Browse Source

Merge remote-tracking branch 'upsteam/master'

zhh 3 years ago
parent
commit
d6c4b64f1a
39 changed files with 754 additions and 378 deletions
  1. 6 0
      kmall-admin/src/main/java/com/kmall/admin/aop/InterfaceExternalAspect.java
  2. 12 70
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java
  3. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/PickUpCodeDao.java
  4. 12 0
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/HaiKongSendOrderInfoDetailRecordEntity.java
  5. 67 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/ErrorCodeConstants.java
  6. 2 2
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongMemberSystemUrlEnum.java
  7. 0 15
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/MemberOrderInfoSyncDTO.java
  8. 15 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoDTO.java
  9. 12 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoItemDTO.java
  10. 8 3
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java
  11. 10 4
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberScoreChangeResendTask.java
  12. 25 6
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/SendOrderInfoTask.java
  13. 51 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/DeepCopyUtils.java
  14. 28 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceResponseVO.java
  15. 3 1
      kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java
  16. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/PickUpCodeService.java
  17. 91 71
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  18. 182 119
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  19. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/PickUpCodeServiceImpl.java
  20. 4 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaikongSendOrderInfoRecordServiceImpl.java
  21. 2 1
      kmall-admin/src/main/resources/conf/cuspay/cuspay-wx.properties
  22. 1 1
      kmall-admin/src/main/resources/conf/fastdfs.properties
  23. 2 1
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  24. 8 0
      kmall-admin/src/main/resources/mybatis/mapper/PickUpCodeDao.xml
  25. 9 0
      kmall-admin/src/main/resources/mybatis/mapper/haikong/HaikongSendOrderInfoDetailRecordDao.xml
  26. 1 0
      kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2PointsRulesDao.xml
  27. 2 2
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiespromotion.html
  28. 4 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesscore.html
  29. 4 4
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivityform.html
  30. 14 10
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  31. 1 1
      kmall-admin/src/main/webapp/js/mk/mkactivitiespromotion.js
  32. 4 1
      kmall-admin/src/main/webapp/js/mk/mkactivitiesscore.js
  33. 2 2
      kmall-admin/src/main/webapp/js/mk/mkactivityform.js
  34. 106 53
      kmall-admin/src/main/webapp/js/sale/sale.js
  35. 10 2
      kmall-admin/src/main/webapp/js/shop/interfacesendlog.js
  36. 38 3
      kmall-admin/src/test/java/com/kmall/admin/Test.java
  37. 4 4
      kmall-manager/src/main/resources/conf/wx-mp.properties
  38. 1 0
      sql/init/other_table.sql
  39. 4 2
      切换环境需要修改的.md

+ 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 - 70
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -1,6 +1,7 @@
 package com.kmall.admin.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsDto;
 import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
@@ -569,9 +570,9 @@ public class GoodsController {
         return R.ok().put("goods", goods);
     }
 
-    @RequestMapping("/details/{prodBarcode}/{storeId}/{sku}")
+    @RequestMapping("/details/{prodBarcode}/{storeId}/{sku}/{sellVolume}")
 //    @RequiresPermissions("goods:details") http://127.0.0.1:8080/goods/details/11111
-    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId,@PathVariable("sku")String sku) {
+    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId,@PathVariable("sku")String sku, @PathVariable("sellVolume") Integer sellVolume) {
         SysUserEntity user = ShiroUtils.getUserEntity();
         if(user == null) {
             return R.error("用户登录超时,请重新登录");
@@ -581,7 +582,7 @@ public class GoodsController {
         }
         Map<String,Object> map = null;
         try {
-            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,sku);
+            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,sku, sellVolume);
         } catch (ServiceException e) {
             log.error("查询订单详情出现异常!", e);
             return R.error(e.getMessage());
@@ -595,9 +596,9 @@ public class GoodsController {
         return R.ok().put("goodsDetails", map.get("goods")).put("map",map);
     }
 
-    @RequestMapping("/detailsOld/{prodBarcode}/{storeId}")
+    @RequestMapping("/detailsOld/{prodBarcode}/{storeId}/{sellVolume}")
 //    @RequiresPermissions("goods:details") http://127.0.0.1:8080/goods/details/11111
-    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId) {
+    public R details(@PathVariable("prodBarcode")String prodBarcode,@PathVariable("storeId")String storeId, @PathVariable("sellVolume") Integer sellVolume) {
         SysUserEntity user = ShiroUtils.getUserEntity();
         if(user == null) {
             return R.error("用户登录超时,请重新登录");
@@ -607,7 +608,7 @@ public class GoodsController {
         }
         Map<String,Object> map = null;
         try {
-            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,null);
+            map = goodsService.calculateGoodsDetail(prodBarcode,storeId,null, sellVolume);
         } catch (ServiceException e) {
             log.error("查询订单详情出现异常!", e);
             return R.error(e.getMessage());
@@ -621,83 +622,24 @@ public class GoodsController {
         return R.ok().put("goodsDetails", map.get("goods")).put("map",map);
     }
 
-    // storeId + sku + prodBarcode
-    @RequestMapping(value = "/number/minus/{storeId}/{sku}/{prodBarcode}", method = RequestMethod.GET)
-    public R minus(@PathVariable("storeId") String storeId, @PathVariable("sku") String sku, @PathVariable("prodBarcode") String prodBarcode) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String itemKey = storeId + sku + prodBarcode;
-
-        try {
-            String cartNumber = JedisUtil.hget(key, itemKey);
-            int number = Integer.parseInt(cartNumber);
-            JedisUtil.hset(key, itemKey, String.valueOf(++number));
-        } catch (Exception e) {
-            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,扣减购物篮商品数量失败!", storeId, sku, prodBarcode);
-            return R.error("扣减购物篮商品数量失败!请删除购物篮商品后重试!");
-        }
-
-        return R.ok();
-    }
-
     @RequestMapping(value = "/number/add/{storeId}/{sku}/{prodBarcode}/{sellVolume}", method = RequestMethod.GET)
     public R add(@PathVariable("storeId") String storeId,
                  @PathVariable("sku") String sku,
                  @PathVariable("prodBarcode") String prodBarcode,
                  @PathVariable("sellVolume") Integer sellVolume) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String itemKey = storeId + sku + prodBarcode;
-
-        try {
-            GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(prodBarcode, Integer.parseInt(storeId), sku);
-            Integer exitRegionNumber = goodsEntity.getExitRegionNumber();
-            Integer stockNum = goodsEntity.getStockNum();
-            String number = JedisUtil.hget(key, itemKey);
-            int cartNumber = Integer.parseInt(number);
-            if (stockNum + cartNumber - exitRegionNumber >= sellVolume) {
-                JedisUtil.hset(key, itemKey, String.valueOf(--cartNumber));
-            } else {
-                log.error("增加商品数量失败!保税仓库存不足!storeId:【{}】,sku:【{}】,prodBarcode:【{}】,stockNum:【{}】,exitRegionNumber:【{}】,wareStockNumber:【{}】"
-                , storeId, sku, prodBarcode, stockNum, exitRegionNumber, cartNumber);
-                return R.error("增加商品数量失败!保税仓库存不足!");
-            }
-        } catch (Exception e) {
-            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,增加购物篮商品数量失败!", storeId, sku, prodBarcode);
-            return R.error("增加购物篮商品数量失败!请删除购物篮商品后重试!");
-        }
-
-        return R.ok();
-    }
-
-    @RequestMapping(value = "/number/del/{storeId}/{sku}/{prodBarcode}", method = RequestMethod.GET)
-    public R del(@PathVariable("storeId") String storeId, @PathVariable("sku") String sku, @PathVariable("prodBarcode") String prodBarcode) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String itemKey = storeId + sku + prodBarcode;
 
         try {
-            JedisUtil.hdel(key, itemKey);
+            GoodsDetailsDto goodsDetailsDto = goodsService.queryGoodsDetailsByProdBarcode(prodBarcode, storeId, sku);
+            goodsDetailsDto.setSellVolume(sellVolume);
+            goodsService.validateWarehouseStock(goodsDetailsDto, prodBarcode, sku, storeId);
         } catch (Exception e) {
-            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,删除购物篮商品失败!", storeId, sku, prodBarcode);
-            return R.error("删除购物篮商品失败!请刷新收银端页面!");
+            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,增加购物篮商品数量失败!", storeId, sku, prodBarcode, e);
+            return R.error("校验库存===>" + e.getMessage());
         }
 
         return R.ok();
     }
 
