Explorar el Código

Merge branch 'master' of lhm/kmall-haikong into master

lhm hace 3 años
padre
commit
a8bfc982e0
Se han modificado 23 ficheros con 411 adiciones y 133 borrados
  1. 6 0
      kmall-admin/src/main/java/com/kmall/admin/aop/InterfaceExternalAspect.java
  2. 12 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongSendOrderInfoDetailRecordEntity.java
  3. 66 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/ErrorCodeConstants.java
  4. 1 16
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberOrderInfoSyncDTO.java
  5. 15 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoDTO.java
  6. 12 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoItemDTO.java
  7. 8 3
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java
  8. 10 4
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberScoreChangeResendTask.java
  9. 18 6
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/SendOrderInfoTask.java
  10. 51 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/DeepCopyUtils.java
  11. 12 2
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  12. 124 88
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  13. 2 1
      kmall-admin/src/main/resources/conf/cuspay/cuspay-wx.properties
  14. 2 1
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  15. 1 1
      kmall-admin/src/main/resources/mybatis/mapper/PickUpCodeDao.xml
  16. 9 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/HaikongSendOrderInfoDetailRecordDao.xml
  17. 4 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesscore.html
  18. 4 1
      kmall-admin/src/main/webapp/js/mk/mkactivitiesscore.js
  19. 1 1
      kmall-admin/src/main/webapp/js/sale/sale.js
  20. 10 2
      kmall-admin/src/main/webapp/js/shop/interfacesendlog.js
  21. 38 3
      kmall-admin/src/test/java/com/kmall/admin/Test.java
  22. 4 4
      kmall-manager/src/main/resources/conf/wx-mp.properties
  23. 1 0
      sql/init/other_table.sql

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/aop/InterfaceExternalAspect.java

