1
0
Selaa lähdekoodia

会员变动记录,同步会员消费订单

lhm 3 vuotta sitten
vanhempi
commit
a1368a6de5
27 muutettua tiedostoa jossa 894 lisäystä ja 136 poistoa
  1. 7 0
      kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java
  2. 30 0
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongMemberScoreChangeRecordDao.java
  3. 4 4
      kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java
  4. 26 0
      kmall-admin/src/main/java/com/kmall/admin/entity/UserEntity.java
  5. 1 1
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberOrderSyncResendEntity.java
  6. 160 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberScoreChangeRecordEntity.java
  7. 6 2
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongMemberOrderResendStatusEnum.java
  8. 28 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongMemberScoreChangeEventEnum.java
  9. 14 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberInfoDTO.java
  10. 102 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberScoreChangeDTO.java
  11. 51 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberScoreChangeResponseDTO.java
  12. 19 4
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/ListUtils.java
  13. 11 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceResponseVO.java
  14. 17 3
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/QueryGoodsVO.java
  15. 7 0
      kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java
  16. 6 0
      kmall-admin/src/main/java/com/kmall/admin/service/ProductStoreRelaService.java
  17. 29 0
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongMemberScoreChangeRecordService.java
  18. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  19. 1 1
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OfflineCartServiceImpl.java
  20. 175 79
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  21. 10 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java
  22. 61 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaiKongMemberScoreChangeRecordServiceImpl.java
  23. 8 2
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  24. 20 37
      kmall-admin/src/main/resources/mybatis/mapper/OrderGoodsDao.xml
  25. 89 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/HaiKongMemberScoreChangeRecordDao.xml
  26. 5 1
      kmall-admin/src/main/webapp/js/sale/sale.js
  27. 2 2
      kmall-admin/src/test/java/com/kmall/admin/Test.java

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

@@ -122,4 +122,11 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
      * @return              商品信息
      */
     GoodsEntity queryGoodsInfoByProductBarcodeAndSku(@Param("prodBarcode") String prodBarcode, @Param("sku") String sku);
+
+    /**
+     * 更新商品库存
+     * @param goodsEntity 商品
+     * @return
+     */
+    int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity);
 }

+ 30 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongMemberScoreChangeRecordDao.java

@@ -0,0 +1,30 @@
+package com.kmall.admin.dao.haikong;
+
+import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 会员积分变动记录
+ * @author lhm
+ * @createDate 2021-11-30
+ */
+public interface HaiKongMemberScoreChangeRecordDao {
+
+    HaiKongMemberScoreChangeRecordEntity queryObjectByOutBizNo(@Param("outBizNo") String outBizNo);
+
+    HaiKongMemberScoreChangeRecordEntity queryObjectByOpenId(@Param("openId") String openId);
+
+    Integer queryTotal();
+
+    List<HaiKongMemberScoreChangeRecordEntity> queryList();
+
+    void save(HaiKongMemberScoreChangeRecordEntity haiKongMemberScoreChangeRecordEntity);
+
+    void updateByOutBizNo(HaiKongMemberScoreChangeRecordEntity haiKongMemberScoreChangeRecordEntity);
+
+    void deleteByOutBizNo(@Param("outBizNo") String outBizNo);
+
+    void deleteBatchByOutBizNo(List<String> outBizNos);
+}

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

