1
0
فهرست منبع

活动流程优化,活动新增优先级处理,营销活动前端页面修改

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

+ 11 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/mk/MkActivityFormController.java

@@ -12,6 +12,7 @@ import com.kmall.common.utils.R;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -38,7 +39,11 @@ public class MkActivityFormController {
         Query query = new Query(params);
 
         List<MkActivityFormEntity> mkActivityFormList = mkActivityFormService.queryList(query);
-        int total = mkActivityFormService.queryTotal(query);
+//        int total = mkActivityFormService.queryTotal(query);
+        int total = 0;
+        if (!CollectionUtils.isEmpty(mkActivityFormList)) {
+            total = mkActivityFormList.size();
+        }
 
         PageUtils pageUtil = new PageUtils(mkActivityFormList, total, query.getLimit(), query.getPage());
 
@@ -117,8 +122,11 @@ public class MkActivityFormController {
         Query query = new Query(params);
 
         List<MkActivitiesEntity> mkActivityFormList = mkActivityFormService.queryMkactivitiesList(query);
-        int total = mkActivityFormService.queryMkactivitiesTotal(query);
-
+//        int total = mkActivityFormService.queryMkactivitiesTotal(query);
+        int total = 0;
+        if (!CollectionUtils.isEmpty(mkActivityFormList)) {
+            total = mkActivityFormList.size();
+        }
         PageUtils pageUtil = new PageUtils(mkActivityFormList, total, query.getLimit(), query.getPage());
 
         return R.ok().put("page", pageUtil);

+ 11 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesCouponDao.java

@@ -4,6 +4,8 @@ import com.kmall.admin.entity.MkActivitiesCouponEntity;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 营销活动-优惠券Dao
  *
@@ -24,4 +26,13 @@ public interface MkActivitiesCouponDao extends BaseDao<MkActivitiesCouponEntity>
                                             , @Param("currentTime") String currentTime);
 
     MkActivitiesCouponEntity queryByCouponSn(@Param("couponSn") String couponSn , @Param("currentTime") String currentTime);
+
+    /**
+     * 根据活动id和门店id查询门店优惠券活动
+     *
+     * @param mkaId   活动id
+     * @param storeId 门店id
+     * @return 优惠券活动
+     */
+    List<MkActivitiesCouponEntity> queryListByMkaIdAndStoreId(@Param("mkaId") Long mkaId, @Param("storeId") String storeId);
 }

+ 28 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/mk/MkActivitiesEntity.java

@@ -11,7 +11,7 @@ import java.util.Date;
  * @email admin@qhdswl.com
  * @date 2020-09-22 10:16:14
  */
-public class MkActivitiesEntity implements Serializable {
+public class MkActivitiesEntity implements Serializable, Comparable {
     private static final long serialVersionUID = 1L;
 
     /**
@@ -98,6 +98,11 @@ public class MkActivitiesEntity implements Serializable {
      */
     private String storeName;
 
+    /**
+     * 优先级
+     */
+    private Integer priority;
+
 
     /**
      * 设置:编号
@@ -329,4 +334,26 @@ public class MkActivitiesEntity implements Serializable {
     public void setModerName(String moderName) {
         this.moderName = moderName;
     }
+
+    public Integer getPriority() {
+        return priority;
+    }
+
+    public void setPriority(Integer priority) {
+        this.priority = priority;
+    }
+
+    /**
+     * 按优先级排序
+     * @param o 传入的对象
+     * @return  结果
+     */
+    @Override
+    public int compareTo(Object o) {
+        if (this.getPriority() > ((MkActivitiesEntity) o).getPriority()) {
+            return 1;
+        } else {
+            return -1;
+        }
+    }
 }

+ 12 - 1
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java

@@ -1,5 +1,7 @@
 package com.kmall.admin.haikong.constant;
 
+import java.util.Arrays;
+
 /**
  * 常量类
  * @author lhm
@@ -27,7 +29,7 @@ public class Constants {
         /**
          * 优惠券活动
          */
-        YHJ("yhj", "优惠券", 5)
+        YHQ("yhq", "优惠券", 5)
         ;
 
         private final String topicCode;
@@ -89,6 +91,15 @@ public class Constants {
         public String getActivityType() {
             return activityType;
         }
+
+        public static ActivityType customValueOf(String val) {
+            for (ActivityType value : ActivityType.values()) {
+                if (val.equals(value.getActivityTypeCode())) {
+                    return value;
+                }
+            }
+            return null;
+        }
     }
 
 }

