Browse Source

Merge remote-tracking branch 'upsteam/master'

zhh 3 years ago
parent
commit
1e0b217c0e
37 changed files with 1137 additions and 212 deletions
  1. 78 0
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderProcessRecordExternalController.java
  2. 11 3
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/MkActivityFormController.java
  3. 11 0
      kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesCouponDao.java
  4. 4 0
      kmall-admin/src/main/java/com/kmall/admin/dao/OrderProcessRecordDao.java
  5. 84 1
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderProcessRecordEntity.java
  6. 14 0
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderProcessRecordHkEntity.java
  7. 28 1
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/MkActivitiesEntity.java
  8. 153 0
      kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2MemberConsumptionRecordsEntity.java
  9. 6 0
      kmall-admin/src/main/java/com/kmall/admin/fromcomm/service/SysConfigService.java
  10. 6 0
      kmall-admin/src/main/java/com/kmall/admin/fromcomm/service/impl/SysConfigServiceImpl.java
  11. 50 33
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongMemberTemplate.java
  12. 1 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongConfig.java
  13. 5 5
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongProperties.java
  14. 12 1
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java
  15. 124 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Message.java
  16. 36 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/MessageCode.java
  17. 46 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/OutRequestMessage.java
  18. 8 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/VmcconnectSignUtils.java
  19. 9 1
      kmall-admin/src/main/java/com/kmall/admin/service/MkActivitiesCouponService.java
  20. 8 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderProcessRecordService.java
  21. 12 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesCouponServiceImpl.java
  22. 23 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderProcessRecordServiceImpl.java
  23. 192 156
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  24. 5 0
      kmall-admin/src/main/resources/XmlTemplate/CouponMerchandiseDtoList.xml
  25. 23 0
      kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesCouponDao.xml
  26. 42 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml
  27. 17 7
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesDao.xml
  28. 1 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivityFormDao.xml
  29. 52 4
      kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2MemberConsumptionRecordsDao.xml
  30. 1 0
      kmall-admin/src/main/resources/spring/spring-shiro.xml
  31. 15 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiescoupon.html
  32. 3 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivityform.html
  33. 1 0
      kmall-admin/src/main/webapp/js/mk/mkactivities.js
  34. 5 0
      kmall-admin/src/main/webapp/js/mk/mkactivitiescoupon.js
  35. 1 0
      kmall-admin/src/main/webapp/js/mk/mkactivityform.js
  36. BIN
      kmall-admin/src/main/webapp/statics/file/activities_coupon_yyyy_mm_dd_v1.0.0.xlsx
  37. 50 0
      sql/kmall_table_alter.sql

+ 78 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/OrderProcessRecordExternalController.java

@@ -0,0 +1,78 @@
+package com.kmall.admin.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.kmall.admin.entity.OrderProcessRecordEntity;
+import com.kmall.admin.entity.OrderProcessRecordHkEntity;
+import com.kmall.admin.fromcomm.service.SysConfigService;
+import com.kmall.admin.haikong.utils.Message;
+import com.kmall.admin.haikong.utils.OutRequestMessage;
+import com.kmall.admin.service.OrderProcessRecordService;
+import com.kmall.admin.utils.jackson.JacksonUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.kmall.admin.haikong.utils.VmcconnectSignUtils.checkMsg;
+
+
+/**
+ * 订单流转过程记录表外部接口
+ *
+ */
+@RestController
+@RequestMapping("/orderProRecordExternal")
+public class OrderProcessRecordExternalController {
+
+    private final Logger logger = LoggerFactory.getLogger(OrderProcessRecordExternalController.class);
+
+    @Autowired
+    private OrderProcessRecordService orderProcessRecordService;
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    /**
+     * 订单流转信息回调通知接口
+     * @return
+     */
+    @PostMapping("/hkNotice")
+    public Message hknoticeMsg(@RequestBody OutRequestMessage outRequestMessage) {
+        try{
+            OrderProcessRecordHkEntity orderProcessRecordHkEntity  = JacksonUtil.fromStringJson(outRequestMessage.getData(), OrderProcessRecordHkEntity.class);
+            //签名验证
+            String strSign =outRequestMessage.getSign()==null?"":outRequestMessage.getSign();
+            String timestamp = outRequestMessage.getTimestamp()==null?"":outRequestMessage.getTimestamp();
+            String key = sysConfigService.getValueHk("HK_NOTICE_KEY");
+            Integer dataNum = Integer.valueOf(sysConfigService.getValueHk("HK_NOTICE_NUM"));
+            if(strSign.equals("")||timestamp.equals("")){
+                return Message.success(false,"参数错误");
+            }
+            if(!strSign.equals(checkMsg(timestamp,key))){
+                return Message.success(false,"签名错误");
+            }
+            List<OrderProcessRecordEntity> orderProcessRecordList = orderProcessRecordHkEntity.getRecordHkList();
+            if(orderProcessRecordList.size()>dataNum){
+                return Message.success(false,"通知数据最多"+dataNum+"条,请分批通知");
+            }
+            // 根据指定属性分组,并统计数量(key:指定属性,value:数量)
+            Map<Object, Long> mapGroup = orderProcessRecordList.stream().collect(Collectors.groupingBy(recordEntity -> recordEntity.getOrderSn(), Collectors.counting()));
+            // 筛选Map中value大于1的key
+            Stream<Object> stringStream = mapGroup.entrySet().stream().filter(entry -> entry.getValue() > 1).map(entry -> entry.getKey());
+            Long num = stringStream.count();
+            if(num>0L){
+                return Message.success(false,"订单数据存在重复");
+            }
+            return orderProcessRecordService.saveHkNoticeMsg(orderProcessRecordList);
+        }catch (Exception e){
+            logger.error("hknoticeMsg---订单流转信息回调通知接口数据="+ JSON.toJSONString(outRequestMessage),e);
+            return Message.success(false,"参数错误");
+        }
+    }
+
+
+}