-    @RequestMapping(value = "/number/clear/{storeId}", method = RequestMethod.GET)
-    public R clear(@PathVariable("storeId") String storeId) {
-        String key = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-
-        try {
-            JedisUtil.del(key);
-        } catch (Exception e) {
-            log.error("storeId:【{}】,清空购物篮商品失败!", storeId);
-            return R.error("清空购物篮商品失败!请刷新收银端页面!");
-        }
-
-        return R.ok();
-    }
-
-
     /**
      * 多sku可选
      * @param prodBarcode

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/PickUpCodeDao.java

@@ -38,4 +38,6 @@ public interface PickUpCodeDao extends BaseDao<PickUpCodeEntity> {
     void updatePickUpCodeStatusByOrderSn(@Param("orderSn") String orderSn, @Param("pickUpCodeStatus") String pickUpCodeStatus);
 
     void updatePickUpCode(Map<String, String> pickUpCodeMap);
+
+    void updateBatchPickUpCodeStatus(@Param("orderSnList") List<String> orderSnList, @Param("pickUpCodeStatus") String pickUpCodeStatus);
 }

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

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

@@ -0,0 +1,67 @@
+package com.kmall.admin.haikong.constant;
+
+/**
+ * 海控对接,错误码枚举
+ * @author lhm
+ * @createDate 2021-12-21
+ */
+public class ErrorCodeConstants {
+
+    /**
+     * 会员系统异常返回码
+     */
+    public enum MemberSysErrorCodeEnum {
+        CODE_0(0, "成功"),
+        CODE_401(401, "无效token,稍后再试!"),
+        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;
+        }
+    }
+}

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

@@ -40,11 +40,11 @@ public enum HaiKongMemberSystemUrlEnum {
     /**
      * 查询会员优惠券,不用对接
      */
-    QUERY_MEMBER_COUPON("GET", "/gateway/wk.coupon.user.list/v1","查询会员优惠券接口"),
+    QUERY_MEMBER_COUPON("GET", "/gw/gateway/wk.coupon.user.list/v1","查询会员优惠券接口"),
     /**
      * 会员消费订单同步接口
      */
-    MEMBER_ORDER_SYNC("POST", "/gateway/wk.user.order.add/v1","会员消费订单同步接口"),
+    MEMBER_ORDER_SYNC("POST", "/gw/gateway/wk.user.order.add/v1","会员消费订单同步接口"),
 
     ;
 

+ 0 - 15
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")
@@ -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;
@@ -56,20 +57,24 @@ public class MemberOrderSyncResendTask {
             haiKongMemberOrderSyncResendEntity.setLastResendTime(new Date());
             log.info("【重发】请求会员消费订单同步接口!请求体:{}", body);
             try {
-                String responseJson = haiKongMemberTemplate.changeMemberScore(body);
+                String responseJson = haiKongMemberTemplate.memberOrderSync(body);
                 Response<String> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<String>>() {});
                 if (Objects.nonNull(response) && response.getSuccess()) {
                     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);
             }

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

@@ -5,12 +5,15 @@ 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;
+import com.kmall.admin.service.PickUpCodeService;
 import com.kmall.admin.service.haikong.HaiKongSendOrderInfoDetailRecordService;
 import com.kmall.admin.service.haikong.HaiKongSendOrderInfoRecordService;
 import com.kmall.admin.utils.jackson.JacksonUtil;
+import com.kmall.common.constant.Dict;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -42,6 +45,9 @@ public class SendOrderInfoTask {
     private HaiKongSendOrderInfoDetailRecordService haiKongSendOrderInfoDetailRecordService;
 
     @Autowired
+    private PickUpCodeService pickUpCodeService;
+
+    @Autowired
     private VmcShopTemplate vmcShopTemplate;
 
     @Scheduled(cron = "0 0/1 * * * ?")
@@ -58,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());
@@ -81,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);
             }
