Ver Fonte

fix some bug

Mr.qian há 2 semanas atrás
pai
commit
b03e4ef905

+ 1 - 2
mall-service/src/main/java/com/txz/mall/controller/CombinationController.java

@@ -183,8 +183,7 @@ public class CombinationController {
         if (storeCombinationAddParam.getActivityId() == null) {
             return Result.fail(ResultCode.ID_IS_NULL);
         }
-        storeCombinationService.addActivityProduct(storeCombinationAddParam.getList(), storeCombinationAddParam.getActivityId());
-        return Result.success();
+        return Result.success(storeCombinationService.addActivityProduct(storeCombinationAddParam.getList(), storeCombinationAddParam.getActivityId()));
     }
 
     @GetMapping("/getActivityProductIds")

+ 3 - 1
mall-service/src/main/java/com/txz/mall/dao/StoreCombinationMapper.java

@@ -4,7 +4,6 @@ import com.txz.mall.core.Mapper;
 import com.txz.mall.dao.impl.StoreCombinationMapperImpl;
 import com.txz.mall.model.StoreCombination;
 import dto.StoreProductAddRequest;
-import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.SelectProvider;
 import org.apache.ibatis.annotations.UpdateProvider;
 
@@ -17,4 +16,7 @@ public interface StoreCombinationMapper extends Mapper<StoreCombination> {
     
     @SelectProvider(type = StoreCombinationMapperImpl.class, method = "getIdByProductId")
     Long getIdByProductId(Long productId);
+    
+    @SelectProvider(type = StoreCombinationMapperImpl.class, method = "getAcSpuId")
+    List<Long> getAcSpuId(String productIds, Long activityId);
 }

+ 12 - 0
mall-service/src/main/java/com/txz/mall/dao/impl/StoreCombinationMapperImpl.java

@@ -26,4 +26,16 @@ public class StoreCombinationMapperImpl {
         return "select id from m_store_combination where product_id = #{productId} and is_delete = 0 and start_time <= now() and stop_time >= now() and is_show = 1 order by start_time limit 1 ";
     }
     
+    
+    public String getAcSpuId(String productIds, Long activityId) {
+        String sql = " SELECT msc.product_id " +
+                " FROM m_store_flash_activity msfa " +
+                " LEFT JOIN m_store_combination msc ON msfa.id = msc.activity_id " +
+                " WHERE msfa.active_state != 2 " +
+                " AND msc.product_id IN (${productIds})" +
+                " AND msfa.id != #{activityId} " +
+                " GROUP BY msc.product_id ";
+        return sql;
+    }
+    
 }

+ 6 - 5
mall-service/src/main/java/com/txz/mall/service/StoreCombinationService.java