+ 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);
 }

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/OrderProcessRecordDao.java

@@ -18,4 +18,8 @@ public interface OrderProcessRecordDao extends BaseDao<OrderProcessRecordEntity>
     OrderProcessRecordEntity queryObjectByOrderSn(String orderSn);
 
     List<OrderProcessRecordEntity> queryListBySendSmsStatus(@Param("customsSendSmsStatus") String customsSendSmsStatus);
+
+    void updateHkNoticeMsg(List<OrderProcessRecordEntity> orderProcessRecordList);
+
+    Integer queryHkOrderTotal(List<OrderProcessRecordEntity> orderProcessRecordList);
 }

+ 84 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/OrderProcessRecordEntity.java

@@ -182,7 +182,34 @@ public class OrderProcessRecordEntity implements Serializable {
 
 
     private String customsSendSmsStatus;
-
+    /**
+     * 订单申报时间
+     */
+    private Date orderDeclarationTime;
+    /**
+     * 订单申报状态
+     */
+    private String orderDeclareStatus;
+    /**
+     * 快递公司简称
+     */
+    private String shippingCode;
+    /**
+     * 快递公司名称
+     */
+    private String shippingName;
+    /**
+     * 运单申报时间
+     */
+    private Date ewbStartTime;
+    /**
+     * 清单编号
+     */
+    private String clearNo;
+    /**
+     * 海关清关类型 ,1:放行:2:查验;3:清关失败; 4:其他
+     */
+    private String clearType;
 
     public String getCustomsSendSmsStatus() {
         return customsSendSmsStatus;
@@ -658,4 +685,60 @@ public class OrderProcessRecordEntity implements Serializable {
     public Date getTstm() {
         return tstm;
     }
+
+    public Date getOrderDeclarationTime() {
+        return orderDeclarationTime;
+    }
+
+    public void setOrderDeclarationTime(Date orderDeclarationTime) {
+        this.orderDeclarationTime = orderDeclarationTime;
+    }
+
+    public String getOrderDeclareStatus() {
+        return orderDeclareStatus;
+    }
+
+    public void setOrderDeclareStatus(String orderDeclareStatus) {
+        this.orderDeclareStatus = orderDeclareStatus;
+    }
+
+    public String getShippingCode() {
+        return shippingCode;
+    }
+
+    public void setShippingCode(String shippingCode) {
+        this.shippingCode = shippingCode;
+    }
+
+    public String getShippingName() {
+        return shippingName;
+    }
+
+    public void setShippingName(String shippingName) {
+        this.shippingName = shippingName;
+    }
+
+    public Date getEwbStartTime() {
+        return ewbStartTime;
+    }
+
+    public void setEwbStartTime(Date ewbStartTime) {
+        this.ewbStartTime = ewbStartTime;
+    }
+
+    public String getClearNo() {
+        return clearNo;
+    }
+
+    public void setClearNo(String clearNo) {
+        this.clearNo = clearNo;
+    }
+
+    public String getClearType() {
+        return clearType;
+    }
+
+    public void setClearType(String clearType) {
+        this.clearType = clearType;
+    }
 }

+ 14 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/OrderProcessRecordHkEntity.java

@@ -0,0 +1,14 @@
+package com.kmall.admin.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class OrderProcessRecordHkEntity implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    List<OrderProcessRecordEntity> recordHkList;
+}

+ 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;
+        }
+    }
 }

+ 153 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2MemberConsumptionRecordsEntity.java