@@ -194,7 +194,7 @@ public class GoodsEntity implements Serializable {
     //视频地址
     private String videoUrl;
 
-    private String stockNum;
+    private Integer stockNum;
 
     private String storeName;
 
@@ -283,7 +283,7 @@ public class GoodsEntity implements Serializable {
     }
 
     public GoodsEntity(QueryGoodsVO queryGoodsVo) {
-        BeanUtils.copyProperties(this, queryGoodsVo);
+        BeanUtils.copyProperties(queryGoodsVo, this);
         this.goodsNumber = queryGoodsVo.getSellVolume();
     }
 
@@ -573,11 +573,11 @@ public class GoodsEntity implements Serializable {
         this.productId = productId;
     }
 
-    public String getStockNum() {
+    public Integer getStockNum() {
         return stockNum;
     }
 
-    public void setStockNum(String stockNum) {
+    public void setStockNum(Integer stockNum) {
         this.stockNum = stockNum;
     }
 

+ 26 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/UserEntity.java

@@ -55,6 +55,16 @@ public class UserEntity implements Serializable {
     private String lastFaceTime;
 
     /**
+     * 海控会员系统openId
+     */
+    private String openId;
+
+    /**
+     * 海控会员系统会员码
+     */
+    private String memberCode;
+
+    /**
      * 设置:主键
      */
     public void setId(Integer id) {
@@ -273,4 +283,20 @@ public class UserEntity implements Serializable {
     public void setLastFaceTime(String lastFaceTime) {
         this.lastFaceTime = lastFaceTime;
     }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public String getMemberCode() {
+        return memberCode;
+    }
+
+    public void setMemberCode(String memberCode) {
+        this.memberCode = memberCode;
+    }
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberOrderSyncResendEntity.java

@@ -42,7 +42,7 @@ public class HaiKongMemberOrderSyncResendEntity {
     private Integer orderScore;
 
     /**
-     * 重发状态,0:未重发 1:重发成功 2:重发失败
+     * 重发状态,0:等待重发 1:重发成功 2:重发失败 3:无需重发
      */
     private String resendStatus;
 

+ 160 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongMemberScoreChangeRecordEntity.java

@@ -0,0 +1,160 @@
+package com.kmall.admin.entity.haikong;
+
+import java.util.Date;
+
+/**
+ * 会员积分变动记录
+ * @author lhm
+ * @createDate 2021-11-30
+ */
+public class HaiKongMemberScoreChangeRecordEntity {
+
+    private Long id;
+
+    private String openId;
+
+    /**
+     * 变动的积分数量
+     */
+    private Integer score;
+
+    /**
+     * 外部订单号(kmall订单号)
+     */
+    private String outBizNo;
+
+    /**
+     * 变动描述
+     */
+    private String changeReason;
+
+    /**
+     * 变动id,自定义生成
+     */
+    private String changeId;
+
+    /**
+     * 变动事件,增 or 减
+     * {@link com.kmall.admin.haikong.constant.HaiKoneMemberScoreChangeEventEnum}
+     */
+    private String changeEvent;
+
+    /**
+     * 积分变动流水id,请求成功才返回
+     */
+    private String statementId;
+
+    private Date createTime;
+
+    private Date modifyTime;
+
+    /**
+     * 重发状态,0:等待重发 1:重发成功 2:重发失败 3:无需重发
+     */
+    private String resendStatus;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public Integer getScore() {
+        return score;
+    }
+
+    public void setScore(Integer score) {
+        this.score = score;
+    }
+
+    public String getOutBizNo() {
+        return outBizNo;
+    }
+
+    public void setOutBizNo(String outBizNo) {
+        this.outBizNo = outBizNo;
+    }
+
+    public String getChangeReason() {
+        return changeReason;
+    }
+
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    public String getChangeId() {
+        return changeId;
+    }
+
+    public void setChangeId(String changeId) {
+        this.changeId = changeId;
+    }
+
+    public String getChangeEvent() {
+        return changeEvent;
+    }
+
+    public void setChangeEvent(String changeEvent) {
+        this.changeEvent = changeEvent;
+    }
+
+    public String getStatementId() {
+        return statementId;
+    }
+
+    public void setStatementId(String statementId) {
+        this.statementId = statementId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getModifyTime() {
+        return modifyTime;
+    }
+
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    public String getResendStatus() {
+        return resendStatus;
+    }
+
+    public void setResendStatus(String resendStatus) {
+        this.resendStatus = resendStatus;
+    }
+
+    @Override
+    public String toString() {
+        return "HaiKongMemberScoreChangeRecordEntity{" +
+                "id=" + id +
+                ", openId='" + openId + '\'' +
+                ", score=" + score +
+                ", outBizNo='" + outBizNo + '\'' +
+                ", changeReason='" + changeReason + '\'' +
+                ", changeId='" + changeId + '\'' +
+                ", changeEvent='" + changeEvent + '\'' +
+                ", statementId='" + statementId + '\'' +
+                ", resendStatus='" + resendStatus + '\'' +
+                ", createTime=" + createTime +
+                ", modifyTime=" + modifyTime +
+                '}';
+    }
+}

+ 6 - 2
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongMemberOrderResendStatusEnum.java

@@ -9,7 +9,7 @@ public enum HaiKongMemberOrderResendStatusEnum {
     /**
      * 未重发
      */
-    WAIT_RESEND("0", "重发"),
+    WAIT_RESEND("0", "等待重发"),
     /**
      * 重发成功
      */
@@ -17,7 +17,11 @@ public enum HaiKongMemberOrderResendStatusEnum {
     /**
      * 重发失败
      */
-    RESEND_FAILED("2", "重发失败")
+    RESEND_FAILED("2", "重发失败"),
+    /**
+     * 无需重发
+     */
+    NON_RESEND("3", "无需重发")
     ;
 
 

+ 28 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongMemberScoreChangeEventEnum.java

@@ -0,0 +1,28 @@
+package com.kmall.admin.haikong.constant;
+
+/**
+ * 会员积分变动时间枚举
+ * @author lhm
+ * @createDate 2021-11-30
+ */
+public enum HaiKongMemberScoreChangeEventEnum {
+    /**
+     * 减
+     */
+    SUBTRACT("event_subtract"),
+    /**
+     * 增
+     */
+    ADD("event_add"),
+    ;
+
+    HaiKongMemberScoreChangeEventEnum(String event) {
+        this.event = event;
+    }
+
+    private final String event;
+
+    public String getEvent() {
+        return event;
+    }
+}

+ 14 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberInfoDTO.java

@@ -75,6 +75,11 @@ public class MemberInfoDTO implements Serializable {
      */
     private String rights;
 
+    /**
+     * 会员手机号
+     */
+    private String phone;
+
     public String getOpenId() {
         return openId;
     }
@@ -163,6 +168,14 @@ public class MemberInfoDTO implements Serializable {
         this.rights = rights;
     }
 
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
     @Override
     public String toString() {
         return "MemberInfoDTO{" +
@@ -177,6 +190,7 @@ public class MemberInfoDTO implements Serializable {
                 ", couponNum=" + couponNum +
                 ", birthday='" + birthday + '\'' +
                 ", rights='" + rights + '\'' +
+                ", phone='" + phone + '\'' +
                 '}';
     }
 }

+ 102 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberScoreChangeDTO.java

@@ -0,0 +1,102 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+
+/**
+ * 会员积分变动
+ * @author lhm
+ * @createDate 2021-11-30
+ */
+public class MemberScoreChangeDTO implements Serializable {
+
+    private static final long serialVersionUID = -5010285119546582199L;
+
+    @JsonProperty("open_id")
+    private String openId;
+
+    private Integer score;
+
+    /**
+     * 外部订单号
+     */
+    @JsonProperty("out_biz_no")
+    private String outBizNo;
+
+    @JsonProperty("change_reason")
+    private String changeReason;
+
+    /**
+     * 积分变动事件,需要在会员平台注册事件,后以固定事件值进行积分变动提交
+     * event_add/event_subtract(增/减)
+     */
+    @JsonProperty("change_event")
+    private String changeEvent;
+
+    /**
+     * 渠道自定义积分变动唯一标识,用于平台幂等性保证
+     */
+    @JsonProperty("change_id")
+    private String changeId;
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public Integer getScore() {
+        return score;
+    }
+
+    public void setScore(Integer score) {
+        this.score = score;
+    }
+
+    public String getOutBizNo() {
+        return outBizNo;
+    }
+
+    public void setOutBizNo(String outBizNo) {
+        this.outBizNo = outBizNo;
+    }
+
+    public String getChangeReason() {
+        return changeReason;
+    }
+
+    public void setChangeReason(String changeReason) {
+        this.changeReason = changeReason;
+    }
+
+    public String getChangeEvent() {
+        return changeEvent;
+    }
+
+    public void setChangeEvent(String changeEvent) {
+        this.changeEvent = changeEvent;
+    }
+
+    public String getChangeId() {
+        return changeId;
+    }
+
+    public void setChangeId(String changeId) {
+        this.changeId = changeId;
+    }
+
+    @Override
+    public String toString() {
+        return "MemberScoreChangeDTO{" +
+                "openId='" + openId + '\'' +
+                ", score=" + score +
+                ", outBizNo='" + outBizNo + '\'' +
+                ", changeReason='" + changeReason + '\'' +
+                ", changeEvent='" + changeEvent + '\'' +
+                ", changeId='" + changeId + '\'' +
+                '}';
+    }
+}

+ 51 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberScoreChangeResponseDTO.java

@@ -0,0 +1,51 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+
+/**
+ * 会员积分变动接口响应
+ * @author lhm
+ * @createDate 2021-11-30
+ */
+public class MemberScoreChangeResponseDTO implements Serializable {
+
+    private static final long serialVersionUID = -5010285119546582259L;
+
+    /**
+     * 变动的积分数量
+     */
+    @JsonProperty("score_change")
+    private Integer scoreChange;
+
+    /**
+     * 积分变动流水id
+     */
+    @JsonProperty("statement_id")
+    private String statementId;
+
+    public Integer getScoreChange() {
+        return scoreChange;
+    }
+
+    public void setScoreChange(Integer scoreChange) {
+        this.scoreChange = scoreChange;
+    }
+
+    public String getStatementId() {
+        return statementId;
+    }
+
+    public void setStatementId(String statementId) {
+        this.statementId = statementId;
+    }
+
+    @Override
+    public String toString() {
+        return "MemberScoreChangeResponseDTO{" +
+                "scoreChange=" + scoreChange +
+                ", statementId='" + statementId + '\'' +
+                '}';
+    }
+}

+ 19 - 4
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/ListUtils.java

@@ -1,10 +1,10 @@
 package com.kmall.admin.haikong.utils;
 
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
 
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -20,9 +20,24 @@ public class ListUtils<T, E> {
             for (int i = 0; i < source.size(); i++) {
                 T o = source.get(i);
                 E t = target.get(i);
-                BeanUtils.copyProperties(o, t);
+                BeanUtils.copyProperties(o, t, getNullPropertyNames(o));
             }
         }
     }
 
+    private String[] getNullPropertyNames (Object source) {
+        final BeanWrapper src = new BeanWrapperImpl(source);
+        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
+
+        Set<String> emptyNames = new HashSet<String>();
+        for(java.beans.PropertyDescriptor pd : pds) {
+            Object srcValue = src.getPropertyValue(pd.getName());
+            if (srcValue == null) {
+                emptyNames.add(pd.getName());
+            }
+        }
+        String[] result = new String[emptyNames.size()];
+        return emptyNames.toArray(result);
+    }
+
 }

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

@@ -37,6 +37,8 @@ public class CalculateOrderDiscountPriceResponseVO {
 
     private Integer afterScore;
 
+    private String openId;
+
     private List<GoodsDetailsDto> goodsDetailsDtos;
 
     public BigDecimal getOrderTotalPrice() {
@@ -111,6 +113,14 @@ public class CalculateOrderDiscountPriceResponseVO {
         this.afterScore = afterScore;
     }
 
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
     @Override
     public String toString() {
         return "CalculateOrderDiscountPriceResponseVO{" +
@@ -122,6 +132,7 @@ public class CalculateOrderDiscountPriceResponseVO {
                 ", scoreLimit=" + scoreLimit +
                 ", beforeScore=" + beforeScore +
                 ", afterScore=" + afterScore +
+                ", openId=" + openId +
                 ", goodsDetailsDtos=" + goodsDetailsDtos +
                 '}';
     }

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

@@ -39,7 +39,7 @@ public class QueryGoodsVO {
     /**
      * 门店id
      */
-    private Integer storeId;
+    private Long storeId;
 
     /**
      * 销售数
@@ -151,6 +151,11 @@ public class QueryGoodsVO {
      */
     private String activity;
 
+    /**
+     * 产品id
+     */
+    private String productId;
+
 
     public String getProdBarcode() {
         return prodBarcode;
@@ -168,11 +173,11 @@ public class QueryGoodsVO {
         this.sku = sku;
     }
 
-    public Integer getStoreId() {
+    public Long getStoreId() {
         return storeId;
     }
 
-    public void setStoreId(Integer storeId) {
+    public void setStoreId(Long storeId) {
         this.storeId = storeId;
     }
 
@@ -376,6 +381,14 @@ public class QueryGoodsVO {
         this.thirdPartyMerchCode = thirdPartyMerchCode;
     }
 
+    public String getProductId() {
+        return productId;
+    }
+
+    public void setProductId(String productId) {
+        this.productId = productId;
+    }
+
     @Override
     public String toString() {
         return "QueryGoodsVO{" +
@@ -404,6 +417,7 @@ public class QueryGoodsVO {
                 ", ciqProdModel='" + ciqProdModel + '\'' +
                 ", toBeRestored=" + toBeRestored +
                 ", exitRegionNumber=" + exitRegionNumber +
+                ", productId=" + productId +
                 ", totalPrice=" + totalPrice +
                 ", lastSaleTime=" + lastSaleTime +
                 ", activity='" + activity + '\'' +

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

@@ -243,4 +243,11 @@ public interface GoodsService {
      * @return              商品信息
      */
     GoodsEntity queryGoodsInfoByProductBarcodeAndSku(String prodBarcode, String sku);
+
+    /**
+     * 更新园区库存
+     * @param goodsEntity   商品实体
+     * @return              更新数
+     */
+    int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity);
 }

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

@@ -157,4 +157,10 @@ public interface ProductStoreRelaService {
      * @param productStoreRelaEntities  门店库存信息
      */
     int restoreBatch(List<ProductStoreRelaEntity> productStoreRelaEntities);
+
+    /**
+     * 更新库存
+     * @param productStoreRelaEntity    门店库存实体
+     */
+    void updateStockNum(ProductStoreRelaEntity productStoreRelaEntity);
 }

+ 29 - 0
kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongMemberScoreChangeRecordService.java

@@ -0,0 +1,29 @@
+package com.kmall.admin.service.haikong;
+
+import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author lhm
+ * @createDate 2021-11-30
+ */
+public interface HaiKongMemberScoreChangeRecordService {
+
+    HaiKongMemberScoreChangeRecordEntity queryObjectByOutBizNo(String outBizNo);
+
+    HaiKongMemberScoreChangeRecordEntity queryObjectByOpenId(String openId);
+
+    Integer queryTotal();
+
+    List<HaiKongMemberScoreChangeRecordEntity> queryList();
+
+    void save(HaiKongMemberScoreChangeRecordEntity haiKongMemberScoreChangeRecordEntity);
+
+    void updateByOutBizNo(HaiKongMemberScoreChangeRecordEntity haiKongMemberScoreChangeRecordEntity);
+
+    void deleteByOutBizNo(String outBizNo);
+
+    void deleteBatchByOutBizNo(List<String> outBizNos);
+}

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -2768,4 +2768,9 @@ public class GoodsServiceImpl implements GoodsService {
     public GoodsEntity queryGoodsInfoByProductBarcodeAndSku(String prodBarcode, String sku) {
         return goodsDao.queryGoodsInfoByProductBarcodeAndSku(prodBarcode, sku);
     }
+
+    @Override
+    public int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity) {
+        return goodsDao.updateStockNumberByProductCodeAndSku(goodsEntity);
+    }
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/OfflineCartServiceImpl.java

@@ -87,7 +87,7 @@ public class OfflineCartServiceImpl implements OfflineCartService {
             cartEntity.setMarketPrice(goods.getStoreMarketPrice());
             cartEntity.setRetailPrice(goods.getStoreRetailPrice());
             cartEntity.setNumber(1);
-            cartEntity.setStockNum(Integer.parseInt(goods.getStockNum()));
+            cartEntity.setStockNum(goods.getStockNum());
             cartEntity.setListPicUrl(goods.getListPicUrl());
             cartEntity.setStoreId(goods.getStoreId());
             cartEntity.setCreateTime(new Date());

+ 175 - 79
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.service.impl;
 
+import cn.hutool.core.lang.UUID;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -21,6 +22,7 @@ import com.kmall.admin.dao.vip.Mall2PointsRulesDao;
 import com.kmall.admin.dto.*;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.entity.haikong.HaiKongMemberOrderSyncResendEntity;
+import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
 import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
 import com.kmall.admin.entity.record.NewRetailOrderRestoreStockRecordEntity;
@@ -31,9 +33,9 @@ import com.kmall.admin.fromcomm.dao.SysConfigDao;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.haikong.constant.Constants;
 import com.kmall.admin.haikong.constant.HaiKongMemberOrderResendStatusEnum;
+import com.kmall.admin.haikong.constant.HaiKongMemberScoreChangeEventEnum;
 import com.kmall.admin.haikong.constant.VmcconnectUrlEnum;
-import com.kmall.admin.haikong.dto.MemberOrderInfoSyncDTO;
-import com.kmall.admin.haikong.dto.WareQueryStockResponseDTO;
+import com.kmall.admin.haikong.dto.*;
 import com.kmall.admin.haikong.utils.ListUtils;
 import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
 import com.kmall.admin.haikong.vo.QueryGoodsVO;
@@ -41,10 +43,10 @@ import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
 import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
 import com.kmall.admin.haikong.client.VmcShopTemplate;
 import com.kmall.admin.haikong.config.HaiKongProperties;
-import com.kmall.admin.haikong.dto.MemberInfoDTO;
 import com.kmall.admin.haikong.utils.Response;
 import com.kmall.admin.service.*;
 import com.kmall.admin.service.haikong.HaiKongMemberOrderSyncResendService;
+import com.kmall.admin.service.haikong.HaiKongMemberScoreChangeRecordService;
 import com.kmall.admin.service.kmall2eccs.KtoEccsService;
 import com.kmall.admin.service.mk.MkActivitiesService;
 import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
@@ -259,8 +261,14 @@ public class OrderServiceImpl implements OrderService {
     /**
      * 同步订单消费信息,重发业务
      */
+    @Autowired
     private HaiKongMemberOrderSyncResendService haiKongMemberOrderSyncResendService;
 
+    /**
+     * 会员积分变动业务
+     */
+    @Autowired
+    private HaiKongMemberScoreChangeRecordService haiKongMemberScoreChangeRecordService;
 
 
     @Override
@@ -2355,29 +2363,42 @@ public class OrderServiceImpl implements OrderService {
         Map resultObj = Maps.newHashMap();
         // 海控需求,下单流程修改,收银端接收会员码,付款码,用户信息,订单数据
         // 1. 校验库存:保税仓库存 + 展销店库存 - 出区数 >= 购买数
-        // 获取保税仓库存
-        String queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(null);
-        if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
-            LOGGER.error("调用库存系统接口出现错误!返回结果为空!");
-            throw new ServiceException("调用库存系统接口出现错误!");
-        }
-        WareQueryStockResponseDTO wareQueryStockResponseDTO = JacksonUtil.fromStringJson(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
-        if (Objects.isNull(wareQueryStockResponseDTO)) {
-            throw new ServiceException("解析一步达库存系统响应数据出现错误!");
-        }
-        List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
-        // 解析xml,组装成map key=>sku value=>库存
+        // TODO 获取保税仓库存,测试时注释
+//        String queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(null);
+//        if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
+//            LOGGER.error("调用库存系统接口出现错误!返回结果为空!");
+//            throw new ServiceException("调用库存系统接口出现错误!");
+//        }
+//        WareQueryStockResponseDTO wareQueryStockResponseDTO = JacksonUtil.fromStringJson(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+//        if (Objects.isNull(wareQueryStockResponseDTO)) {
+//            throw new ServiceException("解析一步达库存系统响应数据出现错误!");
+//        }
+//        List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
+//        // 解析xml,组装成map key=>sku value=>库存
+//        Map<String, Integer> stockMap = new HashMap<>(16);
+//        items.forEach(item -> {
+//            String itemCode = item.getItemCode();
+//            Integer quantity = item.getQuantity();
+//            if (stockMap.containsKey(itemCode)) {
+//                // 避免出现sku相同情况
+//                stockMap.put(itemCode, stockMap.get(itemCode) + quantity);
+//            } else {
+//                stockMap.put(itemCode, quantity);
+//            }
+//        });
+
+        // TODO 上生产时注释,模拟仓库系统(sku最大库存为3)返回
         Map<String, Integer> stockMap = new HashMap<>(16);
-        items.forEach(item -> {
-            String itemCode = item.getItemCode();
-            Integer quantity = item.getQuantity();
-            if (stockMap.containsKey(itemCode)) {
+        goodsList.forEach(goods -> {
+            String sku = (String) goods.get("goodsSn");
+            if (stockMap.containsKey(sku)) {
                 // 避免出现sku相同情况
-                stockMap.put(itemCode, stockMap.get(itemCode) + quantity);
+                stockMap.put(sku, stockMap.get(sku) + 3);
             } else {
-                stockMap.put(itemCode, quantity);
+                stockMap.put(sku, 3);
             }
         });
+
         try {
             if (user == null) {
                 resultObj.put("errno", 400);
@@ -2406,11 +2427,12 @@ public class OrderServiceImpl implements OrderService {
                 QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
                 queryGoodsVo.setProdBarcode((String) map.get("prodBarcode"));
                 queryGoodsVo.setSku((String) map.get("goodsSn"));
-                queryGoodsVo.setStoreId(storeId);
+                queryGoodsVo.setStoreId(storeId.longValue());
                 queryGoodsVo.setSellVolume((Integer) map.get("sellVolume"));
                 queryGoodsVo.setRetailPrice(new BigDecimal(String.valueOf(map.get("retailPrice"))));
                 queryGoodsVo.setGoodsTaxes(new BigDecimal(String.valueOf(map.get("goodstaxes"))));
-                queryGoodsVo.setDisCountedPrice(new BigDecimal(String.valueOf(map.get("disCountedPrice"))));
+                queryGoodsVo.setDisCountedPrice(new BigDecimal(String.valueOf(map.get("discountedPrice"))));
+                queryGoodsVo.setTotalPrice(new BigDecimal(String.valueOf(map.get("actualPaymentAmount"))));
                 queryGoodsVo.setActivity((String) map.get("activity"));
                 queryGoodsVOList.add(queryGoodsVo);
             });
@@ -2425,7 +2447,10 @@ public class OrderServiceImpl implements OrderService {
                 Integer sellVolume = goodsDto.getSellVolume();
                 String prodBarcode = goodsDto.getProdBarcode();
                 String sku = goodsDto.getSku();
+                // 园区库存
                 Integer goodsNumber = goodsDto.getGoodsNumber();
+                // 门店库存
+                Integer stockNum = goodsDto.getStockNum();
                 // 仓库库存可用库存数
                 Integer warehouseStock = stockMap.get(sku);
 
@@ -2477,17 +2502,19 @@ public class OrderServiceImpl implements OrderService {
 
                     // 如果园区库存数量小于等于0, 则不更新园区库存, 园区库存只做参考
                     int diff = Math.max(goodsNumber - sellVolume, 0);
-                    goodsDto.setGoodsNumber(diff);
-                    goodsDto.setLastSaleTime(new Date());
-                    GoodsEntity goodsEntity = new GoodsEntity(goodsDto);
-                    goodsDao.update(goodsEntity);
+                    GoodsEntity goodsEntity = new GoodsEntity();
+                    goodsEntity.setGoodsNumber(diff);
+                    goodsEntity.setLastSaleTime(new Date());
+                    BeanUtils.copyProperties(goodsDto, goodsEntity);
+                    goodsService.updateStockNumberByProductCodeAndSku(goodsEntity);
                     // 门店库存
-                    goodsDto.setStockNum(validNum);
-                    goodsDto.setStoreId(storeId);
-                    goodsDto.setSellVolume(goodsDto.getSellVolume() + sellVolume);
-                    goodsDto.setLastSaleTime(new Date());
-                    ProductStoreRelaEntity productStoreRelaEntity = new ProductStoreRelaEntity(goodsDto);
-                    productStoreRelaDao.updateStockNum(productStoreRelaEntity);//修改普通商品库存
+                    ProductStoreRelaEntity productStoreRelaEntity = new ProductStoreRelaEntity();
+                    BeanUtils.copyProperties(goodsDto, productStoreRelaEntity);
+                    productStoreRelaEntity.setStockNum(validNum);
+                    productStoreRelaEntity.setStoreId(storeId.longValue());
+                    productStoreRelaEntity.setSellVolume(goodsDto.getSellVolume() + sellVolume);
+                    productStoreRelaEntity.setLastSaleTime(new Date());
+                    productStoreRelaService.updateStockNum(productStoreRelaEntity);//修改普通商品库存
 
                     BigDecimal retailPrice = goodsDto.getRetailPrice(); // 单价
                     BigDecimal storeRetailPrice = goodsDto.getRetailPrice(); // 单价
@@ -2496,24 +2523,14 @@ public class OrderServiceImpl implements OrderService {
                     // 实际支付价
                     BigDecimal actualPaymentAmount = goodsDto.getTotalPrice();
 
-                    disCountedPrice = disCountedPrice
-                            .divide(new BigDecimal(sellVolume), 3, RoundingMode.HALF_UP)
-                            .multiply(new BigDecimal(sellVolume))
-                            .setScale(2, RoundingMode.HALF_UP);
-                    actualPaymentAmount = actualPaymentAmount
-                            .divide(new BigDecimal(sellVolume), 3, RoundingMode.HALF_UP)
-                            .multiply(new BigDecimal(sellVolume))
-                            .setScale(2, RoundingMode.HALF_UP);
-
-                    goodsDto.setRetailPrice(retailPrice);
-                    goodsDto.setStoreRetailPrice(storeRetailPrice);
-                    goodsDto.setDisCountedPrice(disCountedPrice);
-                    goodsDto.setTotalPrice(actualPaymentAmount);
-
-                    // 借用这个字段来存储购买数
-                    goodsDto.setGoodsNumber(sellVolume);
-                    goodsDto.setActivity(goodsDto.getActivity());
-                    goodsEntity = new GoodsEntity(goodsDto);
+                    goodsEntity = new GoodsEntity();
+                    BeanUtils.copyProperties(goodsDto, goodsEntity);
+                    goodsEntity.setRetailPrice(retailPrice);
+                    goodsEntity.setStoreRetailPrice(storeRetailPrice);
+                    goodsEntity.setDiscountedPrice(disCountedPrice);
+                    goodsEntity.setActualPaymentAmount(goodsDto.getTotalPrice());
+                    goodsEntity.setSellVolume(goodsDto.getSellVolume());
+                    goodsEntity.setActivity(goodsDto.getActivity());
                     goodsEntities.add(goodsEntity);
                 } else {
                     // sku不存在
@@ -2526,7 +2543,8 @@ public class OrderServiceImpl implements OrderService {
                 totalTax = totalTax.add(tax).setScale(2, BigDecimal.ROUND_HALF_DOWN); // 计算总的税额
             }
 
-
+            String openId = (String) param.get("openId");
+            String memberCode = (String) param.get("memberCode");
             UserEntity userEntity = userDao.queryByMobile((String) userInfo.get("customPhone"));
             if (userEntity == null) {
                 // 保存用户信息
@@ -2539,6 +2557,8 @@ public class OrderServiceImpl implements OrderService {
                 userEntity.setRegisterTime(new Date());
                 userEntity.setLastLoginTime(new Date());
                 userEntity.setIdNo((String) userInfo.get("customIDCard"));
+                userEntity.setOpenId(openId);
+                userEntity.setMemberCode(memberCode);
                 userDao.save(userEntity);
 
                 MerchUserEntity merchUserEntity = new MerchUserEntity();
@@ -2552,6 +2572,12 @@ public class OrderServiceImpl implements OrderService {
                 userEntity.setUsername((String) userInfo.get("customName"));
                 userEntity.setIdNo((String) userInfo.get("customIDCard"));
                 userEntity.setMobile((String) userInfo.get("customPhone"));
+                if (!org.springframework.util.StringUtils.isEmpty(openId)) {
+                    userEntity.setOpenId(openId);
+                }
+                if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
+                    userEntity.setMemberCode(memberCode);
+                }
                 userDao.update(userEntity);
             }
 
@@ -2651,6 +2677,12 @@ public class OrderServiceImpl implements OrderService {
             // 保存订单流转表
             // 设置下单完成时间
             processRecordEntity.setAddOrderSuccTime(order.getPay_time());
+            // 设置其他开始时间
+            Date date = new Date();
+            processRecordEntity.setPaymentStartTime(date);
+            processRecordEntity.setEleOrderStartTime(date);
+            processRecordEntity.setWaybillStartTime(date);
+
             orderProcessRecordDao.save(processRecordEntity);
 
 
@@ -2669,7 +2701,7 @@ public class OrderServiceImpl implements OrderService {
                 saleRecordDao.save(saleRecordEntity);
             }
 
-            // 查询积分规则 ,默认先按消费金额1:1积分
+            // TODO 查询积分规则,根据积分生成规则进行增加会员积分
             Mall2PointsRulesEntity pointsRules = null;
 
             // 增加该会员的积分
@@ -2700,12 +2732,15 @@ public class OrderServiceImpl implements OrderService {
                 consumptionRecords.setIsUseBirthdayOffer("1"); // 没使用生日优惠
             }*/
             // 积分消费记录
-            int deductionScore = (Integer) param.get("deductionScore");
-            String memberCode = String.valueOf(param.get("memberCode"));
+            String deductionScoreStr = (String) param.get("deductionScore");
+            String scoreDeductionPriceStr = (String) param.get("scoreDeductionPrice");
+            Integer beforeScoreInteger = (Integer) param.get("beforeScore") ;
+            Integer afterScoreStrInteger = (Integer) param.get("afterScore");
+            int deductionScore = org.springframework.util.StringUtils.isEmpty(deductionScoreStr) ? 0 : Integer.parseInt(deductionScoreStr);
             String memberPhone = String.valueOf(param.get("memberPhone"));
-            BigDecimal scoreDeductionPrice = new BigDecimal(String.valueOf(param.get("scoreDeductionPrice")));
-            Integer beforeScore = (Integer) param.get("beforeScore");
-            Integer afterScore = (Integer) param.get("afterScore");
+            BigDecimal scoreDeductionPrice = org.springframework.util.StringUtils.isEmpty(scoreDeductionPriceStr) ? BigDecimal.ZERO : new BigDecimal(scoreDeductionPriceStr);
+            Integer beforeScore = beforeScoreInteger;
+            Integer afterScore = afterScoreStrInteger;
             consumptionRecords.setBeforeScore(beforeScore);
             consumptionRecords.setAfterScore(afterScore);
             consumptionRecords.setOrderTotalPrice(order.getActual_price());
@@ -2718,26 +2753,13 @@ public class OrderServiceImpl implements OrderService {
             memberConsumptionRecordsDao.save(consumptionRecords);
 
             // 同步会员订单消费记录
-            HaiKongMemberOrderSyncResendEntity haiKongMemberOrderSyncResendEntity = new HaiKongMemberOrderSyncResendEntity();
-            try {
-                MemberOrderInfoSyncDTO memberOrderInfoSyncDTO = new MemberOrderInfoSyncDTO();
-                memberOrderInfoSyncDTO.setPhone(memberPhone);
-                memberOrderInfoSyncDTO.setOrderNo(order.getOrder_sn());
-                memberOrderInfoSyncDTO.setConsumeDate(new Date());
-                memberOrderInfoSyncDTO.setOrderAmount(order.getActual_price());
-                memberOrderInfoSyncDTO.setOrderScore(deductionScore);
-                BeanUtils.copyProperties(memberOrderInfoSyncDTO, haiKongMemberOrderSyncResendEntity);
-                String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
-                LOGGER.info("请求会员系统同步消费订单接口!请求体:{}", body);
-                // 发送请求
-                String memberOrderSyncResponseJson = haiKongMemberTemplate.memberOrderSync(body);
-                LOGGER.info("请求会员系统同步消费订单接口成功!响应数据:{}", memberOrderSyncResponseJson);
-            } catch (Exception e) {
-                LOGGER.error("请求会员系统同步消费订单接口失败!准备新增发送失败记录,等待重发!异常信息:", e);
-                // TODO 没有请求成功,写表,重发
-                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
-                haiKongMemberOrderSyncResendService.save(haiKongMemberOrderSyncResendEntity);
-            }
+            syncMemberConsumeRecord(memberPhone, order, deductionScore);
+
+            // 积分变动接口,下单扣减
+            syncMemberScoreChangeRecord(openId, order, deductionScore, "下单扣减", HaiKongMemberScoreChangeEventEnum.SUBTRACT.getEvent());
+            // 下单赠送,一元积一分
+            Integer score = order.getActual_price().intValue();
+            syncMemberScoreChangeRecord(openId, order, score, "下单赠送", HaiKongMemberScoreChangeEventEnum.ADD.getEvent());
 
             // 生成取票码
             PickUpCodeEntity pickUpCodeEntity = new PickUpCodeEntity();
@@ -2960,6 +2982,71 @@ public class OrderServiceImpl implements OrderService {
         }
     }
 
+    /**
+     * 同步会员消费记录
+     * @param memberPhone   会员手机号
+     * @param order         订单信息
+     * @param deductionScore    抵扣积分
+     */
+    private void syncMemberConsumeRecord(String memberPhone, OrderVo order, Integer deductionScore) {
+        HaiKongMemberOrderSyncResendEntity haiKongMemberOrderSyncResendEntity = new HaiKongMemberOrderSyncResendEntity();
+        MemberOrderInfoSyncDTO memberOrderInfoSyncDTO = new MemberOrderInfoSyncDTO();
+        memberOrderInfoSyncDTO.setPhone(memberPhone);
+        memberOrderInfoSyncDTO.setOrderNo(order.getOrder_sn());
+        memberOrderInfoSyncDTO.setConsumeDate(new Date());
+        memberOrderInfoSyncDTO.setOrderAmount(order.getActual_price());
+        memberOrderInfoSyncDTO.setOrderScore(deductionScore);
+        BeanUtils.copyProperties(memberOrderInfoSyncDTO, haiKongMemberOrderSyncResendEntity);
+        try {
+            String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
+            LOGGER.info("请求会员系统同步消费订单接口!请求体:{}", body);
+            // 发送请求
+            String memberOrderSyncResponseJson = haiKongMemberTemplate.memberOrderSync(body);
+            haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+            haiKongMemberOrderSyncResendService.save(haiKongMemberOrderSyncResendEntity);
+            LOGGER.info("请求会员系统同步消费订单接口成功!响应数据:{}", memberOrderSyncResponseJson);
+        } catch (Exception e) {
+            LOGGER.error("请求会员系统同步消费订单接口失败!准备新增发送失败记录,等待重发!异常信息:", e);
+            // 没有请求成功,写表,重发
+            haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            haiKongMemberOrderSyncResendService.save(haiKongMemberOrderSyncResendEntity);
+        }
+    }
+
+    /**
+     * 同步会员积分变动记录
+     * @param openId    会员openid
+     * @param order     订单信息
+     * @param score     变动积分
+     */
+    private void syncMemberScoreChangeRecord(String openId, OrderVo order, Integer score, String changeReason, String changeEvent) {
+        HaiKongMemberScoreChangeRecordEntity haiKongMemberScoreChangeRecordEntity = new HaiKongMemberScoreChangeRecordEntity();
+        MemberScoreChangeDTO memberScoreChangeDTO = new MemberScoreChangeDTO();
+        String changeId = UUID.randomUUID(true).toString();
+        memberScoreChangeDTO.setChangeEvent(changeEvent);
+        memberScoreChangeDTO.setChangeId(changeId);
+        memberScoreChangeDTO.setChangeReason(changeReason);
+        memberScoreChangeDTO.setOpenId(openId);
+        memberScoreChangeDTO.setOutBizNo(order.getOrder_sn());
+        memberScoreChangeDTO.setScore(score);
+        BeanUtils.copyProperties(memberScoreChangeDTO, haiKongMemberScoreChangeRecordEntity);
+        try {
+            String body = JacksonUtil.toJson(memberScoreChangeDTO);
+            LOGGER.info("请求会员系统积分变动接口!请求体:{}", body);
+            String changeMemberScoreResponseJson = haiKongMemberTemplate.changeMemberScore(body);
+            Response<MemberScoreChangeResponseDTO> response = JacksonUtil.fromListJson(changeMemberScoreResponseJson, new TypeReference<Response<MemberScoreChangeResponseDTO>>() {});
+            MemberScoreChangeResponseDTO responseData = response.getData();
+            haiKongMemberScoreChangeRecordEntity.setStatementId(responseData.getStatementId());
+            haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+            haiKongMemberScoreChangeRecordService.save(haiKongMemberScoreChangeRecordEntity);
+            LOGGER.info("请求会员系统积分变动接口成功!响应数据:{}", changeMemberScoreResponseJson);
+        } catch (Exception e) {
+            // 失败重发
+            haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            haiKongMemberScoreChangeRecordService.save(haiKongMemberScoreChangeRecordEntity);
+        }
+    }
+
     private boolean orderQuery(OrderVo order, OrderProcessRecordEntity processRecordEntity) {
         LOGGER.info(">>>>>>>>>>>>>>>>>>>>wxOrderQuery 微信查询接口调用");
         String merchOrderSn = order.getMerchOrderSn();
@@ -3817,7 +3904,9 @@ public class OrderServiceImpl implements OrderService {
             QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
             BeanUtils.copyProperties(good, queryGoodsVo);
             queryGoodsVo.setSku(good.getGoodsSn());
-            queryGoodsVo.setStoreId(Integer.parseInt(storeId));
+            queryGoodsVo.setStoreId(Long.parseLong(storeId));
+            queryGoodsVo.setDisCountedPrice(BigDecimal.ZERO);
+            queryGoodsVo.setTotalPrice(good.getActualPaymentAmount());
             orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount());
             goodsVos.add(queryGoodsVo);
         }
@@ -4127,6 +4216,11 @@ public class OrderServiceImpl implements OrderService {
             if (response.getSuccess()) {
                 MemberInfoDTO memberInfoDTO = JacksonUtil.fromStringJson(JacksonUtil.toJson(response.getData()), MemberInfoDTO.class);
                 assert memberInfoDTO != null : String.format("会员码:【%s】会员信息错误!%s", memberCode, JacksonUtil.toJson(response));
+                // 查询会员表
+                /*UserEntity userEntity = userService.queryByMobile(memberCode);
+                userEntity.setOpenId(memberInfoDTO.getOpenId());
+                userEntity.setMemberCode(memberCode);
+                userService.update(userEntity);*/
                 Integer score = memberInfoDTO.getScore();
                 if (Objects.nonNull(score) && score > 0) {
                     // 有积分
@@ -4135,6 +4229,8 @@ public class OrderServiceImpl implements OrderService {
                     calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
                     calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
                     calculateOrderDiscountPriceResponseVO.setBeforeScore(score);
+                    calculateOrderDiscountPriceResponseVO.setOpenId(memberInfoDTO.getOpenId());
+                    calculateOrderDiscountPriceResponseVO.setMemberPhone(memberInfoDTO.getPhone());
                     // 订单完成后再添加积分消费记录,以及同步积分信息
                     return calculateOrderDiscountPriceResponseVO;
                 } else {

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java

@@ -1295,4 +1295,14 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
     public ProductStoreRelaEntity getByStoreSnAndSku(String storeSn, String sku) {
         return productStoreRelaDao.getByStoreSnAndSku(storeSn,sku);
     }
+
+    /**
+     * 更新库存
+     *
+     * @param productStoreRelaEntity 门店库存实体
+     */
+    @Override
+    public void updateStockNum(ProductStoreRelaEntity productStoreRelaEntity) {
+        productStoreRelaDao.updateStockNum(productStoreRelaEntity);
+    }
 }

+ 61 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaiKongMemberScoreChangeRecordServiceImpl.java

@@ -0,0 +1,61 @@
+package com.kmall.admin.service.impl.haikong;
+
+import com.kmall.admin.dao.haikong.HaiKongMemberScoreChangeRecordDao;
+import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
+import com.kmall.admin.service.haikong.HaiKongMemberScoreChangeRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 会员积分变动业务
+ * @author lhm
+ * @createDate 2021-11-30
+ */
+@Service("haiKongMemberScoreChangeRecordServiceImpl")
+public class HaiKongMemberScoreChangeRecordServiceImpl implements HaiKongMemberScoreChangeRecordService {
+
+    @Autowired
+    private HaiKongMemberScoreChangeRecordDao haiKongMemberScoreChangeRecordDao;
+
+    @Override
+    public HaiKongMemberScoreChangeRecordEntity queryObjectByOutBizNo(String outBizNo) {
+        return haiKongMemberScoreChangeRecordDao.queryObjectByOutBizNo(outBizNo);
+    }
+
+    @Override
+    public HaiKongMemberScoreChangeRecordEntity queryObjectByOpenId(String openId) {
+        return haiKongMemberScoreChangeRecordDao.queryObjectByOpenId(openId);
+    }
+
+    @Override
+    public Integer queryTotal() {
+        return haiKongMemberScoreChangeRecordDao.queryTotal();
+    }
+
+    @Override
+    public List<HaiKongMemberScoreChangeRecordEntity> queryList() {
+        return haiKongMemberScoreChangeRecordDao.queryList();
+    }
+
+    @Override
+    public void save(HaiKongMemberScoreChangeRecordEntity haiKongMemberScoreChangeRecordEntity) {
+        haiKongMemberScoreChangeRecordDao.save(haiKongMemberScoreChangeRecordEntity);
+    }
+
+    @Override
+    public void updateByOutBizNo(HaiKongMemberScoreChangeRecordEntity haiKongMemberScoreChangeRecordEntity) {
+        haiKongMemberScoreChangeRecordDao.updateByOutBizNo(haiKongMemberScoreChangeRecordEntity);
+    }
+
+    @Override
+    public void deleteByOutBizNo(String outBizNo) {
+        haiKongMemberScoreChangeRecordDao.deleteByOutBizNo(outBizNo);
+    }
+
+    @Override
+    public void deleteBatchByOutBizNo(List<String> outBizNos) {
+        haiKongMemberScoreChangeRecordDao.deleteBatchByOutBizNo(outBizNos);
+    }
+}

+ 8 - 2
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -57,7 +57,7 @@
         <result property="supplierId" column="supplier_id"/>
         <result property="stockNum" column="stock_num"/>
         <result property="storeName" column="store_name"/>
-        <result property="productId" column="productId"/>
+        <result property="productId" column="product_id"/>
         <result property="storeId" column="storeId"/>
         <result column="merch_name" property="merchName"/>
         <result column="storeMarketPrice" property="storeMarketPrice"/>
@@ -1112,6 +1112,12 @@
             sku=#{item.sku}
         </foreach>
     </update>
+    <update id="updateStockNumberByProductCodeAndSku">
+        update mall_goods
+        set goods_number = #{goodsNumber}
+        where
+        prod_barcode = #{prodBarcode} and sku = #{sku}
+    </update>
 
     <select id="syncOmsHsCodeGoode" resultType="java.lang.String">
         select sku from mall_goods where id in
@@ -1142,7 +1148,7 @@
 
     <select id="queryGoodsStockByQueryGoodsVoList" resultType="com.kmall.admin.entity.GoodsEntity">
         SELECT
-            a.id,a.sku,a.goods_number,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice, r.retail_price as retailPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId',a.goods_rate as goodsRate,
+            a.id,a.sku,a.goods_number,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice, r.retail_price as retailPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id as productId,s.id 'storeId',a.goods_rate as goodsRate,
             a.hs_code as hsCode , a.legal_unit1_qty as legalUnit1Qty , a.legal_unit2_qty as legalUnit2Qty,a.ciq_prod_model as ciqProdModel,a.to_be_restored, r.stock_num, r.exit_region_number as exitRegionNumber,
             a.category_id as categoryId, a.brand_id as brandId
         FROM

+ 20 - 37
kmall-admin/src/main/resources/mybatis/mapper/OrderGoodsDao.xml

@@ -214,52 +214,35 @@
             `mod_time`
         )
         values
-        <foreach collection="list" item="item" open="(" separator="," close=")">
-            #{item.order_id},
-            #{item.goods_id},
-            #{item.goods_name},
-            #{item.goods_sn},
-            #{item.product_id},
-            #{item.number},
-            #{item.market_price},
-            #{item.retail_price},
-            #{item.discountedPrice},
-            #{item.actualPaymentAmount},
-            #{item.goods_specification_name_value},
-            #{item.is_real},
-            #{item.goods_specification_ids},
-            #{item.list_pic_url},
-            0,
-            #{item.taxPrice},
-            #{item.storeTopicId},
-            <if test="item.goodsRate != null" >
+        <foreach collection="list" item="item" separator=",">
+            (
+                #{item.order_id},
+                #{item.goods_id},
+                #{item.goods_name},
+                #{item.goods_sn},
+                #{item.product_id},
+                #{item.number},
+                #{item.market_price},
+                #{item.retail_price},
+                #{item.discountedPrice},
+                #{item.actualPaymentAmount},
+                #{item.goods_specification_name_value},
+                #{item.is_real},
+                #{item.goods_specification_ids},
+                #{item.list_pic_url},
+                0,
+                #{item.taxPrice},
+                #{item.storeTopicId},
                 #{item.goodsRate},
-            </if>
-            <if test="item.settlePrice != null" >
                 #{item.settlePrice},
-            </if>
-
-            <if test="item.sku != null" >
                 #{item.sku,jdbcType=VARCHAR},
-            </if>
-            <if test="item.orderBizType != null" >
                 #{item.orderBizType,jdbcType=VARCHAR},
-            </if>
-            <if test="item.activity != null">
                 #{item.activity},
-            </if>
-            <if test="item.createrSn != null" >
                 #{item.createrSn,jdbcType=VARCHAR},
-            </if>
-            <if test="item.createTime != null" >
                 #{item.createTime,jdbcType=TIMESTAMP},
-            </if>
-            <if test="item.moderSn != null" >
                 #{item.moderSn,jdbcType=VARCHAR},
-            </if>
-            <if test="item.modTime != null" >
                 #{item.modTime,jdbcType=TIMESTAMP}
-            </if>
+            )
         </foreach>
     </insert>
 

+ 89 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/HaiKongMemberScoreChangeRecordDao.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.kmall.admin.dao.haikong.HaiKongMemberScoreChangeRecordDao">
+    <resultMap id="CommonResultMap" type="com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity">
+        <id column="id" property="id" />
+        <result column="open_id" property="openId" />
+        <result column="score" property="score" />
+        <result column="out_biz_no" property="outBizNo" />
+        <result column="change_reason" property="changeReason" />
+        <result column="change_event" property="changeEvent" />
+        <result column="change_id" property="changeId" />
+        <result column="statement_id" property="statementId" />
+        <result column="modify_time" property="modifyTime" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <select id="queryObjectByOutBizNo" resultType="com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity">
+        select *
+        from haikong_member_score_change_record
+        where haikong_member_score_change_record.out_biz_no = #{outBizNo}
+    </select>
+
+    <select id="queryObjectByOpenId" resultType="com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity">
+        select *
+        from haikong_member_score_change_record
+        where haikong_member_score_change_record.open_id = #{openId}
+    </select>
+
+    <select id="queryTotal" resultType="int">
+        select count(1)
+        from haikong_member_score_change_record
+    </select>
+
+    <select id="queryList" resultType="com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity">
+        select *
+        from haikong_member_score_change_record
+    </select>
+
+    <insert id="save" parameterType="com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity" useGeneratedKeys="true" keyProperty="id">
+        insert into haikong_member_score_change_record(
+        `open_id`,
+        `score`,
+        `out_biz_no`,
+        `change_reason`,
+        `change_event`,
+        `change_id`,
+        `statement_id`,
+        `modify_time`,
+        `create_time`)
+        values(
+        #{openId},
+        #{score},
+        #{outBizNo},
+        #{changeReason},
+        #{changeId},
+        #{changeEvent},
+        #{statementId},
+        #{modifyTime},
+        #{createTime}
+    </insert>
+
+    <update id="updateByOutBizNo" parameterType="com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity">
+        update haikong_member_score_change_record
+        <set>
+            <if test="openId != null">`open_id` = #{openId}, </if>
+            <if test="score != null">`score` = #{score}, </if>
+            <if test="outBizNo != null">`out_biz_no` = #{outBizNo}, </if>
+            <if test="changeReason != null">`change_reason` = #{changeReason}, </if>
+            <if test="changeId != null">`change_id` = #{changeId}, </if>
+            <if test="changeEvent != null">`change_event` = #{changeEvent}, </if>
+            <if test="statementId != null">`statement_id` = #{statementId}, </if>
+            <if test="modifyTime != null">`modify_time` = #{modifyTime}</if>
+            <if test="createTime != null">`create_time` = #{createTime}</if>
+        </set>
+        where out_biz_no = #{outBizNo}
+    </update>
+
+    <delete id="deleteByOutBizNo">
+        delete from haikong_member_score_change_record where out_biz_no = #{outBizNo}
+    </delete>
+
+    <delete id="deleteBatchByOutBizNo">
+        delete from haikong_member_score_change_record where out_biz_no in
+        <foreach item="item" collection="list" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </delete>
+
+</mapper>

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

@@ -605,7 +605,9 @@ let vm = new Vue({
         // 抵扣前积分
         beforeScore: 0,
         // 抵扣后积分
-        afterScore: 0
+        afterScore: 0,
+        // 会员openid
+        openId: ''
     },
     watch: {
         prodBarcode (){
@@ -1964,6 +1966,7 @@ function toPayOrder(payCode){
                  'scoreLimit': vm.scoreLimit,
                  'beforeScore': vm.beforeScore,
                  'afterScore': vm.afterScore,
+                 'openId': vm.openId,
                  'cmbProvince':cmbProvince,
                  'cmbCity':cmbCity,
                  'cmbArea':cmbArea,
@@ -2053,6 +2056,7 @@ calculateOrderPrice = function() {
                 vm.actualPrice = r.data.orderTotalPrice;
                 vm.memberCode = r.data.memberCode;
                 vm.memberPhone = r.data.memberPhone;
+                vm.openId = r.data.openId;
                 vm.deductionScore = r.data.deductionScore;
                 vm.scoreDeductionPrice = r.data.scoreDeductionPrice;
                 vm.scoreLimit = r.data.scoreLimit;

+ 2 - 2
kmall-admin/src/test/java/com/kmall/admin/Test.java

@@ -43,12 +43,12 @@ public class Test {
         List<QueryGoodsVO> list = new ArrayList<>();
 
         QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
-        queryGoodsVo.setStoreId(171);
+        queryGoodsVo.setStoreId(171L);
         queryGoodsVo.setSku("ISZWCW50466");
         queryGoodsVo.setProdBarcode("9421033250865");
 
         QueryGoodsVO queryGoodsVO1 = new QueryGoodsVO();
-        queryGoodsVO1.setStoreId(163);
+        queryGoodsVO1.setStoreId(163L);
         queryGoodsVO1.setSku("ISZWCW50466");
         queryGoodsVO1.setProdBarcode("9421033250865");