修改上下架bug
This commit is contained in:
@@ -46,4 +46,7 @@ public interface ProdPropValueMapper extends BaseMapperX<ProdPropValueDO> {
|
||||
void restorePropValue(@Param("ids") List<Long> ids);
|
||||
|
||||
int getMaxPropValue(@Param("propId")Long propId);
|
||||
|
||||
// 根据商品 ID 更新销售属性值的 state(仅 rule=1 的)
|
||||
void updateStateByProdId(@Param("prodId") Long prodId, @Param("state") Integer state);
|
||||
}
|
||||
@@ -41,4 +41,7 @@ public interface SkuMapper extends BaseMapperX<SkuDO> {
|
||||
List<SkuDO> getskuListByDeleted( @Param("prodId")Long prodId,@Param("ids")List<Long> ids);
|
||||
|
||||
void batchSkuRecover(@Param("ids") List<Long> ids);
|
||||
|
||||
// 查询商品下所有 SKU 的 is_shelf 状态(未删除)
|
||||
List<Integer> selectShelfStatusByProdId(@Param("prodId") Long prodId);
|
||||
}
|
||||
@@ -869,42 +869,35 @@ public class SkuServiceImpl implements SkuService {
|
||||
if (!allSameProd) {
|
||||
throw new IllegalArgumentException("批量删除的 SKU 必须属于同一个商品");
|
||||
}
|
||||
|
||||
|
||||
// Step 3: 获取该商品下【当前仍然未禁用】的 SKU 的 properties
|
||||
List<String> activeProperties = skuMapper.selectPropertiesByProdIdShelf(prodId);
|
||||
|
||||
for (Long id : ids) {
|
||||
SkuDO sku = new SkuDO();
|
||||
sku.setSkuId(id);
|
||||
sku.setIsShelf(isShelf);
|
||||
skuMapper.updateById(sku);
|
||||
}
|
||||
// Step 4: 提取所有仍在使用的属性值(去重 + trim)
|
||||
Set<String> currentlyUsedValues = new HashSet<>();
|
||||
for (String props : activeProperties) {
|
||||
if (props != null && !props.trim().isEmpty()) {
|
||||
String[] values = props.split(",");
|
||||
for (String v : values) {
|
||||
currentlyUsedValues.add(v.trim());
|
||||
}
|
||||
}
|
||||
// ================================
|
||||
//新增逻辑:判断商品整体上下架状态,并更新 tz_prod_prop_value.state
|
||||
// ================================
|
||||
// 查询该商品下所有未删除的 SKU 的 is_shelf 状态
|
||||
List<Integer> allSkuShelfStatus = skuMapper.selectShelfStatusByProdId(prodId);
|
||||
|
||||
if (allSkuShelfStatus.isEmpty()) {
|
||||
return; // 没有 SKU,无需处理
|
||||
}
|
||||
|
||||
// Step 5: 查询该商品下所有 rule=1 的销售属性值(未删除的)
|
||||
List<ProdPropValueDO> allPropValues = prodPropValueMapper.selectSalesValuesByState(prodId);
|
||||
boolean allShelf = allSkuShelfStatus.stream().allMatch(status -> status == 1); // 全部上架
|
||||
boolean allOffShelf = allSkuShelfStatus.stream().allMatch(status -> status == 0); // 全部下架
|
||||
|
||||
// Step 6: 收集需要删除的属性值 ID
|
||||
List<Long> valueIdsToDelete = new ArrayList<>();
|
||||
for (ProdPropValueDO pv : allPropValues) {
|
||||
String value = pv.getPropValue().trim();
|
||||
if (!currentlyUsedValues.contains(value)) {
|
||||
valueIdsToDelete.add(pv.getId());
|
||||
}
|
||||
Integer targetState = null;
|
||||
if (allShelf) {
|
||||
targetState = 1; // 启用
|
||||
} else if (allOffShelf) {
|
||||
targetState = 0; // 禁用
|
||||
}
|
||||
// Step 7: 批量删除无用的属性值
|
||||
if (!valueIdsToDelete.isEmpty()) {
|
||||
prodPropValueMapper.batchMarkDeleted(valueIdsToDelete);
|
||||
// 混合状态:不修改 state
|
||||
// 如果需要更新状态,则批量更新 tz_prod_prop_value 的 state 字段
|
||||
if (targetState != null) {
|
||||
prodPropValueMapper.updateStateByProdId(prodId, targetState);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,16 @@
|
||||
SELECT max(sort) FROM `tz_prod_prop_value` WHERE prop_id = #{propId} AND deleted = 0
|
||||
</select>
|
||||
|
||||
|
||||
<update id="updateStateByProdId">
|
||||
UPDATE tz_prod_prop_value
|
||||
SET state = #{state}
|
||||
WHERE prop_id IN (
|
||||
SELECT id FROM tz_prod_prop
|
||||
WHERE prod_id = #{prodId}
|
||||
AND deleted = 0
|
||||
)
|
||||
AND deleted = 0
|
||||
</update>
|
||||
|
||||
|
||||
<update id="batchMarkDeleted">
|
||||
|
||||
@@ -111,4 +111,11 @@
|
||||
</foreach>
|
||||
</update>
|
||||
|
||||
<select id="selectShelfStatusByProdId" resultType="int">
|
||||
SELECT is_shelf
|
||||
FROM tz_sku
|
||||
WHERE prod_id = #{prodId}
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user