@@ -1,6 +1,7 @@
 package com.kmall.admin.entity.vip;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -60,6 +61,62 @@ public class Mall2MemberConsumptionRecordsEntity implements Serializable {
      * +时间戳
      */
     private Date tstm;
+    /**
+     * 会员唯一标识或者电话
+     */
+    private String open_id;
+    /**
+     * 积分变动流水Id
+     */
+    private String statement_id;
+    /**
+     * 回退积分数量
+     */
+    private Integer rollback_score;
+    /**
+     * 渠道自定义积分变动唯一标识,
+     */
+    private String change_id;
+
+    /**
+     * 订单抵扣积分
+     */
+    private Integer deductionScore;
+
+    /**
+     * 会员码
+     */
+    private String memberCode;
+
+    /**
+     * 会员手机号
+     */
+    private String memberPhone;
+
+    /**
+     * 订单总额
+     */
+    private BigDecimal orderTotalPrice;
+
+    /**
+     * 积分抵扣金额
+     */
+    private BigDecimal scoreDeductionPrice;
+
+    /**
+     * 积分抵扣规则,多少积分抵一元
+     */
+    private Integer scoreLimit;
+
+    /**
+     * 下单前积分数量
+     */
+    private Integer beforeScore;
+
+    /**
+     * 下单后积分数量
+     */
+    private Integer afterScore;
 
     /**
      * 设置:主键
@@ -220,4 +277,100 @@ public class Mall2MemberConsumptionRecordsEntity implements Serializable {
     public void setShopName(String shopName) {
         this.shopName = shopName;
     }
+
+    public Integer getDeductionScore() {
+        return deductionScore;
+    }
+
+    public void setDeductionScore(Integer deductionScore) {
+        this.deductionScore = deductionScore;
+    }
+
+    public String getMemberCode() {
+        return memberCode;
+    }
+
+    public void setMemberCode(String memberCode) {
+        this.memberCode = memberCode;
+    }
+
+    public String getMemberPhone() {
+        return memberPhone;
+    }
+
+    public void setMemberPhone(String memberPhone) {
+        this.memberPhone = memberPhone;
+    }
+
+    public BigDecimal getOrderTotalPrice() {
+        return orderTotalPrice;
+    }
+
+    public void setOrderTotalPrice(BigDecimal orderTotalPrice) {
+        this.orderTotalPrice = orderTotalPrice;
+    }
+
+    public BigDecimal getScoreDeductionPrice() {
+        return scoreDeductionPrice;
+    }
+
+    public void setScoreDeductionPrice(BigDecimal scoreDeductionPrice) {
+        this.scoreDeductionPrice = scoreDeductionPrice;
+    }
+
+    public Integer getScoreLimit() {
+        return scoreLimit;
+    }
+
+    public void setScoreLimit(Integer scoreLimit) {
+        this.scoreLimit = scoreLimit;
+    }
+
+    public Integer getBeforeScore() {
+        return beforeScore;
+    }
+
+    public void setBeforeScore(Integer beforeScore) {
+        this.beforeScore = beforeScore;
+    }
+
+    public Integer getAfterScore() {
+        return afterScore;
+    }
+
+    public void setAfterScore(Integer afterScore) {
+        this.afterScore = afterScore;
+    }
+
+    public String getOpen_id() {
+        return open_id;
+    }
+
+    public void setOpen_id(String open_id) {
+        this.open_id = open_id;
+    }
+
+    public String getStatement_id() {
+        return statement_id;
+    }
+
+    public void setStatement_id(String statement_id) {
+        this.statement_id = statement_id;
+    }
+
+    public Integer getRollback_score() {
+        return rollback_score;
+    }
+
+    public void setRollback_score(Integer rollback_score) {
+        this.rollback_score = rollback_score;
+    }
+
+    public String getChange_id() {
+        return change_id;
+    }
+
+    public void setChange_id(String change_id) {
+        this.change_id = change_id;
+    }
 }

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/fromcomm/service/SysConfigService.java

@@ -62,4 +62,10 @@ public interface SysConfigService {
      */
     public <T> T getConfigObject(String key, Class<T> clazz);
 
+    /**
+     * 根据key,获取配置的value值
+     *
+     * @param key          key
+     */
+    public String getValueHk(String key);
 }

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/fromcomm/service/impl/SysConfigServiceImpl.java

@@ -74,4 +74,10 @@ public class SysConfigServiceImpl implements SysConfigService {
 			throw new RRException("获取参数失败");
 		}
 	}
+
+	@Override
+	public String getValueHk(String key) {
+		String value = sysConfigDao.queryByKey(key);
+		return value;
+	}
 }

+ 50 - 33
kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongMemberTemplate.java

@@ -1,13 +1,16 @@
 package com.kmall.admin.haikong.client;
 
 import cn.hutool.core.map.MapUtil;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.kmall.admin.haikong.config.HaiKongProperties;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.haikong.dto.AccessTokenDTO;
+import com.kmall.admin.haikong.dto.MemberInfoDTO;
 import com.kmall.admin.haikong.task.MemberSysAccessTokenRefreshTask;
-import com.kmall.admin.haikong.utils.ApacheHttpUtils;
-import com.kmall.admin.haikong.utils.HttpGetWithEntity;
-import com.kmall.admin.haikong.utils.MemberSysSignUtils;
-import com.kmall.admin.haikong.utils.OkHttpUtils;
+import com.kmall.admin.haikong.utils.*;
 import com.kmall.admin.haikong.constant.HaiKongMemberSystemUrlEnum;
+import com.kmall.admin.utils.jackson.JacksonUtil;
+import com.kmall.manager.manager.redis.JedisUtil;
 import okhttp3.MediaType;
 import okhttp3.Request;
 import okhttp3.RequestBody;
