1
0
فهرست منبع

活动代码相关提交

lhm 3 سال پیش
والد
کامیت
d34791a1ad

+ 5 - 8
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -1,17 +1,15 @@
 package com.kmall.admin.controller;
 
-import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.OrderExpressDto;
-import com.kmall.admin.dto.QueryOrderDto;
 import com.kmall.admin.dto.SystemFormatDto;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
 import com.kmall.admin.service.*;
 import com.kmall.admin.utils.CalculateTax;
 import com.kmall.admin.utils.ParamUtils;
 import com.kmall.admin.utils.ShiroUtils;
-import com.kmall.admin.vo.CalculateOrderDiscountPriceVo;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.common.constant.Dict;
 import com.kmall.common.constant.JxlsXmlTemplateName;
 import com.kmall.common.utils.*;
@@ -34,7 +32,6 @@ import net.sf.json.JSONObject;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -1368,11 +1365,11 @@ public class OrderController {
     }
 
     @PostMapping("/calculateOrderDiscountPrice")
-    public R calculateOrderDiscountPrice(@RequestBody CalculateOrderDiscountPriceVo calculateOrderDiscountPriceVo) {
+    public R calculateOrderDiscountPrice(@RequestBody CalculateOrderDiscountPriceVO calculateOrderDiscountPriceVo) {
 
         try {
-            List<GoodsDetailsDto> queryGoodsVos = orderService.calculateOrderDiscountPrice(calculateOrderDiscountPriceVo);
-            return R.ok().put("goodsList", queryGoodsVos);
+            CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO = orderService.calculateOrderDiscountPrice(calculateOrderDiscountPriceVo);
+            return R.ok().put("data", calculateOrderDiscountPriceResponseVO);
         } catch (Exception e) {
             return R.error("计算出错!请联系管理员!" + e.getMessage());
         }

+ 3 - 3
kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java

@@ -3,7 +3,7 @@ package com.kmall.admin.dao;
 import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
@@ -110,10 +110,10 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
     /**
      * 查询库存及sku的信息,查询出来的库存是门店的库存
      *
-     * @param queryGoodsVoList 查询条件,包含商品条码、sku、门店id
+     * @param queryGoodsVOList 查询条件,包含商品条码、sku、门店id
      * @return 商品信息
      */
-    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVo> queryGoodsVoList);
+    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVO> queryGoodsVOList);
 
     /**
      * 根据产品条码和sku查询保税展示补货的商品

+ 2 - 2
kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java

@@ -1,6 +1,6 @@
 package com.kmall.admin.entity;
 
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import org.springframework.beans.BeanUtils;
 
 import java.io.Serializable;
@@ -282,7 +282,7 @@ public class GoodsEntity implements Serializable {
     public GoodsEntity() {
     }
 
-    public GoodsEntity(QueryGoodsVo queryGoodsVo) {
+    public GoodsEntity(QueryGoodsVO queryGoodsVo) {
         BeanUtils.copyProperties(this, queryGoodsVo);
         this.goodsNumber = queryGoodsVo.getSellVolume();
     }

+ 11 - 4
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java

@@ -19,24 +19,27 @@ public class Constants {
         /**
          * 满赠活动
          */
-        MZ("mz", "满赠"),
+        MZ("mz", "满赠", 3),
         /**
          * 限时特价活动
          */
-        LSCX("lscx", "限时特价"),
+        LSCX("lscx", "限时特价", 1),
         /**
          * 优惠券活动
          */
-        YHJ("yhj", "优惠券")
+        YHJ("yhj", "优惠券", 5)
         ;
 
         private final String topicCode;
 
         private final String topicName;
 