@@ -10,28 +10,29 @@ import java.util.List;
  * Created by CodeGenerator on 2025/07/14.
  */
 public interface StoreCombinationService extends Service<StoreCombination> {
-
+    
     /**
      * 添加活动商品
      *
      * @param list
      * @param activityId
      */
-    void addActivityProduct(List<StoreCombination> list, Long activityId);
-
+    String addActivityProduct(List<StoreCombination> list, Long activityId);
+    
     /**
      * 更多拼团信息
      */
     List<StoreCombination> getMore(Integer comId);
-
+    
     /**
      * 查询带异常
      *
      * @param id 秒杀商品id
+     *
      * @return StoreSeckill
      */
     StoreCombination getByIdException(Long id);
-
+    
     /**
      * 添加/扣减库存
      *

+ 100 - 59
mall-service/src/main/java/com/txz/mall/service/impl/StoreCombinationServiceImpl.java

@@ -1,6 +1,7 @@
 package com.txz.mall.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.txz.mall.core.AbstractService;
@@ -24,6 +25,7 @@ import tk.mybatis.mapper.entity.Example;
 import vo.FlashActivityVO;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -36,13 +38,16 @@ import java.util.stream.Collectors;
 @Transactional
 @AllArgsConstructor
 public class StoreCombinationServiceImpl extends AbstractService<StoreCombination> implements StoreCombinationService {
-
+    
     private final StoreProductService storeProductService;
     private final StoreFlashActivityService storeFlashActivityService;
     private final StorePinkService storePinkService;
-
+    
+    @Resource
+    private StoreCombinationMapper storeCombinationMapper;
+    
     @Override
-    public void addActivityProduct(List<StoreCombination> list, Long activityId) {
+    public String addActivityProduct(List<StoreCombination> list, Long activityId) {
         StoreFlashActivity flashActivity = storeFlashActivityService.findById(activityId);
         if (flashActivity == null || flashActivity.getIsDelete().equals(1)) {
             throw new ServiceException(I18nUtil.get("cannot.find.the.corresponding.activity"));
@@ -51,6 +56,43 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
         String idsStr = list.stream()
                 .map(storeCombination -> storeCombination.getProductId().toString())
                 .collect(Collectors.joining(","));
+        
+        String duplicateIdStr = "";
+        
+        List<Long> acSpuId = storeCombinationMapper.getAcSpuId(idsStr, activityId);
+        if (CollectionUtils.isNotEmpty(acSpuId)) {
+            List<Long> reqIds = Arrays.stream(idsStr.split(","))
+                    .map(String::trim)
+                    .filter(StrUtil::isNotBlank)
+                    .map(Long::valueOf)
+                    .collect(Collectors.toList());
+            
+            // 找出重复的ID
+            List<Long> duplicateIds = reqIds.stream()
+                    .filter(acSpuId::contains)
+                    .collect(Collectors.toList());
+            
+            duplicateIdStr = duplicateIds.stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+            
+            // 从reqIds中删除重复项
+            reqIds.removeAll(duplicateIds);
+            
+            // 重新生成idsStr
+            idsStr = reqIds.stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+            
+            // 从list中删除重复的元素
+            list.removeIf(storeCombination ->
+                    duplicateIds.contains(storeCombination.getProductId()));
+        }
+        
+        if (StrUtil.isBlank(idsStr)) {
+            return duplicateIdStr;
+        }
+        
         List<StoreProduct> productList = storeProductService.findByIds(idsStr);
         for (StoreCombination storeCombination : list) {
             List<StoreProduct> productCollect = productList.stream()
@@ -94,9 +136,11 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
             });
         }
         save(list);
+        
+        return duplicateIdStr;
     }
-
-
+    
+    
     @Override
     public List<StoreCombination> getMore(Integer comId) {
         Condition condition = new Condition(StoreCombination.class);
@@ -112,7 +156,7 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
         condition.setOrderByClause("sort DESC, id DESC");
         return findByCondition(condition);
     }
-
+    
     @Override
     public StoreCombination getByIdException(Long combinationId) {
         Condition condition = new Condition(StoreCombination.class);
@@ -126,84 +170,81 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
         }
         return combinationList.get(0);
     }
-
-    @Resource
-    private StoreCombinationMapper storeCombinationMapper;
-
+    
     @Override
     public synchronized void operationStock(Long id, Integer num, String type) {
         StoreCombination combination = findById(id);
-       if(ObjectUtils.isEmpty(combination)){
-           throw new ServiceException(I18nUtil.get("group.buying.activity.does.not.exist.id") + id);
-       }
-
+        if (ObjectUtils.isEmpty(combination)) {
+            throw new ServiceException(I18nUtil.get("group.buying.activity.does.not.exist.id") + id);
+        }
+        
         StoreCombination storeCombinationForUpdate = new StoreCombination();
         if ("add".equals(type)) {
-
+            
             int sales = combination.getSales() - num;
             int stock = combination.getStock() + num;
             int quota = combination.getQuota() + num;
-            if(sales<0){
-                throw new ServiceException(I18nUtil.get("the.sales.deduction.of.group.buying.activity.m_store_combination.is.negative.id")+id);
+            if (sales < 0) {
+                throw new ServiceException(I18nUtil.get("the.sales.deduction.of.group.buying.activity.m_store_combination.is.negative.id") + id);
             }
-
+            
             storeCombinationForUpdate.setSales(sales);
             storeCombinationForUpdate.setStock(stock);
             storeCombinationForUpdate.setQuota(quota);
         }
         if ("sub".equals(type)) {
-
+            
             int sales = combination.getSales() + num;
             int stock = combination.getStock() - num;
             int quota = combination.getQuota() - num;
-            if(stock<0){
-                throw new ServiceException(I18nUtil.get("the.stock.deduction.of.group.buying.activity.m_store_combination.is.negative.id")+id);
+            if (stock < 0) {
+                throw new ServiceException(I18nUtil.get("the.stock.deduction.of.group.buying.activity.m_store_combination.is.negative.id") + id);
             }
-            if(quota<0){
-                throw new ServiceException(I18nUtil.get("the.quota.deduction.of.group.buying.activity.m_store_combination.is.negative.id")+id);
+            if (quota < 0) {
+                throw new ServiceException(I18nUtil.get("the.quota.deduction.of.group.buying.activity.m_store_combination.is.negative.id") + id);
             }
-
+            
             storeCombinationForUpdate.setSales(sales);
             storeCombinationForUpdate.setStock(stock);
             storeCombinationForUpdate.setQuota(quota);
-
+            
         }
-        storeCombinationForUpdate.setVersion(combination.getVersion()+1);
+        storeCombinationForUpdate.setVersion(combination.getVersion() + 1);
         Example example = new Example(StoreCombination.class);
-        example.createCriteria().andEqualTo("id",id).andEqualTo("version",combination.getVersion());
+        example.createCriteria().andEqualTo("id", id).andEqualTo("version", combination.getVersion());
         int i = storeCombinationMapper.updateByConditionSelective(storeCombinationForUpdate, example);
-        if(!(i==1)){
-            throw new ServiceException(I18nUtil.get("storecombination.inventory.operation.failed.id")+id);
+        if (!(i == 1)) {
+            throw new ServiceException(I18nUtil.get("storecombination.inventory.operation.failed.id") + id);
         }
-
+        
     }
-
-
-//    @Override
-//    public synchronized void operationStock(Long id, Integer num, String type) {
-//        StoreCombination combination = findById(id);
-//        UpdateWrapper<StoreCombination> updateWrapper = new UpdateWrapper<>();
-//        if ("add".equals(type)) {
-//            combination.setSales(combination.getNum() - num);
-//            combination.setStock(combination.getStock() + num);
-//            combination.setQuota(combination.getQuota() + num);
-//        }
-//        if ("sub".equals(type)) {
-//            combination.setSales(combination.getSales() + num);
-//            combination.setStock(combination.getStock() - num);
-//            combination.setQuota(combination.getQuota() - num);
-//
-//            Condition condition = new Condition(StoreCombination.class);
-//            Example.Criteria criteria = condition.createCriteria();
-//            criteria.andEqualTo("id", id);
-//            criteria.andGreaterThanOrEqualTo("quota", num);
-//            criteria.andEqualTo("isDelete", 0);
-//            criteria.andGreaterThanOrEqualTo("stock", num);
-//            List<StoreCombination> combinationList = findByCondition(condition);
-//            if (CollectionUtils.isEmpty(combinationList)) {
-//                throw new ServiceException("更新拼团商品库存失败,商品id = " + id + ",库存不足");
-//            }
-//        }
-//        update(combination);
-//    }
+    
+    
+    //    @Override
+    //    public synchronized void operationStock(Long id, Integer num, String type) {
+    //        StoreCombination combination = findById(id);
+    //        UpdateWrapper<StoreCombination> updateWrapper = new UpdateWrapper<>();
+    //        if ("add".equals(type)) {
+    //            combination.setSales(combination.getNum() - num);
+    //            combination.setStock(combination.getStock() + num);
+    //            combination.setQuota(combination.getQuota() + num);
+    //        }
+    //        if ("sub".equals(type)) {
+    //            combination.setSales(combination.getSales() + num);
+    //            combination.setStock(combination.getStock() - num);
+    //            combination.setQuota(combination.getQuota() - num);
+    //
+    //            Condition condition = new Condition(StoreCombination.class);
+    //            Example.Criteria criteria = condition.createCriteria();
+    //            criteria.andEqualTo("id", id);
+    //            criteria.andGreaterThanOrEqualTo("quota", num);
+    //            criteria.andEqualTo("isDelete", 0);
+    //            criteria.andGreaterThanOrEqualTo("stock", num);
+    //            List<StoreCombination> combinationList = findByCondition(condition);
+    //            if (CollectionUtils.isEmpty(combinationList)) {
+    //                throw new ServiceException("更新拼团商品库存失败,商品id = " + id + ",库存不足");
+    //            }
+    //        }
+    //        update(combination);
+    //    }
 }