@@ -224,40 +227,54 @@ public class HaiKongMemberTemplate {
 
     public static void main(String[] args) throws Exception {
 
-//        HaiKongMemberTemplate haiKongMemberTemplate = new HaiKongMemberTemplate();
-//
-//        HaiKongProperties haiKongProperties = new HaiKongProperties();
-//
-//        haiKongProperties.setRetry(3);
-//        haiKongProperties.setMemberAppId("mianshuitestzhanxiao");
-//        haiKongProperties.setMemberAppSecret("mianshuitestzhanxiao1029");
-//        haiKongProperties.setMemberUrl("https://test-ump.greedc.com");
-//
-//        haiKongMemberTemplate.setHaiKongProperties(haiKongProperties);
-//
-////        String accessToken = haiKongMemberTemplate.getAccessToken();
-//
-////        System.out.println(accessToken);
-//
-//        String accessToken = "atBF2B26D3DB790E652E7A810BCC927040";
-//
-//        String refreshToken = "rt256E320B415B9B9A0DB7CA21E773F795";
-//
-//        String body = "{\"phone\": \"13726271499\"}";
-//
+        HaiKongMemberTemplate haiKongMemberTemplate = new HaiKongMemberTemplate();
+
+        HaiKongProperties haiKongProperties = new HaiKongProperties();
+
+        haiKongProperties.setMemberUrl("https://test-ump.greedc.com");
+        haiKongProperties.setMemberAppId("mianshuitestzhanxiao");
+        haiKongProperties.setMemberAppSecret("mianshuitestzhanxiao1029");
+        haiKongProperties.setRetry(3);
+
+        haiKongMemberTemplate.setHaiKongProperties(haiKongProperties);
+
+//        String accessToken = haiKongMemberTemplate.getAccessToken();
+
+//        System.out.println(accessToken);
+
+        String accessToken = "at9528E3271080F8A3C5AE9FD9C8EBC9D9";
+
+        String refreshToken = "rt6D6F3077B2CDFA31BB294CF0662194F3";
+
+        String body = "{\"phone\": \"13726271499\"}";
+
 //        String refreshAccessToken = haiKongMemberTemplate.refreshAccessToken(refreshToken);
 //        System.out.println(refreshAccessToken);
-        /*log.info("请求获取会员优惠券详细信息接口......");
-        String url = haiKongProperties.getMemberUrl() + haiKongMemberTemplate.appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_COUPON.getUrl(), accessToken);
+        log.info("请求获取会员优惠券详细信息接口......");
+        String url = haiKongProperties.getMemberUrl() + haiKongMemberTemplate.appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_PHONE.getUrl(), accessToken);
         url = haiKongMemberTemplate.getSignUrl(url, body);
 
-        HttpGetWithEntity httpGet = new HttpGetWithEntity(url);
-        HttpEntity httpEntity = new StringEntity(body, ContentType.APPLICATION_JSON);
-        httpGet.setEntity(httpEntity);
+        Request build = new Request.Builder().url(url).post(haiKongMemberTemplate.requestBody(body)).build();
+
+        String retry = OkHttpUtils.retry(build, 3);
+
+        System.out.println(retry);
+
+        Response<MemberInfoDTO> response = JacksonUtil.fromListJson(retry, new TypeReference<Response<MemberInfoDTO>>() {
+        });
+
+        System.out.println("会员积分========>" + response.getData().getScore() + "会员码========>" + response.getData().getOpenId());
+
+
+//        HttpGetWithEntity httpGet = new HttpGetWithEntity(url);
+//        HttpEntity httpEntity = new StringEntity(body, ContentType.APPLICATION_JSON);
+//        httpGet.setEntity(httpEntity);
+//
+//        String response = ApacheHttpUtils.retry(httpGet, haiKongProperties.getRetry());
+//        System.out.println(response);
+//        log.info("请求获取会员优惠券详细信息接口成功......");
+
 
-        String response = ApacheHttpUtils.retry(httpGet, haiKongProperties.getRetry());
-        System.out.println(response);
-        log.info("请求获取会员优惠券详细信息接口成功......");*/
 
     }
 

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongConfig.java

@@ -25,6 +25,7 @@ public class HaiKongConfig {
         haiKongProperties.setMemberUrl(environment.getProperty("haikong.member.url"));
         haiKongProperties.setMemberAppId(environment.getProperty("haikong.member.appId"));
         haiKongProperties.setMemberAppSecret(environment.getProperty("haikong.member.appSecret"));
+        haiKongProperties.setMemberScoreLimit(Integer.parseInt(environment.getProperty("haikong.member.scoreLimit")));
         haiKongProperties.setRetry(Integer.parseInt(environment.getProperty("haikong.retry")));
         haiKongProperties.setVmcconnectUrl(environment.getProperty("haikong.vmcconnect.url"));
         haiKongProperties.setVmcconnectAppId(environment.getProperty("haikong.vmcconnect.appId"));

+ 5 - 5
kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongProperties.java

@@ -13,7 +13,7 @@ public class HaiKongProperties {
 
     private String memberAppSecret;
 
-    private Integer scoreLimit;
+    private Integer memberScoreLimit;
 
     private Integer retry;
 
@@ -91,12 +91,12 @@ public class HaiKongProperties {
         this.memberAppSecret = memberAppSecret;
     }
 
-    public Integer getScoreLimit() {
-        return scoreLimit;
+    public Integer getMemberScoreLimit() {
+        return memberScoreLimit;
     }
 
-    public void setScoreLimit(Integer scoreLimit) {
-        this.scoreLimit = scoreLimit;
+    public void setMemberScoreLimit(Integer memberScoreLimit) {
+        this.memberScoreLimit = memberScoreLimit;
     }
 
     public Integer getRetry() {

+ 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;
+        }
     }
 
 }

+ 124 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Message.java

@@ -0,0 +1,124 @@
+package com.kmall.admin.haikong.utils;
+
+import com.google.common.base.Strings;
+
+import java.io.Serializable;
+
+/**
+ * 通用消息封装
+ * 
+ * @ClassName: Message
+ * @author yechao
+ * @date 2017年5月3日 下午2:03:14
+ * @author Scott Chen
+ * @date 2017-09-19 16:60
+ * @Description:
+ */
+public class Message implements Serializable {
+
+	private static final long serialVersionUID = 4081619286503989887L;
+	private static String success;
+	private static String message;
+
+
+	/**
+	 * 消息代码 , 由使用者自由发挥
+	 */
+	private Boolean Success;
+	/**
+	 * 消息内容体 , 由使用者自由发挥
+	 */
+	private String Message;
+
+//	/**
+//	 * 消息代码 , 由使用者自由发挥
+//	 */
+//	private String Success;
+//	/**
+//	 * 消息内容体 , 由使用者自由发挥
+//	 */
+//	private String Message;
+
+
+
+	private Message() {
+	}
+
+	public Boolean getSuccess() {
+		return Success;
+	}
+
+	public String getMessage() {
+		return Message;
+	}
+
+	public static Builder builder() {
+		return new Builder();
+	}
+	public static Builder builder(Boolean Success, String Message) {
+		return new Builder(Success, Message);
+	}
+	
+	//---------- 直接返回结果 ----------
+	public static Message success() {
+		return new Builder().build();
+	}
+
+	public static Message success(boolean Success, String Message) {
+		return new Builder(Success, Message).build();
+	}
+
+	//--- 错误----------
+	public static Message error(boolean Success, String Message) {
+		return new Builder(Success, Message).build();
+	}
+
+
+
+	/**
+	 * 消息构建器类
+	 */
+	public static class Builder {
+
+//		private boolean isSuccess;
+//		private Object extend;
+		private Boolean Success;
+		private String Message;
+
+		public Builder() {
+			this.Success = true;
+			this.Message = MessageCode.SUCCESS_MSG;
+		}
+
+		public Builder(boolean Success, String Message) {
+			this.Success = Success;
+			this.Message = Message;
+		}
+
+
+
+		public Message build() {
+			Message message = new Message();
+			message.Success = this.Success;
+			message.Message = this.Message;
+			return message;
+		}
+
+		public Boolean getSuccess() {
+			return Success;
+		}
+
+		public void setSuccess(Boolean success) {
+			Success = success;
+		}
+
+		public String getMessage() {
+			return Message;
+		}
+
+		public void setMessage(String message) {
+			Message = message;
+		}
+	}
+
+}

+ 36 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/MessageCode.java

@@ -0,0 +1,36 @@
+package com.kmall.admin.haikong.utils;
+
+/**
+ * @author Scott Chen
+ * @version 1.0
+ * 2017-09-20 12:38
+ */
+public class MessageCode {
+
+    public static final String SUCCESS_CODE = "0";
+    public static final String SUCCESS_MSG = "成功";
+
+    public static final String FAILED_CODE = "-1";
+    public static final String FAILED_MSG = "失败";
+
+    public static final String ERROR_CODE = "-2";
+    public static final String ERROR_MSG = "错误";
+
+    public static final String EXCEPTION_CODE = "-3";
+    public static final String EXCEPTION_MSG = "系统内部异常!";
+
+    public static final String NULL_CODE = "-4";
+    public static final String NULL_MSG = "为空";
+
+    public static final String TIMESTAMP_EXPIRES_CODE = "-5";
+    public static final String TIMESTAMP_EXPIRES_MSG = "时间戳已过期";
+
+    public static final String ERROR_LENGTH_CODE = "-6";
+    public static final String ERROR_LENGTH_MSG = "超出长度范围";
+
+
+    public static final String CONDUCT_CODE = "2";
+    public static final String CONDUCT_MSG = "进行中";
+
+
+}

+ 46 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/OutRequestMessage.java

@@ -0,0 +1,46 @@
+package com.kmall.admin.haikong.utils;
+
+import java.io.Serializable;
+
+/**
+ * 外部请求消息结构
+ * 由外部系统发起
+ *
+ * @author Scott Chen
+ * @since 1.0
+ * 2018-03-28
+ */
+public class OutRequestMessage implements Serializable {
+    private static final long serialVersionUID = -3044821399294307105L;
+
+    //业务数据
+    private String data;
+    //时间戳
+    private String timestamp;
+    //签名
+    private String sign;
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+}

+ 8 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/VmcconnectSignUtils.java

@@ -29,5 +29,13 @@ public class VmcconnectSignUtils {
     }
 
 
+    //签名加密校验
+    public static String checkMsg(String timestamp,String sekey) {
+        String sign = sekey+ timestamp;
+        return Md5Utils.encryption(sign);
+    }
+
+
+
 
 }

+ 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);
 }