@@ -104,6 +121,8 @@ public class SendOrderInfoTask {
 
         if (!CollectionUtils.isEmpty(successList)) {
             haiKongSendOrderInfoRecordService.updateResendStatusBatch(successList);
+            List<String> orderSnList = successList.stream().map(HaiKongSendOrderInfoRecordEntity::getOuterOrderNo).collect(Collectors.toList());
+            pickUpCodeService.updateBatchPickUpCodeStatus(orderSnList, Dict.PickUpCodeStatusEnum.item_0.getStatus());
         }
 
         if (!CollectionUtils.isEmpty(failedList)) {

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

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

@@ -19,6 +19,16 @@ public class CalculateOrderDiscountPriceResponseVO {
     private String memberPhone;
 
     /**
+     * 会员当前可用积分
+     */
+    private Integer memberCurrentAvailableScore;
+
+    /**
+     * 会员等级名称
+     */
+    private String levelName;
+
+    /**
      * 抵扣积分
      */
     private Integer deductionScore;
@@ -121,11 +131,29 @@ public class CalculateOrderDiscountPriceResponseVO {
         this.openId = openId;
     }
 
+    public Integer getMemberCurrentAvailableScore() {
+        return memberCurrentAvailableScore;
+    }
+
+    public void setMemberCurrentAvailableScore(Integer memberCurrentAvailableScore) {
+        this.memberCurrentAvailableScore = memberCurrentAvailableScore;
+    }
+
+    public String getLevelName() {
+        return levelName;
+    }
+
+    public void setLevelName(String levelName) {
+        this.levelName = levelName;
+    }
+
     @Override
     public String toString() {
         return "CalculateOrderDiscountPriceResponseVO{" +
                 "orderTotalPrice=" + orderTotalPrice +
                 ", memberCode='" + memberCode + '\'' +
+                ", memberCurrentAvailableScore='" + memberCurrentAvailableScore + '\'' +
+                ", levelName='" + levelName + '\'' +
                 ", memberPhone='" + memberPhone + '\'' +
                 ", deductionScore=" + deductionScore +
                 ", scoreDeductionPrice=" + scoreDeductionPrice +

+ 3 - 1
kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java

@@ -170,7 +170,7 @@ public interface GoodsService {
      * @param storeId
      * @return
      */
-    Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId,String sku);
+    Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId,String sku, Integer sellVolume);
 
     /**
      * 根据条形码查询商品
@@ -250,4 +250,6 @@ public interface GoodsService {
      * @return              更新数
      */
     int updateStockNumberByProductCodeAndSku(GoodsEntity goodsEntity);
+
+    void validateWarehouseStock(GoodsDetailsDto goods, String prodBarcode, String sku, String storeId);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/PickUpCodeService.java

@@ -80,4 +80,6 @@ public interface PickUpCodeService {
     void updatePickUpCodeStatusByOrderSn(String orderSn, String pickUpCodeStatus);
 
     void updatePickUpCode(Map<String,String> pickUpCodeMap);
+
+    void updateBatchPickUpCodeStatus(List<String> orderSnList, String pickUpCodeStatus);
 }

+ 91 - 71
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;
@@ -42,6 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -136,6 +140,9 @@ public class GoodsServiceImpl implements GoodsService {
 
     @Autowired
     private HaiKongWarehouseTemplate haiKongWarehouseTemplate;
+
+    @Autowired
+    private HaiKongProperties haiKongProperties;
     @Autowired
     private Environment environment;
 
@@ -1548,7 +1555,7 @@ public class GoodsServiceImpl implements GoodsService {
      */
     @Override
     @Transactional
-    public synchronized Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId, String sku) {
+    public synchronized Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId, String sku, Integer sellVolume) {
         /**
          * 1.首先根据商品条码跟门店id查询是否有库存,没库存直接返回
          */
@@ -1556,83 +1563,17 @@ public class GoodsServiceImpl implements GoodsService {
         if(goods == null) {
             return null;
         }
-
-        String env = environment.getProperty("haikong.env");
+        goods.setSellVolume(sellVolume);
 
         /*
         * 2. 查询海仓仓库系统,判断库存是否足够
         * */
-        sku = org.springframework.util.StringUtils.isEmpty(sku) ? goods.getSku() : sku;
+        /*sku = org.springframework.util.StringUtils.isEmpty(sku) ? goods.getSku() : sku;
         String wareStockNumberKey = storeId + sku + prodBarcode;
         String warehouseStockMapKey = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
-        String redisCacheWareQuantity = JedisUtil.hget(warehouseStockMapKey, wareStockNumberKey);
-        Integer wareQuantity = 0;
-        Integer exitRegionNumber = goods.getExitRegionNumber();
-        String stockNum = goods.getStockNum();
-        Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
-        if (org.springframework.util.StringUtils.isEmpty(redisCacheWareQuantity)) {
-            WareQueryStockResponseDTO wareQueryStockResponseDTO = null;
-            String queryWarehouseStockResponse = null;
-            // 环境配置
-            if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
-                WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
-                List<Criteria> criteriaList = new ArrayList<>();
-                Criteria criteria = new Criteria();
-                criteria.setItemId(goods.getWarehouseSysGoodId());
-                criteria.setItemCode(goods.getSku());
-                criteria.setOwnerCode(goods.getConsignorSn());
-                criteria.setInventoryType(Constants.InventoryType.ZP.getType());
-                criteria.setWarehouseCode(goods.getWarehouseSn());
-                criteriaList.add(criteria);
-                wareQueryStockParamDTO.setCriteriaList(criteriaList);
-                try {
-                    queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
-                } catch (Exception e) {
-                    log.error("sku:【{}】,调用海控仓库系统查询库存出现异常!", sku, e);
-                    throw new ServiceException(String.format("sku:【%s】,调用海控仓库系统查询库存出现异常!", sku));
-                }
-                log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
-                if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
-                    log.error("调用库存系统接口出现错误!返回结果为空!");
-                    throw new ServiceException("调用库存系统接口出现错误!");
-                }
-                wareQueryStockResponseDTO = JacksonUtil.fromStringJson(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
-            } else {
-                wareQueryStockResponseDTO = new WareQueryStockResponseDTO();
-                wareQueryStockResponseDTO.setCode("0");
-                wareQueryStockResponseDTO.setFlag("success");
-                wareQueryStockResponseDTO.setMessage("");
-                WareQueryStockResponseDTO.WareQueryStockResponseItemDTO wareQueryStockResponseItemDTO = new WareQueryStockResponseDTO.WareQueryStockResponseItemDTO();
-                wareQueryStockResponseItemDTO.setQuantity(3);
-                wareQueryStockResponseItemDTO.setItemCode(sku);
-                wareQueryStockResponseItemDTO.setProduceCode(prodBarcode);
-                List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> wareQueryStockResponseItemDTOS = new ArrayList<>();
-                wareQueryStockResponseItemDTOS.add(wareQueryStockResponseItemDTO);
-                wareQueryStockResponseDTO.setItems(wareQueryStockResponseItemDTOS);
-            }
-
+        String redisCacheWareQuantity = JedisUtil.hget(warehouseStockMapKey, wareStockNumberKey);*/
 
-            if (Objects.isNull(wareQueryStockResponseDTO)) {
-                log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
-                throw new ServiceException("解析一步达库存系统响应数据出现错误!");
-            }
-
-            // 校验库存
-            WareQueryStockResponseDTO.WareQueryStockResponseItemDTO itemDTO = wareQueryStockResponseDTO.getItems().get(0);
-            // 仓库可用库存
-            wareQuantity = itemDTO.getQuantity();
-            JedisUtil.hset(warehouseStockMapKey, wareStockNumberKey, String.valueOf(wareQuantity));
-        } else {
-            wareQuantity = Integer.parseInt(redisCacheWareQuantity);
-        }
-        // 保税仓库存 + 展销店库存 - 出区数 >= 购买数
-        if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) > sellVolume)) {
-            // 库存不足
-            log.error("商品条码:【{}】,sku:【{}】,门店库存:【{}】,保税仓库存:【{}】,出区数:【{}】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber);
-            throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店库存:【%s】,保税仓库存:【%s】,出区数:【%s】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber));
-        } else {
-            JedisUtil.hset(warehouseStockMapKey, wareStockNumberKey, String.valueOf(wareQuantity - sellVolume));
-        }
+        validateWarehouseStock(goods, prodBarcode, sku, storeId);
 
         goods.setDiscountedPrice(new BigDecimal(0));
         BigDecimal retailPrice = goods.getRetailPrice();
@@ -1652,6 +1593,85 @@ public class GoodsServiceImpl implements GoodsService {
     }
 
     @Override
+    public void validateWarehouseStock(GoodsDetailsDto goods, String prodBarcode, String sku, String storeId) {
+        // 保税仓库存
+        Integer wareQuantity = 0;
+
+        String env = environment.getProperty("haikong.env");
+        // 保税仓库存
+        Integer exitRegionNumber = goods.getExitRegionNumber();
+        String stockNum = goods.getStockNum();
+        Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
+        WareQueryStockResponseDTO wareQueryStockResponseDTO = null;
+        String queryWarehouseStockResponse = null;
+        // 环境配置
+        if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
+            WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
+            List<Criteria> criteriaList = new ArrayList<>();
+            Criteria criteria = new Criteria();
+            criteria.setItemId(goods.getWarehouseSysGoodId());
+            criteria.setItemCode(goods.getSku());
+            criteria.setOwnerCode(haiKongProperties.getWareCompanyCode());
+            criteria.setInventoryType(Constants.InventoryType.ZP.getType());
+            criteria.setWarehouseCode(goods.getWarehouseSn());
+            criteriaList.add(criteria);
+            wareQueryStockParamDTO.setCriteriaList(criteriaList);
+            try {
+                queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
+            } catch (Exception e) {
+                log.error("sku:【{}】,调用海控仓库系统查询库存出现异常!", sku, e);
+                throw new ServiceException(String.format("sku:【%s】,调用海控仓库系统查询库存出现异常!", sku));
+            }
+            log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
+            if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
+                log.error("调用库存系统接口出现错误!返回结果为空!");
+                throw new ServiceException("调用库存系统接口出现错误!");
+            }
+            try {
+                wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtils.toObject(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+            } catch (Exception e) {
+                log.error("解析一步达库存系统响应数据出现错误!出现异常:", e);
+            }
+            if (Objects.isNull(wareQueryStockResponseDTO)) {
+                log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
+                throw new ServiceException("解析一步达库存系统响应数据出现错误!");
+            }
+            if ("failure".equals(wareQueryStockResponseDTO.getFlag())) {
+                log.error("请求一步达库存系统返回错误响应!响应数据:{}", queryWarehouseStockResponse);
+                throw new ServiceException(String.format("请求一步达库存系统查询库存错误!响应数据:%s", wareQueryStockResponseDTO.getMessage()));
+            }
+        } else {
+            wareQueryStockResponseDTO = new WareQueryStockResponseDTO();
+            wareQueryStockResponseDTO.setCode("0");
+            wareQueryStockResponseDTO.setFlag("success");
+            wareQueryStockResponseDTO.setMessage("");
+            WareQueryStockResponseDTO.WareQueryStockResponseItemDTO wareQueryStockResponseItemDTO = new WareQueryStockResponseDTO.WareQueryStockResponseItemDTO();
+            wareQueryStockResponseItemDTO.setQuantity(3);
+            wareQueryStockResponseItemDTO.setItemCode(sku);
+            wareQueryStockResponseItemDTO.setProduceCode(prodBarcode);
+            List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> wareQueryStockResponseItemDTOS = new ArrayList<>();
+            wareQueryStockResponseItemDTOS.add(wareQueryStockResponseItemDTO);
+            wareQueryStockResponseDTO.setItems(wareQueryStockResponseItemDTOS);
+        }
+
+        // 校验库存
+        List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
+        if (CollectionUtils.isEmpty(items)) {
+            log.error("查询商品时:【{}】,仓库不存在该商品!", prodBarcode);
+            throw new ServiceException(String.format("查询商品时:【%s】,仓库不存在该商品!", prodBarcode));
+        }
+        WareQueryStockResponseDTO.WareQueryStockResponseItemDTO itemDTO = items.get(0);
+        // 仓库可用库存
+        wareQuantity = itemDTO.getQuantity();
+        // 保税仓库存 + 展销店库存 - 出区数 >= 购买数
+        if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) > sellVolume)) {
+            // 库存不足
+            log.error("商品条码:【{}】,sku:【{}】,门店库存:【{}】,保税仓库存:【{}】,出区数:【{}】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber);
+            throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店库存:【%s】,保税仓库存:【%s】,出区数:【%s】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber));
+        }
+    }
+
+    @Override
     public List<Map<String,Object>> selectSkuDetails(String prodBarcode, String storeId) {
         /**
          * 1.首先根据商品条码跟门店id查询是否有库存,没库存直接返回

+ 182 - 119
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)) {
@@ -2609,7 +2619,7 @@ public class OrderServiceImpl implements OrderService {
                             orderGiftScoreRulesVo.setGenerateType(Constants.MemberScoreRulesEnum.TWO.getCode());
                             if (ratio.compareTo(BigDecimal.ZERO) > 0) {
                                 // 算出所积的分
-                                int giftScore = money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue();
+                                int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
                                 memberScore.set(giftScore);
                                 orderGiftScoreRulesVo.setGiftScore(giftScore);
                                 orderGiftScoreRulesVo.setGenerateRatio(ratio);
@@ -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();
@@ -2638,7 +2649,7 @@ public class OrderServiceImpl implements OrderService {
                                     BigDecimal money = goodsMap.get(sku);
                                     if (ratio.compareTo(BigDecimal.ZERO) > 0) {
                                         // 算出所积的分
-                                        int giftScore = money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue();
+                                        int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
                                         memberScore.set(giftScore);
                                         orderGiftScoreRulesVo.setGiftScore(giftScore);
                                         orderGiftScoreRulesVo.setGenerateRatio(ratio);
@@ -2667,7 +2678,7 @@ public class OrderServiceImpl implements OrderService {
                                 BigDecimal money = goodsMap.get(sku);
                                 if (ratio.compareTo(BigDecimal.ZERO) != 0) {
                                     // 算出所积的分
-                                    int giftScore = money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue();
+                                    int giftScore = money.multiply(ratio).setScale(0, BigDecimal.ROUND_FLOOR).add(new BigDecimal(memberScore.get())).intValue();
                                     memberScore.set(giftScore);
                                     orderGiftScoreRulesVo.setGiftScore(giftScore);
                                     orderGiftScoreRulesVo.setGenerateRatio(ratio);
@@ -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;
@@ -3195,21 +3216,28 @@ public class OrderServiceImpl implements OrderService {
 
         if (atomicBoolean.get()) {
             // 推送支付单
-            sendWxPayInfo(order, store);
+            sendWxPayInfo(order, store, wechatMicropayApiResult);
         }
 
     }
 
-    private void sendWxPayInfo(OrderVo order, StoreEntity store) {
+    private void sendWxPayInfo(OrderVo order, StoreEntity store, WechatMicropayApiResult wechatMicropayApiResult) {
         // 组装支付单信息
+        String payTransactionId = "";
+        if (Objects.nonNull(wechatMicropayApiResult)) {
+            payTransactionId = wechatMicropayApiResult.getTransaction_id();
+        } else {
+            payTransactionId = order.getPayTransactionId();
+        }
+
         Map<String, Object> orderSendCusParams = new HashMap<>();
         orderSendCusParams.put("merchSn", order.getMerchSn());
         orderSendCusParams.put("orderSn", order.getOrder_sn());
         orderSendCusParams.put("merchName", order.getMerchName());
         orderSendCusParams.put("thirdPartyMerchCode", store.getThirdPartyMerchCode());
         orderSendCusParams.put("thirdPartyMerchName", store.getThirdPartyMerchName());
-        orderSendCusParams.put("outTradeNo", order.getMerchOrderSn());
-        orderSendCusParams.put("transactionId", order.getPayTransactionId());
+        orderSendCusParams.put("outTradeNo", order.getOrder_sn());
+        orderSendCusParams.put("transactionId", payTransactionId);
         orderSendCusParams.put("subOrderId", "");   // ccnet原逻辑没有对该字段赋值
         orderSendCusParams.put("subOrderNo", order.getOrder_sn());
         orderSendCusParams.put("feeType", order.getFeeType());
@@ -3234,8 +3262,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 +3271,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);
@@ -3252,16 +3281,18 @@ public class OrderServiceImpl implements OrderService {
             Response<String> response = JacksonUtil.fromListJson(memberOrderSyncResponseJson, new TypeReference<Response<String>>() {});
             if (Objects.nonNull(response) && response.getSuccess()) {
                 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,23 +3333,25 @@ 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("保存会员系统积分变动详情记录中......");
-        List<HaiKongMemberScoreChangeDetailRecordEntity> recordEntityList = goodsList.stream().map(goodsEntity -> {
+        List<HaiKongMemberScoreChangeDetailRecordEntity> recordEntityList = goodsList.stream().distinct().map(goodsEntity -> {
             HaiKongMemberScoreChangeDetailRecordEntity entity = new HaiKongMemberScoreChangeDetailRecordEntity();
             String sku = goodsEntity.getSku();
             OrderGiftScoreRulesVo orderGiftScoreRulesVo = giftGoodsScoreDetailMap.get(sku);
@@ -4256,7 +4289,7 @@ public class OrderServiceImpl implements OrderService {
             if (Objects.nonNull(activity)) {
                 good.setActivity(null);
             }
-            BigDecimal actualPaymentAmount = good.getActualPaymentAmount();
+            BigDecimal actualPaymentAmount = good.getActualPaymentAmount().multiply(BigDecimal.valueOf(good.getSellVolume()));
             good.setActualPaymentAmount(good.getRetailPrice());
 
             QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
@@ -4265,7 +4298,7 @@ public class OrderServiceImpl implements OrderService {
             queryGoodsVo.setStoreId(Long.parseLong(storeId));
             queryGoodsVo.setDisCountedPrice(BigDecimal.ZERO);
             queryGoodsVo.setTotalPrice(actualPaymentAmount);
-            orderTotalPrice = orderTotalPrice.add(good.getRetailPrice());
+            orderTotalPrice = orderTotalPrice.add(good.getRetailPrice().multiply(BigDecimal.valueOf(good.getSellVolume())));
             goodsVos.add(queryGoodsVo);
         }
         calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
@@ -4279,7 +4312,7 @@ public class OrderServiceImpl implements OrderService {
          * 2.查询当前时间,该门店是否有活动,如果有活动,查询开启了哪些营销方式
          * 参数: 当前时间  门店id
          */
-        List<MkActivitiesEntity> mkActivitiesEntityList = mkActivitiesService.queryByNow(storeId, DateUtils.format(new Date(), "yyyy-MM-dd"));
+        List<MkActivitiesEntity> mkActivitiesEntityList = mkActivitiesService.queryByNow(storeId, DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
         // 活动优先级判定,特价>打折>满减/满赠>优惠券>积分抵扣;
 //        List<Constants.ActivityTopicEnum> activityTopicEnums = Arrays.asList(Constants.ActivityTopicEnum.values());
 //        for (MkActivitiesEntity mkActivitiesEntity : mkActivitiesEntityList) {
@@ -4582,13 +4615,15 @@ public class OrderServiceImpl implements OrderService {
             queryGoodsVo.setSku(good.getGoodsSn());
             queryGoodsVo.setStoreId(Long.parseLong(storeId));
             queryGoodsVo.setDisCountedPrice(BigDecimal.ZERO);
-            queryGoodsVo.setTotalPrice(good.getActualPaymentAmount());
-            orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount());
+            queryGoodsVo.setTotalPrice(good.getActualPaymentAmount().multiply(BigDecimal.valueOf(good.getSellVolume())));
+            orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount().multiply(BigDecimal.valueOf(good.getSellVolume())));
             goodsVos.add(queryGoodsVo);
         }
         calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
         calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