@@ -48,6 +48,9 @@ public class InterfaceExternalAspect {
              interfaceSendLogEntity = getMethdMsg(methd);
             Object[] args = proceedingJoinPoint.getArgs();
             for (Object o : args) {
+                if (o instanceof String) {
+                    o = ((String) o).replaceAll("\r|\n", "");
+                }
                 requestLog.append(String.format("参数:%s\r\n", JSON.toJSON(o)));
             }
             interfaceSendLogEntity.setRequestDate(new Date());
@@ -57,6 +60,9 @@ public class InterfaceExternalAspect {
             exMsg = e.getMessage();
             throw e;
         } finally {
+            if (result instanceof String) {
+                result = ((String) result).replaceAll("\r|\n", "");
+            }
             saveVmcSend(interfaceSendLogEntity,requestLog.toString(),JSON.toJSONString(result),exMsg);
         }
         return result;

+ 12 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongSendOrderInfoDetailRecordEntity.java

@@ -48,6 +48,10 @@ public class HaiKongSendOrderInfoDetailRecordEntity implements Serializable {
      */
     private BigDecimal price;
     /**
+     * 成交价
+     */
+    private BigDecimal buyPrice;
+    /**
      * 商品编码
      */
     private String itemcode;
@@ -233,4 +237,12 @@ public class HaiKongSendOrderInfoDetailRecordEntity implements Serializable {
     public void setTaxPrice(BigDecimal taxPrice) {
         this.taxPrice = taxPrice;
     }
+
+    public BigDecimal getBuyPrice() {
+        return buyPrice;
+    }
+
+    public void setBuyPrice(BigDecimal buyPrice) {
+        this.buyPrice = buyPrice;
+    }
 }

+ 66 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/ErrorCodeConstants.java

@@ -0,0 +1,66 @@
+package com.kmall.admin.haikong.constant;
+
+/**
+ * 海控对接,错误码枚举
+ * @author lhm
+ * @createDate 2021-12-21
+ */
+public class ErrorCodeConstants {
+
+    /**
+     * 会员系统异常返回码
+     */
+    public enum MemberSysErrorCodeEnum {
+        CODE_0(0, "成功"),
+        CODE_500(500, "系统繁忙"),
+        CODE_1001(1001, "参数不合法"),
+        CODE_150007(150007, "退款积分超出上线"),
+        CODE_150008(150008, "积分不够扣除"),
+        CODE_150009(150009, "积分余额不足以回退"),
+        CODE_150010(150010, "仅支持全额回退")
+        ;
+
+        private final Integer code;
+
+        private final String desc;
+
+        MemberSysErrorCodeEnum(Integer code, String desc) {
+            this.code = code;
+            this.desc = desc;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    /**
+     * 免税mall异常返回码
+     */
+    public enum VmcShopSysErrorCodeEnum {
+        CODE_0(0, "成功"),
+        CODE_10500(10500, "参数不合法"),
+        ;
+
+        private final Integer code;
+
+        private final String desc;
+
+        VmcShopSysErrorCodeEnum(Integer code, String desc) {
+            this.code = code;
+            this.desc = desc;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+}

+ 1 - 16
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberOrderInfoSyncDTO.java

@@ -28,12 +28,6 @@ public class MemberOrderInfoSyncDTO implements Serializable {
     private String openId;
 
     /**
-     * 会员手机号
-     */
-    @JsonProperty("phone")
-    private String phone;
-
-    /**
      * 消费时间
      */
     @JsonProperty("consume_date")
@@ -66,7 +60,7 @@ public class MemberOrderInfoSyncDTO implements Serializable {
     /**
      * 这笔订单需要发放的积分
      */
-    @JsonProperty("order_score")
+    @JsonProperty("score")
     private Integer orderScore;
 
     public Long getStoreId() {
@@ -85,14 +79,6 @@ public class MemberOrderInfoSyncDTO implements Serializable {
         this.openId = openId;
     }
 
-    public String getPhone() {
-        return phone;
-    }
-
-    public void setPhone(String phone) {
-        this.phone = phone;
-    }
-
     public Date getConsumeDate() {
         return consumeDate;
     }
@@ -146,7 +132,6 @@ public class MemberOrderInfoSyncDTO implements Serializable {
         return "MemberOrderInfoSyncDTO{" +
                 "storeId=" + storeId +
                 ", openId='" + openId + '\'' +
-                ", phone='" + phone + '\'' +
                 ", consumeDate=" + consumeDate +
                 ", orderAmount=" + orderAmount +
                 ", orderNo='" + orderNo + '\'' +

+ 15 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoDTO.java

@@ -63,6 +63,12 @@ public class OrderInfoDTO implements Serializable {
 
     private String platform;
 
+    /**
+     * 商品优惠后总金额
+     */
+    @JsonProperty("finally_cart_amount")
+    private BigDecimal finallyCartAmount;
+
     public String getOuterOrderNo() {
         return outerOrderNo;
     }
@@ -191,6 +197,14 @@ public class OrderInfoDTO implements Serializable {
         this.platform = platform;
     }
 
+    public BigDecimal getFinallyCartAmount() {
+        return finallyCartAmount;
+    }
+
+    public void setFinallyCartAmount(BigDecimal finallyCartAmount) {
+        this.finallyCartAmount = finallyCartAmount;
+    }
+
     @Override
     public String toString() {
         return "OrderInfoDTO{" +
@@ -209,6 +223,7 @@ public class OrderInfoDTO implements Serializable {
                 ", weight='" + weight + '\'' +
                 ", quantity='" + quantity + '\'' +
                 ", orderTotal=" + orderTotal +
+                ", finallyCartAmount=" + finallyCartAmount +
                 ", platform='" + platform + '\'' +
                 '}';
     }

+ 12 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoItemDTO.java

@@ -30,6 +30,9 @@ public class OrderInfoItemDTO implements Serializable {
 
     private BigDecimal price;
 
+    @JsonProperty("buy_price")
+    private BigDecimal buyPrice;
+
     private String itemcode;
 
     private BigDecimal amount;
@@ -138,6 +141,14 @@ public class OrderInfoItemDTO implements Serializable {
         this.taxPrice = taxPrice;
     }
 
+    public BigDecimal getBuyPrice() {
+        return buyPrice;
+    }
+
+    public void setBuyPrice(BigDecimal buyPrice) {
+        this.buyPrice = buyPrice;
+    }
+
     @Override
     public String toString() {
         return "OrderInfoItemDTO{" +
@@ -148,6 +159,7 @@ public class OrderInfoItemDTO implements Serializable {
                 ", name='" + name + '\'' +
                 ", cost=" + cost +
                 ", price=" + price +
+                ", buyPrice=" + buyPrice +
                 ", itemcode='" + itemcode + '\'' +
                 ", amount=" + amount +
                 ", nums=" + nums +

+ 8 - 3
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.kmall.admin.entity.haikong.HaiKongMemberOrderSyncResendEntity;
 import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
+import com.kmall.admin.haikong.constant.ErrorCodeConstants;
 import com.kmall.admin.haikong.constant.HaiKongMemberOrderResendStatusEnum;
 import com.kmall.admin.haikong.dto.MemberOrderInfoSyncDTO;
 import com.kmall.admin.haikong.dto.MemberScoreChangeDTO;
@@ -58,18 +59,22 @@ public class MemberOrderSyncResendTask {
             try {
                 String responseJson = haiKongMemberTemplate.changeMemberScore(body);
                 Response<String> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<String>>() {});
-                if (Objects.nonNull(response) && response.getSuccess()) {
+                if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_0.getCode().equals(response.getCode())) {
                     haiKongMemberOrderSyncResendEntity.setMemberSysOrderId(response.getData());
                     haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
                     successList.add(haiKongMemberOrderSyncResendEntity);
                     log.info("【重发】请求会员消费订单同步接口成功!响应数据:{}", responseJson);
-                } else {
+                } else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
                     haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
                     failedList.add(haiKongMemberOrderSyncResendEntity);
                     log.error("【重发】请求会员消费订单同步接口失败!响应:{}", responseJson);
+                } else {
+                    haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                    failedList.add(haiKongMemberOrderSyncResendEntity);
+                    log.error("【重发】请求会员消费订单同步接口失败!响应:{}", responseJson);
                 }
             } catch (Exception e) {
-                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
+                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
                 failedList.add(haiKongMemberOrderSyncResendEntity);
                 log.error("【重发】请求会员消费订单同步接口失败!异常:", e);
             }

+ 10 - 4
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberScoreChangeResendTask.java

@@ -3,6 +3,7 @@ package com.kmall.admin.haikong.task;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
+import com.kmall.admin.haikong.constant.ErrorCodeConstants;
 import com.kmall.admin.haikong.constant.HaiKongMemberOrderResendStatusEnum;
 import com.kmall.admin.haikong.constant.HaiKongMemberScoreChangeEventEnum;
 import com.kmall.admin.haikong.dto.MemberScoreChangeDTO;
@@ -56,20 +57,25 @@ public class MemberScoreChangeResendTask {
             log.info("【重发】请求会员系统积分变动接口!请求体:{}", body);
             try {
                 String responseJson = haiKongMemberTemplate.changeMemberScore(body);
-                Response<String> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<String>>() {});
-                if (Objects.nonNull(response) && response.getSuccess()) {
+                Response<String> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<String>>() {
+                });
+                if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_0.getCode().equals(response.getCode())) {
                     MemberScoreChangeResponseDTO responseData = JacksonUtil.fromStringJson(response.getData(), MemberScoreChangeResponseDTO.class);
                     haiKongMemberScoreChangeRecordEntity.setStatementId(responseData.getStatementId());
                     haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
                     successList.add(haiKongMemberScoreChangeRecordEntity);
                     log.info("【重发】请求会员系统积分变动接口成功!响应数据:{}", responseJson);
-                } else {
+                } else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
                     haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
+                    successList.add(haiKongMemberScoreChangeRecordEntity);
+                    log.info("【重发】请求会员系统积分变动接口失败!响应:{}", responseJson);
+                } else {
+                    haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
                     failedList.add(haiKongMemberScoreChangeRecordEntity);
                     log.error("【重发】请求会员系统积分变动接口失败!响应:{}", responseJson);
                 }
             } catch (Exception e) {
-                haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
+                haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
                 failedList.add(haiKongMemberScoreChangeRecordEntity);
                 log.error("【重发】请求会员系统积分变动接口失败!异常:", e);
             }

+ 18 - 6
kmall-admin/src/main/java/com/kmall/admin/haikong/task/SendOrderInfoTask.java

@@ -5,6 +5,7 @@ import com.kmall.admin.entity.haikong.HaiKongMemberOrderSyncResendEntity;
 import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoDetailRecordEntity;
 import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity;
 import com.kmall.admin.haikong.client.VmcShopTemplate;
+import com.kmall.admin.haikong.constant.ErrorCodeConstants;
 import com.kmall.admin.haikong.constant.HaiKongMemberOrderResendStatusEnum;
 import com.kmall.admin.haikong.dto.*;
 import com.kmall.admin.haikong.utils.Response;
@@ -63,9 +64,12 @@ public class SendOrderInfoTask {
             SeaportInfoDTO seaportInfoDTO = new SeaportInfoDTO();
             PayInfoDTO payInfoDTO = new PayInfoDTO();
             OrderInfoDTO orderInfoDTO = new OrderInfoDTO();
-
             BeanUtils.copyProperties(haiKongSendOrderInfoRecordEntity, orderInfoDTO);
+            orderInfoDTO.setFinallyCartAmount(haiKongSendOrderInfoRecordEntity.getOrderTotal());
             BeanUtils.copyProperties(haiKongSendOrderInfoRecordEntity, payInfoDTO);
+            String response1 = payInfoDTO.getResponse();
+            response1 = response1.replaceAll("\r|\n", "");
+            payInfoDTO.setResponse(response1);
             seaportInfoDTO.setSeaportCode(haiKongSendOrderInfoRecordEntity.getSeaportCode());
             seaportInfoDTO.setPlatform(haiKongSendOrderInfoRecordEntity.getPlatform());
             seaportInfoDTO.setIdentityCard(haiKongSendOrderInfoRecordEntity.getIdentityCard());
@@ -86,22 +90,30 @@ public class SendOrderInfoTask {
             sendOrderToVmcShopDTO.setOrderInfoItems(dtoList);
             sendOrderToVmcShopDTO.setOrderInfo(orderInfoDTO);
 
-            String body = JacksonUtil.toJson(sendOrderToVmcShopDTO);
-            log.info("【重发】请求免税mall创建订单接口!请求体:{}", body);
             try {
+                String body = JacksonUtil.getObjectMapper().writeValueAsString(sendOrderToVmcShopDTO);
+                log.info("【重发】请求免税mall创建订单接口!请求体:{}", body);
                 String responseJson = vmcShopTemplate.sendOrder(body);
                 Response<String> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<String>>() {});
-                if (Objects.nonNull(response) && !"failure".equals(response.getResult())) {
+                if (Objects.nonNull(response) && ErrorCodeConstants.VmcShopSysErrorCodeEnum.CODE_0.getCode().equals(response.getCode())) {
                     haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
                     successList.add(haiKongSendOrderInfoRecordEntity);
                     log.info("【重发】请求免税mall创建订单接口成功!响应数据:{}", responseJson);
-                } else {
+                } else if (Objects.nonNull(response) && ErrorCodeConstants.VmcShopSysErrorCodeEnum.CODE_10500.getCode().equals(response.getCode())) {
+                    haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                    failedList.add(haiKongSendOrderInfoRecordEntity);
+                    log.error("【重发】请求免税mall创建订单接口失败!响应:{}", responseJson);
+                } else if (Objects.isNull(response)) {
                     haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
                     failedList.add(haiKongSendOrderInfoRecordEntity);
                     log.error("【重发】请求免税mall创建订单接口失败!响应:{}", responseJson);
+                } else {
+                    haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                    failedList.add(haiKongSendOrderInfoRecordEntity);
+                    log.error("【重发】请求免税mall创建订单接口失败!响应:{}", responseJson);
                 }
             } catch (Exception e) {
-                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_FAILED.getStatus());
+                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
                 failedList.add(haiKongSendOrderInfoRecordEntity);
                 log.error("【重发】请求免税mall创建订单接口失败!异常:", e);
             }

+ 51 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/DeepCopyUtils.java

@@ -0,0 +1,51 @@
+package com.kmall.admin.haikong.utils;
+
+import java.io.*;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * 深拷贝工具类
+ * @author lhm
+ * @createDate 2021-12-21
+ */
+public class DeepCopyUtils {
+
+    public static <T> Collection<T> depCopyHashSet(Collection<T> srcList) {
+        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+        try {
+            ObjectOutputStream out = new ObjectOutputStream(byteOut);
+            out.writeObject(srcList);
+
+            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
+            ObjectInputStream inStream = new ObjectInputStream(byteIn);
+            HashSet<T> destList = (HashSet<T>) inStream.readObject();
+            return destList;
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static <T> Collection<T> depCopyList(Collection<T> srcList) {
+        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+        try {
+            ObjectOutputStream out = new ObjectOutputStream(byteOut);
+            out.writeObject(srcList);
+
+            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
+            ObjectInputStream inStream = new ObjectInputStream(byteIn);
+            List<T> destList = (List<T>) inStream.readObject();
+            return destList;
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}

+ 12 - 2
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -14,10 +14,12 @@ import com.kmall.admin.entity.kmall2eccs.KtoEccsEntity;
 import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.entity.shop.ShopErrorPriceRecordEntity;
 import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
+import com.kmall.admin.haikong.config.HaiKongProperties;
 import com.kmall.admin.haikong.constant.Constants;
 import com.kmall.admin.haikong.dto.Criteria;
 import com.kmall.admin.haikong.dto.WareQueryStockParamDTO;
 import com.kmall.admin.haikong.dto.WareQueryStockResponseDTO;
+import com.kmall.admin.haikong.utils.XmlUtils;
 import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.admin.service.*;
 import com.kmall.admin.service.kmall2eccs.KtoEccsService;
@@ -34,6 +36,7 @@ import com.kmall.common.constant.Dict;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.common.utils.*;
 import com.kmall.manager.manager.express.sf.ServiceException;
+import com.kmall.manager.manager.express.sf.XmlUtil;
 import com.kmall.manager.manager.redis.JedisCacheManager;
 import com.kmall.manager.manager.redis.JedisUtil;
 import org.slf4j.Logger;
@@ -137,6 +140,9 @@ public class GoodsServiceImpl implements GoodsService {
 
     @Autowired
     private HaiKongWarehouseTemplate haiKongWarehouseTemplate;
+
+    @Autowired
+    private HaiKongProperties haiKongProperties;
     @Autowired
     private Environment environment;
 
@@ -1581,7 +1587,7 @@ public class GoodsServiceImpl implements GoodsService {
                 Criteria criteria = new Criteria();
                 criteria.setItemId(goods.getWarehouseSysGoodId());
                 criteria.setItemCode(goods.getSku());
-                criteria.setOwnerCode(goods.getConsignorSn());
+                criteria.setOwnerCode(haiKongProperties.getWareCompanyCode());
                 criteria.setInventoryType(Constants.InventoryType.ZP.getType());
                 criteria.setWarehouseCode(goods.getWarehouseSn());
                 criteriaList.add(criteria);
@@ -1597,7 +1603,11 @@ public class GoodsServiceImpl implements GoodsService {
                     log.error("调用库存系统接口出现错误!返回结果为空!");
                     throw new ServiceException("调用库存系统接口出现错误!");
                 }
-                wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtil.xmlStrToBean(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+                try {
+                    wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtils.toObject(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+                } catch (Exception e) {
+                    log.error("解析一步达库存系统响应数据出现错误!出现异常:", e);
+                }
                 if (Objects.isNull(wareQueryStockResponseDTO)) {
                     log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
                     throw new ServiceException("解析一步达库存系统响应数据出现错误!");

+ 124 - 88
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -1,6 +1,10 @@
 package com.kmall.admin.service.impl;
 
+import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.lang.UUID;
+import cn.hutool.core.lang.generator.SnowflakeGenerator;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.XmlUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -11,6 +15,8 @@ import com.google.gson.Gson;
 import com.google.gson.internal.LinkedTreeMap;
 import com.kmall.admin.cuspay.biz.ali.AliCusDeclareBiz;
 import com.kmall.admin.cuspay.biz.wx.WxCusDeclareBiz;
+import com.kmall.admin.cuspay.manager.snow.SnowflakeIdWorker;
+import com.kmall.admin.cuspay.manager.snow.SnowflakeUtil;
 import com.kmall.admin.dao.*;
 import com.kmall.admin.dao.alarm.Mall2LowPriceWarningDao;
 import com.kmall.admin.dao.mk.Mk2GoodsTopicPriceDao;
@@ -35,7 +41,9 @@ import com.kmall.admin.fromcomm.dao.SysConfigDao;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.haikong.constant.*;
 import com.kmall.admin.haikong.dto.*;
+import com.kmall.admin.haikong.utils.DeepCopyUtils;
 import com.kmall.admin.haikong.utils.ListUtils;
+import com.kmall.admin.haikong.utils.XmlUtils;
 import com.kmall.admin.haikong.vo.*;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
 import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
@@ -2211,63 +2219,69 @@ public class OrderServiceImpl implements OrderService {
         Map resultObj = Maps.newHashMap();
         // 海控需求,下单流程修改,收银端接收会员码,付款码,用户信息,订单数据
         // 1. 校验库存:保税仓库存 + 展销店库存 - 出区数 >= 购买数
-        /* -----------------↓--------------生产请打开注释-------------------↓------------ */
-        /*WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
-        List<Criteria> criteriaList = new ArrayList<>();
-        goodsList.forEach(goods -> {
-            Criteria criteria = new Criteria();
-            String sku = (String) goods.get("goodsSn");
-            criteria.setItemCode(sku);
-            GoodsEntity goodsEntity = goodsEntityMap.get(sku);
-            criteria.setItemId(goodsEntity.getWarehousSysGoodId());
-            criteria.setWarehouseCode(goodsEntity.getWarehouseSn());
-            criteria.setOwnerCode(goodsEntity.getConsignorSn());
-            criteria.setInventoryType(Constants.InventoryType.ZP.getType());
-            criteriaList.add(criteria);
-        });
-        wareQueryStockParamDTO.setCriteriaList(criteriaList);
-        String queryWarehouseStockResponse = null;
-        try {
-            queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
-        } catch (Exception e) {
-            LOGGER.error("下单调用海控仓库系统查询库存出现异常!", e);
-            throw new ServiceException(String.format("下单调用海控仓库系统查询库存出现异常!"));
-        }
-        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);
+        Map<String, Integer> stockMap = null;
+
+        String env = environment.getProperty("haikong.env");
+        if (Constants.PROD.equals(env)) {
+            WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
+            List<Criteria> criteriaList = new ArrayList<>();
+            goodsList.forEach(goods -> {
+                Criteria criteria = new Criteria();
+                String sku = (String) goods.get("goodsSn");
+                criteria.setItemCode(sku);
+                GoodsEntity goodsEntity = goodsEntityMap.get(sku);
+                criteria.setItemId(goodsEntity.getWarehousSysGoodId());
+                criteria.setWarehouseCode(goodsEntity.getWarehouseSn());
+                criteria.setOwnerCode(haiKongProperties.getWareCompanyCode());
+                criteria.setInventoryType(Constants.InventoryType.ZP.getType());
+                criteriaList.add(criteria);
+            });
+            wareQueryStockParamDTO.setCriteriaList(criteriaList);
+            String queryWarehouseStockResponse = null;
+            try {
+                queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
+            } catch (Exception e) {
+                LOGGER.error("下单调用海控仓库系统查询库存出现异常!", e);
+                throw new ServiceException(String.format("下单调用海控仓库系统查询库存出现异常!"));
             }
-        });*/
-        /* -----------------↑--------------生产请打开注释------------------↑------------- */
-
-        /* -----------------↓--------------测试数据,生产请注释-------------------↓------------ */
-        Map<String, Integer> stockMap = new HashMap<>(16);
-        goodsList.forEach(goods -> {
-            String sku = (String) goods.get("goodsSn");
-            if (stockMap.containsKey(sku)) {
-                // 避免出现sku相同情况
-                stockMap.put(sku, stockMap.get(sku) + 3);
-            } else {
-                stockMap.put(sku, 3);
+            if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
+                LOGGER.error("调用库存系统接口出现错误!返回结果为空!");
+                throw new ServiceException("调用库存系统接口出现错误!");
             }
-        });
-        /* -----------------↑--------------测试数据,生产请注释------------------↑------------- */
+            WareQueryStockResponseDTO wareQueryStockResponseDTO = null;
+            try {
+                wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtils.toObject(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+            } catch (Exception e) {
+                LOGGER.error("解析一步达库存系统响应数据出现错误!", e);
+            }
+            if (Objects.isNull(wareQueryStockResponseDTO)) {
+                throw new ServiceException("解析一步达库存系统响应数据出现错误!");
+            }
+            List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
+            // 解析xml,组装成map key=>sku value=>库存
+            stockMap = new HashMap<>(16);
+            for (WareQueryStockResponseDTO.WareQueryStockResponseItemDTO item : items) {
+                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);
+                }
+            }
+        } else {
+            stockMap = new HashMap<>(16);
+            for (LinkedHashMap goods : goodsList) {
+                String sku = (String) goods.get("goodsSn");
+                if (stockMap.containsKey(sku)) {
+                    // 避免出现sku相同情况
+                    stockMap.put(sku, stockMap.get(sku) + 3);
+                } else {
+                    stockMap.put(sku, 3);
+                }
+            }
+        }
 
         try {
             if (user == null) {
@@ -2297,7 +2311,9 @@ public class OrderServiceImpl implements OrderService {
 
             //生成商户订单号
             SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
-            String orderSn = "ZMHK" + format.format(new Date()) + CommonUtil.generateOrderNumber();
+//            String orderSn = "ZMHK" + format.format(new Date()) + CommonUtil.generateOrderNumber();
+            Snowflake snowflake = IdUtil.createSnowflake(14, 14);
+            String orderSn = "8" + snowflake.nextIdStr().substring(6);
             // 检查库存和更新库存
             for (QueryGoodsVO goodsDto : queryGoodsVOList) {
                 // 要购买的数量
@@ -2417,7 +2433,7 @@ public class OrderServiceImpl implements OrderService {
 
             String openId = (String) param.get("openId");
             String memberCode = (String) param.get("memberCode");
-            UserEntity userEntity = userDao.queryByMobile((String) userInfo.get("customPhone"));
+            UserEntity userEntity = userDao.queryByOpenId((String) userInfo.get("customPhone"));
             if (userEntity == null) {
                 // 保存用户信息
                 userEntity = new UserEntity();
@@ -2429,7 +2445,7 @@ public class OrderServiceImpl implements OrderService {
                 userEntity.setRegisterTime(new Date());
                 userEntity.setLastLoginTime(new Date());
                 userEntity.setIdNo((String) userInfo.get("customIDCard"));
-                userEntity.setOpenId(openId);
+                userEntity.setOpenId(userEntity.getMobile());
                 userEntity.setMemberCode(memberCode);
                 userDao.save(userEntity);
 
@@ -2444,12 +2460,8 @@ 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);
-                }
+                userEntity.setOpenId(userEntity.getMobile());
+                userEntity.setMemberCode(memberCode);
                 userDao.update(userEntity);
             }
 
@@ -2515,8 +2527,6 @@ public class OrderServiceImpl implements OrderService {
             StoreEntity store = storeService.queryObject(order.getStore_id().intValue());
 
             processRecordEntity.setPaymentStartTime(new Date());
-
-            String env = environment.getProperty("haikong.env");
             // 判断是微信的支付码还是支付宝的支付码
 
             if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
@@ -2625,8 +2635,9 @@ public class OrderServiceImpl implements OrderService {
 
                     }
                     if (pointsType.equals(Constants.MemberScoreRulesEnum.ONE.getCode())) {
-                        Collection<GoodsEntity> goodsEntityCollection = goodsDataMap.values();
-                        goodsEntityCollection.forEach(goodsEntity -> {
+                        Collection<GoodsEntity> values = goodsDataMap.values();
+                        Collection<GoodsEntity> entityCollection = DeepCopyUtils.depCopyHashSet(new HashSet<>(values));
+                        entityCollection.forEach(goodsEntity -> {
                             // 商品类别
                             Integer categoryId = goodsEntity.getCategoryId();
                             String sku = goodsEntity.getSku();
@@ -2812,29 +2823,35 @@ public class OrderServiceImpl implements OrderService {
         HaiKongSendOrderInfoRecordEntity haiKongSendOrderInfoRecordEntity = wrapSendOrderInfoRecord(sendOrderToVmcShopDTO);
         List<HaiKongSendOrderInfoDetailRecordEntity> detailRecordEntities = wrapSendOrderInfoDetailRecord(orderInfoItemDTOList);
 
-        // 不要用自带的工具类,处理XML字符串时有bug
-        cn.hutool.json.JSON json = JSONUtil.parse(sendOrderToVmcShopDTO);
-        String body = JSONUtil.toJsonPrettyStr(json);
 
         String orderSn = order.getOrder_sn();
         try {
-
+            String body = JacksonUtil.getObjectMapper().writeValueAsString(sendOrderToVmcShopDTO);
+            LOGGER.info("请求免税mall创建订单接口!请求体:{}", body);
             String response = vmcShopTemplate.sendOrder(body);
 
             Response<String> r = JacksonUtil.fromListJson(response, new TypeReference<Response<String>>() {});
 
-            if (Objects.nonNull(r) && !"failure".equals(r.getResult())) {
+            if (Objects.nonNull(r) && ErrorCodeConstants.VmcShopSysErrorCodeEnum.CODE_0.getCode().equals(r.getCode())) {
                 pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_0.getStatus());
-                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
                 LOGGER.info("推送订单到免税mall成功!响应结果:{}", response);
-            } else {
+            } else if (Objects.nonNull(r) && ErrorCodeConstants.VmcShopSysErrorCodeEnum.CODE_10500.getCode().equals(r.getCode())) {
+                pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
+                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                LOGGER.error("推送订单到免税mall失败!响应结果:{}", response);
+            } else if (Objects.isNull(r)) {
                 pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
                 haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
                 LOGGER.error("推送订单到免税mall失败!响应结果:{}", response);
+            } else {
+                pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
+                haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
+                LOGGER.error("推送订单到免税mall失败!响应结果:{}", response);
             }
         } catch (Exception e) {
             pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
-            haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            haiKongSendOrderInfoRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
             LOGGER.error("推送订单到免税mall失败!出现异常!", e);
         }
 
@@ -2899,7 +2916,9 @@ public class OrderServiceImpl implements OrderService {
         payInfoDTO.setMoney(order.getActual_price());
         payInfoDTO.setPayMode("offline");
         payInfoDTO.setRequest(order.getRequest());
-        payInfoDTO.setResponse(order.getResponse());
+        String response = order.getResponse();
+        response = response.replaceAll("\r|\n", "");
+        payInfoDTO.setResponse(response);
         payInfoDTO.setOutTradeNo(order.getAliTradeNo());
         return payInfoDTO;
     }
@@ -2920,6 +2939,7 @@ public class OrderServiceImpl implements OrderService {
         orderInfoItemDTO.setPrice(orderGoodsVo.getRetail_price());
         orderInfoItemDTO.setItemcode(orderGoodsVo.getSku());
         orderInfoItemDTO.setAmount(orderGoodsVo.getActualPaymentAmount());
+        orderInfoItemDTO.setBuyPrice(orderGoodsVo.getActualPaymentAmount());
         orderInfoItemDTO.setNums(orderGoodsVo.getNumber());
         orderInfoItemDTO.setTax("true");
         orderInfoItemDTO.setTaxPrice(orderGoodsVo.getTaxPrice());
@@ -2947,6 +2967,7 @@ public class OrderServiceImpl implements OrderService {
         orderInfoDTO.setConsigneeMobile(order.getMobile());
         orderInfoDTO.setQuantity(order.getNumber());
         orderInfoDTO.setOrderTotal(order.getActual_price());
+        orderInfoDTO.setFinallyCartAmount(order.getActual_price());
         orderInfoDTO.setPlatform("store");
 
         return orderInfoDTO;
@@ -3234,8 +3255,8 @@ public class OrderServiceImpl implements OrderService {
     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.setOpenId(memberPhone);
         memberOrderInfoSyncDTO.setConsumeDate(new Date());
         memberOrderInfoSyncDTO.setOrderAmount(order.getActual_price());
         memberOrderInfoSyncDTO.setOrderScore(deductionScore);
@@ -3243,6 +3264,7 @@ public class OrderServiceImpl implements OrderService {
         Date date = new Date();
         haiKongMemberOrderSyncResendEntity.setCreateTime(date);
         haiKongMemberOrderSyncResendEntity.setLastResendTime(date);
+        haiKongMemberOrderSyncResendEntity.setPhone(memberPhone);
         try {
             String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
             LOGGER.info("请求会员系统同步消费订单接口!请求体:{}", body);
@@ -3250,18 +3272,20 @@ public class OrderServiceImpl implements OrderService {
             String memberOrderSyncResponseJson = haiKongMemberTemplate.memberOrderSync(body);
             LOGGER.info("请求会员系统同步消费订单接口!响应:{}", memberOrderSyncResponseJson);
             Response<String> response = JacksonUtil.fromListJson(memberOrderSyncResponseJson, new TypeReference<Response<String>>() {});
-            if (Objects.nonNull(response) && response.getSuccess()) {
+            if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_0.getCode().equals(response.getCode())) {
                 haiKongMemberOrderSyncResendEntity.setMemberSysOrderId(response.getData());
-                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
-            } else {
+                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
+            } else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
                 haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            } else {
+                haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
             }
             haiKongMemberOrderSyncResendService.save(haiKongMemberOrderSyncResendEntity);
             LOGGER.info("请求会员系统同步消费订单接口成功!");
         } catch (Exception e) {
             LOGGER.error("请求会员系统同步消费订单接口出现异常!准备新增发送失败记录,等待重发!异常信息:", e);
             // 没有请求成功,写表,重发
-            haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            haiKongMemberOrderSyncResendEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
             haiKongMemberOrderSyncResendService.save(haiKongMemberOrderSyncResendEntity);
         }
     }
@@ -3302,19 +3326,21 @@ public class OrderServiceImpl implements OrderService {
             String changeMemberScoreResponseJson = haiKongMemberTemplate.changeMemberScore(body);
             LOGGER.info("请求会员系统积分变动接口!响应数据:{}", changeMemberScoreResponseJson);
             Response<MemberScoreChangeResponseDTO> response = JacksonUtil.fromListJson(changeMemberScoreResponseJson, new TypeReference<Response<MemberScoreChangeResponseDTO>>() {});
-            if (Objects.nonNull(response) && response.getSuccess()) {
+            if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_0.getCode().equals(response.getCode())) {
                 MemberScoreChangeResponseDTO responseData = response.getData();
                 haiKongMemberScoreChangeRecordEntity.setStatementId(responseData.getStatementId());
-                haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
-            } else {
+                haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
+            } else if (Objects.nonNull(response) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_500.getCode().equals(response.getCode())) {
                 haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            } else {
+                haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
             }
             haiKongMemberScoreChangeRecordService.save(haiKongMemberScoreChangeRecordEntity);
             LOGGER.info("请求会员系统积分变动接口成功!");
         } catch (Exception e) {
             LOGGER.error("请求会员系统积分变动接口出现异常!准备新增发送失败记录,等待重发!异常信息:", e);
             // 失败重发
-            haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.WAIT_RESEND.getStatus());
+            haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.NON_RESEND.getStatus());
             haiKongMemberScoreChangeRecordService.save(haiKongMemberScoreChangeRecordEntity);
         }
         LOGGER.info("保存会员系统积分变动详情记录中......");
@@ -4618,6 +4644,10 @@ public class OrderServiceImpl implements OrderService {
                     userEntity.setOpenId(memberInfoDTO.getOpenId());
                     userEntity.setMemberCode(memberCode);
                     userService.save(userEntity);
+                } else {
+                    userEntity.setOpenId(memberInfoDTO.getOpenId());
+                    userEntity.setMemberCode(memberCode);
+                    userService.update(userEntity);
                 }
                 Integer score = memberInfoDTO.getScore();
                 if (Objects.nonNull(score) && score > 0) {
@@ -5297,8 +5327,15 @@ public class OrderServiceImpl implements OrderService {
                     LOGGER.info("=======> [integralTask-----重推退款积分]" + responseMsg);
 
                     //解析数据
-                    if ("true".equals(res.get("success").toString())) {
+                    if (!CollectionUtils.isEmpty(res) && ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_0.getCode().equals(res.get("code"))) {
+                        HaiKongResendMsgEntity haiKongResendMsgEntity = new HaiKongResendMsgEntity();
+                        haiKongResendMsgEntity.setResponseMsg(responseMsg);
+                        haiKongResendMsgEntity.setResendNum(haiKongResendMsg.getResendNum()+1);
+                        haiKongResendMsgEntity.setResendTime(date);
+                        haiKongResendMsgEntity.setId(haiKongResendMsg.getId());
+                        haiKongResendMsgEntity.setIsValid(2);
                         LOGGER.info("=======> [integralTask-----重推退款积分]" + responseMsg);
+                        haiKongResendMsgDao.updateResendMsg(haiKongResendMsgEntity);
                     } else {
                         LOGGER.error("=======> [integralTask-----重推退款积分]" + responseMsg);
                         HaiKongResendMsgEntity haiKongResendMsgEntity = new HaiKongResendMsgEntity();
@@ -5308,7 +5345,6 @@ public class OrderServiceImpl implements OrderService {
                         haiKongResendMsgEntity.setId(haiKongResendMsg.getId());
                         haiKongResendMsgDao.updateResendMsg(haiKongResendMsgEntity);
                     }
-
                 }
             }
 

+ 2 - 1
kmall-admin/src/main/resources/conf/cuspay/cuspay-wx.properties

@@ -15,7 +15,8 @@ merchant.customs-code=44048600Y8
 # \u5546\u6237\u6D77\u5173\u5907\u6848\u540D\u79F0
 merchant.customs-name=\u73E0\u6D77\u6D77\u63A7\u79D1\u6280\u6709\u9650\u516C\u53F8
 # appid
-cus.play.wx.app-id=wxd3e627dd62d6ff32
+#cus.play.wx.app-id=wxd3e627dd62d6ff32
+cus.play.wx.app-id=wxe186e23f5a8f0dbf
 # \u5FAE\u4FE1\u652F\u4ED8\u5546\u6237\u53F7
 cus.play.wx.mch-id=1574349031
 # \u6D77\u5173\uFF0C\u5E7F\u5DDE\uFF08\u603B\u7F72\uFF09

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

@@ -1184,7 +1184,8 @@
         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 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,a.net_weight as netWeight
+            a.category_id as categoryId, a.brand_id as brandId,a.net_weight as netWeight,
+            a.warehouse_sn as warehouseSn, a.warehous_sys_good_id as warehousSysGoodId, a.inventory_type as inventoryType
         FROM
             mall_goods a
         LEFT JOIN mall_product_store_rela r ON r.goods_id = a.id

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

@@ -220,7 +220,7 @@
     <update id="updateBatchPickUpCodeStatus">
 		update mall_pick_up_code set pick_up_code_status = #{pickUpCodeStatus}
 		where order_sn in
-		<foreach collection="list" item="item" open="(" separator="," close=")">
+		<foreach collection="orderSnList" item="item" open="(" separator="," close=")">
 			#{item}
 		</foreach>
 	</update>

+ 9 - 0
kmall-admin/src/main/resources/mybatis/mapper/haikong/HaikongSendOrderInfoDetailRecordDao.xml

@@ -12,6 +12,7 @@
         <result property="name" column="name"/>
         <result property="cost" column="cost"/>
         <result property="price" column="price"/>
+        <result property="buyPrice" column="buy_price"/>
         <result property="itemcode" column="itemcode"/>
         <result property="amount" column="amount"/>
         <result property="nums" column="nums"/>
@@ -29,6 +30,7 @@
 			`name`,
 			`cost`,
 			`price`,
+			`buy_price`,
 			`itemcode`,
 			`amount`,
 			`nums`,
@@ -48,6 +50,7 @@
     		`name`,
     		`cost`,
     		`price`,
+    		`buy_price`,
     		`itemcode`,
     		`amount`,
     		`nums`,
@@ -84,6 +87,7 @@
 		`name`,
 		`cost`,
 		`price`,
+		`buy_price`,
 		`itemcode`,
 		`amount`,
 		`nums`,
@@ -116,6 +120,7 @@
 			`name`,
 			`cost`,
 			`price`,
+			`buy_price`,
 			`itemcode`,
 			`amount`,
 			`nums`,
@@ -129,6 +134,7 @@
 			#{name},
 			#{cost},
 			#{price},
+			#{buyPrice},
 			#{itemcode},
 			#{amount},
 			#{nums},
@@ -146,6 +152,7 @@
 			`name`,
 			`cost`,
 			`price`,
+			`buy_price`,
 			`itemcode`,
 			`amount`,
 			`nums`,
@@ -162,6 +169,7 @@
 					#{item.name},
 					#{item.cost},
 					#{item.price},
+					#{item.buyPrice},
 					#{item.itemcode},
 					#{item.amount},
 					#{item.nums},
@@ -181,6 +189,7 @@
 			<if test="name != null">`name` = #{name}, </if>
 			<if test="cost != null">`cost` = #{cost}, </if>
 			<if test="price != null">`price` = #{price}, </if>
+			<if test="buyPrice != null">`buy_price` = #{buyPrice}, </if>
 			<if test="itemcode != null">`itemcode` = #{itemcode}, </if>
 			<if test="amount != null">`amount` = #{amount}, </if>
 			<if test="nums != null">`nums` = #{nums}, </if>

+ 4 - 0
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesscore.html

@@ -51,6 +51,10 @@
             <Form-item label="门店id" prop="storeId">
                 <i-input v-model="mkActivitiesScore.storeId" placeholder="门店id"/>
             </Form-item>
+            <Form-item label="是否参与积分抵扣" prop="reject">
+                <p>只能有一种情况,如果积分抵扣商品中都为0,则默认这些商品为参与,其余商品不参与,如果积分抵扣商品都为1,其余商品都参与</p>
+                <i-input v-model="mkActivitiesScore.reject" placeholder="0:参与,1:不参与"/>
+            </Form-item>
             <!--<Form-item label="抵扣比例" prop="scoreLimit">
                 <i-input v-model="mkActivitiesScore.scoreLimit" placeholder="抵扣比例"/>
             </Form-item>-->

+ 4 - 1
kmall-admin/src/main/webapp/js/mk/mkactivitiesscore.js

@@ -27,7 +27,7 @@ $(function () {
 			{label: '商品条码', name: 'prodBarcode', index: 'prod_barcode', width: 150},
 			{label: 'sku', name: 'sku', index: 'sku', width: 150},
 			{label: '门店id', name: 'storeId', index: 'store_id', width: 80},
-			// {label: '抵扣比例', name: 'scoreLimit', index: 'score_limit', width: 80},
+			{label: '是否参与', name: 'reject', index: 'reject', width: 80},
 			{label: '营销活动编号', name: 'mkaId', index: 'mka_id', width: 100}
 			// {label: '截止日期', name: 'deadline', index: 'deadline', width: 200,
 			// 	formatter: function (value) {
@@ -91,6 +91,9 @@ let vm = new Vue({
 			],
 			scoreLimit: [
 				{required: true, message: '抵扣比例不能为空', trigger: 'blur'}
+			],
+			reject: [
+				{required: true, message: '必须填0或1', trigger: 'blur'}
 			]
 			// deadLine: [
 			// 	{required: true, message: '截止日期不能为空', trigger: 'blur'}

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

@@ -1454,7 +1454,7 @@ function openWebSocket() {
         // 预发布环境
         // webSocket = new WebSocket("ws://14.29.226.8:8080/ws/server/"+storeId);
         //kmall海控正式环境
-        webSocket = new WebSocket("ws://127.0.0.1:8080/ws/server/"+storeId);
+        webSocket = new WebSocket("ws://120.76.119.218:8080/ws/server/"+storeId);
         //kmall本地环境
         // webSocket = new WebSocket("ws://127.0.0.1:8089/ws/server/"+storeId);
         // webSocket = new WebSocket("wss://cb.k1net.cn/ws/server/"+storeId);

+ 10 - 2
kmall-admin/src/main/webapp/js/shop/interfacesendlog.js

@@ -6,8 +6,16 @@ $(function () {
 			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
 			{label: '请求/响应系统类型', name: 'sysType', index: 'sys_type', width: 80},
 			{label: '请求/响应接口类型', name: 'interfaceType', index: 'interface_type', width: 80},
-			{label: '请求信息', name: 'requestMsg', index: 'request_msg', width: 100},
-			{label: '响应结果', name: 'responseMsg', index: 'response_msg', width: 100},
+			{label: '请求信息', name: 'requestMsg', index: 'request_msg', width: 100, formatter: function (value) {
+				value = value.replace(/</g, '&lt;');
+				value = value.replace(/>/g, '&gt;');
+				return value;
+			}},
+			{label: '响应结果', name: 'responseMsg', index: 'response_msg', width: 100, formatter: function (value) {
+				value = value.replace(/</g, '&lt;');
+				value = value.replace(/>/g, '&gt;');
+				return value;
+			}},
 			{label: '发送时间', name: 'requestDate', index: 'request_date',align: 'center', width: 70,formatter:function(value){
 					return transDate(value, 'yyyy-MM-dd hh:mm:ss');
 				}},

+ 38 - 3
kmall-admin/src/test/java/com/kmall/admin/Test.java

@@ -1,17 +1,18 @@
 package com.kmall.admin;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.kmall.admin.entity.GoodsEntity;
+import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
 import com.kmall.admin.haikong.constant.HaiKongMemberScoreChangeEventEnum;
-import com.kmall.admin.haikong.dto.MemberInfoDTO;
-import com.kmall.admin.haikong.dto.MemberScoreChangeDTO;
-import com.kmall.admin.haikong.dto.MemberScoreChangeResponseDTO;
+import com.kmall.admin.haikong.dto.*;
 import com.kmall.admin.haikong.task.MemberSysAccessTokenRefreshTask;
 import com.kmall.admin.haikong.utils.ListUtils;
 import com.kmall.admin.haikong.utils.Response;
 import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.admin.service.GoodsService;
+import com.kmall.admin.service.haikong.HaiKongSendOrderInfoRecordService;
 import com.kmall.admin.utils.jackson.JacksonUtil;
 import org.junit.runner.RunWith;
 import org.springframework.beans.BeanUtils;
@@ -47,6 +48,9 @@ public class Test {
     @Autowired
     private MemberSysAccessTokenRefreshTask memberSysAccessTokenRefreshTask;
 
+    @Autowired
+    private HaiKongSendOrderInfoRecordService haiKongSendOrderInfoRecordService;
+
     @org.junit.Test
     public void addScore() throws Exception {
 
@@ -106,4 +110,35 @@ public class Test {
 
     }
 
+    @org.junit.Test
+    public void testXmlFormat() throws JsonProcessingException {
+
+        HaiKongSendOrderInfoRecordEntity haiKongSendOrderInfoRecordEntity = haiKongSendOrderInfoRecordService.queryObject(76);
+
+        SendOrderToVmcShopDTO sendOrderToVmcShopDTO = new SendOrderToVmcShopDTO();
+        SeaportInfoDTO seaportInfoDTO = new SeaportInfoDTO();
+        PayInfoDTO payInfoDTO = new PayInfoDTO();
+        OrderInfoDTO orderInfoDTO = new OrderInfoDTO();
+        BeanUtils.copyProperties(haiKongSendOrderInfoRecordEntity, orderInfoDTO);
+        BeanUtils.copyProperties(haiKongSendOrderInfoRecordEntity, payInfoDTO);
+        String response1 = payInfoDTO.getResponse();
+        response1 = response1.replaceAll("\r|\n", "");
+        payInfoDTO.setResponse(response1);
+        seaportInfoDTO.setSeaportCode(haiKongSendOrderInfoRecordEntity.getSeaportCode());
+        seaportInfoDTO.setPlatform(haiKongSendOrderInfoRecordEntity.getPlatform());
+        seaportInfoDTO.setIdentityCard(haiKongSendOrderInfoRecordEntity.getIdentityCard());
+        seaportInfoDTO.setIdentityMobile(haiKongSendOrderInfoRecordEntity.getIdentityMobile());
+        seaportInfoDTO.setIdentityName(haiKongSendOrderInfoRecordEntity.getIdentityName());
+        seaportInfoDTO.setOrderProductInfoList(JacksonUtil.fromListJson(haiKongSendOrderInfoRecordEntity.getOrderProductInfo(), new TypeReference<List<OrderProductInfoDTO>>() {}));
+
+        sendOrderToVmcShopDTO.setPayInfo(payInfoDTO);
+        sendOrderToVmcShopDTO.setSeaportInfo(seaportInfoDTO);
+        sendOrderToVmcShopDTO.setOrderInfo(orderInfoDTO);
+
+        String string = JacksonUtil.getObjectMapper().writeValueAsString(sendOrderToVmcShopDTO);
+
+        System.out.println(string);
+
+    }
+
 }

+ 4 - 4
kmall-manager/src/main/resources/conf/wx-mp.properties

@@ -51,17 +51,17 @@ wx.dev.templateSendUrl=https://api.weixin.qq.com/cgi-bin/message/subscribe/send?
 #========== \u751F\u4EA7\u73AF\u5883 \u6D77\u63A7\u7684\u914D\u7F6E ==========
 
 #\u5C0F\u7A0B\u5E8FID
-wx.prod.appId=wxd3e627dd62d6ff32
+wx.prod.appId=wxe186e23f5a8f0dbf
 #\u5C0F\u7A0B\u5E8F\u5BC6\u94A5
-wx.prod.secret=hkkjkjweixinzhifupassword2020017
+wx.prod.secret=137f5c41a2b919a24ddcc2413dddb015
 #\u5546\u6237\u53F7
 wx.prod.mchId=1574349031
 #\u652F\u4ED8\u7B7E\u540D
-wx.prod.paySignKey=Zx1245uytDLliom123456248798416846
+wx.prod.paySignKey=hkkjkjweixinzhifupassword1234567
 #\u4EA4\u6613\u7C7B\u578B
 wx.prod.tradeType=JSAPI
 #\u8BC1\u4E66\u540D\u79F0\uFF0C\u5BF9\u5E94\u4E0D\u540C\u7684\u5546\u6237\u53F7
-wx.prod.certName=/app/project/kmall_haikong/cert/apiclient_cert.p12
+wx.prod.certName=/app/project/haikong/cert/apiclient_cert.p12
 #\u652F\u4ED8\u56DE\u8C03\u5730\u5740
 wx.prod.notifyUrl=https://mp.k1net.cn/api/pay/notify
 #\u83B7\u53D6code\u7684\u8BF7\u6C42\u5730\u5740

+ 1 - 0
sql/init/other_table.sql

@@ -256,6 +256,7 @@ CREATE TABLE `haikong_send_order_info_detail_record`  (
   `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '商品名',
   `cost` decimal(10, 3) DEFAULT NULL COMMENT '明细商品的成本,填零售价',
   `price` decimal(10, 3) DEFAULT NULL COMMENT '销售价',
+  `buy_price` decimal(10, 3) DEFAULT NULL COMMENT '成交价',
   `itemcode` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '商品编码',
   `amount` decimal(10, 3) DEFAULT NULL COMMENT '明细商品总额,销售价*数量',
   `nums` int(8) DEFAULT NULL COMMENT '明细商品购买数量',