浏览代码

活动相关bug修复

lhm 3 年之前
父节点
当前提交
0adc3cf20a

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -1375,8 +1375,10 @@ public class OrderController {
             CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO = orderService.calculateOrderDiscountPrice(calculateOrderDiscountPriceVo);
             return R.ok().put("data", calculateOrderDiscountPriceResponseVO);
         } catch (ServiceException e) {
+            logger.error("计算优惠价出现异常!", e);
             return R.error(e.getMessage());
         } catch (Exception e) {
+            logger.error("计算优惠价出现异常!请联系管理员!", e);
             return R.error("计算出错!请联系管理员!" + e.getMessage());
         }
 

+ 33 - 18
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -4170,6 +4170,7 @@ public class OrderServiceImpl implements OrderService {
 
         // 查询商品表
         List<GoodsEntity> goodsEntities = goodsService.queryGoodsStockByQueryGoodsVoList(goodsVos);
+        Map<String, GoodsEntity> goodsMap = goodsEntities.stream().collect(Collectors.toMap(GoodsEntity::getSku, Function.identity(), (k1, k2) -> k2));
 
         /*
          * 2.查询当前时间,该门店是否有活动,如果有活动,查询开启了哪些营销方式
@@ -4209,7 +4210,7 @@ public class OrderServiceImpl implements OrderService {
 
         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(true);
         // 限时特价活动标识
         AtomicBoolean promotionActivityFlag = new AtomicBoolean(false);
@@ -4235,7 +4236,7 @@ public class OrderServiceImpl implements OrderService {
             }
             Constants.ActivityTopicEnum activityTopicEnum = Constants.ActivityTopicEnum.valueOf(mkaTopic.toUpperCase());
             // 活动之间的优先级:特价>打折>满减/满赠>优惠券>积分抵扣
-            if (activityTopicEnum == Constants.ActivityTopicEnum.LSCX && activityFlag.get()) {
+            if (activityTopicEnum == Constants.ActivityTopicEnum.LSCX) {
                 // 判断商品是否符合限时特价活动要求
                 List<MkActivitiesPromotionEntity> mkActivitiesPromotionEntities = mkActivitiesPromotionService.queryListByMkaIdAndStoreId(mkaId.intValue(), storeId);
                 if (CollectionUtils.isEmpty(mkActivitiesPromotionEntities)) {
@@ -4252,26 +4253,23 @@ public class OrderServiceImpl implements OrderService {
                     if (!org.springframework.util.StringUtils.isEmpty(rejectScore) && Constants.PromotionActivityRejectEnum.REJECT.getCode().equals(rejectScore)) {
                         promotionSkuList.add(entityGoodsSn);
                     }
-                    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();
+                    goodsDetailsDtos.forEach(goodsDetailsDto -> {
+                        String sku = goodsDetailsDto.getSku();
+                        String prodBarcode = goodsDetailsDto.getProdBarcode();
+                        BigDecimal retailPrice = goodsDetailsDto.getRetailPrice();
+                        if (entityBarcode.equals(prodBarcode) && entityGoodsSn.equals(sku) && shopSn.equals(storeId)) {
+                            GoodsEntity goodsEntity = goodsMap.get(sku);
                             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(Constants.ActivityTopicEnum.LSCX.getTopicName());
                             goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
-                            goodsDetailsDtos.add(goodsDetailsDto);
                             activityFlag.set(false);
                             promotionActivityFlag.set(true);
                         }
                     });
                 });
-            } else if (activityTopicEnum == Constants.ActivityTopicEnum.MZ && activityFlag.get()) {
+            } else if (activityTopicEnum == Constants.ActivityTopicEnum.MZ) {
                 // 判断商品是否符合满赠活动要求
                 MkActivitiesFullGiftEntity mkActivitiesFullGiftEntity = mkActivitiesFullGiftService.queryObjectByMkaIdAndStoreId(mkaId.intValue(), storeId);
                 if (Objects.isNull(mkActivitiesFullGiftEntity)) {
@@ -4350,7 +4348,7 @@ public class OrderServiceImpl implements OrderService {
                             throw new ServiceException(String.format("未知满赠类型【%s,%s】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode()));
                     }
                 }
-            } else if (activityTopicEnum == Constants.ActivityTopicEnum.YHQ && activityFlag.get()) {
+            } else if (activityTopicEnum == Constants.ActivityTopicEnum.YHQ) {
                 // 判断商品是否符合优惠券活动要求
                 List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryListByMkaIdAndStoreId(mkaId, storeId);
                 if (CollectionUtils.isEmpty(mkActivitiesCouponEntities)) {
@@ -4468,6 +4466,20 @@ public class OrderServiceImpl implements OrderService {
                 throw new ServiceException(String.format("未知的活动类型:【%s,%s】,请检查活动设置!!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
             }
         });
+        orderTotalPrice = BigDecimal.ZERO;
+        for (GoodsDetailsDto good : goodsDetailsDtos) {
+            QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
+            BeanUtils.copyProperties(good, queryGoodsVo);
+            queryGoodsVo.setSku(good.getGoodsSn());
+            queryGoodsVo.setStoreId(Long.parseLong(storeId));
+            queryGoodsVo.setDisCountedPrice(BigDecimal.ZERO);
+            queryGoodsVo.setTotalPrice(good.getActualPaymentAmount());
+            orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount());
+            goodsVos.add(queryGoodsVo);
+        }
+        calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
+        calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
+
 
         // 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
         if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
@@ -4501,7 +4513,7 @@ public class OrderServiceImpl implements OrderService {
                 Integer score = memberInfoDTO.getScore();
                 if (Objects.nonNull(score) && score > 0) {
                     // 有积分
-                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList);
+                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, activityFlag, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList);
                     LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
                     calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
                     calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
@@ -4534,6 +4546,7 @@ public class OrderServiceImpl implements OrderService {
      * @param score             积分
      * @param memberCode        会员码
      * @param goodsDetailsDtos  订单商品详情
+     * @param activityFlag      是否参加过活动
      * @param calculateOrderDiscountPriceResponseVO 响应数据
      * @param promotionSkuList  参与了限时特价活动并且与积分抵扣互斥的sku集合
      *
@@ -4542,6 +4555,7 @@ public class OrderServiceImpl implements OrderService {
     private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice,
                                                   Integer score,
                                                   String memberCode,
+                                                  AtomicBoolean activityFlag,
                                                   CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO,
                                                   List<GoodsDetailsDto> goodsDetailsDtos,
                                                   List<String> promotionSkuList) {
@@ -4616,6 +4630,7 @@ public class OrderServiceImpl implements OrderService {
                     BigDecimal scoreLimitDecimal = skuScoreLimitMap.get(sku);
                     String prodBarcode = goodsDetailsDto.getProdBarcode();
                     BigDecimal retailPrice = goodsDetailsDto.getRetailPrice();
+                    BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
                     // 计算抵扣,当商品不是最后一个商品
                     if (i < index) {
                         // 商品总价
@@ -4627,7 +4642,7 @@ public class OrderServiceImpl implements OrderService {
                         goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
                         goodsDetailsDto.setDiscountedPrice(discountedPrice);
                         goodsDetailsDto.setDeductionScore(shareScoreItem.intValue());
-                        goodsDetailsDto.setActualPaymentAmount(retailPrice.subtract(discountedPrice));
+                        goodsDetailsDto.setActualPaymentAmount(actualPaymentAmount.subtract(discountedPrice));
                     }
                     // 订单商品详情最后一个商品并且详情不止一个商品
                     if (i == index && size > 1) {// 商品总价
@@ -4637,13 +4652,13 @@ public class OrderServiceImpl implements OrderService {
                         goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
                         goodsDetailsDto.setDiscountedPrice(discountedPrice);
                         goodsDetailsDto.setDeductionScore(shareScoreItem.intValue());
-                        goodsDetailsDto.setActualPaymentAmount(retailPrice.subtract(discountedPrice));
+                        goodsDetailsDto.setActualPaymentAmount(actualPaymentAmount.subtract(discountedPrice));
                     }
                     // 订单商品详情只有一个商品的情况下
                     if (size == 1) {
                         shareScore = scoreIntegerDecimal;
                         // 3-1. 计算总价的50%,百分比可以进行设置,算出整数(向下取整)
-                        BigDecimal halfPrice = orderTotalPrice.multiply(scoreLimitDecimal).setScale(0, BigDecimal.ROUND_FLOOR);
+                        BigDecimal halfPrice = orderTotalPrice.multiply(new BigDecimal("0.5")).setScale(0, BigDecimal.ROUND_FLOOR);
                         // 3-3. 计算积分抵扣后的价格
                         BigDecimal discountedPrice = scoreMayDeductionPriceDecimal;
                         if (halfPrice.compareTo(discountedPrice) <= 0) {
@@ -4653,7 +4668,7 @@ public class OrderServiceImpl implements OrderService {
                         goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
                         goodsDetailsDto.setDiscountedPrice(discountedPrice);
                         goodsDetailsDto.setDeductionScore(shareScore.intValue());
-                        goodsDetailsDto.setActualPaymentAmount(retailPrice.subtract(discountedPrice));
+                        goodsDetailsDto.setActualPaymentAmount(actualPaymentAmount.subtract(discountedPrice));
                     }
                     LOGGER.info("--------------------------------------------------------");
                     LOGGER.info("【计算优惠价】sku:【{}】,条码:【{}】积分抵扣{}元,抵扣积分{}分", sku, prodBarcode, goodsDetailsDto.getDiscountedPrice(), shareScore.intValue());

+ 1 - 0
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -85,6 +85,7 @@
         <result column="prod_name" property="prodName" />
         <result column="prod_record_name" property="prodRecordName" />
         <result column="exit_region_number" property="exitRegionNumber"/>
+        <result column="net_weight" property="netWeight"/>
     </resultMap>
 
     <select id="queryObject" resultType="com.kmall.admin.entity.GoodsEntity">

+ 1 - 1
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -1966,7 +1966,7 @@ function toPayOrder(payCode){
                  'memberPhone': vm.memberPhone,
                  'deductionScore': new BigNumber(vm.deductionScore).toString(),
                  'actualPrice': new BigNumber(vm.actualPrice).toString(),
-                 'scoreDeductionPrice': vm.scoreDeductionPrice,
+                 'scoreDeductionPrice': vm.scoreDeductionPrice.toString(),
                  'scoreLimit': vm.scoreLimit,
                  'beforeScore': vm.beforeScore,
                  'afterScore': vm.afterScore,