-
+        calculateOrderDiscountPriceResponseVO.setLevelName("无");
+        calculateOrderDiscountPriceResponseVO.setMemberCurrentAvailableScore(0);
+        calculateOrderDiscountPriceResponseVO.setDeductionScore(0);
 
         // 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
         if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
@@ -4596,11 +4631,19 @@ public class OrderServiceImpl implements OrderService {
             Response<Object> response;
             try {
                 // 查询会员信息
-                memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByPhone("{\"phone\":" + memberCode + "}");
+                if (memberCode.trim().length() == 11) {
+                    memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByPhone("{\"phone\":\"" + memberCode + "\"}");
+                } else {
+                    memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByCode("{\"code\":\"" + memberCode + "\"}");
+                }
                 response = JacksonUtil.fromListJson(memberInfoByCodeResponseJson, new TypeReference<Response<Object>>() {
                 });
-                if (Objects.isNull(response) || Objects.nonNull(response.getErrorCode())) {
+                if (Objects.isNull(response)) {
                     LOGGER.error("请求会员系统出现异常!error:{}", memberInfoByCodeResponseJson);
+                    if (ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_401.getCode().equals(response.getCode())) {
+                        JedisUtil.del(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
+                        throw new ServiceException(String.format("请求会员系统出现异常!会员码:%s,error:%s", memberCode, ErrorCodeConstants.MemberSysErrorCodeEnum.CODE_401.getDesc()));
+                    }
                     throw new ServiceException(String.format("请求会员系统出现异常!会员码:%s,error:%s", memberCode, memberInfoByCodeResponseJson));
                 }
             } catch (Exception e) {
@@ -4612,28 +4655,37 @@ public class OrderServiceImpl implements OrderService {
                 MemberInfoDTO memberInfoDTO = JacksonUtil.fromStringJson(JacksonUtil.toJson(response.getData()), MemberInfoDTO.class);
                 assert memberInfoDTO != null : String.format("会员码:【%s】会员信息错误!%s", memberCode, JacksonUtil.toJson(response));
                 // 查询会员表
+                calculateOrderDiscountPriceResponseVO.setOpenId(memberInfoDTO.getOpenId());
+                calculateOrderDiscountPriceResponseVO.setMemberPhone(memberInfoDTO.getPhone());
+                calculateOrderDiscountPriceResponseVO.setMemberCurrentAvailableScore(memberInfoDTO.getScore());
+                calculateOrderDiscountPriceResponseVO.setLevelName(memberInfoDTO.getLevelName());
                 UserEntity userEntity = userService.queryByOpenId(memberInfoDTO.getOpenId());
+                String openId = memberInfoDTO.getOpenId();
                 if (Objects.isNull(userEntity)) {
                     userEntity = new UserEntity();
-                    userEntity.setOpenId(memberInfoDTO.getOpenId());
+                    userEntity.setOpenId(openId);
                     userEntity.setMemberCode(memberCode);
+                    userEntity.setMobile(openId);
                     userService.save(userEntity);
+                } else {
+                    userEntity.setOpenId(openId);
+                    userEntity.setMobile(openId);
+                    userEntity.setMemberCode(memberCode);
+                    userService.update(userEntity);
                 }
                 Integer score = memberInfoDTO.getScore();
                 if (Objects.nonNull(score) && score > 0) {
                     // 有积分
-                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList, mkActivitiesEntityList);
-                    LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
+                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, memberCode, openId, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionSkuList, mkActivitiesEntityList);
+                    LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", openId, score, afterDiscountPrice, orderTotalPrice);
                     calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
                     calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
                     calculateOrderDiscountPriceResponseVO.setBeforeScore(score);
-                    calculateOrderDiscountPriceResponseVO.setOpenId(memberInfoDTO.getOpenId());
-                    calculateOrderDiscountPriceResponseVO.setMemberPhone(memberInfoDTO.getPhone());
                     // 订单完成后再添加积分消费记录,以及同步积分信息
                     return calculateOrderDiscountPriceResponseVO;
                 } else {
-                    LOGGER.error("会员【{}】积分为0,积分抵扣失败!", memberCode);
-                    throw new ServiceException(String.format("会员【%s】积分为0,积分抵扣失败!", memberCode));
+                    LOGGER.error("会员【{}】积分为0,积分抵扣失败!", openId);
+                    return calculateOrderDiscountPriceResponseVO;
                 }
             } else {
                 LOGGER.error("查询会员信息失败!响应结果:{}", memberInfoByCodeResponseJson);
@@ -4654,15 +4706,18 @@ public class OrderServiceImpl implements OrderService {
      * @param orderTotalPrice   订单商品总价
      * @param score             积分
      * @param memberCode        会员码
+     * @param openId            会员open_id:手机号
      * @param goodsDetailsDtos  订单商品详情
      * @param calculateOrderDiscountPriceResponseVO 响应数据
      * @param promotionSkuList  参与了限时特价活动并且与积分抵扣互斥的sku集合
+     * @param mkActivitiesEntityList 根据优先级排序后的活动集合
      *
      * @return                  积分抵扣后的订单总金额
      */
     private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice,
                                                   Integer score,
                                                   String memberCode,
+                                                  String openId,
                                                   CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO,
                                                   List<GoodsDetailsDto> goodsDetailsDtos,
                                                   List<String> promotionSkuList,
@@ -4717,7 +4772,8 @@ public class OrderServiceImpl implements OrderService {
             if (!promotionSkuList.contains(sku)) {
                 if (!CollectionUtils.isEmpty(scoreDeductionAllowSkuList) && CollectionUtils.isEmpty(scoreDeductionRejectSkuList)) {
                     if (scoreDeductionAllowSkuList.contains(sku)) {
-                        BigDecimal skuActualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
+                        BigDecimal skuActualPaymentAmount = goodsDetailsDto.getActualPaymentAmount()
+                                .multiply(BigDecimal.valueOf(goodsDetailsDto.getSellVolume()));
                         skuTotalPrice = skuTotalPrice.add(skuActualPaymentAmount);
                     }
                 }
@@ -4733,9 +4789,10 @@ public class OrderServiceImpl implements OrderService {
             }
             Integer scoreLimit = Integer.parseInt(scoreLimitStr);
             if (score < scoreLimit) {
-                LOGGER.error("用户【{}】的积分数量为:{},最低需要{}积分才能抵扣!", memberCode, score, scoreLimit);
+                LOGGER.error("会员码【{}】用户【{}】的积分数量为:{},最低需要{}积分才能抵扣!", memberCode, openId, score, scoreLimit);
                 calculateOrderDiscountPriceResponseVO.setAfterScore(score);
-                throw new ServiceException(String.format("用户【%s】的积分数量为:%s,最低需要%s积分才能抵扣!", memberCode, score, scoreLimit));
+                return orderTotalPrice;
+//                throw new ServiceException(String.format("用户【%s】的积分数量为:%s,最低需要%s积分才能抵扣!", openId, score, scoreLimit));
             } else {
                 // 积分取整
                 int scoreInteger = score % scoreLimit == 0 ? score : score - (score % scoreLimit);
@@ -4790,10 +4847,10 @@ public class OrderServiceImpl implements OrderService {
                     String sku = goodsDetailsDto.getGoodsSn();
                     String prodBarcode = goodsDetailsDto.getProdBarcode();
                     // 此字段 = 零售价 - 其他活动优惠金额
-                    BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
+                    BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount()
+                            .multiply(BigDecimal.valueOf(goodsDetailsDto.getSellVolume()));
                     // 当前商品最大支持抵扣的金额
-                    BigDecimal currentSkuMaxDeductionPrice = actualPaymentAmount.multiply(BigDecimal.valueOf(goodsDetailsDto.getSellVolume()))
-                                                                                .multiply(scoreRatio).setScale(0, BigDecimal.ROUND_FLOOR);
+                    BigDecimal currentSkuMaxDeductionPrice = actualPaymentAmount.multiply(scoreRatio).setScale(0, BigDecimal.ROUND_FLOOR);
                     // 其他活动优惠金额
                     BigDecimal otherDiscountedPrice = Objects.isNull(goodsDetailsDto.getDiscountedPrice()) ? BigDecimal.ZERO : goodsDetailsDto.getDiscountedPrice();
 
@@ -4857,10 +4914,10 @@ public class OrderServiceImpl implements OrderService {
                 calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
                 // 积分抵扣的总金额
                 calculateOrderDiscountPriceResponseVO.setScoreDeductionPrice(goodsDetailScoreDeductionPrice);
-                LOGGER.info("会员【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", memberCode, score, afterScore);
+                LOGGER.info("会员【{}】会员码【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", openId, memberCode, score, afterScore);
             }
         } else {
-            LOGGER.info("会员【{}】的积分小于积分抵扣最低值,不参加积分抵扣!", memberCode);
+            LOGGER.info("会员【{}】会员码【{}】的积分小于积分抵扣最低值,不参加积分抵扣!", openId, memberCode);
         }
         return orderTotalPrice;
     }
@@ -5201,7 +5258,7 @@ public class OrderServiceImpl implements OrderService {
         /*GoodsEntity goodsEntity = goodsService.queryObject(goodsDto.getId().intValue());
         BigDecimal goodsTax = CalculateTax.calculateFinalTax(goodsEntity, goodsDto.getStoreRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
         goodsTax = goodsTax.multiply(number).setScale(2, RoundingMode.HALF_UP);*/
-        orderGoodsVo.setTaxPrice(goodsDto.getGoodsTaxes());
+        orderGoodsVo.setTaxPrice(goodsDto.getGoodsTaxes().divide(BigDecimal.valueOf(goodsDto.getSellVolume()), 3, BigDecimal.ROUND_HALF_UP));
 
         return orderGoodsVo;
     }
@@ -5297,8 +5354,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 +5372,6 @@ public class OrderServiceImpl implements OrderService {
                         haiKongResendMsgEntity.setId(haiKongResendMsg.getId());
                         haiKongResendMsgDao.updateResendMsg(haiKongResendMsgEntity);
                     }
-
                 }
             }
 

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

@@ -110,4 +110,9 @@ public class PickUpCodeServiceImpl implements PickUpCodeService {
     public void updatePickUpCode(Map<String, String> pickUpCodeMap) {
         pickUpCodeDao.updatePickUpCode(pickUpCodeMap);
     }
+
+    @Override
+    public void updateBatchPickUpCodeStatus(List<String> orderSnList, String pickUpCodeStatus) {
+        pickUpCodeDao.updateBatchPickUpCodeStatus(orderSnList, pickUpCodeStatus);
+    }
 }

+ 4 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaikongSendOrderInfoRecordServiceImpl.java

@@ -2,12 +2,16 @@ package com.kmall.admin.service.impl.haikong;
 
 import com.kmall.admin.dao.haikong.HaiKongSendOrderInfoRecordDao;
 import com.kmall.admin.entity.haikong.HaiKongSendOrderInfoRecordEntity;
+import com.kmall.admin.service.PickUpCodeService;
 import com.kmall.admin.service.haikong.HaiKongSendOrderInfoRecordService;
+import com.kmall.common.constant.Dict;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 
 /**

+ 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

+ 1 - 1
kmall-admin/src/main/resources/conf/fastdfs.properties

@@ -98,7 +98,7 @@ use_storage_id=false
 storage_ids_filename=storage_ids.conf
 
 #HTTP \u670D\u52A1\u5668\u5730\u5740
-http.tracket_nginx_addr=172.18.246.243
+http.tracket_nginx_addr=120.76.119.218
 
 #HTTP \u670D\u52A1\u5668\u7AEF\u53E3\u53F7
 http.tracker_server_port=80

+ 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

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

@@ -217,4 +217,12 @@
 		where order_sn = #{orderSn}
 	</update>
 
+    <update id="updateBatchPickUpCodeStatus">
+		update mall_pick_up_code set pick_up_code_status = #{pickUpCodeStatus}
+		where order_sn in
+		<foreach collection="orderSnList" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</update>
+
 </mapper>

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

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

@@ -156,6 +156,7 @@
     	from mall2_points_rules mpr
     	left join mall2_points_rules_detil mprs on mpr.mpr_id = mprs.father_id
     	where mprs.id is not null and mpr.is_valid = 0 and mpr.points_begin_time &lt;= #{nowTime} and mpr.points_end_time &gt;= #{nowTime}
+    	order by mpr.points_type desc
 	</select>
 
 	<insert id="saveMall2PointsRulesDetil" parameterType="com.kmall.admin.dto.Mall2RulesDto">

+ 2 - 2
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiespromotion.html

@@ -61,9 +61,9 @@
             <Form-item label="商品系列" prop="productSeries">
                 <i-input v-model="mkActivitiesPromotion.productSeries" placeholder="商品系列"/>
             </Form-item>
-            <Form-item label="截止日期" prop="deadline">
+            <!--<Form-item label="截止日期" prop="deadline">
                 <i-input v-model="mkActivitiesPromotion.deadline" placeholder="截止日期 yyy-mm-dd"/>
-            </Form-item>
+            </Form-item>-->
             <Form-item>
                 <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
                 <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>

+ 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 - 4
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivityform.html

@@ -115,7 +115,7 @@
             <Form-item label="结束时间" prop="mkdEndTime">
                 <Date-picker type="datetime" format="yyyy-MM-dd HH:mm:ss" v-model="mkActivities.mkdEndTime" @on-change="getMkdEndTime" placeholder="结束时间" style="width: 240px"></Date-picker>
             </Form-item>
-            <Form-item label="是否提前结束" prop="mkaEndEarly">
+            <!--<Form-item label="是否提前结束" prop="mkaEndEarly">
                 <Radio-group v-model="mkActivities.mkaEndEarly" @on-change="changeMkaEndEarly">
                     <Radio label="1">
                         <span>是</span>
@@ -124,10 +124,10 @@
                         <span>否</span>
                     </Radio>
                 </Radio-group>
-            </Form-item>
-            <Form-item label="提前结束时间" prop="mkdEndEarlyTime" v-show="isMkdEndEarlyTimeShow">
+            </Form-item>-->
+            <!--<Form-item label="提前结束时间" prop="mkdEndEarlyTime" v-show="isMkdEndEarlyTimeShow">
                 <Date-picker type="datetime" format="yyyy-MM-dd HH:mm:ss" v-model="mkActivities.mkdEndEarlyTime" @on-change="getMkdEndEarlyTime" placeholder="提前结束时间" style="width: 240px"></Date-picker>
-            </Form-item>
+            </Form-item>-->
             <Form-item>
                 <i-button type="primary" @click="handleMkactivitiesSubmit('formMkactivitiesValidate')">提交</i-button>
                 <i-button type="warning" @click="reloadMkactivities" style="margin-left: 8px"/>返回</i-button>

+ 14 - 10
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -138,7 +138,7 @@
         <div id="content" class="row-fluid">
             <div class="col-md-3">
                 <div>
-                    <i-input class="search" placeholder="输入或扫码商品条形码" id="saomiao" v-model.trim='prodBarcode' @on-enter="searchQuery(prodBarcode)"/>
+                    <i-input class="search" placeholder="输入或扫码商品条形码" ref="saomiao" id="saomiao" v-model.trim='prodBarcode' @on-enter="searchQuery(prodBarcode)"/>
                 </div>
                 <div v-show="prodBarcode" class="search_menu">
                     <ul>
@@ -205,13 +205,19 @@
                         </table>
                     </li>
                     <li>
-                        <ul>
+                        <ul style="display: inline-block">
                             <li><h3 style="border: white;padding: 8px;">总件数:{{totalCount}}</h3></li>
                             <li><h3 style="border: white;padding: 8px;">总价:{{totalPrice}}</h3></li>
 <!--                            <li><h3 style="border: white;padding: 8px">优惠价:{{discountedPrice}}</h3></li>-->
                             <li><h3 style="border: white;padding: 8px">实际支付价:{{actualPrice}}</h3></li>
                             <li v-if="showReduceMoney != 0"><h3 style="border: white;padding: 8px">满减:{{showReduceMoney}}</h3></li>
                         </ul>
+                        <div style="width: 30px; display: inline-block"></div>
+                        <ul style="display: inline-block">
+                            <li><h3 style="border: white;padding: 8px;">会员当前积分:{{memberCurrentAvailableScore}}</h3></li>
+                            <li><h3 style="border: white;padding: 8px;">抵扣积分:{{deductionScore}}</h3></li>
+                            <li><h3 style="border: white;padding: 8px;">会员等级:{{levelName}}</h3></li>
+                        </ul>
                     </li>
                     <li  style="height: 100px;">
                         <i-button type="error" @click="clearGoodsList" class="goods-button"><i class="fa fa-pencil-square-o"></i>&nbsp;清空</i-button>
@@ -298,7 +304,7 @@
                             </div>
                         </div>
 
-                        <div class="modal fade" id="calculateOrderPriceDialog"  role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                        <div class="modal fade" id="calculateOrderPriceDialog"  role="dialog" aria-hidden="true">
                             <div class="modal-dialog">
                                 <div class="modal-content">
                                     <div class="modal-header">
@@ -306,12 +312,10 @@
                                         <h4 class="modal-title" id="calculateOrderPriceModalLabel">录入会员码</h4>
                                     </div>
                                     <div class="modal-body">
-                                        <form>
-                                            <div class="form-group">
-                                                <label for="customPhone" class="control-label">会员码:</label>
-                                                <input autocomplete="off" type="text" class="form-control" ref="couponBarCode" id="couponBarCode" @blur="customPhoneBlur" />
-                                            </div>
-                                        </form>
+                                        <div>
+                                            <label for="customPhone" class="control-label">会员码:</label>
+                                            <input autocomplete="off" type="text" ref="couponBarCode" size="60%" id="couponBarCode" @on-enter="calculateOrderPriceSubmit" />
+                                        </div>
                                     </div>
                                     <div class="modal-footer">
                                         <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
@@ -332,7 +336,7 @@
                                     <div class="modal-body">
                                         <form>
                                             <div class="form-group">
-                                                <i-input id="payCode"  @on-enter="submitOrder" ref="payCode" placeholder="请输入付款码"/>
+                                                <i-input id="payCode" class="payCodeInput" @on-enter="submitOrder" ref="payCode" size="60%" placeholder="请输入付款码"/>
                                             </div>
 
                                         </form>

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

@@ -39,7 +39,7 @@ $(function () {
 				}
 			},
 			{label: '商品系列', name: 'productSeries', index: 'product_series', width: 80, align: 'center'},
-			{label: '截止日期', name: 'deadline', index: 'deadline', width: 80, align: 'center'}],
+			/*{label: '截止日期', name: 'deadline', index: 'deadline', width: 80, align: 'center'}*/],
 		viewrecords: true,
 		postData: {'mkaId': vm.mkaId},
         height: 550,

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

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

@@ -112,7 +112,7 @@ $(function () {
             {label: '活动优先级', name: 'priority', index: 'priority', width: 100, align: 'center'},
             {label: '开始时间', name: 'mkaStartTime', index: 'mka_start_time', width: 200, align: 'center'},
             {label: '结束时间', name: 'mkdEndTime', index: 'mkd_end_time', width: 200, align: 'center'},
-            {label: '是否提前结束', name: 'mkaEndEarly', index: 'mka_end_early', width: 200, align: 'center',
+            /*{label: '是否提前结束', name: 'mkaEndEarly', index: 'mka_end_early', width: 200, align: 'center',
                 formatter: function (value) {
                     if (value == '0') {
                         return '否';
@@ -121,7 +121,7 @@ $(function () {
                     }
                     return '';
                 }
-            },
+            },*/
             {label: '提前结束时间', name: 'mkdEndEarlyTime', index: 'mkd_end_early_time', width: 200, align: 'center'}
             ],
         viewrecords: true,

+ 106 - 53
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -6,8 +6,8 @@ $(function () {
     queryAssistantInfo();
     var cwQrcode = new Image();
     var cwLogo2 = new Image();
-    cwQrcode.src = "http://8.135.102.238:8080/statics/img/cw_qrcode.png";
-    cwLogo2.src = "http://8.135.102.238:8080/statics/img/cw_logo2.png";
+    cwQrcode.src = "http://120.76.119.218:8080/statics/img/cw_qrcode.png";
+    cwLogo2.src = "http://120.76.119.218:8080/statics/img/cw_logo2.png";
     vm.queryGoods();
 });
 
@@ -496,6 +496,13 @@ const delay = (function () {
 });
 
 let vm = new Vue({
+    created : function () {
+        this.$nextTick(() => {
+            setTimeout(() => {
+                this.$refs.saomiao.focus();
+            }, 200);
+        })
+    },
     el: '#rrapp',
     data: {
         showList: true,
@@ -598,6 +605,10 @@ let vm = new Vue({
         memberPhone: '',
         // 订单抵扣积分
         deductionScore: '',
+        // 会员可用积分
+        memberCurrentAvailableScore: 0,
+        // 会员等级名称
+        levelName: '无',
         // 积分抵扣金额
         scoreDeductionPrice: '',
         // 积分抵扣金额
@@ -607,7 +618,9 @@ let vm = new Vue({
         // 抵扣后积分
         afterScore: 0,
         // 会员openid
-        openId: ''
+        openId: '',
+        // 是否点击了加号或减号的标识
+        clickFlag: false
     },
     watch: {
         prodBarcode (){
@@ -681,7 +694,9 @@ let vm = new Vue({
             vm.storeId = sessionStorage.getItem("storeId");
             var thisGoods = {};
             var overflowLi = this.$refs.overflowLi;
-            $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId+"/"+vm.prodBarcode, function (r) {
+            console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
+            let scanSellVolume = calScanSellVolume(vm.$refs.saomiao.value);
+            $.get("../goods/details/"+vm.prodBarcode+"/"+vm.storeId+"/"+vm.prodBarcode+"/"+scanSellVolume, function (r) {
                 if (r.code == 0) {
                     if(r.goodsDetails.length>1) {
                         r.goodsDetails.sellVolume = 1;
@@ -731,7 +746,9 @@ let vm = new Vue({
         saveOld:function(){
             vm.storeId = sessionStorage.getItem("storeId");
             var overflowLi = this.$refs.overflowLi;
-                $.get("../goods/detailsOld/"+vm.prodBarcode+"/"+vm.storeId, function (r) {
+            console.log("vm.$refs.saomiao.value===>" + vm.$refs.saomiao.value);
+            let scanSellVolume = calScanSellVolume(vm.$refs.saomiao.value);
+                $.get("../goods/detailsOld/"+vm.prodBarcode+"/"+vm.storeId+"/"+scanSellVolume, function (r) {
                     if (r.code == 0) {
                         r.goodsDetails.sellVolume = 1;
                         vm.goodsMap.set(r.goodsDetails.goodsSn,JSON.parse(JSON.stringify(r.goodsDetails)));
@@ -770,6 +787,7 @@ let vm = new Vue({
                     break;
                 }
             }
+            vm.clickFlag = true;
         },
         minus:function(value){
             // 减少数量
@@ -808,6 +826,7 @@ let vm = new Vue({
                     break;
                 }
             }
+            vm.clickFlag = true;
 
         },
         selectItem:function(value) {
@@ -853,16 +872,6 @@ let vm = new Vue({
                     // console.log(goods);
                     // console.log(vm.totalPrice);
 
-                    $.get("../goods/number/del/" + sessionStorage.getItem("storeId") + "/" + goods.sku + "/" + goods.prodBarcode, function (res) {
-                        if (res.code === 0) {
-                            alert("删除成功!");
-                        } else if (res.code === 500) {
-                            alert(res.msg);
-                        } else {
-                            alert("未知异常!请联系管理员!");
-                        }
-                    });
-
                     if(vm.freeBardcode.get(goods.prodBarcode) || vm.freeBardcode.get(goods.prodBarcode) == 0){
                         var nnum = (((goods.retailPrice * goods.sellVolume) - goods.actualPaymentAmount)/goods.retailPrice);
                         vm.freeBardcode.set(goods.prodBarcode, nnum);
@@ -887,19 +896,11 @@ let vm = new Vue({
         },
         clearGoodsList:function(){
             confirm('确认清空吗?', function () {
-                $.get("../goods/number/clear/" + sessionStorage.getItem("storeId"), function (res) {
-                    if (res.code === 0) {
-                        layer.confirm("清空成功", {
-                                skin: 'layui-layer-molv', btn: ['确定'], title: "提示"
-                            }, function () {
-                                location.reload();
-                            });
-                    } else if (res.code === 500) {
-                        alert(res.msg);
-                    } else {
-                        alert("未知异常!请联系管理员!");
-                    }
-                })
+                layer.confirm("清空成功", {
+                    skin: 'layui-layer-molv', btn: ['确定'], title: "提示"
+                }, function () {
+                    location.reload();
+                });
             })
 
         },
@@ -961,11 +962,24 @@ let vm = new Vue({
                 alert("请选择商品");
                 return;
             }
+
+            console.log("vm.clickFlag==>" + vm.clickFlag);
+            if (vm.clickFlag) {
+                let value = vm.$refs.couponBarCode.value;
+                if (value != null || value != "" || value != 'undefined') {
+                    alert("请重新计算优惠价再提交订单!");
+                    return;
+                }
+            }
             $('#myModal').modal('show')
             // 每次点击提交订单的时候清空姓名和身份证信息和手机号
             vm.$refs.customName.value = "";
             vm.$refs.customIDCard.value = "";
-            vm.$refs.customPhone.value = "";
+            let customPhone = vm.userInfo.customPhone;
+            if (customPhone === null || typeof customPhone === 'undefined') {
+                customPhone = '';
+            }
+            vm.$refs.customPhone.value = customPhone;
             vm.$refs.couponBarCode.value = "";
             if(vm.$refs.couponSn)
                 vm.$refs.couponSn.value = "";
@@ -977,19 +991,25 @@ let vm = new Vue({
                 alert("请选择商品");
                 return;
             }
+
+            vm.clickFlag = false;
             $("#calculateOrderPriceDialog").modal('show');
 
+            this.couponBarCodeChangeFocus();
         },
         // 计算优惠价格,返回订单详情数据
         calculateOrderPriceSubmit : function () {
 
             // console.log("点击计算=====>" + JSON.stringify(vm.goodsList));
 
-            var couponBarCode = vm.$refs.couponBarCode;
+            var couponBarCode = vm.$refs.couponBarCode.value;
             if (couponBarCode === null || couponBarCode === '') {
-                alert("无会员码,不能参加积分抵扣活动!\n计算中...");
+                confirm("无会员码,不能参加积分抵扣活动!<br/>点击确认开始计算...", function () {
+                    calculateOrderPrice();
+                });
+            } else {
+                calculateOrderPrice();
             }
-            calculateOrderPrice();
         },
         // 提交订单
         submitOrder:function(){
@@ -1148,6 +1168,7 @@ let vm = new Vue({
 
             $("#Send").attr("data-dismiss","modal");
             $('#payModal').modal('show');
+            this.payCodeChangeFocus();
             $("#payCode").keydown(function(e){
                 if(e.keyCode==13){
                     $("#submitOrder").click();
@@ -1331,6 +1352,20 @@ let vm = new Vue({
                     toUrl('../logout?_' + $.now());
                 }, 500);
             });
+        },
+        couponBarCodeChangeFocus() {
+            this.$nextTick(() => {
+                setTimeout(() => {
+                    this.$refs.couponBarCode.focus();
+                }, 200);
+            })
+        },
+        payCodeChangeFocus() {
+            this.$nextTick(() => {
+                setTimeout(() => {
+                    this.$refs.payCode.focus();
+                }, 200);
+            })
         }
     }
 });
@@ -1454,7 +1489,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);
@@ -1992,7 +2027,7 @@ function toPayOrder(payCode){
                  'sessionId':vm.sessionId,
                  'machineCode':vm.machineCode,
                  'memberCode': vm.memberCode,
-                 'memberPhone': vm.memberPhone,
+                 'memberPhone': vm.userInfo.customPhone,
                  'deductionScore': deductionScore,
                  'actualPrice': actualPrice,
                  'scoreDeductionPrice': scoreDeductionPrice,
@@ -2062,6 +2097,25 @@ function toRefund(){
     })
 }
 
+calScanSellVolume = function (prodBarcode) {
+    let goodsList = vm.goodsList;
+
+    console.log("prodBarcode typeof===>" + typeof prodBarcode);
+    console.log("prodBarcode===>" + prodBarcode);
+    if (goodsList === null || goodsList.length === 0) {
+        return 1;
+    }
+    let sellVolume = 0;
+    goodsList.forEach(goods => {
+        if (prodBarcode === goods.prodBarcode) {
+            sellVolume = sellVolume + goods.sellVolume;
+        }
+    });
+
+    return sellVolume;
+
+}
+
 /**
  * 计算当前购物栏商品优惠价格
  */
@@ -2091,10 +2145,17 @@ calculateOrderPrice = function() {
                 vm.memberPhone = r.data.memberPhone;
                 vm.openId = r.data.openId;
                 vm.deductionScore = r.data.deductionScore;
+                vm.memberCurrentAvailableScore = r.data.memberCurrentAvailableScore;
+                vm.levelName = r.data.levelName;
                 vm.scoreDeductionPrice = r.data.scoreDeductionPrice;
                 vm.scoreLimit = r.data.scoreLimit;
                 vm.beforeScore = r.data.beforeScore;
                 vm.afterScore = r.data.afterScore;
+                vm.userInfo.customPhone = r.data.memberPhone;
+                vm.$refs.customPhone.value = r.data.memberPhone;
+                // console.log("memberPhone===>" + r.data.memberPhone);
+                // console.log("this.userInfo.customPhone===>" + vm.userInfo.customPhone);
+                // console.log("vm.$refs.customPhone.value===>" + vm.$refs.customPhone.value);
                 // console.log("计算后数据===>" + JSON.stringify(calGoodsList));
                 // console.log("替换后数据===>" + JSON.stringify(vm.goodsList));
 
@@ -2119,20 +2180,20 @@ handleSellVolume = function (currentGoodsDetail, type) {
     // 当前未被处理的商品数量
     let number = currentGoodsDetail.sellVolume;
     // 当前商品应支付金额
-    let currentActualPaymentAmount = new BigNumber(currentGoodsDetail.actualPaymentAmount);
+    let currentActualPaymentAmount = new BigNumber(currentGoodsDetail.actualPaymentAmount, 2, BigNumber.ROUND_HALF_UP);
     // 当前商品税款
     let currentGoodsTax = new BigNumber(currentGoodsDetail.goodstaxes);
     // 当前商品零售价
     let retailPrice = new BigNumber(currentGoodsDetail.retailPrice);
     // 单个商品时的税款
-    let singleTax = currentGoodsTax.divide(number);
+    let singleTax = new BigNumber(currentGoodsTax.divide(number).toString(), 2, BigNumber.ROUND_HALF_UP);
     // 单个商品时的应支付金额
-    let singleActualPaymentAmount = currentActualPaymentAmount.divide(number);
+    let singleActualPaymentAmount = new BigNumber(currentActualPaymentAmount.divide(number).toString(), 2, BigNumber.ROUND_HALF_UP);
 
     // 当前总价
-    let currentTotalPrice = new BigNumber(vm.totalPrice);
+    let currentTotalPrice = new BigNumber(vm.totalPrice, 2, BigNumber.ROUND_HALF_UP);
     // 当前实际支付价
-    let currentActualPrice = new BigNumber(vm.actualPrice);
+    let currentActualPrice = new BigNumber(vm.actualPrice, 2, BigNumber.ROUND_HALF_UP);
     let storeId = sessionStorage.getItem("storeId");
     let sku = currentGoodsDetail.sku;
     let prodBarcode = currentGoodsDetail.prodBarcode;
@@ -2152,20 +2213,12 @@ handleSellVolume = function (currentGoodsDetail, type) {
             }
         });
     } else {
-        $.get("../goods/number/minus/"+ storeId +"/" + sku + "/" + prodBarcode, function (res) {
-            if (res.code === 0) {
-                currentGoodsDetail.sellVolume -= 1;
-                currentGoodsDetail.goodstaxes = currentGoodsTax.subtract(singleTax).toString();
-                currentGoodsDetail.actualPaymentAmount = currentActualPaymentAmount.subtract(singleActualPaymentAmount).toString();
-                vm.totalCount -= 1;
-                vm.totalPrice = currentTotalPrice.subtract(retailPrice).toString();
-                vm.actualPrice = currentActualPrice.subtract(singleActualPaymentAmount).toString();
-            } else if (res.code === 500) {
-                alert(res.msg);
-            } else {
-                alert("未知异常!请联系管理员!");
-            }
-        });
+        currentGoodsDetail.sellVolume -= 1;
+        currentGoodsDetail.goodstaxes = currentGoodsTax.subtract(singleTax).toString();
+        currentGoodsDetail.actualPaymentAmount = currentActualPaymentAmount.subtract(singleActualPaymentAmount).toString();
+        vm.totalCount -= 1;
+        vm.totalPrice = currentTotalPrice.subtract(retailPrice).toString();
+        vm.actualPrice = currentActualPrice.subtract(singleActualPaymentAmount).toString();
     }
 
     for (let i = 0; i < vm.goodsList.length; i++) {

+ 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 '明细商品购买数量',

+ 4 - 2
切换环境需要修改的.md

@@ -19,7 +19,7 @@
 
 6. cert安装目录配置在wx-mp.properties的certName中
 
-7. sale.js修改WebSocket地址,海控为127.0.0.1:8080
+7. sale.js修改WebSocket地址,海控为120.76.119.218:8080
 
 8. haikong.properties,修改env为prod
 
@@ -31,4 +31,6 @@
     HK_NOTICE_NUM: 100 (通知数据阀值)
 
 10. 微信支付推送海关支付凭证
-    cuspay-wx.properties,修改为海控生产环境配置
+    cuspay-wx.properties,修改为海控生产环境配置
+
+11. 如果测试环境需要测试支付,请在OrderServiceImpl的判断付款码之前加上:env = "prod";