Przeglądaj źródła

将销量字段冗余到活动商品表,并移除连表查询

yubin 2 tygodni temu
rodzic
commit
86efb42bc8

+ 74 - 40
mall-service/src/main/java/com/txz/mall/business/impl/OrderServiceBusinessImpl.java

@@ -17,6 +17,7 @@ import com.txz.mall.model.*;
 import com.txz.mall.service.*;
 import com.txz.mall.util.I18nUtil;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.time.DateUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -38,6 +39,7 @@ import java.util.stream.Collectors;
 @Service
 @Transactional
 @AllArgsConstructor
+@Slf4j
 public class OrderServiceBusinessImpl implements OrderServiceBusiness {
 
     private final StoreOrderService storeOrderService;
@@ -50,7 +52,7 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
     private final RedisUtil redisUtil;
     private final CifRedEnvelopeDubboServiceClient cifRedEnvelopeDubboServiceClient;
     private final StoreOrderMapper storeOrderMapper;
-
+    private final StoreProductService storeProductService;
     @Override
     public StoreOrderVO orderDetail(Long id, String orderNo) {
         StoreOrderVO vo = new StoreOrderVO();
@@ -179,48 +181,80 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
 //            return list;
 //        }
 
-        Date date = new Date();
-        Date date1 = DateUtils.addDays(date, -7);
-       // List<Map<String, Object>> rank = storeOrderMapper.getRank(date1);
-        List<Map<String, Object>> rank = storePinkMapper.getRank(date1);
-
-
-        if (!CollectionUtils.isEmpty(rank)) {
-            Map<Long, Map<String, Object>> saleMap = rank.stream().collect(Collectors.toMap(a -> Long.valueOf(a.get("pid")+"") , a -> a, (b, c) -> c));
-            List<Long> pidList = rank.stream().map(a -> Long.valueOf(a.get("pid")+"")).collect(Collectors.toList());
-
-            Condition storeCombinationCondition = new Condition(StoreCombination.class);
-            Example.Criteria storeCombinationCriteria = storeCombinationCondition.createCriteria();
-            storeCombinationCriteria.andIn("productId", pidList);
-            List<StoreCombination> combinationList = storeCombinationService.findByCondition(storeCombinationCondition);
-            Map<Long, StoreCombination> storeCombinationMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(combinationList)){
-                 storeCombinationMap = combinationList.stream().collect(Collectors.toMap(StoreCombination::getProductId, a -> a, (b, c) -> c));
-            }
-            for (Map<String, Object> stringObjectMap : rank) {
-
-
-                Object pid = stringObjectMap.get("pid");
-                Object num = stringObjectMap.get("num");
-
-                StoreCombination storeCombination = storeCombinationMap.get(Long.parseLong(pid + ""));
-                StoreCombinationRankVO rankVO = new StoreCombinationRankVO();
-                rankVO.setProductId(storeCombination.getProductId());
-                rankVO.setProductName(storeCombination.getProductName());
-                rankVO.setSales(Integer.valueOf(num+""));
-                rankVO.setFicti(Integer.valueOf(num+""));
-                rankVO.setImage(storeCombination.getImage());
-                rankVO.setPrice(storeCombination.getPrice());
-                list.add(rankVO);
-            }
-
-            if(!CollectionUtils.isEmpty(list)){
-                list =list.stream().sorted(Comparator.comparing(StoreCombinationRankVO::getSales).reversed()).collect(Collectors.toList());
-            }
-
+        Set<Long> isvalidProductIdList = new HashSet<>();
+        //提取有效的参与活动的商品id
+        Condition storeCombinationCondition = new Condition(StoreCombination.class);
+        Example.Criteria StoreCombinationCriteria = storeCombinationCondition.createCriteria();
+        StoreCombinationCriteria.andEqualTo("isDelete", 0);
+        StoreCombinationCriteria.andEqualTo("isShow", 1);
+        List<StoreCombination> combinationList = storeCombinationService.findByCondition(storeCombinationCondition);
+
+        if(!CollectionUtils.isEmpty(combinationList)){
+            log.info("getRank.storeCombinationService.findByCondition"+JSONObject.toJSONString(combinationList));
+            List<Long> productIdList1 = combinationList.stream().map(StoreCombination::getProductId).collect(Collectors.toList());
+            isvalidProductIdList.addAll(productIdList1);
         }
 
 
+//        Condition storeProductondition = new Condition(StoreProduct.class);
+//        Example.Criteria storeProductCriteria = storeProductondition.createCriteria();
+//        storeProductCriteria.andEqualTo("isDelete", 0);
+//        storeProductCriteria.andEqualTo("isShow", 1);
+//        List<StoreProduct> storeProductList = storeProductService.findByCondition(storeProductondition);
+//        if(!CollectionUtils.isEmpty(storeProductList)){
+//            List<Long> productIdList2 = storeProductList.stream().map(StoreProduct::getId).collect(Collectors.toList());
+//            isvalidProductIdList.addAll(productIdList2);
+//        }
+
+
+       if(!CollectionUtils.isEmpty(isvalidProductIdList)) {
+           log.info("getRank.isvalidProductIdList"+JSONObject.toJSONString(isvalidProductIdList));
+           Date date = new Date();
+           Date date1 = DateUtils.addDays(date, -7);
+           // List<Map<String, Object>> rank = storeOrderMapper.getRank(date1);
+           List<Map<String, Object>> rank = storePinkMapper.getRank(date1,isvalidProductIdList);
+
+
+           if (!CollectionUtils.isEmpty(rank)) {
+               log.info("rank"+JSONObject.toJSONString(rank));
+               Map<Long, Map<String, Object>> saleMap = rank.stream().collect(Collectors.toMap(a -> Long.valueOf(a.get("pid") + ""), a -> a, (b, c) -> c));
+               List<Long> pidList = rank.stream().map(a -> Long.valueOf(a.get("pid") + "")).collect(Collectors.toList());
+
+//               Condition storeCombinationCondition = new Condition(StoreCombination.class);
+//               Example.Criteria storeCombinationCriteria = storeCombinationCondition.createCriteria();
+//               storeCombinationCriteria.andIn("productId", pidList);
+//               List<StoreCombination> combinationList = storeCombinationService.findByCondition(storeCombinationCondition);
+               Map<Long, StoreCombination> storeCombinationMap = new HashMap<>();
+               if (!CollectionUtils.isEmpty(combinationList)) {
+                   log.info("getRank.combinationList"+JSONObject.toJSONString(combinationList));
+                   storeCombinationMap = combinationList.stream().collect(Collectors.toMap(StoreCombination::getProductId, a -> a, (b, c) -> c));
+               }
+               for (Map<String, Object> stringObjectMap : rank) {
+
+
+                   Object pid = stringObjectMap.get("pid");
+                   Object num = stringObjectMap.get("num");
+                   log.info("getRank.pid"+JSONObject.toJSONString(pid));
+                   StoreCombination storeCombination = storeCombinationMap.get(Long.parseLong(pid + ""));
+                   log.info("getRank.storeCombination"+JSONObject.toJSONString(storeCombination));
+                   StoreCombinationRankVO rankVO = new StoreCombinationRankVO();
+                   rankVO.setProductId(storeCombination.getProductId());
+                   rankVO.setProductName(storeCombination.getProductName());
+                   rankVO.setSales(Integer.valueOf(num + ""));
+                   rankVO.setFicti(Integer.valueOf(num + ""));
+                   rankVO.setImage(storeCombination.getImage());
+                   rankVO.setPrice(storeCombination.getPrice());
+                   list.add(rankVO);
+               }
+
+               if (!CollectionUtils.isEmpty(list)) {
+                   log.info("getRank.list"+JSONObject.toJSONString(list));
+                   list = list.stream().sorted(Comparator.comparing(StoreCombinationRankVO::getSales).reversed()).collect(Collectors.toList());
+               }
+
+           }
+
+       }
 
         // redisUtil.set(key, list);
         return list;

+ 36 - 37
mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppCombinationController.java

@@ -9,6 +9,7 @@ import com.txz.mall.business.OrderServiceBusiness;
 import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
 import com.txz.mall.core.ServiceException;
+import com.txz.mall.enums.SpuSortEnum;
 import com.txz.mall.model.StoreCombination;
 import com.txz.mall.model.StoreProduct;
 import com.txz.mall.service.StoreCombinationService;
@@ -202,46 +203,44 @@ public class AppCombinationController {
     public Result<PageInfo<List<StoreCombinationVO>>> spuList(@Validated SpuListRO ro, Integer page, Integer size) {
         PageHelper.startPage(page, size);
 
-        List<StoreCombinationVO> storeCombinationVOS1 = storeCombinationService.spuList(ro);
+       // List<StoreCombinationVO> storeCombinationVOS1 = storeCombinationService.spuList(ro);
 
-//        Condition condition = new Condition(StoreCombination.class);
-//        Example.Criteria criteria = condition.createCriteria();
-//        criteria.andEqualTo("isDelete", 0);
-//        criteria.andEqualTo("isShow", 1);
-//
-//        if (StrUtil.isNotBlank(ro.getStoreName())) {
-//            criteria.andLike("productName", "%" + ro.getStoreName() + "%");
-//        }
-//        if (StrUtil.isNotBlank(ro.getCateId())) {
-//            criteria.andEqualTo("cateId", ro.getCateId());
-//        }
-//        if (ObjectUtil.isNotNull(ro.getPrice())) {
-//            criteria.andEqualTo("price", ro.getPrice());
-//        }
-//        condition.setOrderByClause(ro.getSort().getSort());
-//        List<StoreCombination> byCondition = storeCombinationService.findByCondition(condition);
-//        List<StoreCombinationVO> storeCombinationVOS = new ArrayList<>();
-//
-//        if(!CollectionUtils.isEmpty(byCondition)){
-//            List<Long> productIdList = byCondition.stream().map(StoreCombination::getProductId).collect(Collectors.toList());
-//
-//            Condition conditionStoreProduct = new Condition(StoreProduct.class);
-//            Example.Criteria criteriaStoreProduct = conditionStoreProduct.createCriteria();
-//            criteriaStoreProduct.andEqualTo("isDelete", 0);
-//            criteriaStoreProduct.andIn("id",productIdList);
-//            List<StoreProduct> storeProductList = storeProductService.findByCondition(conditionStoreProduct);
-//            Map<Long, StoreProduct> storeProductMap = storeProductList.stream().collect(Collectors.toMap(StoreProduct::getId, a -> a, (b, c) -> c));
-//            for (StoreCombination storeCombination : byCondition) {
-//                StoreCombinationVO storeCombinationVO = new StoreCombinationVO();
-//                BeanUtils.copyProperties(storeCombination,storeCombinationVO);
-//                StoreProduct storeProduct = storeProductMap.get(storeCombination.getProductId());
-//                storeCombinationVO.setFicti(storeProduct.getFicti());
-//                storeCombinationVOS.add(storeCombinationVO);
-//            }
-//        }
+        Condition condition = new Condition(StoreCombination.class);
+        Example.Criteria criteria = condition.createCriteria();
+        criteria.andEqualTo("isDelete", 0);
+        criteria.andEqualTo("isShow", 1);
+        if(SpuSortEnum.SALES_ASC.equals(ro.getSort())){
+            condition.setOrderByClause("ficti asc");
+        }else if(SpuSortEnum.SALES_DESC.equals(ro.getSort())){
+            condition.setOrderByClause("ficti desc");
+        }else{
+            condition.setOrderByClause("ficti desc");
+        }
+
+        if (StrUtil.isNotBlank(ro.getStoreName())) {
+            criteria.andLike("productName", "%" + ro.getStoreName() + "%");
+        }
+        if (StrUtil.isNotBlank(ro.getCateId())) {
+            criteria.andEqualTo("cateId", ro.getCateId());
+        }
+        if (ObjectUtil.isNotNull(ro.getPrice())) {
+            criteria.andEqualTo("price", ro.getPrice());
+        }
+
+        List<StoreCombination> byCondition = storeCombinationService.findByCondition(condition);
+        List<StoreCombinationVO> storeCombinationVOS = new ArrayList<>();
 
+        if(!CollectionUtils.isEmpty(byCondition)){
+
+            for (StoreCombination storeCombination : byCondition) {
+                StoreCombinationVO storeCombinationVO = new StoreCombinationVO();
+                BeanUtils.copyProperties(storeCombination,storeCombinationVO);
+
+                storeCombinationVOS.add(storeCombinationVO);
+            }
+        }
 
-        return Result.success(new PageInfo(storeCombinationVOS1));
+        return Result.success(new PageInfo(storeCombinationVOS));
     }
     
     

+ 7 - 2
mall-service/src/main/java/com/txz/mall/dao/StorePinkMapper.java

@@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.SelectProvider;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public interface StorePinkMapper extends Mapper<StorePink> {
     
@@ -18,7 +19,11 @@ public interface StorePinkMapper extends Mapper<StorePink> {
     List<ProductCarouselDTO> pinkByProductId(Long productId);
 
 
-    @Select("select pid as pid ,count(*) as num from m_store_pink where (order_status in (3,4,5,6,7,8) or l_id in(1) )and create_time > #{date} group by pid ORDER BY num desc limit 20")
-    List<Map<String,Object>> getRank(@Param("date") Date date);
+//    @Select("select pid as pid ,count(*) as num from m_store_pink where order_status in (3,4,5,6,7,8) and " +
+//            "<foreach collection='productSet' item='item' open='(' separator=',' close=')'>" +
+//               "#{item}" +
+//            "</foreach> " +
+//            "pid in (productSet) and create_time > #{date} group by pid ORDER BY num desc limit 20")
+    List<Map<String,Object>> getRank(@Param("date") Date date,@Param("productSet") Set<Long> productSet);
     
 }

+ 4 - 0
mall-service/src/main/java/com/txz/mall/model/StoreCombination.java

@@ -286,5 +286,9 @@ public class StoreCombination {
      */
     @Column(name = "version")
     private Integer version;
+
+
+    @ApiModelProperty(value = "虚拟销量")
+    private Integer ficti;
     
 }

+ 1 - 0
mall-service/src/main/java/com/txz/mall/service/impl/StoreCombinationServiceImpl.java

@@ -126,6 +126,7 @@ public class StoreCombinationServiceImpl extends AbstractService<StoreCombinatio
             }
             storeCombination.setTitle(flashActivity.getName());
             storeCombination.setActivityId(activityId);
+            storeCombination.setFicti(storeProduct.getFicti());
         }
         //  直接进行覆盖
         Condition condition = new Condition(StoreCombination.class);

+ 11 - 7
mall-service/src/main/java/com/txz/mall/service/impl/StorePinkServiceImpl.java

@@ -14,6 +14,7 @@ import com.txz.cif.param.OrderParam;
 import com.txz.mall.constants.Constants;
 import com.txz.mall.core.AbstractService;
 import com.txz.mall.core.ServiceException;
+import com.txz.mall.dao.StoreCombinationMapper;
 import com.txz.mall.dao.StorePinkMapper;
 import com.txz.mall.dao.StoreProductMapper;
 import com.txz.mall.dubbo.client.CifAccountDubboServiceClient;
@@ -22,10 +23,7 @@ import com.txz.mall.enums.OrderEventsEnum;
 import com.txz.mall.dubbo.client.CifUserDubboServiceClient;
 import com.txz.mall.enums.PinkOrderStatusEnum;
 import com.txz.mall.enums.StorePinkStatusEnum;
-import com.txz.mall.model.StoreOrder;
-import com.txz.mall.model.StorePink;
-import com.txz.mall.model.StorePinkSummary;
-import com.txz.mall.model.StoreProduct;
+import com.txz.mall.model.*;
 import com.txz.mall.service.*;
 import com.txz.mall.util.I18nUtil;
 import com.txz.mall.util.OrderStateMachine;
@@ -69,6 +67,8 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
     @Resource
     private StoreProductMapper storeProductMapper;
 
+    @Resource
+    private StoreCombinationMapper storeCombinationMapper;
     @Override
     public List<StorePink> getListByCidAndKid(Long cid, Long kid) {
         Condition condition = new Condition(StorePink.class);
@@ -111,12 +111,9 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         Long pid = teamPink.getPid();
 
         StoreProduct storeProduct = storeProductService.findById(pid);
-
         StoreProduct storeProductForUpdate = new StoreProduct();
         storeProductForUpdate.setFicti(storeProduct.getFicti()+teamPink.getTotalNum());
         storeProductForUpdate.setVersion(storeProduct.getVersion()+1);
-
-
         Example exampleStoreProduct = new Example(StoreProduct.class);
         exampleStoreProduct.createCriteria().andEqualTo("id", pid).andEqualTo(storeProduct.getVersion());
         int i = storeProductMapper.updateByConditionSelective(storeProductForUpdate, exampleStoreProduct);
@@ -124,6 +121,13 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
             throw new ServiceException(I18nUtil.get("failed.to.increase.virtual.sales.during.payment")+pid);
         }
 
+        //将虚拟销量维护到拼团商品表上防止连表查询
+        StoreCombination storeCombinationUpdate = new StoreCombination();
+        storeCombinationUpdate.setFicti(storeProduct.getFicti()+teamPink.getTotalNum());
+        Example exampleStoreCombination = new Example(StoreCombination.class);
+        exampleStoreCombination.createCriteria().andEqualTo("productId", pid).andEqualTo("isDelete",0);
+        storeCombinationMapper.updateByConditionSelective(storeCombinationUpdate,exampleStoreCombination);
+
         memberList.add(teamPink);
 //        memberList.forEach(i -> {
 //            i.setStatus(2);

+ 17 - 0
mall-service/src/main/resources/mapper/StorePinkMapper.xml

@@ -30,4 +30,21 @@
         <result column="update_user_id" jdbcType="BIGINT" property="updateUserId"/>
         <result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
     </resultMap>
+
+    <select id="getRank" resultType="map">
+
+        select pid as pid ,count(*) as num
+        from m_store_pink
+        where order_status in (3,4,5,6,7,8)
+        and pid in
+        <foreach collection='productSet' item='item' open='(' separator=',' close=')'>
+            #{item}
+        </foreach>
+        and create_time > #{date}
+        group by pid
+        ORDER BY num desc limit 20
+
+    </select>
+
+
 </mapper>