修改上下架bug

This commit is contained in:
xuelijun
2025-08-26 10:54:51 +08:00
parent 40f0ecd162
commit 4711bb8cbc
5 changed files with 42 additions and 27 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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">

View File

@@ -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>