Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mall-service/src/main/java/com/txz/mall/service/impl/StoreCombinationServiceImpl.java
#	mall-service/src/main/java/com/txz/mall/service/impl/StoreFlashActivityServiceImpl.java
yubin vor 2 Wochen
Ursprung
Commit
c3bd816669

+ 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

@@ -6,7 +6,6 @@ import com.txz.mall.model.StoreCombination;
 import com.txz.mall.web.param.result.StoreCombinationVO;
 import com.txz.mall.web.vo.SpuListRO;
 import dto.StoreProductAddRequest;
-import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.SelectProvider;
 import org.apache.ibatis.annotations.UpdateProvider;
 
@@ -26,4 +25,7 @@ public interface StoreCombinationMapper extends Mapper<StoreCombination> {
 //            " order by sales desc LIMIT ?")
     List<StoreCombinationVO> spuList(SpuListRO ro);
 
+    
+    @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 - 8
mall-service/src/main/java/com/txz/mall/service/StoreCombinationService.java

@@ -1,12 +1,9 @@
 package com.txz.mall.service;
 
-import com.github.pagehelper.PageInfo;
-import com.txz.mall.core.Result;
 import com.txz.mall.core.Service;
 import com.txz.mall.model.StoreCombination;
 import com.txz.mall.web.param.result.StoreCombinationVO;
 import com.txz.mall.web.vo.SpuListRO;
-import org.springframework.validation.annotation.Validated;
 
 import java.util.List;
 
@@ -15,28 +12,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);
-
+    
     /**
      * 添加/扣减库存
      *

+ 63 - 21
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;
@@ -26,6 +27,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;
@@ -38,14 +40,18 @@ 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"));
@@ -54,6 +60,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()
@@ -100,9 +143,11 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
         save(list);
 
 
+        
+        return duplicateIdStr;
     }
-
-
+    
+    
     @Override
     public List<StoreCombination> getMore(Integer comId) {
         Condition condition = new Condition(StoreCombination.class);
@@ -118,7 +163,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);
@@ -133,15 +178,12 @@ 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)) {
@@ -149,8 +191,8 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
             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);
@@ -162,11 +204,11 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
             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);
@@ -174,12 +216,12 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
             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);
         }
 
     }

+ 81 - 76
mall-service/src/main/java/com/txz/mall/service/impl/StoreFlashActivityServiceImpl.java

@@ -1,5 +1,6 @@
 package com.txz.mall.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.txz.mall.core.AbstractService;
@@ -9,9 +10,7 @@ import com.txz.mall.dao.StoreCombinationMapper;
 import com.txz.mall.dao.StoreFlashActivityMapper;
 import com.txz.mall.model.StoreCombination;
 import com.txz.mall.model.StoreFlashActivity;
-import com.txz.mall.service.StoreCombinationService;
 import com.txz.mall.service.StoreFlashActivityService;
-import com.txz.mall.util.EasyToUseUtil;
 import com.txz.mall.util.I18nUtil;
 import dto.StoreFlashActivityDTO;
 import org.apache.commons.lang3.StringUtils;
@@ -36,14 +35,14 @@ import java.util.List;
 @Service
 @Transactional
 public class StoreFlashActivityServiceImpl extends AbstractService<StoreFlashActivity> implements StoreFlashActivityService {
-
+    
     @Resource
     private StoreFlashActivityMapper storeFlashActivityMapper;
-
+    
     @Lazy
     @Resource
     private StoreCombinationMapper storeCombinationMapper;
-
+    
     @Override
     public List<StoreFlashActivity> activityList(StoreFlashActivity storeFlashActivity, Integer page, Integer size) {
         this.activityStatusJudgmentTimedTask();
@@ -61,70 +60,78 @@ public class StoreFlashActivityServiceImpl extends AbstractService<StoreFlashAct
         if (storeFlashActivity.getStatus() != null) {
             criteria.andEqualTo("status", storeFlashActivity.getStatus());
         }
-        if (storeFlashActivity.getActiveState() != null) {
-            criteria.andEqualTo("activeState", storeFlashActivity.getActiveState());
-        }
-        Date date = new Date();
-        List<StoreFlashActivity> activityList = findByCondition(condition);
-//        for (StoreFlashActivity flashActivity : activityList) {
-//            Date startTime = flashActivity.getStartTime();
-//            Date endTime = flashActivity.getEndTime();
-//            if (startTime.getTime() > date.getTime()) {
-//                flashActivity.setActiveState(0);
-//            } else if (endTime.getTime() < date.getTime()) {
-//                flashActivity.setActiveState(2);
-//            } else {
-//                flashActivity.setActiveState(1);
+         if (storeFlashActivity.getActiveState() != null) {
+             criteria.andEqualTo("activeState", storeFlashActivity.getActiveState());
+         }
+        
+        // 不知道哪个臭SB写的,减少改动,暂时先这样处理
+//        Date now = new Date();
+//        if (ObjectUtil.isNotEmpty(storeFlashActivity.getActiveState())) {
+//
+//            switch (storeFlashActivity.getActiveState()) {
+//                case 0:
+//                    criteria.andGreaterThan("startTime", now);
+//                    break;
+//                case 1:
+//                    criteria.andLessThanOrEqualTo("startTime", now);
+//                    criteria.andGreaterThanOrEqualTo("endTime", now);
+//                    break;
+//                case 2:
+//                    criteria.andLessThan("endTime", now);
+//                    break;
 //            }
 //        }
+//
+        List<StoreFlashActivity> activityList = findByCondition(condition);
+
         return activityList;
     }
-
+    
     @Override
     public void modify(StoreFlashActivityDTO dto) {
-
+        
         StoreFlashActivity storeFlashActivityOri = findById(dto.getId());
-        if(ObjectUtils.isEmpty(storeFlashActivityOri)){
+        if (ObjectUtils.isEmpty(storeFlashActivityOri)) {
             String s = I18nUtil.get("activity.does.not.exist.id");
-            throw new ServiceException(s+storeFlashActivityOri.getId());
+            throw new ServiceException(s + storeFlashActivityOri.getId());
         }
-//        FlashActivityVO activityVOOri = new FlashActivityVO();
-//        //数据库中的现有数据
-//        Integer statusOri = storeFlashActivityOri.getStatus();  //目测这也是可以控制活动是否开启的 也对应对应m_store_combination.isshow
-//        String contentOri = storeFlashActivityOri.getContent();  //解析出来对应 `effective_time`拼团订单有效时间(小时)', `people` stock
-//        if(!ObjectUtils.isEmpty(contentOri)) {
-//             activityVOOri = JSONObject.parseObject(storeFlashActivityOri.getContent(), FlashActivityVO.class);
-//        }
-//        Date startTimeOri = storeFlashActivityOri.getStartTime();
-//        Date endTimeOri = storeFlashActivityOri.getEndTime();
-//        Integer isDeleteOri = storeFlashActivityOri.getIsDelete();
-//        Integer activeStateOri = storeFlashActivityOri.getActiveState();//活动状态目测是定时任务来时时修改的  对应m_store_combination.isshow
-
-//        storeCombination.setPeople(activityVO.getGroupNumber());
-//        storeCombination.setEffectiveTime(activityVO.getCountdownTime());
-//        if (activityVO.getInventory() != null) {
-//            storeCombination.setStock(activityVO.getInventory());
-//        }
-
-
+        //        FlashActivityVO activityVOOri = new FlashActivityVO();
+        //        //数据库中的现有数据
+        //        Integer statusOri = storeFlashActivityOri.getStatus();  //目测这也是可以控制活动是否开启的 也对应对应m_store_combination.isshow
+        //        String contentOri = storeFlashActivityOri.getContent();  //解析出来对应 `effective_time`拼团订单有效时间(小时)', `people` stock
+        //        if(!ObjectUtils.isEmpty(contentOri)) {
+        //             activityVOOri = JSONObject.parseObject(storeFlashActivityOri.getContent(), FlashActivityVO.class);
+        //        }
+        //        Date startTimeOri = storeFlashActivityOri.getStartTime();
+        //        Date endTimeOri = storeFlashActivityOri.getEndTime();
+        //        Integer isDeleteOri = storeFlashActivityOri.getIsDelete();
+        //        Integer activeStateOri = storeFlashActivityOri.getActiveState();//活动状态目测是定时任务来时时修改的  对应m_store_combination.isshow
+        
+        //        storeCombination.setPeople(activityVO.getGroupNumber());
+        //        storeCombination.setEffectiveTime(activityVO.getCountdownTime());
+        //        if (activityVO.getInventory() != null) {
+        //            storeCombination.setStock(activityVO.getInventory());
+        //        }
+        
+        
         StoreFlashActivity storeFlashActivity = new StoreFlashActivity();
         BeanUtils.copyProperties(dto, storeFlashActivity);
         FlashActivityVO contentNow = dto.getContent();
         storeFlashActivity.setContent(JSONObject.toJSONString(dto.getContent()));
-
+        
         JSONObject tokenUser = UserUtil.getTokenUser(null);
         Long tokenUserId = 0L;
-
-
-        if(!ObjectUtils.isEmpty(tokenUser)){
-            if(!ObjectUtils.isEmpty(tokenUser.getLongValue("id"))){
+        
+        
+        if (!ObjectUtils.isEmpty(tokenUser)) {
+            if (!ObjectUtils.isEmpty(tokenUser.getLongValue("id"))) {
                 tokenUserId = tokenUser.getLongValue("id");
             }
         }
         Date date = new Date();
-
-        if((!ObjectUtils.isEmpty(storeFlashActivity.getStartTime())) && (!ObjectUtils.isEmpty(storeFlashActivity.getEndTime()))) {
-
+        
+        if ((!ObjectUtils.isEmpty(storeFlashActivity.getStartTime())) && (!ObjectUtils.isEmpty(storeFlashActivity.getEndTime()))) {
+            
             if (date.compareTo(storeFlashActivity.getStartTime()) < 0) {
                 storeFlashActivity.setActiveState(0);
             } else if (date.compareTo(storeFlashActivity.getStartTime()) >= 0 && date.compareTo(storeFlashActivity.getEndTime()) <= 0) {
@@ -135,40 +142,38 @@ public class StoreFlashActivityServiceImpl extends AbstractService<StoreFlashAct
         }
         storeFlashActivity.setUpdateTime(date);
         storeFlashActivity.setUpdateUserId(tokenUserId);
-
-
-
+        
+        
         update(storeFlashActivity);
-
-        //活动商品信息联动
-
+        
+        // 活动商品信息联动
+        
         Example exampleStoreCombination = new Example(StoreCombination.class);
         exampleStoreCombination.createCriteria()
-                .andEqualTo("activityId",dto.getId());
-
+                .andEqualTo("activityId", dto.getId());
+        
         StoreCombination storeCombination = new StoreCombination();
-       // storeCombination.setStock();
+        // storeCombination.setStock();
         storeCombination.setEffectiveTime(contentNow.getCountdownTime());
         storeCombination.setPeople(contentNow.getGroupNumber());
         Integer statusOne = 1;
         Integer statusZero = 0;
-
-
+        
+        
         //
-        if(statusOne.equals(storeFlashActivity.getActiveState())
-               //  && statusOne.equals(storeFlashActivity.getStatus())
-                &&  statusZero.equals(storeFlashActivity.getIsDelete())
-        ){
+        if (statusOne.equals(storeFlashActivity.getActiveState())
+                //  && statusOne.equals(storeFlashActivity.getStatus())
+                && statusZero.equals(storeFlashActivity.getIsDelete())
+        ) {
             storeCombination.setIsShow(1);
-        }else{
+        } else {
             storeCombination.setIsShow(0);
         }
         storeCombination.setStartTime(storeFlashActivity.getStartTime());
         storeCombination.setStopTime(storeFlashActivity.getEndTime());
-//        storeCombination.setIsDelete(storeFlashActivity.getIsDelete());
+        //        storeCombination.setIsDelete(storeFlashActivity.getIsDelete());
         storeCombination.setUpdateUserId(storeFlashActivity.getUpdateUserId());
-        storeCombinationMapper.updateByConditionSelective(storeCombination,exampleStoreCombination);
-
+        storeCombinationMapper.updateByConditionSelective(storeCombination, exampleStoreCombination);
 
 
     }
@@ -178,15 +183,15 @@ public class StoreFlashActivityServiceImpl extends AbstractService<StoreFlashAct
     public void delete(StoreFlashActivity storeFlashActivity) {
 
         StoreFlashActivity storeFlashActivityOri = findById(storeFlashActivity.getId());
-        if(ObjectUtils.isEmpty(storeFlashActivityOri)){
-            throw new ServiceException(I18nUtil.get("activity.does.not.exist.id")+storeFlashActivityOri.getId());
+        if (ObjectUtils.isEmpty(storeFlashActivityOri)) {
+            throw new ServiceException(I18nUtil.get("activity.does.not.exist.id") + storeFlashActivityOri.getId());
         }
 
         JSONObject tokenUser = UserUtil.getTokenUser(null);
         Long tokenUserId = 0L;
 
-        if(!ObjectUtils.isEmpty(tokenUser)){
-            if(!ObjectUtils.isEmpty(tokenUser.getLongValue("id"))){
+        if (!ObjectUtils.isEmpty(tokenUser)) {
+            if (!ObjectUtils.isEmpty(tokenUser.getLongValue("id"))) {
                 tokenUserId = tokenUser.getLongValue("id");
             }
         }
@@ -197,17 +202,17 @@ public class StoreFlashActivityServiceImpl extends AbstractService<StoreFlashAct
 
         update(storeFlashActivity);
 
-        //活动商品信息联动
+        // 活动商品信息联动
 
         Example exampleStoreCombination = new Example(StoreCombination.class);
         exampleStoreCombination.createCriteria()
-                .andEqualTo("activityId",storeFlashActivity.getId());
+                .andEqualTo("activityId", storeFlashActivity.getId());
 
         StoreCombination storeCombination = new StoreCombination();
         storeCombination.setIsShow(0);
         storeCombination.setIsDelete(storeFlashActivity.getIsDelete());
         storeCombination.setUpdateUserId(storeFlashActivity.getUpdateUserId());
-        storeCombinationMapper.updateByConditionSelective(storeCombination,exampleStoreCombination);
+        storeCombinationMapper.updateByConditionSelective(storeCombination, exampleStoreCombination);
     }
 
     @Override