+ 9 - 1
kmall-admin/src/main/java/com/kmall/admin/service/MkActivitiesCouponService.java

@@ -18,7 +18,7 @@ public interface MkActivitiesCouponService {
     /**
      * 根据主键查询实体
      *
-     * @param id 主键
+     * @param macId 主键
      * @return 实体
      */
     MkActivitiesCouponEntity queryObject(Long macId);
@@ -88,4 +88,12 @@ public interface MkActivitiesCouponService {
     MkActivitiesCouponEntity queryByBarCode(String mkaId, String prodBarcode, String currentTime);
 
     MkActivitiesCouponEntity queryByCouponSn(String couponSn,String currentTime);
+
+    /**
+     * 根据活动id和门店id查询门店优惠券活动
+     * @param mkaId     活动id
+     * @param storeId   门店id
+     * @return          优惠券活动
+     */
+    List<MkActivitiesCouponEntity> queryListByMkaIdAndStoreId(Long mkaId, String storeId);
 }

+ 12 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesCouponServiceImpl.java

@@ -136,4 +136,16 @@ public class MkActivitiesCouponServiceImpl implements MkActivitiesCouponService
     public MkActivitiesCouponEntity queryByCouponSn(String couponSn,String currentTime) {
         return mkActivitiesCouponDao.queryByCouponSn(couponSn,currentTime);
     }
+
+    /**
+     * 根据活动id和门店id查询门店优惠券活动
+     *
+     * @param mkaId   活动id
+     * @param storeId 门店id
+     * @return 优惠券活动
+     */
+    @Override
+    public List<MkActivitiesCouponEntity> queryListByMkaIdAndStoreId(Long mkaId, String storeId) {
+        return mkActivitiesCouponDao.queryListByMkaIdAndStoreId(mkaId, storeId);
+    }
 }