+ 8 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderProcessRecordService.java

@@ -2,6 +2,7 @@ package com.kmall.admin.service;
 
 
 import com.kmall.admin.entity.OrderProcessRecordEntity;
+import com.kmall.admin.haikong.utils.Message;
 
 import java.util.List;
 import java.util.Map;
@@ -74,4 +75,11 @@ public interface OrderProcessRecordService {
     OrderProcessRecordEntity queryObjectByOrderSn(String orderSn);
 
     void sendCustomsSuccessSms();
+
+    /**
+     * 订单流转信息回调通知接口
+     * @param orderProcessRecordList
+     * @return
+     */
+    Message saveHkNoticeMsg(List<OrderProcessRecordEntity> orderProcessRecordList);
 }

+ 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);
+    }
 }

+ 23 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderProcessRecordServiceImpl.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.kmall.admin.dao.OrderDao;
 import com.kmall.admin.dao.OrderProcessRecordDao;
 import com.kmall.admin.dao.StoreSmsConfigDao;
@@ -7,6 +8,7 @@ import com.kmall.admin.entity.OrderEntity;
 import com.kmall.admin.entity.OrderProcessRecordEntity;
 import com.kmall.admin.entity.PickUpCodeEntity;
 import com.kmall.admin.entity.StoreSmsConfigEntity;
+import com.kmall.admin.haikong.utils.Message;
 import com.kmall.admin.service.OrderProcessRecordService;
 import com.kmall.admin.service.PickUpCodeService;
 import com.kmall.api.util.SendMsgUtil;
@@ -155,4 +157,25 @@ public class OrderProcessRecordServiceImpl implements OrderProcessRecordService
 
         }
     }
+
+    /**
+     * 海控通知回调接口
+     * @param orderProcessRecordList
+     * @return
+     */
+    @Override
+    public Message saveHkNoticeMsg(List<OrderProcessRecordEntity> orderProcessRecordList) {
+       try{
+           Integer count = orderProcessRecordDao.queryHkOrderTotal(orderProcessRecordList);
+           if(orderProcessRecordList.size()!=count){
+               return Message.success(false,"订单不存在");
+           }else{
+               orderProcessRecordDao.updateHkNoticeMsg(orderProcessRecordList);
+           }
+       }catch (Exception e){
+           logger.error("saveHkNoticeMsg---海控通知回调接口插入错误="+ JSON.toJSONString(orderProcessRecordList),e);
+           return Message.success(false,"参数错误");
+       }
+        return Message.success(true,"成功");
+    }
 }