-        ActivityTopicEnum(String topicCode, String topicName) {
+        private final Integer priority;
+
+        ActivityTopicEnum(String topicCode, String topicName, Integer priority) {
             this.topicCode = topicCode;
             this.topicName = topicName;
+            this.priority = priority;
         }
 
         public String getTopicCode() {
@@ -46,6 +49,10 @@ public class Constants {
         public String getTopicName() {
             return topicName;
         }
+
+        public Integer getPriority() {
+            return priority;
+        }
     }
 
     /**

+ 42 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceResponseVO.java

@@ -0,0 +1,42 @@
+package com.kmall.admin.haikong.vo;
+
+import com.kmall.admin.dto.GoodsDetailsDto;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 计算优惠后价格响应类
+ * @author lhm
+ * @createDate 2021-11-22
+ */
+public class CalculateOrderDiscountPriceResponseVO {
+
+    private BigDecimal orderTotalPrice;
+
+    private List<GoodsDetailsDto> goodsDetailsDtos;
+
+    public BigDecimal getOrderTotalPrice() {
+        return orderTotalPrice;
+    }
+
+    public void setOrderTotalPrice(BigDecimal orderTotalPrice) {
+        this.orderTotalPrice = orderTotalPrice;
+    }
+
+    public List<GoodsDetailsDto> getGoodsDetailsDtos() {
+        return goodsDetailsDtos;
+    }
+
+    public void setGoodsDetailsDtos(List<GoodsDetailsDto> goodsDetailsDtos) {
+        this.goodsDetailsDtos = goodsDetailsDtos;
+    }
+
+    @Override
+    public String toString() {
+        return "CalculateOrderDiscountPriceResponseVO{" +
+                "orderTotalPrice=" + orderTotalPrice +
+                ", goodsDetailsDtos=" + goodsDetailsDtos +
+                '}';
+    }
+}

+ 14 - 4
kmall-admin/src/main/java/com/kmall/admin/vo/CalculateOrderDiscountPriceVo.java → kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceVO.java

@@ -1,14 +1,15 @@
-package com.kmall.admin.vo;
+package com.kmall.admin.haikong.vo;
 
 import com.kmall.admin.dto.GoodsDetailsDto;
 
 import java.util.List;
 
 /**
+ * 计算优惠后价格请求参数
  * @author lhm
  * @createDate 2021-11-19
  */
-public class CalculateOrderDiscountPriceVo {
+public class CalculateOrderDiscountPriceVO {
 
     private String storeId;
 
@@ -16,10 +17,10 @@ public class CalculateOrderDiscountPriceVo {
 
     private List<GoodsDetailsDto> goodsList;
 
-    public CalculateOrderDiscountPriceVo() {
+    public CalculateOrderDiscountPriceVO() {
     }
 
-    public CalculateOrderDiscountPriceVo(String storeId, String memberCode, List<GoodsDetailsDto> goodsList) {
+    public CalculateOrderDiscountPriceVO(String storeId, String memberCode, List<GoodsDetailsDto> goodsList) {
         this.storeId = storeId;
         this.memberCode = memberCode;
         this.goodsList = goodsList;
@@ -48,4 +49,13 @@ public class CalculateOrderDiscountPriceVo {
     public void setGoodsList(List<GoodsDetailsDto> goodsList) {
         this.goodsList = goodsList;
     }
+
+    @Override
+    public String toString() {
+        return "CalculateOrderDiscountPriceVO{" +
+                "storeId='" + storeId + '\'' +
+                ", memberCode='" + memberCode + '\'' +
+                ", goodsList=" + goodsList +
+                '}';
+    }
 }

+ 3 - 3
kmall-admin/src/main/java/com/kmall/admin/haikong/vo/QueryGoodsVo.java → kmall-admin/src/main/java/com/kmall/admin/haikong/vo/QueryGoodsVO.java

@@ -8,7 +8,7 @@ import java.util.Objects;
  * @author lhm
  * @createDate 2021-11-15
  */
-public class QueryGoodsVo {
+public class QueryGoodsVO {
 
     /**
      * 商品条码
@@ -311,7 +311,7 @@ public class QueryGoodsVo {
 
     @Override
     public String toString() {
-        return "QueryGoodsVo{" +
+        return "QueryGoodsVO{" +
                 "prodBarcode='" + prodBarcode + '\'' +
                 ", sku='" + sku + '\'' +
                 ", storeId=" + storeId +
@@ -356,7 +356,7 @@ public class QueryGoodsVo {
         if (Objects.isNull(obj)) {
             return false;
         }
-        if (obj instanceof QueryGoodsVo) {
+        if (obj instanceof QueryGoodsVO) {
             return this.hashCode() == obj.hashCode();
         }
         return false;

+ 3 - 3
kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java

@@ -6,7 +6,7 @@ import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
 import com.kmall.admin.entity.TaxErrorRecordEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
 
 import java.util.List;
@@ -231,10 +231,10 @@ public interface GoodsService {
 
     /**
      * 查询库存及sku的信息,查询出来的库存是门店的库存
-     * @param queryGoodsVoList 查询条件,包含商品条码、sku、门店id
+     * @param queryGoodsVOList 查询条件,包含商品条码、sku、门店id
      * @return              商品信息
      */
-    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVo> queryGoodsVoList);
+    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVO> queryGoodsVOList);
 
     /**
      * 根据产品条码和sku查询保税展示补货的商品

+ 3 - 4
kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java

@@ -3,8 +3,8 @@ package com.kmall.admin.service;
 import com.kmall.admin.dto.*;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
-import com.kmall.admin.vo.CalculateOrderDiscountPriceVo;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.common.utils.Query;
 import com.kmall.common.utils.R;
 import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
@@ -12,7 +12,6 @@ import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult
 import com.kmall.common.utils.print.ticket.item.Ticket;
 import com.kmall.common.utils.wechat.WechatRefundApiResult;
 import net.sf.json.JSONObject;
-import org.apache.ibatis.annotations.Param;
 
 import java.io.IOException;
 import java.util.List;
@@ -242,5 +241,5 @@ public interface OrderService {
      * @param calculateOrderDiscountPriceVo 请求参数
      * @return  商品集合
      */
-    List<GoodsDetailsDto> calculateOrderDiscountPrice(CalculateOrderDiscountPriceVo calculateOrderDiscountPriceVo);
+    CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPrice(CalculateOrderDiscountPriceVO calculateOrderDiscountPriceVo);
 }

+ 4 - 10
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -14,10 +14,7 @@ import com.kmall.admin.entity.kmall2eccs.KtoEccsEntity;
 import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.entity.shop.ShopErrorPriceRecordEntity;
 import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
-import com.kmall.admin.haikong.dto.Criteria;
-import com.kmall.admin.haikong.dto.WareQueryStockParamDTO;
-import com.kmall.admin.haikong.dto.WareQueryStockResponseDTO;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.admin.service.*;
 import com.kmall.admin.service.kmall2eccs.KtoEccsService;
 import com.kmall.admin.service.mk.MkActivitiesService;
@@ -27,12 +24,10 @@ import com.kmall.admin.service.shop.ShopErrorPriceRecordService;
 import com.kmall.admin.utils.CalculateTax;
 import com.kmall.admin.utils.GoodsUtils;
 import com.kmall.admin.utils.ShiroUtils;
-import com.kmall.admin.utils.jackson.JacksonUtil;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
 import com.kmall.common.constant.Dict;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.common.utils.*;
-import com.kmall.manager.manager.express.sf.ServiceException;
 import com.kmall.manager.manager.redis.JedisUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,7 +39,6 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -2463,12 +2457,12 @@ public class GoodsServiceImpl implements GoodsService {
     /**
      * 查询库存及sku的信息,查询出来的库存是门店的库存
      *
-     * @param queryGoodsVoList 查询条件,包含商品条码、sku、门店id
+     * @param queryGoodsVOList 查询条件,包含商品条码、sku、门店id
      * @return 商品信息
      */
     @Override
-    public List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVo> queryGoodsVoList) {
-        return goodsDao.queryGoodsStockByQueryGoodsVoList(queryGoodsVoList);
+    public List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVO> queryGoodsVOList) {
+        return goodsDao.queryGoodsStockByQueryGoodsVoList(queryGoodsVOList);
     }
 
     /**

+ 292 - 211
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.ImmutableBiMap;
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.gson.Gson;
 import com.google.gson.internal.LinkedTreeMap;
@@ -21,7 +20,6 @@ import com.kmall.admin.dao.vip.Mall2MemberPointsDao;
 import com.kmall.admin.dao.vip.Mall2PointsRulesDao;
 import com.kmall.admin.dto.*;
 import com.kmall.admin.entity.*;
-import com.kmall.admin.entity.kmall2eccs.KtoEccsEntity;
 import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
 import com.kmall.admin.entity.record.NewRetailOrderRestoreStockRecordEntity;
@@ -33,7 +31,8 @@ import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.haikong.constant.Constants;
 import com.kmall.admin.haikong.dto.WareQueryStockResponseDTO;
 import com.kmall.admin.haikong.utils.ListUtils;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
 import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
 import com.kmall.admin.haikong.client.VmcShopTemplate;
@@ -53,7 +52,7 @@ import com.kmall.admin.utils.data.response.ResponseMessageData;
 import com.kmall.admin.utils.jackson.JacksonUtil;
 import com.kmall.admin.utils.oms.OmsSign;
 import com.kmall.admin.utils.pdf.BarcodeUtil;
-import com.kmall.admin.vo.CalculateOrderDiscountPriceVo;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.admin.websocket.WebSocketServer;
 import com.kmall.api.entity.OrderGoodsRestoreVo;
 import com.kmall.api.entity.OrderGoodsVo;
@@ -82,9 +81,7 @@ import com.kmall.manager.manager.print.ticket.TicketPrintUtil;
 import com.kmall.manager.manager.redis.JedisUtil;
 import com.kmall.manager.manager.wechat.WechatUtil;
 import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
-import com.qiniu.util.Json;
 import okhttp3.Request;
-import org.apache.shiro.crypto.hash.Hash;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -2066,9 +2063,9 @@ public class OrderServiceImpl implements OrderService {
         List<GoodsEntity> goodsEntities = new ArrayList<>();
 
         // TODO 根据商品条码、sku、门店id查询相对应的商品信息,并组装成对象
-        List<QueryGoodsVo> queryGoodsVoList = new ArrayList<>();
+        List<QueryGoodsVO> queryGoodsVOList = new ArrayList<>();
         goodsList.forEach(map -> {
-            QueryGoodsVo queryGoodsVo = new QueryGoodsVo();
+            QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
             queryGoodsVo.setProdBarcode((String) map.get("prodBarcode"));
             queryGoodsVo.setSku((String) map.get("goodsSn"));
             queryGoodsVo.setStoreId(storeId);
@@ -2076,18 +2073,18 @@ public class OrderServiceImpl implements OrderService {
             queryGoodsVo.setRetailPrice(new BigDecimal(String.valueOf(map.get("retailPrice"))));
             queryGoodsVo.setGoodsTaxes(new BigDecimal(String.valueOf(map.get("goodstaxes"))));
             queryGoodsVo.setDisCountedPrice(new BigDecimal(String.valueOf(map.get("disCountedPrice"))));
-            queryGoodsVoList.add(queryGoodsVo);
+            queryGoodsVOList.add(queryGoodsVo);
         });
         // 将在循环中查询数据库改为一次性查询
-        List<GoodsEntity> goodsEntityList = goodsService.queryGoodsStockByQueryGoodsVoList(queryGoodsVoList);
+        List<GoodsEntity> goodsEntityList = goodsService.queryGoodsStockByQueryGoodsVoList(queryGoodsVOList);
         // 复制集合数据
         ListUtils listUtils = BeanUtils.instantiate(ListUtils.class);
-        listUtils.copyList(goodsEntityList, queryGoodsVoList);
+        listUtils.copyList(goodsEntityList, queryGoodsVOList);
         // 用来存储是否达到满赠条件的map
         Map<String, BigDecimal> categoryConditionMap = new HashMap<>();
         Map<String, BigDecimal> brandConditionMap = new HashMap<>();
 
-        for (QueryGoodsVo goodsEntity : queryGoodsVoList) {
+        for (QueryGoodsVO goodsEntity : queryGoodsVOList) {
             OrderGoodsEntity orderGoodsEntity = new OrderGoodsEntity();
             // 要购买的数量
             Integer sellVolume = goodsEntity.getSellVolume();
@@ -3980,20 +3977,27 @@ public class OrderServiceImpl implements OrderService {
      * @return 商品集合
      */
     @Override
-    public List<GoodsDetailsDto> calculateOrderDiscountPrice(CalculateOrderDiscountPriceVo calculateOrderDiscountPriceVo) {
+    public CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPrice(CalculateOrderDiscountPriceVO calculateOrderDiscountPriceVo) {
         if (Objects.isNull(calculateOrderDiscountPriceVo)) {
             LOGGER.error("计算活动优惠价格,请求参数为null!");
             throw new ServiceException("计算活动优惠价格,请求参数为null!");
         }
+        CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO = new CalculateOrderDiscountPriceResponseVO();
         String storeId = calculateOrderDiscountPriceVo.getStoreId();
+        String memberCode = calculateOrderDiscountPriceVo.getMemberCode();
         List<GoodsDetailsDto> goodsDetailsDtos = calculateOrderDiscountPriceVo.getGoodsList();
-        List<QueryGoodsVo> goodsVos = goodsDetailsDtos.stream().map(good -> {
-            QueryGoodsVo queryGoodsVo = new QueryGoodsVo();
+        BigDecimal orderTotalPrice = BigDecimal.ZERO;
+        List<QueryGoodsVO> goodsVos = new ArrayList<>();
+        for (GoodsDetailsDto good : goodsDetailsDtos) {
+            QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
             BeanUtils.copyProperties(good, queryGoodsVo);
             queryGoodsVo.setSku(good.getGoodsSn());
             queryGoodsVo.setStoreId(Integer.parseInt(storeId));
-            return queryGoodsVo;
-        }).collect(Collectors.toList());
+            orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount());
+            goodsVos.add(queryGoodsVo);
+        }
+        calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
+        calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
 
         // 查询商品表
         List<GoodsEntity> goodsEntities = goodsService.queryGoodsStockByQueryGoodsVoList(goodsVos);
@@ -4003,7 +4007,15 @@ public class OrderServiceImpl implements OrderService {
          * 参数: 当前时间  门店id
          */
         List<MkActivitiesEntity> mkActivitiesEntityList = mkActivitiesService.queryByNow(storeId, DateUtils.format(new Date(), "yyyy-MM-dd"));
-
+        // 活动优先级判定,特价>打折>满减/满赠>优惠券>积分抵扣;
+//        List<Constants.ActivityTopicEnum> activityTopicEnums = Arrays.asList(Constants.ActivityTopicEnum.values());
+//        for (MkActivitiesEntity mkActivitiesEntity : mkActivitiesEntityList) {
+//            for (Constants.ActivityTopicEnum activityTopicEnum : activityTopicEnums) {
+//                if (activityTopicEnum.get) {
+//
+//                }
+//            }
+//        }
         /*
          * 活动相关规则:
          * 1. 优先优惠券再去计算积分
@@ -4011,8 +4023,8 @@ public class OrderServiceImpl implements OrderService {
          * 3. 任何活动都优先于积分计算
          * 4. 活动之间具有互斥性
          */
-        if (CollectionUtils.isEmpty(mkActivitiesEntityList)) {
-            LOGGER.info("当前时间门店【{}】,无相关活动信息!", storeId);
+        if (CollectionUtils.isEmpty(mkActivitiesEntityList) && org.springframework.util.StringUtils.isEmpty(memberCode)) {
+            LOGGER.info("门店【{}】,在当前时间无相关活动信息!", storeId);
             for (GoodsDetailsDto goodsDetailsDto : goodsDetailsDtos) {
                 GoodsEntity goodsEntity = new GoodsEntity();
                 BeanUtils.copyProperties(goodsDetailsDto, goodsEntity);
@@ -4022,136 +4034,199 @@ public class OrderServiceImpl implements OrderService {
                 // 预估税
                 goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
             }
-            return goodsDetailsDtos;
+            calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
+            return calculateOrderDiscountPriceResponseVO;
         }
 
         List<Integer> brandIdList = goodsEntities.stream().map(GoodsEntity::getBrandId).collect(Collectors.toList());
         List<Integer> categoryIdList = goodsEntities.stream().map(GoodsEntity::getCategoryId).collect(Collectors.toList());
-
-        AtomicBoolean activityFlag = new AtomicBoolean(false);
+        // 活动互斥标识
+        AtomicBoolean activityFlag = new AtomicBoolean(true);
         // 判断活动类型,并确定购物栏中商品是否满足活动条件
         mkActivitiesEntityList.forEach(mkActivitiesEntity -> {
             String mkaStoreId = mkActivitiesEntity.getMkaStoreId();
             Long mkaId = mkActivitiesEntity.getMkaId();
             String mkaTopic = mkActivitiesEntity.getMkaTopic();
             Constants.ActivityTopicEnum activityTopicEnum = Constants.ActivityTopicEnum.valueOf(mkaTopic);
-            switch (activityTopicEnum) {
-                case MZ:
-                    // 判断商品是否符合满赠活动要求
-                    MkActivitiesFullGiftEntity mkActivitiesFullGiftEntity = mkActivitiesFullGiftService.queryObjectByMkaIdAndStoreId(mkaId.intValue(), storeId);
-                    if (Objects.isNull(mkActivitiesFullGiftEntity)) {
-                        LOGGER.error("查询满赠活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
-                        throw new ServiceException(String.format("查询满赠活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
-                    }
-                    Long brandId = mkActivitiesFullGiftEntity.getBrandId();
-                    Long categoryId = mkActivitiesFullGiftEntity.getCategoryId();
-                    Constants.ActivityType fullGiftActivityType = Constants.ActivityType.valueOf(mkActivitiesFullGiftEntity.getFullGiftType());
-                    switch (fullGiftActivityType) {
-                        case BRAND:
-                            if (brandIdList.contains(brandId.intValue())) {
-                                // 活动包含该商品品牌,此次订单该品牌商品
-                                List<GoodsEntity> goodsEntityList = goodsEntities.stream().filter(goodsEntity -> brandId.intValue() == goodsEntity.getBrandId()).collect(Collectors.toList());
-                                AtomicReference<BigDecimal> brandTotalPrice = new AtomicReference<>(BigDecimal.ZERO);
-                                goodsEntityList.forEach(goodsEntity -> {
-                                    brandTotalPrice.set(brandTotalPrice.get().add(goodsEntity.getRetailPrice()));
-                                });
-                                if (brandTotalPrice.get().compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) >= 0) {
-                                    // 满足满赠条件
-                                    String giftGoodsSn = mkActivitiesFullGiftEntity.getGiftGoodsSn();
-                                    String giftBarcode = mkActivitiesFullGiftEntity.getGiftBarcode();
-                                    GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(giftBarcode, Integer.parseInt(mkaStoreId), giftGoodsSn);
-                                    GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
-                                    BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
-                                    // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
-                                    BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
-                                    goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
-                                    goodsDetailsDto.setActualPaymentAmount(BigDecimal.ZERO);
-                                    goodsDetailsDto.setActivity("满赠商品");
-                                    goodsDetailsDto.setGiftNumber(mkActivitiesFullGiftEntity.getGiftNumber());
-                                    goodsDetailsDto.setDiscountedPrice(goodsEntity.getRetailPrice());
-                                    // 添加进商品详情列表
-                                    goodsDetailsDtos.add(goodsDetailsDto);
-                                }
+            // 活动之间的优先级:特价>打折>满减/满赠>优惠券>积分抵扣
+            if (activityTopicEnum == Constants.ActivityTopicEnum.LSCX && activityFlag.get()) {
+                // 判断商品是否符合限时特价活动要求
+                List<MkActivitiesPromotionEntity> mkActivitiesPromotionEntities = mkActivitiesPromotionService.queryListByMkaIdAndStoreId(mkaId.intValue(), storeId);
+                if (CollectionUtils.isEmpty(mkActivitiesPromotionEntities)) {
+                    LOGGER.error("查询临时促销活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
+                    throw new ServiceException(String.format("查询临时促销活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
+                }
+                // 限时特价,直接替换实际支付价即可,并且拿特价计算税款
+                mkActivitiesPromotionEntities.forEach(mkActivitiesPromotionEntity -> {
+                    String entityBarcode = mkActivitiesPromotionEntity.getBarcode();
+                    String entityGoodsSn = mkActivitiesPromotionEntity.getGoodsSn();
+                    BigDecimal activityPrice = mkActivitiesPromotionEntity.getActivityPrice();
+                    String shopSn = mkActivitiesPromotionEntity.getShopSn();
+                    goodsEntities.forEach(goodsEntity -> {
+                        String sku = goodsEntity.getSku();
+                        String prodBarcode = goodsEntity.getProdBarcode();
+                        String storeId2 = String.valueOf(goodsEntity.getStoreId());
+                        BigDecimal retailPrice = goodsEntity.getRetailPrice();
+                        if (entityBarcode.equals(prodBarcode) && entityGoodsSn.equals(sku) && shopSn.equals(storeId2)) {
+                            GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                            BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, activityPrice, goodsService).setScale(3, RoundingMode.HALF_UP);
+                            BeanUtils.copyProperties(goodsDetailsDto, goodsEntity);
+                            goodsDetailsDto.setActualPaymentAmount(activityPrice);
+                            goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                            goodsDetailsDto.setActivity("限时促销");
+                            goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
+                            goodsDetailsDtos.add(goodsDetailsDto);
+                            activityFlag.set(false);
+                        }
+                    });
+                });
+            } else if (activityTopicEnum == Constants.ActivityTopicEnum.MZ && activityFlag.get()) {
+                // 判断商品是否符合满赠活动要求
+                MkActivitiesFullGiftEntity mkActivitiesFullGiftEntity = mkActivitiesFullGiftService.queryObjectByMkaIdAndStoreId(mkaId.intValue(), storeId);
+                if (Objects.isNull(mkActivitiesFullGiftEntity)) {
+                    LOGGER.error("查询满赠活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
+                    throw new ServiceException(String.format("查询满赠活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
+                }
+                Long brandId = mkActivitiesFullGiftEntity.getBrandId();
+                Long categoryId = mkActivitiesFullGiftEntity.getCategoryId();
+                Constants.ActivityType fullGiftActivityType = Constants.ActivityType.valueOf(mkActivitiesFullGiftEntity.getFullGiftType());
+                switch (fullGiftActivityType) {
+                    case BRAND:
+                        if (brandIdList.contains(brandId.intValue())) {
+                            // 活动包含该商品品牌,此次订单该品牌商品
+                            List<GoodsEntity> goodsEntityList = goodsEntities.stream().filter(goodsEntity -> brandId.intValue() == goodsEntity.getBrandId()).collect(Collectors.toList());
+                            AtomicReference<BigDecimal> brandTotalPrice = new AtomicReference<>(BigDecimal.ZERO);
+                            goodsEntityList.forEach(goodsEntity -> {
+                                brandTotalPrice.set(brandTotalPrice.get().add(goodsEntity.getRetailPrice()));
+                            });
+                            if (brandTotalPrice.get().compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) >= 0) {
+                                // 满足满赠条件
+                                String giftGoodsSn = mkActivitiesFullGiftEntity.getGiftGoodsSn();
+                                String giftBarcode = mkActivitiesFullGiftEntity.getGiftBarcode();
+                                GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(giftBarcode, Integer.parseInt(mkaStoreId), giftGoodsSn);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActualPaymentAmount(BigDecimal.ZERO);
+                                goodsDetailsDto.setActivity("满赠商品");
+                                goodsDetailsDto.setGiftNumber(mkActivitiesFullGiftEntity.getGiftNumber());
+                                goodsDetailsDto.setDiscountedPrice(goodsEntity.getRetailPrice());
+                                // 添加进商品详情列表
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
                             }
-                            break;
-                        case CATEGORY:
-                            if (categoryIdList.contains(categoryId.intValue())) {
-                                // 活动包含该商品分类
-                                List<GoodsEntity> goodsEntityList = goodsEntities.stream().filter(goodsEntity -> brandId.equals(mkActivitiesFullGiftEntity.getCategoryId())).collect(Collectors.toList());
-                                AtomicReference<BigDecimal> categoryTotalPrice = new AtomicReference<>(BigDecimal.ZERO);
-                                goodsEntityList.forEach(goodsEntity -> {
-                                    categoryTotalPrice.set(categoryTotalPrice.get().add(goodsEntity.getRetailPrice()));
-                                });
-                                if (categoryTotalPrice.get().compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) >= 0) {
-                                    // 满足满赠条件
-                                    String giftGoodsSn = mkActivitiesFullGiftEntity.getGiftGoodsSn();
-                                    String giftBarcode = mkActivitiesFullGiftEntity.getGiftBarcode();
-                                    GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(giftBarcode, Integer.parseInt(mkaStoreId), giftGoodsSn);
-                                    GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
-                                    BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
-                                    // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
-                                    BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
-                                    goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
-                                    goodsDetailsDto.setActualPaymentAmount(BigDecimal.ZERO);
-                                    goodsDetailsDto.setActivity("满赠商品");
-                                    goodsDetailsDto.setGiftNumber(mkActivitiesFullGiftEntity.getGiftNumber());
-                                    goodsDetailsDto.setDiscountedPrice(goodsEntity.getRetailPrice());
-                                    // 添加进商品详情列表
-                                    goodsDetailsDtos.add(goodsDetailsDto);
+                        }
+                        break;
+                    case CATEGORY:
+                        if (categoryIdList.contains(categoryId.intValue())) {
+                            // 活动包含该商品分类
+                            List<GoodsEntity> goodsEntityList = goodsEntities.stream().filter(goodsEntity -> brandId.equals(mkActivitiesFullGiftEntity.getCategoryId())).collect(Collectors.toList());
+                            AtomicReference<BigDecimal> categoryTotalPrice = new AtomicReference<>(BigDecimal.ZERO);
+                            goodsEntityList.forEach(goodsEntity -> {
+                                categoryTotalPrice.set(categoryTotalPrice.get().add(goodsEntity.getRetailPrice()));
+                            });
+                            if (categoryTotalPrice.get().compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) >= 0) {
+                                // 满足满赠条件
+                                String giftGoodsSn = mkActivitiesFullGiftEntity.getGiftGoodsSn();
+                                String giftBarcode = mkActivitiesFullGiftEntity.getGiftBarcode();
+                                GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(giftBarcode, Integer.parseInt(mkaStoreId), giftGoodsSn);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActualPaymentAmount(BigDecimal.ZERO);
+                                goodsDetailsDto.setActivity("满赠商品");
+                                goodsDetailsDto.setGiftNumber(mkActivitiesFullGiftEntity.getGiftNumber());
+                                goodsDetailsDto.setDiscountedPrice(goodsEntity.getRetailPrice());
+                                // 添加进商品详情列表
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
+                            }
+                        }
+                        break;
+                    default:
+                        LOGGER.error("未知满赠类型【{},{}】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode());
+                        throw new ServiceException(String.format("未知满赠类型【%s,%s】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode()));
+                }
+            } else if (activityTopicEnum == Constants.ActivityTopicEnum.YHJ && activityFlag.get()) {
+                // 判断商品是否符合优惠券活动要求
+                Map<String, Object> params = new HashMap<>();
+                params.put("shop_sn", storeId);
+                params.put("mka_id", mkaId);
+                List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryList(params);
+                if (CollectionUtils.isEmpty(mkActivitiesCouponEntities)) {
+                    LOGGER.error("查询优惠券活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
+                    throw new ServiceException(String.format("查询优惠券活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
+                }
+                MkActivitiesCouponEntity mkActivitiesCouponEntity = mkActivitiesCouponEntities.get(0);
+                Integer couponEntityBrandId = mkActivitiesCouponEntity.getBrandId();
+                Integer couponEntityCategoryId = mkActivitiesCouponEntity.getCategoryId();
+                Integer couponEntityStoreId = Integer.parseInt(mkActivitiesCouponEntity.getShopSn());
+                BigDecimal couponPrice = mkActivitiesCouponEntity.getCouponPrice();
+                Constants.ActivityType couponActivityType = Constants.ActivityType.valueOf(mkActivitiesCouponEntity.getActivityType());
+                switch (couponActivityType) {
+                    case BRAND:
+                        goodsEntities.forEach(goodsEntity -> {
+                            if (couponEntityBrandId.equals(goodsEntity.getBrandId())) {
+                                BigDecimal retailPrice = goodsEntity.getRetailPrice();
+                                String sku = goodsEntity.getSku();
+                                String prodBarcode = goodsEntity.getProdBarcode();
+                                if (couponPrice.compareTo(retailPrice) <= 0) {
+                                    LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
+                                    throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
                                 }
+                                BigDecimal discountAfterPrice = retailPrice.subtract(couponPrice);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setActualPaymentAmount(discountAfterPrice);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActivity("优惠券活动");
+                                goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
                             }
-                            break;
-                        default:
-                            LOGGER.error("未知满赠类型【{},{}】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode());
-                            throw new ServiceException(String.format("未知满赠类型【%s,%s】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode()));
-                    }
-                    break;
-                case YHJ:
-                    // 判断商品是否符合优惠券活动要求
-                    Map<String, Object> params = new HashMap<>();
-                    params.put("shop_sn", storeId);
-                    params.put("mka_id", mkaId);
-                    List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryList(params);
-                    if (CollectionUtils.isEmpty(mkActivitiesCouponEntities)) {
-                        LOGGER.error("查询优惠券活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
-                        throw new ServiceException(String.format("查询优惠券活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
-                    }
-                    MkActivitiesCouponEntity mkActivitiesCouponEntity = mkActivitiesCouponEntities.get(0);
-                    Integer couponEntityBrandId = mkActivitiesCouponEntity.getBrandId();
-                    Integer couponEntityCategoryId = mkActivitiesCouponEntity.getCategoryId();
-                    Integer couponEntityStoreId = Integer.parseInt(mkActivitiesCouponEntity.getShopSn());
-                    BigDecimal couponPrice = mkActivitiesCouponEntity.getCouponPrice();
-                    Constants.ActivityType couponActivityType = Constants.ActivityType.valueOf(mkActivitiesCouponEntity.getActivityType());
-                    switch (couponActivityType) {
-                        case BRAND:
-                            goodsEntities.forEach(goodsEntity -> {
-                                if (couponEntityBrandId.equals(goodsEntity.getBrandId())) {
-                                    BigDecimal retailPrice = goodsEntity.getRetailPrice();
-                                    String sku = goodsEntity.getSku();
-                                    String prodBarcode = goodsEntity.getProdBarcode();
-                                    if (couponPrice.compareTo(retailPrice) <= 0) {
-                                        LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
-                                        throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
-                                    }
-                                    BigDecimal discountAfterPrice = retailPrice.subtract(couponPrice);
-                                    GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
-                                    BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
-                                    // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
-                                    BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
-                                    goodsDetailsDto.setActualPaymentAmount(discountAfterPrice);
-                                    goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
-                                    goodsDetailsDto.setActivity("优惠券活动");
-                                    goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
-                                    goodsDetailsDtos.add(goodsDetailsDto);
+                        });
+                        break;
+                    case CATEGORY:
+                        goodsEntities.forEach(goodsEntity -> {
+                            if (couponEntityCategoryId.equals(goodsEntity.getCategoryId())) {
+                                BigDecimal retailPrice = goodsEntity.getRetailPrice();
+                                String sku = goodsEntity.getSku();
+                                String prodBarcode = goodsEntity.getProdBarcode();
+                                if (couponPrice.compareTo(retailPrice) <= 0) {
+                                    LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
+                                    throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
                                 }
-                            });
-                            break;
-                        case CATEGORY:
+                                BigDecimal discountAfterPrice = retailPrice.subtract(couponPrice);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setActualPaymentAmount(discountAfterPrice);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActivity("优惠券活动");
+                                goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
+                            }
+                        });
+                        break;
+                    case PRODUCT:
+                        mkActivitiesCouponEntities.forEach(mkActivitiesCouponEntity1 -> {
+                            // 单个商品优惠券,有多条记录
+                            String activityProductBarcode = mkActivitiesCouponEntity1.getBarcode();
+                            String activitySku = mkActivitiesCouponEntity1.getGoodsSn();
                             goodsEntities.forEach(goodsEntity -> {
-                                if (couponEntityCategoryId.equals(goodsEntity.getCategoryId())) {
+                                String sku = goodsEntity.getSku();
+                                String prodBarcode = goodsEntity.getProdBarcode();
+                                // 条码、sku、门店都需一致
+                                if (activitySku.equals(sku) && activityProductBarcode.equals(prodBarcode) && couponEntityStoreId.equals(goodsEntity.getStoreId())) {
                                     BigDecimal retailPrice = goodsEntity.getRetailPrice();
-                                    String sku = goodsEntity.getSku();
-                                    String prodBarcode = goodsEntity.getProdBarcode();
                                     if (couponPrice.compareTo(retailPrice) <= 0) {
                                         LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
                                         throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
@@ -4166,92 +4241,98 @@ public class OrderServiceImpl implements OrderService {
                                     goodsDetailsDto.setActivity("优惠券活动");
                                     goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
                                     goodsDetailsDtos.add(goodsDetailsDto);
+                                    activityFlag.set(false);
                                 }
                             });
-                            break;
-                        case PRODUCT:
-                            mkActivitiesCouponEntities.forEach(mkActivitiesCouponEntity1 -> {
-                                // 单个商品优惠券,有多条记录
-                                String activityProductBarcode = mkActivitiesCouponEntity1.getBarcode();
-                                String activitySku = mkActivitiesCouponEntity1.getGoodsSn();
-                                goodsEntities.forEach(goodsEntity -> {
-                                    String sku = goodsEntity.getSku();
-                                    String prodBarcode = goodsEntity.getProdBarcode();
-                                    // 条码、sku、门店都需一致
-                                    if (activitySku.equals(sku) && activityProductBarcode.equals(prodBarcode) && couponEntityStoreId.equals(goodsEntity.getStoreId())) {
-                                        BigDecimal retailPrice = goodsEntity.getRetailPrice();
-                                        if (couponPrice.compareTo(retailPrice) <= 0) {
-                                            LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
-                                            throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
-                                        }
-                                        BigDecimal discountAfterPrice = retailPrice.subtract(couponPrice);
-                                        GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
-                                        BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
-                                        // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
-                                        BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
-                                        goodsDetailsDto.setActualPaymentAmount(discountAfterPrice);
-                                        goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
-                                        goodsDetailsDto.setActivity("优惠券活动");
-                                        goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
-                                        goodsDetailsDtos.add(goodsDetailsDto);
-                                    }
-                                });
-                            });
-                            break;
-                        default:
-                            LOGGER.error("未知的优惠券活动分类类型:【{},{}】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
-                            throw new ServiceException(String.format("未知的优惠券活动分类类型:【%s,%s】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
-                    }
-
-                    break;
-                case LSCX:
-                    // 判断商品是否符合限时特价活动要求
-                    List<MkActivitiesPromotionEntity> mkActivitiesPromotionEntities = mkActivitiesPromotionService.queryListByMkaIdAndStoreId(mkaId.intValue(), storeId);
-                    if (CollectionUtils.isEmpty(mkActivitiesPromotionEntities)) {
-                        LOGGER.error("查询临时促销活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
-                        throw new ServiceException(String.format("查询临时促销活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
-                    }
-                    // 限时特价,直接替换实际支付价即可,并且拿特价计算税款
-                    mkActivitiesPromotionEntities.forEach(mkActivitiesPromotionEntity -> {
-                        String entityBarcode = mkActivitiesPromotionEntity.getBarcode();
-                        String entityGoodsSn = mkActivitiesPromotionEntity.getGoodsSn();
-                        BigDecimal activityPrice = mkActivitiesPromotionEntity.getActivityPrice();
-                        String shopSn = mkActivitiesPromotionEntity.getShopSn();
-                        goodsEntities.forEach(goodsEntity -> {
-                            String sku = goodsEntity.getSku();
-                            String prodBarcode = goodsEntity.getProdBarcode();
-                            String storeId2 = String.valueOf(goodsEntity.getStoreId());
-                            BigDecimal retailPrice = goodsEntity.getRetailPrice();
-                            if (entityBarcode.equals(prodBarcode) && entityGoodsSn.equals(sku) && shopSn.equals(storeId2)) {
-                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
-                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, activityPrice, goodsService).setScale(3, RoundingMode.HALF_UP);
-                                BeanUtils.copyProperties(goodsDetailsDto, goodsEntity);
-                                goodsDetailsDto.setActualPaymentAmount(activityPrice);
-                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
-                                goodsDetailsDto.setActivity("限时促销");
-                                goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
-                                goodsDetailsDtos.add(goodsDetailsDto);
-                            }
                         });
-                    });
-                    break;
-                default:
-                    LOGGER.error("未知的满赠活动分类类型:【{},{}】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
-                    throw new ServiceException(String.format("未知的满赠活动分类类型:【%s,%s】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
+                        break;
+                    default:
+                        LOGGER.error("未知的优惠券活动分类类型:【{},{}】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
+                        throw new ServiceException(String.format("未知的优惠券活动分类类型:【%s,%s】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
+                }
+            } else {
+                LOGGER.error("未知的满赠活动分类类型:【{},{}】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
+                throw new ServiceException(String.format("未知的满赠活动分类类型:【%s,%s】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
             }
         });
 
-        // TODO 计算完活动优惠后,计算积分抵扣。
-        String memberCode = calculateOrderDiscountPriceVo.getMemberCode();
-        try {
-            haiKongMemberTemplate.getMemberInfoByCode("{\"code\":" + memberCode + "}");
-        } catch (Exception e) {
-            throw new ServiceException(e);
+        // 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
+        if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
+            String memberInfoByCodeResponseJson;
+            Response<MemberInfoDTO> response;
+            try {
+                // 查询会员信息
+                memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByCode("{\"code\":" + memberCode + "}");
+                response = JacksonUtil.fromListJson(memberInfoByCodeResponseJson, new TypeReference<Response<MemberInfoDTO>>() {
+                });
+            } catch (Exception e) {
+                LOGGER.error("请求会员系统失败或处理响应失败!", e);
+                throw new ServiceException(e);
+            }
+            BigDecimal afterDiscountPrice;
+            if (Objects.nonNull(response) && response.getSuccess()) {
+                MemberInfoDTO memberInfoDTO = response.getData();
+                Integer score = memberInfoDTO.getScore();
+                if (Objects.nonNull(score) && score > 0) {
+                    // 有积分
+                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, storeId, memberCode);
+                    calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
+                    // 订单完成后再添加积分消费记录,以及同步积分信息
+                }
+            } else if (Objects.nonNull(response)) {
+                LOGGER.error("查询会员信息失败!响应结果:{}", memberInfoByCodeResponseJson);
+                throw new ServiceException(String.format("错误码:%s,错误信息:%s", response.getErrorCode(), response.getErrorMessage()));
+            }
         }
-
-        return goodsDetailsDtos;
+        calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
+        orderTotalPrice = BigDecimal.ZERO;
+        for (GoodsDetailsDto goodsDetailsDto : goodsDetailsDtos) {
+            orderTotalPrice = orderTotalPrice.add(goodsDetailsDto.getActualPaymentAmount());
+        }
+        calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
+        return calculateOrderDiscountPriceResponseVO;
     }
 
+    /**
+     * 计算积分抵扣后的订单总金额
+     * @param orderTotalPrice   订单商品详情
+     * @param score             积分
+     * @param storeId           门店id
+     * @param memberCode        会员码
+     * @return                  积分抵扣后的订单总金额
+     */
+    private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice, Integer score, String storeId, String memberCode) {
+        // 1. 判断是否有积分,是否需要计算积分抵扣后的价格
+        AtomicBoolean isCalculateScorePrice = new AtomicBoolean(false);
+        if (Objects.nonNull(score) && score > 0) {
+            isCalculateScorePrice.set(true);
+        }
+        // 2. 计算积分抵扣后的总价格
+        if (isCalculateScorePrice.get()) {
+            // 3-1. 计算总价的50%,百分比可以进行设置
+            BigDecimal halfPrice = orderTotalPrice.multiply(new BigDecimal("0.5")).setScale(2, BigDecimal.ROUND_HALF_UP);
+            Integer scoreLimit = haiKongProperties.getScoreLimit();
+            if (score < scoreLimit) {
+                LOGGER.warn("用户【{}】的积分数量为:{},最低需要30积分才能抵扣!", memberCode, score);
+                return orderTotalPrice;
+            } else {
+                // 3-2. 计算出积分能抵扣的价格
+                int scoreMayDeductionPrice = (int) (score / scoreLimit);
+                BigDecimal scoreMayDeductionPriceDecimal = new BigDecimal(scoreMayDeductionPrice);
+                // 3-3. 计算积分抵扣后的价格
+                if (halfPrice.compareTo(scoreMayDeductionPriceDecimal) > 0) {
+                    // 积分能抵扣的金额大于订单总额的50%,按50%抵扣
+                    scoreMayDeductionPriceDecimal = halfPrice;
+                }
+                orderTotalPrice = orderTotalPrice.subtract(scoreMayDeductionPriceDecimal);
+                LOGGER.info("会员【{}】,积分抵扣前剩余:{},积分抵扣订单金额后剩余:{},积分抵扣后的订单总额为:{}", memberCode, score, scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)), orderTotalPrice);
+            }
+        } else {
+            LOGGER.info("会员【{}】的积分为0,不参加积分抵扣!", memberCode);
+        }
+        return orderTotalPrice;
+
+    }
 
     /**
      * 设置订单数据

+ 3 - 2
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -2009,7 +2009,7 @@ function toRefund(){
 calculateOrderPrice = function() {
     let param = {
         'storeId': sessionStorage.getItem("storeId"),
-        'memberCode': vm.couponBarCode,
+        'memberCode': vm.$refs.couponBarCode.value,
         'goodsList' : vm.goodsList
     };
     console.log("请求参数===>" + JSON.stringify(param));
@@ -2021,12 +2021,13 @@ calculateOrderPrice = function() {
         data: JSON.stringify(param),
         success: function (r) {
             if (r.code === 0) {
-                let calGoodsList = r.goodsList;
+                let calGoodsList = r.data.goodsDetailsDtos;
                 // 更新购物栏中数据
                 console.log("返回====>" + JSON.stringify(r));
                 console.log("计算前数据===>" + JSON.stringify(vm.goodsList));
                 vm.goodsList.clear();
                 calGoodsList.forEach(goods => vm.goodsList.push(goods));
+                vm.actualPrice = r.data.orderTotalPrice;
                 console.log("计算后数据===>" + JSON.stringify(calGoodsList));
                 console.log("替换后数据===>" + JSON.stringify(vm.goodsList));