+ 173 - 144
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -4086,19 +4086,22 @@ public class OrderServiceImpl implements OrderService {
         List<Integer> categoryIdList = goodsEntities.stream().map(GoodsEntity::getCategoryId).collect(Collectors.toList());
         // 活动互斥标识
         AtomicBoolean activityFlag = new AtomicBoolean(true);
-        // 判断活动类型,并确定购物栏中商品是否满足活动条件
-        mkActivitiesEntityList.forEach(mkActivitiesEntity -> {
+        // 判断活动类型并排序,再确定购物栏中商品是否满足活动条件
+        mkActivitiesEntityList.stream().sorted().forEach(mkActivitiesEntity -> {
             String mkaStoreId = mkActivitiesEntity.getMkaStoreId();
             Long mkaId = mkActivitiesEntity.getMkaId();
             String mkaTopic = mkActivitiesEntity.getMkaTopic();
-            Constants.ActivityTopicEnum activityTopicEnum = Constants.ActivityTopicEnum.valueOf(mkaTopic);
+            if (org.springframework.util.StringUtils.isEmpty(mkaTopic)) {
+                LOGGER.error("活动主题为空!请检查活动设置!");
+                throw new ServiceException("价活动主题为空!请检查活动设置!");
+            }
+            Constants.ActivityTopicEnum activityTopicEnum = Constants.ActivityTopicEnum.valueOf(mkaTopic.toUpperCase());
             // 活动之间的优先级:特价>打折>满减/满赠>优惠券>积分抵扣
             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 -> {
@@ -4129,148 +4132,140 @@ public class OrderServiceImpl implements OrderService {
                 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);
+                } else {
+                    Long brandId = mkActivitiesFullGiftEntity.getBrandId();
+                    Long categoryId = mkActivitiesFullGiftEntity.getCategoryId();
+                    Constants.ActivityType fullGiftActivityType = Constants.ActivityType.valueOf(mkActivitiesFullGiftEntity.getFullGiftType());
+                    switch (fullGiftActivityType) {
+                        case BRAND:
+                            if (Objects.isNull(brandId)) {
+                                LOGGER.error("满赠活动品牌编号为空,计算失败!请检查活动设置!活动ID:{}", mkActivitiesFullGiftEntity.getMkaId());
+                                throw new ServiceException(String.format("满赠活动品牌编号为空,计算失败!请检查活动设置!活动ID:%s", mkActivitiesFullGiftEntity.getMkaId()));
                             }
-                        }
-                        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);
+                            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;
-                    default:
-                        LOGGER.error("未知满赠类型【{},{}】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode());
-                        throw new ServiceException(String.format("未知满赠类型【%s,%s】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode()));
+                            break;
+                        case CATEGORY:
+                            if (Objects.isNull(categoryId)) {
+                                LOGGER.error("满赠活动分类编号为空,计算失败!请检查活动设置!活动ID:{}", mkActivitiesFullGiftEntity.getMkaId());
+                                throw new ServiceException(String.format("满赠活动分类编号为空,计算失败!请检查活动设置!活动ID:%s", mkActivitiesFullGiftEntity.getMkaId()));
+                            }
+                            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()) {
+            } else if (activityTopicEnum == Constants.ActivityTopicEnum.YHQ && activityFlag.get()) {
                 // 判断商品是否符合优惠券活动要求
-                Map<String, Object> params = new HashMap<>();
-                params.put("shop_sn", storeId);
-                params.put("mka_id", mkaId);
-                List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryList(params);
+                List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryListByMkaIdAndStoreId(mkaId, storeId);
                 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);
+                    LOGGER.error("查询优惠券活动信息结果为空!活动ID:{}, 门店编号:{}", mkaId, storeId);
+                } else {
+                    MkActivitiesCouponEntity mkActivitiesCouponEntity = mkActivitiesCouponEntities.get(0);
+                    Integer couponEntityBrandId = mkActivitiesCouponEntity.getBrandId();
+                    Integer couponEntityCategoryId = mkActivitiesCouponEntity.getCategoryId();
+                    String shopSn = mkActivitiesCouponEntity.getShopSn();
+                    if (org.springframework.util.StringUtils.isEmpty(shopSn)) {
+                        LOGGER.error("优惠券活动门店编号为空,计算失败!请检查活动设置!活动ID:{}", mkActivitiesCouponEntity.getMkaId());
+                        throw new ServiceException(String.format("优惠券活动门店编号为空,计算失败!请检查活动设置!活动ID:%s", mkActivitiesCouponEntity.getMkaId()));
+                    }
+                    Integer couponEntityStoreId = Integer.parseInt(shopSn);
+                    BigDecimal couponPrice = mkActivitiesCouponEntity.getCouponPrice();
+                    Constants.ActivityType couponActivityType = Constants.ActivityType.customValueOf(mkActivitiesCouponEntity.getActivityType());
+                    if (Objects.isNull(couponActivityType)) {
+                        LOGGER.error("错误的优惠券优惠类型:【{}】,请检查活动设置!活动ID:{}", mkActivitiesCouponEntity.getActivityType(), mkActivitiesCouponEntity.getMkaId());
+                        throw new ServiceException(String.format("错误的优惠券优惠类型:【%s】,请检查活动设置!活动ID:%s", mkActivitiesCouponEntity.getActivityType(), mkActivitiesCouponEntity.getMkaId()));
+                    }
+                    switch (couponActivityType) {
+                        case BRAND:
+                            if (Objects.isNull(couponEntityBrandId)) {
+                                LOGGER.error("优惠券活动品牌编号为空,计算失败!请检查活动设置!活动ID:{}", mkActivitiesCouponEntity.getMkaId());
+                                throw new ServiceException(String.format("优惠券活动品牌编号为空,计算失败!请检查活动设置!活动ID:%s", mkActivitiesCouponEntity.getMkaId()));
                             }
-                        });
-                        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));
+                            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);
                                 }
-                                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 CATEGORY:
+                            if (Objects.isNull(couponEntityCategoryId)) {
+                                LOGGER.error("优惠券活动分类编号为空,计算失败!请检查活动设置!活动ID:{}", mkActivitiesCouponEntity.getMkaId());
+                                throw new ServiceException(String.format("优惠券活动分类编号为空,计算失败!请检查活动设置!活动ID:%s", mkActivitiesCouponEntity.getMkaId()));
                             }
-                        });
-                        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())) {
+                                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));
@@ -4288,15 +4283,45 @@ public class OrderServiceImpl implements OrderService {
                                     activityFlag.set(false);
                                 }
                             });