+ 192 - 156
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -2341,7 +2341,7 @@ public class OrderServiceImpl implements OrderService {
         if (isCalculateScorePrice.get()) {
             // 3-1. 计算总价的50%
             BigDecimal halfPrice = preferentialPrice.multiply(new BigDecimal("0.5")).setScale(2, BigDecimal.ROUND_HALF_UP);
-            Integer scoreLimit = haiKongProperties.getScoreLimit();
+            Integer scoreLimit = haiKongProperties.getMemberScoreLimit();
             if (score < scoreLimit) {
                 LOGGER.warn("用户【{}】的积分数量为:{},最低需要30积分才能抵扣!", userInfo.get("customName"), score);
                 return preferentialPrice;
@@ -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,44 +4283,85 @@ 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()));
             }
         });
 
         // 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
         if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
             String memberInfoByCodeResponseJson;
-            Response<MemberInfoDTO> response;
+            Response<Object> response;
             try {
                 // 查询会员信息
-                memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByCode("{\"code\":" + memberCode + "}");
-                response = JacksonUtil.fromListJson(memberInfoByCodeResponseJson, new TypeReference<Response<MemberInfoDTO>>() {
+                memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByPhone("{\"phone\":" + memberCode + "}");
+                response = JacksonUtil.fromListJson(memberInfoByCodeResponseJson, new TypeReference<Response<Object>>() {
                 });
+                if (Objects.isNull(response) || Objects.nonNull(response.getErrorCode())) {
+                    LOGGER.error("请求会员系统出现异常!error:{}", memberInfoByCodeResponseJson);
+                    throw new ServiceException(String.format("请求会员系统出现异常!会员码:%s,error:%s", memberCode, memberInfoByCodeResponseJson));
+                }
             } catch (Exception e) {
                 LOGGER.error("请求会员系统失败或处理响应失败!", e);
                 throw new ServiceException(e);
             }
             BigDecimal afterDiscountPrice;
-            if (Objects.nonNull(response) && response.getSuccess()) {
-                MemberInfoDTO memberInfoDTO = response.getData();
+            if (response.getSuccess()) {
+                MemberInfoDTO memberInfoDTO = JacksonUtil.fromStringJson(JacksonUtil.toJson(response.getData()), MemberInfoDTO.class);
+                assert memberInfoDTO != null : String.format("会员码:【%s】会员信息错误!%s", memberCode, JacksonUtil.toJson(response));
                 Integer score = memberInfoDTO.getScore();
                 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 if (Objects.nonNull(response)) {
+            } else {
                 LOGGER.error("查询会员信息失败!响应结果:{}", memberInfoByCodeResponseJson);
-                throw new ServiceException(String.format("错误码:%s,错误信息:%s", response.getErrorCode(), response.getErrorMessage()));
+                throw new ServiceException(String.format("会员码:%s,错误码:%s,错误信息:%s", memberCode, response.getErrorCode(), response.getErrorMessage()));
             }
         }
         calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
@@ -4353,9 +4389,9 @@ public class OrderServiceImpl implements OrderService {
         }
         // 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();
+            // 3-1. 计算总价的50%,百分比可以进行设置,算出整数(向下取整)
+            BigDecimal halfPrice = orderTotalPrice.multiply(new BigDecimal("0.5")).setScale(0, BigDecimal.ROUND_FLOOR);
+            Integer scoreLimit = haiKongProperties.getMemberScoreLimit();
             if (score < scoreLimit) {
                 LOGGER.warn("用户【{}】的积分数量为:{},最低需要30积分才能抵扣!", memberCode, score);
                 return orderTotalPrice;
@@ -4364,12 +4400,12 @@ public class OrderServiceImpl implements OrderService {
                 int scoreMayDeductionPrice = (int) (score / scoreLimit);
                 BigDecimal scoreMayDeductionPriceDecimal = new BigDecimal(scoreMayDeductionPrice);
                 // 3-3. 计算积分抵扣后的价格
-                if (halfPrice.compareTo(scoreMayDeductionPriceDecimal) > 0) {
+                if (halfPrice.compareTo(scoreMayDeductionPriceDecimal) <= 0) {
                     // 积分能抵扣的金额大于订单总额的50%,按50%抵扣
                     scoreMayDeductionPriceDecimal = halfPrice;
                 }
                 orderTotalPrice = orderTotalPrice.subtract(scoreMayDeductionPriceDecimal);
-                LOGGER.info("会员【{}】,积分抵扣前剩余:{},积分抵扣订单金额后剩余:{},积分抵扣后的订单总额为:{}", memberCode, score, scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)), orderTotalPrice);
+                LOGGER.info("会员【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", memberCode, score, (score - scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)).intValue()));
             }
         } else {
             LOGGER.info("会员【{}】的积分为0,不参加积分抵扣!", memberCode);

+ 5 - 0
kmall-admin/src/main/resources/XmlTemplate/CouponMerchandiseDtoList.xml

@@ -11,6 +11,11 @@
                 <mapping row="1" col="3">CouponMerchandiseDto.deadline</mapping>
                 <mapping row="1" col="4">CouponMerchandiseDto.discountPrice</mapping>
                 <mapping row="1" col="5">CouponMerchandiseDto.couponSn</mapping>
+                <mapping row="1" col="6">CouponMerchandiseDto.activityType</mapping>
+                <mapping row="1" col="7">CouponMerchandiseDto.brandId</mapping>
+                <mapping row="1" col="8">CouponMerchandiseDto.categoryId</mapping>
+                <mapping row="1" col="9">CouponMerchandiseDto.brandName</mapping>
+                <mapping row="1" col="10">CouponMerchandiseDto.categoryName</mapping>
             </section>
             <loopbreakcondition>
                 <rowcheck offset="0">

+ 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>

+ 42 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml

@@ -291,4 +291,46 @@ select
 		</foreach>
 	</delete>
 
+
+
+	<!--批量修改-->
+	<update id="updateHkNoticeMsg" parameterType="list">
+		update mall_order_process_record
+		<trim prefix="set" suffixOverrides=",">
+			<trim prefix="points_rules_id =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+						when order_sn=#{item.orderSn}
+						then
+							<if test="eleOrderStartTime != null">`ele_order_start_time` = #{item.eleOrderStartTime}, </if>
+							<if test="eleOrderSuccTime != null">`ele_order_succ_time` = #{item.eleOrderSuccTime}, </if>
+							<if test="isEleOrderSend != null">`is_ele_order_send` = #{item.isEleOrderSend}, </if>
+							<if test="waybillStartTime != null">`waybill_start_time` = #{item.waybillStartTime}, </if>
+							<if test="waybillSuccTime != null">`waybill_succ_time` = #{item.waybillSuccTime}, </if>
+							<if test="logisticsNo != null">`logistics_no` = #{item.logisticsNo}, </if>
+							<if test="customsStartTime != null">`customs_start_time` = #{item.customsStartTime}, </if>
+							<if test="customsSuccTime != null">`customs_succ_time` = #{item.customsSuccTime}, </if>
+							<if test="invtNo != null">`invt_no` = #{item.invtNo}, </if>
+							<if test="isCustomsSend != null">`is_customs_send` = #{item.isCustomsSend}, </if>
+				</foreach>
+			</trim>
+		</trim>
+		where order_sn in
+		<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
+			#{item.orderSn}
+		</foreach>
+	</update>
+
+	<select id="queryHkOrderTotal" parameterType="java.util.List" resultType="java.lang.Integer">
+		select
+		 count(*)
+		from mall_order_process_record
+		where
+		<if test="list != null">
+			 order_sn in
+			<foreach collection="list" item="item" open="(" separator="," close=")">
+				#{item.orderSn}
+			</foreach>
+		</if>
+	</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,

+ 52 - 4
kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2MemberConsumptionRecordsDao.xml

@@ -15,6 +15,14 @@
         <result property="moderSn" column="moder_sn"/>
         <result property="modTime" column="mod_time"/>
         <result property="tstm" column="tstm"/>
+        <result property="deductionScore" column="deduction_score"/>
+        <result property="memberCode" column="member_code"/>
+        <result property="memberPhone" column="member_phone"/>
+        <result property="orderTotalPrice" column="order_total_price"/>
+        <result property="scoreDeductionPrice" column="score_deduction_price"/>
+        <result property="scoreLimit" column="score_limit"/>
+        <result property="beforeScore" column="before_score"/>
+        <result property="afterScore" column="after_score"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.vip.Mall2MemberConsumptionRecordsEntity">
@@ -29,7 +37,15 @@
 			`create_time`,
 			`moder_sn`,
 			`mod_time`,
-			`tstm`
+			`tstm`,
+			`deduction_score`,
+			`member_code`,
+			`member_phone`,
+			`order_total_price`,
+			`score_deduction_price`,
+			`score_limit`,
+			`before_score`,
+			`after_score`
 		from mall2_member_consumption_records
 		where mmcr_id = #{id}
 	</select>
@@ -48,7 +64,15 @@
     		records.mod_time,
     		records.tstm,
 			mu.username as userName,
-			store.store_name as shopName
+			store.store_name as shopName,
+			records.`deduction_score`,
+			records.`member_code`,
+			records.`member_phone`,
+			records.`order_total_price`,
+			records.`score_deduction_price`,
+			records.`score_limit`,
+			records.`before_score`,
+			records.`after_score`
 		from mall2_member_consumption_records records
 		left join mall_user mu on mu.id = records.user_id
 		left join mall_store store on store.id = records.shop_sn
@@ -95,7 +119,15 @@
 			`create_time`,
 			`moder_sn`,
 			`mod_time`,
-			`tstm`)
+			`tstm`,
+			`deduction_score`,
+			`member_code`,
+			`member_phone`,
+			`order_total_price`,
+			`score_deduction_price`,
+			`score_limit`,
+			`before_score`,
+			`after_score`)
 		values(
 			#{mmcrId},
 			#{userId},
@@ -107,7 +139,15 @@
 			#{createTime},
 			#{moderSn},
 			#{modTime},
-			#{tstm})
+			#{tstm},
+			#{deductionScore},
+			#{memberCode},
+			#{memberPhone},
+			#{orderTotalPrice},
+			#{scoreDeductionPrice},
+			#{scoreLimit},
+			#{beforeScore},
+			#{afterScore})
 	</insert>
 
 	<update id="update" parameterType="com.kmall.admin.entity.vip.Mall2MemberConsumptionRecordsEntity">
@@ -123,6 +163,14 @@
 			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
 			<if test="modTime != null">`mod_time` = #{modTime}, </if>
 			<if test="tstm != null">`tstm` = #{tstm}</if>
+			<if test="deductionScore != null">`deduction_score` = #{deductionScore}</if>
+			<if test="memberCode != null">`member_code` = #{memberCode}</if>
+			<if test="memberPhone != null">`member_phone` = #{memberPhone}</if>
+			<if test="orderTotalPrice != null">`order_total_price` = #{orderTotalPrice}</if>
+			<if test="scoreDeductionPrice != null">`score_deduction_price` = #{scoreDeductionPrice}</if>
+			<if test="scoreLimit != null">`score_limit` = #{scoreLimit}</if>
+			<if test="beforeScore != null">`before_score` = #{beforeScore}</if>
+			<if test="afterScore != null">`after_score` = #{afterScore}</if>
 		</set>
 		where mmcr_id = #{mmcrId}
 	</update>

+ 1 - 0
kmall-admin/src/main/resources/spring/spring-shiro.xml

@@ -66,6 +66,7 @@
         <!-- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter -->
         <property name="filterChainDefinitions">
             <value>
+                /orderProRecordExternal/**=anon
                 /statics/**=anon
                 /api/**=anon
                 /js/**=anon

+ 15 - 0
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiescoupon.html

@@ -52,6 +52,21 @@
             <Form-item label="优惠金额" prop="couponPrice">
                 <i-input v-model="mkActivitiesCoupon.couponPrice" placeholder="优惠金额"/>
             </Form-item>
+            <Form-item label="优惠券类型" prop="activityType">
+                <i-input v-model="mkActivitiesCoupon.activityType" placeholder="优惠券类型"/>
+            </Form-item>
+            <Form-item label="品牌ID" prop="brandId">
+                <i-input v-model="mkActivitiesCoupon.brandId" placeholder="品牌ID"/>
+            </Form-item>
+            <Form-item label="品牌名" prop="brandName">
+                <i-input v-model="mkActivitiesCoupon.brandName" placeholder="品牌名"/>
+            </Form-item>
+            <Form-item label="分类ID" prop="categoryId">
+                <i-input v-model="mkActivitiesCoupon.categoryId" placeholder="分类ID"/>
+            </Form-item>
+            <Form-item label="分类名" prop="categoryName">
+                <i-input v-model="mkActivitiesCoupon.categoryName" placeholder="分类名"/>
+            </Form-item>
             <Form-item label="截止日期" prop="deadline">
                 <i-input v-model="mkActivitiesCoupon.deadline" placeholder="截止日期 yyyy-mm-dd"/>
             </Form-item>

+ 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},

+ 5 - 0
kmall-admin/src/main/webapp/js/mk/mkactivitiescoupon.js

@@ -28,6 +28,11 @@ $(function () {
 			{label: '适用商品条码', name: 'barcode', index: 'barcode', width: 80, align: 'center'},
 			{label: '优惠券码', name: 'couponSn', index: 'coupon_sn', width: 80, align: 'center'},
 			{label: '优惠金额', name: 'couponPrice', index: 'coupon_price', width: 80, align: 'center'},
+			{label: '优惠券类型', name: 'activityType', index: 'activity_type', width: 80, align: 'center'},
+			{label: '品牌ID', name: 'brandId', index: 'brand_id', width: 80, align: 'center'},
+			{label: '品牌名', name: 'brandName', index: 'brand_name', width: 80, align: 'center'},
+			{label: '分类ID', name: 'categoryId', index: 'category_id', width: 80, align: 'center'},
+			{label: '分类名', name: 'categoryName', index: 'category_name', width: 80, align: 'center'},
 			{label: '截止日期', name: 'deadline', index: 'deadline', width: 80, align: 'center'}],
 		viewrecords: true,
 		postData: {'mkaId': vm.mkaId},

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

@@ -101,6 +101,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',

BIN
kmall-admin/src/main/webapp/statics/file/activities_coupon_yyyy_mm_dd_v1.0.0.xlsx


+ 50 - 0
sql/kmall_table_alter.sql

@@ -0,0 +1,50 @@
+# 营销方式-满赠表
+alter table mk_activities_full_gift add full_gift_type char(1) comment '满赠类型,0:按品牌 1:按商品分类';
+
+alter table mk_activities_full_gift add category_id int(11) comment '分类id';
+
+alter table mk_activities_full_gift add category_name varchar(32) comment '分类名称';
+
+alter table mk_activities_full_gift add brand_id int(11) comment '品牌id';
+
+alter table mk_activities_full_gift add shop_name varchar(64) comment '门店名称';
+
+alter table mk_activities_full_gift add gift_number int(8) comment '赠品数量';
+
+alter table mk_activities_full_gift add full_gift_type char(1) comment '满赠类型,0:按品牌 1:按商品分类';
+
+# 营销方式-优惠券表
+alter table mk_activities_coupon add full_gift_type char(1) comment '优惠券类型,0:按品牌 1:按商品分类 2:按商品';
+
+alter table mk_activities_coupon add category_id int(11) comment '分类id';
+
+alter table mk_activities_coupon add category_name varchar(255) comment '分类名称';
+
+alter table mk_activities_coupon add brand_id int(11) comment '品牌id';
+
+alter table mk_activities_coupon add brand_name varchar(255) comment '品牌id';
+
+
+# 门店库存表
+alter table mall_product_store_rela add exit_region_number int(11) comment '展销店出区数';
+
+
+# 会员消费记录表
+alter table mall2_member_consumption_records add deduction_score int(11) comment '订单抵扣积分';
+
+alter table mall2_member_consumption_records add member_code varchar(64) comment '会员码';
+
+alter table mall2_member_consumption_records add member_phone varchar(20) comment '会员手机号';
+
+alter table mall2_member_consumption_records add order_total_price decimal(10,2) comment '订单总金额';
+
+alter table mall2_member_consumption_records add score_deduction_price decimal(10,2) comment '积分抵扣金额';
+
+alter table mall2_member_consumption_records add score_limit int(11) comment '积分抵扣规则,多少积分抵一元';
+
+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';