-                        });
-                        break;
-                    default:
-                        LOGGER.error("未知的优惠券活动分类类型:【{},{}】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
-                        throw new ServiceException(String.format("未知的优惠券活动分类类型:【%s,%s】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
+                            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);
+                                        activityFlag.set(false);
+                                    }
+                                });
+                            });
+                            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()));
+                LOGGER.error("未知的活动类型:【{},{}】,请检查活动设置!!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
+                throw new ServiceException(String.format("未知的活动类型:【%s,%s】,请检查活动设置!!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
             }
         });
 
@@ -4325,10 +4350,14 @@ public class OrderServiceImpl implements OrderService {
                 if (Objects.nonNull(score) && score > 0) {
                     // 有积分
                     afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, storeId, memberCode);
+                    LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
                     calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
                     calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
                     // 订单完成后再添加积分消费记录,以及同步积分信息
                     return calculateOrderDiscountPriceResponseVO;
+                } else {
+                    LOGGER.error("会员【{}】积分为0,积分抵扣失败!", memberCode);
+                    throw new ServiceException(String.format("会员【%s】积分为0,积分抵扣失败!", memberCode));
                 }
             } else {
                 LOGGER.error("查询会员信息失败!响应结果:{}", memberInfoByCodeResponseJson);
@@ -4376,7 +4405,7 @@ public class OrderServiceImpl implements OrderService {
                     scoreMayDeductionPriceDecimal = halfPrice;
                 }
                 orderTotalPrice = orderTotalPrice.subtract(scoreMayDeductionPriceDecimal);
-                LOGGER.info("会员【{}】,积分抵扣前剩余:{},积分抵扣订单金额后剩余:{},积分抵扣后的订单总额为:{}", memberCode, score, (score - scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)).intValue()), orderTotalPrice);
+                LOGGER.info("会员【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", memberCode, score, (score - scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)).intValue()));
             }
         } else {
             LOGGER.info("会员【{}】的积分为0,不参加积分抵扣!", memberCode);

+ 23 - 0
kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesCouponDao.xml

@@ -228,4 +228,27 @@
 		</if>
 	</select>
 
+    <select id="queryListByMkaIdAndStoreId" resultMap="mkActivitiesCouponMap">
+		select
+		`mac_id`,
+		`goods_sn`,
+		`barcode`,
+		`shop_sn`,
+		`coupon_sn`,
+		`coupon_price`,
+		`mka_id`,
+		`deadline`,
+		`create_time`,
+		`creater_sn`,
+		`moder_sn`,
+		`update_time`,
+		`activity_type`,
+		`brand_id`,
+		`category_id`,
+		`brand_name`,
+		`category_name`
+		from mk_activities_coupon
+		where mka_id = #{mkaId} and shop_sn = #{storeId}
+	</select>
+
 </mapper>

+ 17 - 7
kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesDao.xml

@@ -18,6 +18,7 @@
         <result property="createrSn" column="creater_sn"/>
         <result property="updateTime" column="update_time"/>
         <result property="moderSn" column="moder_sn"/>
+        <result property="priority" column="priority"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.mk.MkActivitiesEntity">
@@ -35,7 +36,8 @@
 			`create_time`,
 			`creater_sn`,
 			`update_time`,
-			`moder_sn`
+			`moder_sn`,
+			`priority`
 		from mk_activities
 		where mka_id = #{id}
 	</select>
@@ -53,7 +55,8 @@
     		`create_time`,
     		`creater_sn`,
     		`update_time`,
-    		`moder_sn`
+    		`moder_sn`,
+    		`priority`
 		from mk_activities
 		WHERE 1=1
 		<if test="name != null and name.trim() != ''">
@@ -94,7 +97,8 @@
 			`create_time`,
 			`creater_sn`,
 			`update_time`,
-			`moder_sn`)
+			`moder_sn`,
+			`priority`)
 		values(
 			#{mkaTopic},
 			#{merchSn},
@@ -108,7 +112,8 @@
 			#{createTime},
 			#{createrSn},
 			#{updateTime},
-			#{moderSn})
+			#{moderSn},
+			#{priority})
 	</insert>
 
 	<update id="update" parameterType="com.kmall.admin.entity.mk.MkActivitiesEntity">
@@ -127,6 +132,7 @@
 			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
 			<if test="updateTime != null">`update_time` = #{updateTime}, </if>
 			<if test="moderSn != null">`moder_sn` = #{moderSn}</if>
+			<if test="priority != null">`priority` = #{priority}</if>
 		</set>
 		where mka_id = #{mkaId}
 	</update>
@@ -157,13 +163,15 @@
 			create_time,
 			creater_sn,
 			update_time,
-			moder_sn
+			moder_sn,
+			priority
 		from mk_activities
 		where
 			mka_store_id = #{storeId}
 			and mka_start_time &lt; #{currentTime}
 			and mkd_end_time &gt; #{currentTime}
 			and mka_status = 1
+			and mka_id is not null
 	</select>
 
 	<select id="queryByTopic" resultType="com.kmall.admin.entity.mk.MkActivitiesEntity">
@@ -181,7 +189,8 @@
 			create_time,
 			creater_sn,
 			update_time,
-			moder_sn
+			moder_sn,
+			priority
 		from mk_activities
 		where
 			mka_store_id = #{storeId}
@@ -207,7 +216,8 @@
 			create_time,
 			creater_sn,
 			update_time,
-			moder_sn
+			moder_sn,
+			priority
 		from mk_activities ma
 		where
 			mka_store_id = #{storeId}

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

@@ -118,6 +118,7 @@
 		a.mkd_end_early_time,
 		a.create_time,
 		a.creater_sn,
+		a.priority,
 		u.username createrName,
 		a.update_time,
 		a.moder_sn,

+ 3 - 0
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivityform.html

@@ -96,6 +96,9 @@
                     <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
                 </i-select>
             </Form-item>
+            <Form-item label="活动优先级" prop="priority">
+                <i-input v-model="mkActivities.priority" placeholder="活动优先级,数字越小优先级越高,最低为0"/>
+            </Form-item>
             <Form-item label="是否启用" prop="mkaStatus">
                 <Radio-group v-model="mkActivities.mkaStatus">
                     <Radio label="1">

+ 1 - 0
kmall-admin/src/main/webapp/js/mk/mkactivities.js

@@ -7,6 +7,7 @@ $(function () {
 			{label: '活动主题', name: 'mkaTopic', index: 'mka_topic', width: 80},
 			{label: '活动门店id', name: 'mkaStoreId', index: 'mka_store_id', width: 80},
 			{label: '是否启用', name: 'mkaStatus', index: 'mka_status', width: 80},
+			{label: '活动优先级', name: 'priority', index: 'priority', width: 80},
 			{label: '开始时间', name: 'mkaStartTime', index: 'mka_start_time', width: 80},
 			{label: '结束时间', name: 'mkdEndTime', index: 'mkd_end_time', width: 80},
 			{label: '是否提前结束', name: 'mkaEndEarly', index: 'mka_end_early', width: 80},

+ 1 - 0
kmall-admin/src/main/webapp/js/mk/mkactivityform.js

@@ -96,6 +96,7 @@ $(function () {
                     return '';
                 }
             },
+            {label: '活动优先级', name: 'priority', index: 'priority', width: 80, align: 'center'},
             {label: '开始时间', name: 'mkaStartTime', index: 'mka_start_time', width: 80, align: 'center'},
             {label: '结束时间', name: 'mkdEndTime', index: 'mkd_end_time', width: 80, align: 'center'},
             {label: '是否提前结束', name: 'mkaEndEarly', index: 'mka_end_early', width: 60, align: 'center',

+ 2 - 0
sql/kmall_table_alter.sql

@@ -46,3 +46,5 @@ alter table mall2_member_consumption_records add before_score int(11) comment '
 
 alter table mall2_member_consumption_records add after_score int(11) comment '下单之后积分数量';
 
+# 营销活动表
+alter table mk_activities add priority int(11) comment '活动优先级,数字越小优先级越高,最低为0';