Parcourir la source

Merge remote-tracking branch 'upsteam/master'

zhh il y a 3 ans
Parent
commit
7fa17f2b91
70 fichiers modifiés avec 2652 ajouts et 770 suppressions
  1. 148 0
      kmall-admin/src/main/java/com/kmall/admin/aop/InterfaceExternalAspect.java
  2. 95 1
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java
  3. 107 0
      kmall-admin/src/main/java/com/kmall/admin/controller/InterfaceSendLogController.java
  4. 8 2
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  5. 1 1
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderProcessRecordExternalController.java
  6. 4 3
      kmall-admin/src/main/java/com/kmall/admin/controller/PickUpCodeController.java
  7. 11 0
      kmall-admin/src/main/java/com/kmall/admin/controller/StoreController.java
  8. 16 0
      kmall-admin/src/main/java/com/kmall/admin/dao/InterfaceSendLogDao.java
  9. 3 0
      kmall-admin/src/main/java/com/kmall/admin/dao/OrderProcessRecordDao.java
  10. 7 0
      kmall-admin/src/main/java/com/kmall/admin/dao/PickUpCodeDao.java
  11. 3 0
      kmall-admin/src/main/java/com/kmall/admin/dao/StoreDao.java
  12. 12 0
      kmall-admin/src/main/java/com/kmall/admin/dto/StoreGoodsDto.java
  13. 12 1
      kmall-admin/src/main/java/com/kmall/admin/entity/AddressEntity.java
  14. 166 0
      kmall-admin/src/main/java/com/kmall/admin/entity/InterfaceSendLogEntity.java
  15. 10 2
      kmall-admin/src/main/java/com/kmall/admin/entity/MallVmcSendlogEntity.java
  16. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ProductStoreRelaEntity.java
  17. 1 1
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongVmcconnectTemplate.java
  18. 20 20
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/VmcShopTemplate.java
  19. 5 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java
  20. 19 10
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongMemberSystemUrlEnum.java
  21. 11 2
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/HaiKongWareSystemUrlEnum.java
  22. 17 5
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/VmcconnectUrlEnum.java
  23. 215 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoDTO.java
  24. 158 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderInfoItemDTO.java
  25. 32 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderProductInfoDTO.java
  26. 82 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/PayInfoDTO.java
  27. 96 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/SeaportInfoDTO.java
  28. 71 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/SendOrderToVmcShopDTO.java
  29. 38 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/R.java
  30. 73 0
      kmall-admin/src/main/java/com/kmall/admin/service/InterfaceSendLogService.java
  31. 2 1
      kmall-admin/src/main/java/com/kmall/admin/service/OrderProcessRecordService.java
  32. 0 8
      kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java
  33. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/PickUpCodeService.java
  34. 3 0
      kmall-admin/src/main/java/com/kmall/admin/service/StoreService.java
  35. 68 274
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  36. 59 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/InterfaceSendLogServiceImpl.java
  37. 29 24
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderProcessRecordServiceImpl.java
  38. 165 337
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  39. 6 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/PickUpCodeServiceImpl.java
  40. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/StoreServiceImpl.java
  41. 5 0
      kmall-admin/src/main/java/com/kmall/admin/websocket/WebSocketServer.java
  42. 1 0
      kmall-admin/src/main/resources/XmlTemplate/StoreGoodsDtoList.xml
  43. 1 1
      kmall-admin/src/main/resources/logback.xml
  44. 11 8
      kmall-admin/src/main/resources/mybatis/mapper/AddressDao.xml
  45. 1 1
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  46. 11 5
      kmall-admin/src/main/resources/mybatis/mapper/MallVmcSendLogDao.xml
  47. 49 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderProcessRecordDao.xml
  48. 43 0
      kmall-admin/src/main/resources/mybatis/mapper/PickUpCodeDao.xml
  49. 5 3
      kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml
  50. 8 0
      kmall-admin/src/main/resources/mybatis/mapper/StoreDao.xml
  51. 115 0
      kmall-admin/src/main/resources/mybatis/mapper/shop/InterfaceSendLogDao.xml
  52. 1 0
      kmall-admin/src/main/resources/spring/spring-shiro.xml
  53. 1 0
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  54. 5 2
      kmall-admin/src/main/webapp/WEB-INF/page/shop/address.html
  55. 72 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/interfacesendlog.html
  56. 73 34
      kmall-admin/src/main/webapp/js/sale/sale.js
  57. 2 1
      kmall-admin/src/main/webapp/js/shop/address.js
  58. 8 8
      kmall-admin/src/main/webapp/js/shop/goods.js
  59. 149 0
      kmall-admin/src/main/webapp/js/shop/interfacesendlog.js
  60. 9 8
      kmall-admin/src/main/webapp/js/shop/storeProductStock.js
  61. BIN
      kmall-admin/src/main/webapp/statics/img/sf_img.jpg
  62. 26 0
      kmall-api/src/main/java/com/kmall/api/entity/OrderGoodsVo.java
  63. 65 0
      kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java
  64. 62 0
      kmall-common/src/main/java/com/kmall/common/constant/Dict.java
  65. 1 1
      kmall-common/src/main/java/com/kmall/common/utils/Query.java
  66. 37 0
      kmall-manager/src/main/java/com/kmall/manager/manager/dto/PayOriginInfoDTO.java
  67. 91 0
      kmall-manager/src/main/java/com/kmall/manager/manager/redis/JedisUtil.java
  68. 4 1
      kmall-manager/src/main/java/com/kmall/manager/manager/wechat/WechatUtil.java
  69. 3 3
      kmall-manager/src/main/resources/conf/db.properties
  70. 3 2
      kmall-manager/src/main/resources/conf/redis.properties

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

@@ -0,0 +1,148 @@
+package com.kmall.admin.aop;
+
+import com.alibaba.fastjson.JSON;
+import com.kmall.admin.dao.InterfaceSendLogDao;
+import com.kmall.admin.entity.InterfaceSendLogEntity;
+import com.kmall.admin.haikong.constant.HaiKongMemberSystemUrlEnum;
+import com.kmall.admin.haikong.constant.HaiKongWareSystemUrlEnum;
+import com.kmall.admin.haikong.constant.VmcconnectUrlEnum;
+import com.kmall.common.constant.Dict;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Aspect
+@Component
+public class InterfaceExternalAspect {
+    private final static Logger logger = LoggerFactory.getLogger(RepeatSubmitAspect.class);
+
+    /**
+     * 日志记录dao层
+     */
+    @Autowired
+    private InterfaceSendLogDao interfaceSendLogDao;
+
+    /**
+     * 接口日志记录
+     *
+     * @param proceedingJoinPoint
+     * @return
+     */
+    @Around("execution(public * com.kmall.admin.haikong.client.*.*(..))")
+    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
+        Object result = null;
+        String exMsg = null;
+        String methd = null;
+        InterfaceSendLogEntity interfaceSendLogEntity = null;
+        StringBuilder requestLog = new StringBuilder();
+        try {
+            MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
+            methd = methodSignature.getMethod().getName();
+             interfaceSendLogEntity = getMethdMsg(methd);
+            Object[] args = proceedingJoinPoint.getArgs();
+            for (Object o : args) {
+                requestLog.append(String.format("参数:%s\r\n", JSON.toJSON(o)));
+            }
+            interfaceSendLogEntity.setRequestDate(new Date());
+            result = proceedingJoinPoint.proceed();
+
+            } catch (Exception e) {
+            exMsg = e.getMessage();
+            throw e;
+        } finally {
+            saveVmcSend(interfaceSendLogEntity,requestLog.toString(),JSON.toJSONString(result),exMsg);
+        }
+        return result;
+    }
+
+    /**
+     * 调用各外部系统日志组装
+     * @param methd
+     * @return
+     */
+    private InterfaceSendLogEntity getMethdMsg(String methd) {
+        InterfaceSendLogEntity interfaceSendLogEntity = new InterfaceSendLogEntity();
+        switch (methd){
+            case "sendOrder":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_mall.getItemName());
+                interfaceSendLogEntity.setInterfaceType(VmcconnectUrlEnum.ORDERS_CREATE_ORDER.getMethodName());
+                break;
+            case "refundOrder":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_mall.getItemName());
+                interfaceSendLogEntity.setInterfaceType(VmcconnectUrlEnum.ORDERS_CANCEL_ORDER.getMethodName());
+                break;
+            case "ordersOuterStatus":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_mall.getItemName());
+                interfaceSendLogEntity.setInterfaceType(VmcconnectUrlEnum.ORDERS_OUTER_STATUS.getMethodName());
+                break;
+            case "resendOrder":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_mall.getItemName());
+                interfaceSendLogEntity.setInterfaceType(VmcconnectUrlEnum.ORDERS_RETRY_ORDER.getMethodName());
+                break;
+            case "queryWarehouseStock":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_warehouse.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongWareSystemUrlEnum.QUERY_INVENTORY.getMethodName());
+                break;
+                //会员系统
+            case "getAccessToken":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.QUERY_ACCESS_TOKEN.getMethodName());
+                break;
+            case "refreshAccessToken":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.REFRESH_ACCESS_TOKEN.getMethodName());
+                break;
+            case "getMemberInfoByPhone":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_PHONE.getMethodName());
+                break;
+            case "getMemberInfoByCode":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_CODE.getMethodName());
+                break;
+            case "getMemberCouponInfo":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_COUPON.getMethodName());
+                break;
+            case "changeMemberScore":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.CHANGE_MEMBER_SCORE.getMethodName());
+                break;
+            case "memberOrderSync":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.MEMBER_ORDER_SYNC.getMethodName());
+                break;
+            case "rollbackMemberScore":
+                interfaceSendLogEntity.setSysType(Dict.sendLog.item_member.getItemName());
+                interfaceSendLogEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.ROLLBACK_MEMBER_SCORE.getMethodName());
+                break;
+            default:
+                break;
+        }
+            return interfaceSendLogEntity;
+    }
+
+
+    /**
+     * 插入日志记录
+     * @param interfaceSendLogEntity
+     * @param request
+     * @param response
+     * @param exMsg
+     */
+    private void saveVmcSend(InterfaceSendLogEntity interfaceSendLogEntity, String request, String response,String exMsg){
+        interfaceSendLogEntity.setRequestMsg(request);
+        interfaceSendLogEntity.setResponseMsg(response);
+        interfaceSendLogEntity.setResponseDate(new Date());
+        interfaceSendLogEntity.setExceptionMsg(exMsg);
+        interfaceSendLogDao.save(interfaceSendLogEntity);
+    }
+
+}

+ 95 - 1
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -6,6 +6,7 @@ import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
 import com.kmall.admin.entity.GoodsGalleryEntity;
 import com.kmall.admin.entity.SysOssEntity;
+import com.kmall.admin.haikong.constant.Constants;
 import com.kmall.admin.service.*;
 import com.kmall.admin.utils.ParamUtils;
 import com.kmall.admin.utils.ShiroUtils;
@@ -16,6 +17,8 @@ import com.kmall.common.fileserver.util.FileManager;
 import com.kmall.common.utils.*;
 import com.kmall.common.utils.excel.ExcelExport;
 import com.kmall.common.utils.excel.ExcelUtil;
+import com.kmall.manager.manager.express.sf.ServiceException;
+import com.kmall.manager.manager.redis.JedisUtil;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
@@ -23,6 +26,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.apache.tools.zip.ZipEntry;
 import org.apache.tools.zip.ZipFile;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -31,9 +35,9 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.sql.rowset.serial.SerialException;
 import java.io.*;
 import java.util.*;
-import java.util.logging.Logger;
 
 /**
  * Controller
@@ -45,6 +49,9 @@ import java.util.logging.Logger;
 @RestController
 @RequestMapping("goods")
 public class GoodsController {
+
+    private final static Logger log = LoggerFactory.getLogger(GoodsController.class);
+
     @Autowired
     private GoodsService goodsService;
     @Autowired
@@ -584,7 +591,11 @@ public class GoodsController {
         Map<String,Object> map = null;
         try {
             map = goodsService.calculateGoodsDetail(prodBarcode,storeId,sku);
+        } catch (ServiceException e) {
+            log.error("查询订单详情出现异常!", e);
+            return R.error(e.getMessage());
         } catch (Exception e) {
+            log.error("查询条码:【{}】详情出现异常!", prodBarcode, e);
             return R.error("系统异常,请联系管理员!e:"+e.getMessage());
         }
         if(map == null){
@@ -606,7 +617,11 @@ public class GoodsController {
         Map<String,Object> map = null;
         try {
             map = goodsService.calculateGoodsDetail(prodBarcode,storeId,null);
+        } catch (ServiceException e) {
+            log.error("查询订单详情出现异常!", e);
+            return R.error(e.getMessage());
         } catch (Exception e) {
+            log.error("查询条码:【{}】价格出现异常!", prodBarcode, e);
             return R.error("系统异常,请联系管理员!e:"+e.getMessage());
         }
         if(map == null){
@@ -615,6 +630,82 @@ 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);
+        } catch (Exception e) {
+            log.error("storeId:【{}】,sku:【{}】,prodBarcode:【{}】,删除购物篮商品失败!", storeId, sku, prodBarcode);
+            return R.error("删除购物篮商品失败!请刷新收银端页面!");
+        }
+
+        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可选
@@ -635,6 +726,9 @@ public class GoodsController {
         List<Map<String,Object>> mapList = null;
         try {
             mapList = goodsService.selectSkuDetails(prodBarcode,storeId);
+        } catch (ServiceException e) {
+            log.error("查询sku详情出现异常!", e);
+            return R.error(e.getMessage());
         } catch (Exception e) {
             return R.error("系统异常,请联系管理员!e:"+e.getMessage());
         }

+ 107 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/InterfaceSendLogController.java

@@ -0,0 +1,107 @@
+package com.kmall.admin.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.entity.InterfaceSendLogEntity;
+import com.kmall.admin.service.InterfaceSendLogService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 接口日志记录Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-03 16:41:35
+ */
+@Controller
+@RequestMapping("interfacesendlog")
+public class InterfaceSendLogController {
+    @Autowired
+    private InterfaceSendLogService interfaceSendLogService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("interfacesendlog:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<InterfaceSendLogEntity> interfaceSendLogList = interfaceSendLogService.queryList(query);
+        int total = interfaceSendLogService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(interfaceSendLogList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("interfacesendlog:info")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        InterfaceSendLogEntity interfaceSendLog = interfaceSendLogService.queryObject(id);
+
+        return R.ok().put("interfaceSendLog", interfaceSendLog);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("interfacesendlog:save")
+    @ResponseBody
+    public R save(@RequestBody InterfaceSendLogEntity interfaceSendLog) {
+        interfaceSendLogService.save(interfaceSendLog);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("interfacesendlog:update")
+    @ResponseBody
+    public R update(@RequestBody InterfaceSendLogEntity interfaceSendLog) {
+        interfaceSendLogService.update(interfaceSendLog);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("interfacesendlog:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        interfaceSendLogService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<InterfaceSendLogEntity> list = interfaceSendLogService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+}

+ 8 - 2
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -22,6 +22,8 @@ import com.kmall.common.utils.wechat.WechatRefundApiResult;
 import com.kmall.common.utils.wechat.WechatReverseApiResult;
 import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 import com.kmall.manager.manager.alipay.AliPayUtil;
+import com.kmall.manager.manager.dto.PayOriginInfoDTO;
+import com.kmall.manager.manager.express.sf.ServiceException;
 import com.kmall.manager.manager.merch.OmsMerchPropertiesBuilder;
 import com.kmall.manager.manager.pingan.PinganUtil;
 import com.kmall.manager.manager.pingan.dto.PinganResponseDto;
@@ -797,12 +799,12 @@ public class OrderController {
 
         //保存支付记录
         OrderWXPayRecordEntity orderWXPayRecordCurrent = orderWXPayRecordService.saveRecord(orderEntity);
-
+        PayOriginInfoDTO payOriginInfoDTO = new PayOriginInfoDTO();
         StoreEntity store = storeService.queryObject(orderEntity.getStoreId());
         WechatMicropayApiResult wechatMicropayApiResult = WechatUtil
                 .wxMicropay(store.getMerchName() + "-" + store.getStoreName(), orderEntity.getOrderBizType(), null,
                             orderWXPayRecordCurrent.getOutTradeNoWX(), orderEntity.getActualPrice().doubleValue(),
-                            "127.0.0.1", auth_code);
+                            "127.0.0.1", auth_code, payOriginInfoDTO);
         orderWXPayRecordService.updateRecord(orderWXPayRecordCurrent.getId(), wechatMicropayApiResult);
 
         //当支付成功时,修改订单,并把其他支付记录撤销
@@ -1064,6 +1066,8 @@ public class OrderController {
                 return R.error((String) resultObj.get("errmsg"));
             }
             return R.ok().put("resultObj", resultObj);
+        } catch (ServiceException e) {
+            return R.error(e.getMessage());
         } catch (Exception e) {
             if (e.getMessage().contains("java.lang.IllegalStateException: invalid auth_code!")){
                 return R.error("付款码异常,请重新输入!");
@@ -1370,6 +1374,8 @@ public class OrderController {
         try {
             CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO = orderService.calculateOrderDiscountPrice(calculateOrderDiscountPriceVo);
             return R.ok().put("data", calculateOrderDiscountPriceResponseVO);
+        } catch (ServiceException e) {
+            return R.error(e.getMessage());
         } catch (Exception e) {
             return R.error("计算出错!请联系管理员!" + e.getMessage());
         }

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

@@ -68,7 +68,7 @@ public class OrderProcessRecordExternalController {
             if(num>0L){
                 return Message.error("订单数据存在重复");
             }
-            return orderProcessRecordService.saveHkNoticeMsg(orderProcessRecordList);
+            return orderProcessRecordService.saveHkNoticeMsg(orderProcessRecordList,outRequestMessage);
         }catch (Exception e){
             logger.error("hknoticeMsg---订单流转信息回调通知接口数据="+ JSON.toJSONString(outRequestMessage),e);
             return Message.error("参数错误");

+ 4 - 3
kmall-admin/src/main/java/com/kmall/admin/controller/PickUpCodeController.java

@@ -14,6 +14,7 @@ import com.kmall.admin.service.PickUpCodeService;
 import com.kmall.admin.utils.ParamUtils;
 import com.kmall.admin.utils.SessionUtils;
 import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.common.constant.Dict;
 import com.kmall.common.utils.PageUtils;
 import com.kmall.common.utils.Query;
 import com.kmall.common.utils.R;
@@ -143,11 +144,11 @@ public class PickUpCodeController {
         }
 
         String status = pickUpCodeService.queryPickUpCodeStatus(pickUpCode.getOrderSn());
-        if(status.equals("1")){
+        if(Dict.PickUpCodeStatusEnum.item_1.getStatus().equals(status)){
             return R.error("小票码已核销过!");
         }
 
-        pickUpCode.setPickUpCodeStatus("1");
+        pickUpCode.setPickUpCodeStatus(Dict.PickUpCodeStatusEnum.item_1.getStatus());
         if (pickUpCode.getPickUpCodeCreatetime()==null){
             SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
             pickUpCode.setPickUpCodeVerificationtime(df.format(new Date()));// new Date()为获取当前系统时间
@@ -185,7 +186,7 @@ public class PickUpCodeController {
             return R.error("该订单还不能提货!");
         }
 
-        pickUpCodeEntity.setPickUpCodeStatus("5");
+        pickUpCodeEntity.setPickUpCodeStatus(Dict.PickUpCodeStatusEnum.item_5.getStatus());
         pickUpCodeEntity.setModerSn(String.valueOf(ShiroUtils.getUserId()));
         pickUpCodeEntity.setModTime(new Date());
         pickUpCodeService.update(pickUpCodeEntity);

+ 11 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/StoreController.java

@@ -3,6 +3,7 @@ package com.kmall.admin.controller;
 import com.google.common.collect.ImmutableBiMap;
 import com.kmall.admin.dto.StoreDto;
 import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.SysMacroEntity;
 import com.kmall.admin.service.StoreService;
 import com.kmall.admin.utils.ParamUtils;
 import com.kmall.admin.utils.ShiroUtils;
@@ -279,4 +280,14 @@ public class StoreController {
         return R.ok();
     }
 
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAllDictionary")
+    @ResponseBody
+    public R queryAll() {
+        List<SysMacroEntity> list = storeService.queryListDictionary();
+        return R.ok().put("list", list);
+    }
+
 }

+ 16 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/InterfaceSendLogDao.java

@@ -0,0 +1,16 @@
+package com.kmall.admin.dao;
+
+
+import com.kmall.admin.entity.InterfaceSendLogEntity;
+import com.kmall.manager.dao.BaseDao;
+
+/**
+ * 接口日志记录Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-03 16:41:35
+ */
+public interface InterfaceSendLogDao extends BaseDao<InterfaceSendLogEntity> {
+
+}

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

@@ -23,4 +23,7 @@ public interface OrderProcessRecordDao extends BaseDao<OrderProcessRecordEntity>
     void updateHkNoticeMsg(List<OrderProcessRecordHkNewEntity> orderProcessRecordList);
 
     Integer queryHkOrderTotal(List<OrderProcessRecordHkNewEntity> orderProcessRecordList);
+
+    void updateHkNoticeMsgMallOrder(List<OrderProcessRecordHkNewEntity> orderProcessRecordList);
+
 }

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

@@ -1,9 +1,12 @@
 package com.kmall.admin.dao;
 
+import com.kmall.admin.entity.OrderProcessRecordHkNewEntity;
 import com.kmall.admin.entity.PickUpCodeEntity;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 小票码信息表Dao
  *
@@ -28,4 +31,8 @@ public interface PickUpCodeDao extends BaseDao<PickUpCodeEntity> {
     String queryMaxPickUpCode(@Param("nowTime") String nowTime);
 
     String queryMaxPickUpCodeByStoreId(@Param("nowTime")String nowTime, @Param("storeId") String storeId);
+
+    void updateHkNoticeMsgPickUpCode(List<OrderProcessRecordHkNewEntity> orderProcessRecordList);
+
+    void updatePickUpCodeStatusByOrderSn(@Param("orderSn") String orderSn, @Param("pickUpCodeStatus") String pickUpCodeStatus);
 }

+ 3 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/StoreDao.java

@@ -2,6 +2,7 @@ package com.kmall.admin.dao;
 
 import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.SysMacroEntity;
 import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import org.apache.ibatis.annotations.Param;
 import com.kmall.manager.dao.BaseDao;
@@ -34,4 +35,6 @@ public interface StoreDao extends BaseDao<StoreEntity> {
     void updateStoreRulesDetil(Integer[] mprIds);
 
     Long queryObjectRulesByName(String trim);
+
+    List<SysMacroEntity> queryListDictionary();
 }

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

@@ -26,6 +26,10 @@ public class StoreGoodsDto implements Serializable {
     private String bottomLinePrice;//底线价
     private String batchSn;//批次编号
     private String uniqueIdentifier;
+    /**
+     * 出区数
+     */
+    private String exitRegionNumber;
 
     public String getBatchSn() {
         return batchSn;
@@ -146,4 +150,12 @@ public class StoreGoodsDto implements Serializable {
     public void setUniqueIdentifier(String uniqueIdentifier) {
         this.uniqueIdentifier = uniqueIdentifier;
     }
+
+    public String getExitRegionNumber() {
+        return exitRegionNumber;
+    }
+
+    public void setExitRegionNumber(String exitRegionNumber) {
+        this.exitRegionNumber = exitRegionNumber;
+    }
 }

+ 12 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/AddressEntity.java

@@ -65,7 +65,10 @@ public class AddressEntity implements Serializable {
      * 所属门店
      */
     private String storeName;
-
+    /**
+     * 发货人名称
+     */
+    private String senderName;
 
     /**
      * 翻译会员名
@@ -251,4 +254,12 @@ public class AddressEntity implements Serializable {
     public void setStoreName(String storeName) {
         this.storeName = storeName;
     }
+
+    public String getSenderName() {
+        return senderName;
+    }
+
+    public void setSenderName(String senderName) {
+        this.senderName = senderName;
+    }
 }

+ 166 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/InterfaceSendLogEntity.java

@@ -0,0 +1,166 @@
+package com.kmall.admin.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 接口日志记录实体
+ * 表名 mall_interface_send_log
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-03 16:41:35
+ */
+public class InterfaceSendLogEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    private Integer id;
+    /**
+     * 请求/响应系统类型
+     */
+    private String sysType;
+    /**
+     * 请求/响应接口类型
+     */
+    private String interfaceType;
+    /**
+     * 请求信息
+     */
+    private String requestMsg;
+    /**
+     * 响应状态码
+     */
+    private String msgStatus;
+    /**
+     * 响应结果
+     */
+    private String responseMsg;
+    /**
+     * 发送时间
+     */
+    private Date requestDate;
+    /**
+     * 响应时间
+     */
+    private Date responseDate;
+    /**
+     * 异常信息
+     */
+    private String exceptionMsg;
+
+    /**
+     * 设置:主键id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:主键id
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:请求/响应系统类型
+     */
+    public void setSysType(String sysType) {
+        this.sysType = sysType;
+    }
+
+    /**
+     * 获取:请求/响应系统类型
+     */
+    public String getSysType() {
+        return sysType;
+    }
+    /**
+     * 设置:请求/响应接口类型
+     */
+    public void setInterfaceType(String interfaceType) {
+        this.interfaceType = interfaceType;
+    }
+
+    /**
+     * 获取:请求/响应接口类型
+     */
+    public String getInterfaceType() {
+        return interfaceType;
+    }
+    /**
+     * 设置:请求信息
+     */
+    public void setRequestMsg(String requestMsg) {
+        this.requestMsg = requestMsg;
+    }
+
+    /**
+     * 获取:请求信息
+     */
+    public String getRequestMsg() {
+        return requestMsg;
+    }
+    /**
+     * 设置:响应状态码
+     */
+    public void setMsgStatus(String msgStatus) {
+        this.msgStatus = msgStatus;
+    }
+
+    /**
+     * 获取:响应状态码
+     */
+    public String getMsgStatus() {
+        return msgStatus;
+    }
+    /**
+     * 设置:响应结果
+     */
+    public void setResponseMsg(String responseMsg) {
+        this.responseMsg = responseMsg;
+    }
+
+    /**
+     * 获取:响应结果
+     */
+    public String getResponseMsg() {
+        return responseMsg;
+    }
+    /**
+     * 设置:发送时间
+     */
+    public void setRequestDate(Date requestDate) {
+        this.requestDate = requestDate;
+    }
+
+    /**
+     * 获取:发送时间
+     */
+    public Date getRequestDate() {
+        return requestDate;
+    }
+    /**
+     * 设置:响应时间
+     */
+    public void setResponseDate(Date responseDate) {
+        this.responseDate = responseDate;
+    }
+
+    /**
+     * 获取:响应时间
+     */
+    public Date getResponseDate() {
+        return responseDate;
+    }
+
+    public String getExceptionMsg() {
+        return exceptionMsg;
+    }
+
+    public void setExceptionMsg(String exceptionMsg) {
+        this.exceptionMsg = exceptionMsg;
+    }
+}

+ 10 - 2
kmall-admin/src/main/java/com/kmall/admin/entity/MallVmcSendlogEntity.java

@@ -13,9 +13,13 @@ public class MallVmcSendlogEntity implements Serializable {
      */
     private Integer id;
     /**
-     * 请求类型
+     * 请求系统类型
      */
-    private String vmcType;
+    private String sysType;
+    /**
+     * 请求接口类型
+     */
+    private String interfaceType;
     /**
      * 订单编号
      */
@@ -32,4 +36,8 @@ public class MallVmcSendlogEntity implements Serializable {
      * 发送时间
      */
     private Data sendDate;
+    /**
+     * 状态码
+     */
+    private String msgStatus;
 }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/ProductStoreRelaEntity.java

@@ -147,6 +147,8 @@ public class ProductStoreRelaEntity implements Serializable {
     private Integer toBeRestored;
     //积分生成规则id
     private Long pointsRulesId;
+    //出区数
+    private Integer exitRegionNumber;
 
     public ProductStoreRelaEntity() {
     }
@@ -626,4 +628,12 @@ public class ProductStoreRelaEntity implements Serializable {
     public void setPointsRulesId(Long pointsRulesId) {
         this.pointsRulesId = pointsRulesId;
     }
+
+    public Integer getExitRegionNumber() {
+        return exitRegionNumber;
+    }
+
+    public void setExitRegionNumber(Integer exitRegionNumber) {
+        this.exitRegionNumber = exitRegionNumber;
+    }
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongVmcconnectTemplate.java

@@ -24,7 +24,7 @@ public class HaiKongVmcconnectTemplate {
      * @param method
      * @return
      */
-    public String vmcconnectSign(String methodParams,String method){
+    private String vmcconnectSign(String methodParams,String method){
         Map<String,String> params = new HashMap<>();
         params.put("appid",haiKongProperties.getVmcconnectAppId());
         params.put("method", method);

+ 20 - 20
kmall-admin/src/main/java/com/kmall/admin/haikong/client/VmcShopTemplate.java

@@ -35,7 +35,7 @@ public class VmcShopTemplate {
      * @param method
      * @return
      */
-    public String vmcconnectSign(String json,String method){
+    private String vmcconnectSign(String json,String method){
         Map<String,String> params = new HashMap<>();
         params.put("appid",haiKongProperties.getVmcconnectAppId());
         params.put("method", method);
@@ -96,24 +96,24 @@ public class VmcShopTemplate {
     }
 
 
-    public static void main(String[] args) {
-        Map<String,String> params2 = new HashMap<>();
-        params2.put("outer_order_no","HK57746599");
-        //.replaceAll("\\\\","")
-        Map<String,String> params = new HashMap<>();
-        params.put("appid","5");
-        params.put("method", "vmc.orders.cancel.order");
-        params.put("method_params", JSON.toJSONString(params2));
-        params.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
-        String sign = VmcconnectSignUtils.createSign(params,"GXfc6ZtDlnxHxmmAHvfRfqvrqgfwRiJX");
-        params.put("sign",sign);
-        Request request = new Request.Builder()
-                .post(RequestBody.create(MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE), JSON.toJSONString(params)))
-                .url("https://testmall.greedc.com/openapi/vmcconnect/json")
-                .build();
-        String s = OkHttpUtils.retry(request, 3);
-        Map<String,String> res = JSON.parseObject(s,Map.class);
-        System.out.println(res);
-    }
+//    public static void main(String[] args) {
+//        Map<String,String> params2 = new HashMap<>();
+//        params2.put("outer_order_no","HK57746599");
+//        //.replaceAll("\\\\","")
+//        Map<String,String> params = new HashMap<>();
+//        params.put("appid","5");
+//        params.put("method", "vmc.orders.cancel.order");
+//        params.put("method_params", JSON.toJSONString(params2));
+//        params.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
+//        String sign = VmcconnectSignUtils.createSign(params,"GXfc6ZtDlnxHxmmAHvfRfqvrqgfwRiJX");
+//        params.put("sign",sign);
+//        Request request = new Request.Builder()
+//                .post(RequestBody.create(MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE), JSON.toJSONString(params)))
+//                .url("https://testmall.greedc.com/openapi/vmcconnect/json")
+//                .build();
+//        String s = OkHttpUtils.retry(request, 3);
+//        Map<String,String> res = JSON.parseObject(s,Map.class);
+//        System.out.println(res);
+//    }
 
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java

@@ -9,11 +9,16 @@ import java.util.Arrays;
  */
 public class Constants {
 
+    /* --------------------------------------------------redis常量----------------------------------------------- */
 
     public static final String MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY = "haikong_memberSys_accessToken";
 
     public static final String MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY = "haikong_memberSys_refreshToken";
 
+    public static final String WAREHOUSE_STOCK_MAP_KEY = "haikong_warehouse_stock_cache";
+
+    /* --------------------------------------------------redis常量----------------------------------------------- */
+
     /**
      * 活动主题枚举
      */

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

@@ -12,39 +12,39 @@ public enum HaiKongMemberSystemUrlEnum {
     /**
      * 获取accessToken
      */
-    QUERY_ACCESS_TOKEN("POST", "/gw/gateway/dss.auth.token.query/v1"),
+    QUERY_ACCESS_TOKEN("POST", "/gw/gateway/dss.auth.token.query/v1","获取accessToken接口"),
     /**
      * 刷新token
      */
-    REFRESH_ACCESS_TOKEN("POST", "/gw/gateway/dss.auth.token.refresh/v1"),
+    REFRESH_ACCESS_TOKEN("POST", "/gw/gateway/dss.auth.token.refresh/v1","刷新token接口"),
     /**
      * 查询会员信息,根据手机号
      */
-    QUERY_MEMBER_INFO_BY_PHONE("POST", "/gw/gateway/wk.user.info.query/v1"),
+    QUERY_MEMBER_INFO_BY_PHONE("POST", "/gw/gateway/wk.user.info.query/v1","查询会员信息(根据手机号)接口"),
     /**
      * 查询会员信息,根据会员码
      */
-    QUERY_MEMBER_INFO_BY_CODE("POST", "/gw/gateway/wk.user.code.parsing/v1"),
+    QUERY_MEMBER_INFO_BY_CODE("POST", "/gw/gateway/wk.user.code.parsing/v1","查询会员信息(根据会员码)接口"),
     /**
      * 更新会员积分
      */
-    CHANGE_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.change/v1"),
+    CHANGE_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.change/v1","更新会员积分接口"),
     /**
      * 会员积分回退
      */
-    ROLLBACK_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.rollback/v1"),
+    ROLLBACK_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.rollback/v1","会员积分回退接口"),
     /**
      * 会员积分部分回退
      */
-    ROLLBACK_PART_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.rollback.part/v1"),
+    ROLLBACK_PART_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.rollback.part/v1","会员积分部分回退接口"),
     /**
      * 查询会员优惠券,不用对接
      */
-    QUERY_MEMBER_COUPON("GET", "/gateway/wk.coupon.user.list/v1"),
+    QUERY_MEMBER_COUPON("GET", "/gateway/wk.coupon.user.list/v1","查询会员优惠券接口"),
     /**
      * 会员消费订单同步接口
      */
-    MEMBER_ORDER_SYNC("POST", "/gateway/wk.user.order.add/v1"),
+    MEMBER_ORDER_SYNC("POST", "/gateway/wk.user.order.add/v1","会员消费订单同步接口"),
 
     ;
 
@@ -56,10 +56,15 @@ public enum HaiKongMemberSystemUrlEnum {
      * 请求地址
      */
     private final String url;
+    /**
+     * 请求名称
+     */
+    private final String methodName;
 
-    HaiKongMemberSystemUrlEnum(String method, String url) {
+    HaiKongMemberSystemUrlEnum(String method, String url, String methodName) {
         this.method = method;
         this.url = url;
+        this.methodName = methodName;
     }
 
     public String getMethod() {
@@ -69,4 +74,8 @@ public enum HaiKongMemberSystemUrlEnum {
     public String getUrl() {
         return url;
     }
+
+    public String getMethodName() {
+        return methodName;
+    }
 }

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

@@ -11,7 +11,7 @@ public enum HaiKongWareSystemUrlEnum {
     /**
      * 查询库存,多商品
      */
-    QUERY_INVENTORY("POST", ""),
+    QUERY_INVENTORY("POST", "","查询库存接口"),
     ;
 
 
@@ -24,10 +24,15 @@ public enum HaiKongWareSystemUrlEnum {
      * 请求地址
      */
     private final String url;
+    /**
+     * 请求名称
+     */
+    private final String methodName;
 
-    HaiKongWareSystemUrlEnum(String method, String url) {
+    HaiKongWareSystemUrlEnum(String method, String url, String methodName) {
         this.method = method;
         this.url = url;
+        this.methodName = methodName;
     }
 
     public String getMethod() {
@@ -37,4 +42,8 @@ public enum HaiKongWareSystemUrlEnum {
     public String getUrl() {
         return url;
     }
+
+    public String getMethodName() {
+        return methodName;
+    }
 }

+ 17 - 5
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/VmcconnectUrlEnum.java

@@ -1,5 +1,7 @@
 package com.kmall.admin.haikong.constant;
 
+import com.kmall.common.constant.Dict;
+
 /**
  * 免税mall接口方法名
  */
@@ -8,19 +10,19 @@ public enum VmcconnectUrlEnum {
     /**
      * 订单创建接口
      */
-    ORDERS_CREATE_ORDER("POST", "vmc.orders.create.order"),
+    ORDERS_CREATE_ORDER("POST", "vmc.orders.create.order","订单创建接口"),
     /**
      * 订单取消接口
      */
-    ORDERS_CANCEL_ORDER("POST", "vmc.orders.cancel.order"),
+    ORDERS_CANCEL_ORDER("POST", "vmc.orders.cancel.order","订单取消接口"),
     /**
      * 订单通关查询接口
      */
-    ORDERS_OUTER_STATUS("POST", "vmc.orders.read.outer_status"),
+    ORDERS_OUTER_STATUS("POST", "vmc.orders.read.outer_status","订单通关查询接口"),
     /**
      * 重试订单接口
      */
-    ORDERS_RETRY_ORDER("POST", "vmc.orders.retry.order"),
+    ORDERS_RETRY_ORDER("POST", "vmc.orders.retry.order","重试订单接口"),
     ;
 
 
@@ -32,10 +34,15 @@ public enum VmcconnectUrlEnum {
      * 请求地址
      */
     private final String method;
+    /**
+     * 请求名称
+     */
+    private final String methodName;
 
-    VmcconnectUrlEnum(String method, String mode) {
+    VmcconnectUrlEnum(String method, String mode,String methodName) {
         this.mode = mode;
         this.method = method;
+        this.methodName = methodName;
     }
 
     public String getMethod() {
@@ -45,4 +52,9 @@ public enum VmcconnectUrlEnum {
     public String getMode() {
         return mode;
     }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
 }

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

@@ -0,0 +1,215 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单主信息
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class OrderInfoDTO implements Serializable {
+
+    private static final long serialVersionUID = -1110285187874182199L;
+
+    @JsonProperty("outer_order_no")
+    private String outerOrderNo;
+
+    @JsonProperty("pay_app")
+    private String payApp;
+
+    /**
+     * 默认:SF
+     */
+    @JsonProperty("dlytype_code")
+    private String dlytypeCode;
+
+    @JsonProperty("consignee_name")
+    private String consigneeName;
+
+    @JsonProperty("consignee_area_province")
+    private String consigneeAreaProvince;
+
+    @JsonProperty("consignee_area_city")
+    private String consigneeAreaCity;
+
+    @JsonProperty("consignee_area_county")
+    private String consigneeAreaCounty;
+
+    @JsonProperty("consignee_address")
+    private String consigneeAddress;
+
+    @JsonProperty("consignee_zip")
+    private String consigneeZip;
+
+    @JsonProperty("consignee_tel")
+    private String consigneeTel;
+
+    @JsonProperty("consignee_email")
+    private String consigneeEmail;
+
+    @JsonProperty("consignee_mobile")
+    private String consigneeMobile;
+
+    private String weight;
+
+    private Integer quantity;
+
+    @JsonProperty("order_total")
+    private BigDecimal orderTotal;
+
+    private String platform;
+
+    public String getOuterOrderNo() {
+        return outerOrderNo;
+    }
+
+    public void setOuterOrderNo(String outerOrderNo) {
+        this.outerOrderNo = outerOrderNo;
+    }
+
+    public String getPayApp() {
+        return payApp;
+    }
+
+    public void setPayApp(String payApp) {
+        this.payApp = payApp;
+    }
+
+    public String getDlytypeCode() {
+        return dlytypeCode;
+    }
+
+    public void setDlytypeCode(String dlytypeCode) {
+        this.dlytypeCode = dlytypeCode;
+    }
+
+    public String getConsigneeName() {
+        return consigneeName;
+    }
+
+    public void setConsigneeName(String consigneeName) {
+        this.consigneeName = consigneeName;
+    }
+
+    public String getConsigneeAreaProvince() {
+        return consigneeAreaProvince;
+    }
+
+    public void setConsigneeAreaProvince(String consigneeAreaProvince) {
+        this.consigneeAreaProvince = consigneeAreaProvince;
+    }
+
+    public String getConsigneeAreaCity() {
+        return consigneeAreaCity;
+    }
+
+    public void setConsigneeAreaCity(String consigneeAreaCity) {
+        this.consigneeAreaCity = consigneeAreaCity;
+    }
+
+    public String getConsigneeAreaCounty() {
+        return consigneeAreaCounty;
+    }
+
+    public void setConsigneeAreaCounty(String consigneeAreaCounty) {
+        this.consigneeAreaCounty = consigneeAreaCounty;
+    }
+
+    public String getConsigneeAddress() {
+        return consigneeAddress;
+    }
+
+    public void setConsigneeAddress(String consigneeAddress) {
+        this.consigneeAddress = consigneeAddress;
+    }
+
+    public String getConsigneeZip() {
+        return consigneeZip;
+    }
+
+    public void setConsigneeZip(String consigneeZip) {
+        this.consigneeZip = consigneeZip;
+    }
+
+    public String getConsigneeTel() {
+        return consigneeTel;
+    }
+
+    public void setConsigneeTel(String consigneeTel) {
+        this.consigneeTel = consigneeTel;
+    }
+
+    public String getConsigneeEmail() {
+        return consigneeEmail;
+    }
+
+    public void setConsigneeEmail(String consigneeEmail) {
+        this.consigneeEmail = consigneeEmail;
+    }
+
+    public String getConsigneeMobile() {
+        return consigneeMobile;
+    }
+
+    public void setConsigneeMobile(String consigneeMobile) {
+        this.consigneeMobile = consigneeMobile;
+    }
+
+    public String getWeight() {
+        return weight;
+    }
+
+    public void setWeight(String weight) {
+        this.weight = weight;
+    }
+
+    public Integer getQuantity() {
+        return quantity;
+    }
+
+    public void setQuantity(Integer quantity) {
+        this.quantity = quantity;
+    }
+
+    public BigDecimal getOrderTotal() {
+        return orderTotal;
+    }
+
+    public void setOrderTotal(BigDecimal orderTotal) {
+        this.orderTotal = orderTotal;
+    }
+
+    public String getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderInfoDTO{" +
+                "outerOrderNo='" + outerOrderNo + '\'' +
+                ", payApp='" + payApp + '\'' +
+                ", dlytypeCode='" + dlytypeCode + '\'' +
+                ", consigneeName='" + consigneeName + '\'' +
+                ", consigneeAreaProvince='" + consigneeAreaProvince + '\'' +
+                ", consigneeAreaCity='" + consigneeAreaCity + '\'' +
+                ", consigneeAreaCounty='" + consigneeAreaCounty + '\'' +
+                ", consigneeAddress='" + consigneeAddress + '\'' +
+                ", consigneeZip='" + consigneeZip + '\'' +
+                ", consigneeTel='" + consigneeTel + '\'' +
+                ", consigneeEmail='" + consigneeEmail + '\'' +
+                ", consigneeMobile='" + consigneeMobile + '\'' +
+                ", weight='" + weight + '\'' +
+                ", quantity='" + quantity + '\'' +
+                ", orderTotal=" + orderTotal +
+                ", platform='" + platform + '\'' +
+                '}';
+    }
+}

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

@@ -0,0 +1,158 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单明细信息
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class OrderInfoItemDTO implements Serializable {
+
+    private static final long serialVersionUID = -5010285187879982199L;
+
+    @JsonProperty("order_id")
+    private String orderId;
+
+    @JsonProperty("image_url")
+    private String imageUrl;
+
+    private String bn;
+
+    private String barcode;
+
+    private String name;
+
+    private BigDecimal cost;
+
+    private BigDecimal price;
+
+    private String itemcode;
+
+    private BigDecimal amount;
+
+    private Integer nums;
+
+    @JsonProperty("is_tax")
+    private Boolean tax;
+
+    @JsonProperty("tax_price")
+    private BigDecimal taxPrice;
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getImageUrl() {
+        return imageUrl;
+    }
+
+    public void setImageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    public String getBn() {
+        return bn;
+    }
+
+    public void setBn(String bn) {
+        this.bn = bn;
+    }
+
+    public String getBarcode() {
+        return barcode;
+    }
+
+    public void setBarcode(String barcode) {
+        this.barcode = barcode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public BigDecimal getCost() {
+        return cost;
+    }
+
+    public void setCost(BigDecimal cost) {
+        this.cost = cost;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    public String getItemcode() {
+        return itemcode;
+    }
+
+    public void setItemcode(String itemcode) {
+        this.itemcode = itemcode;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Integer getNums() {
+        return nums;
+    }
+
+    public void setNums(Integer nums) {
+        this.nums = nums;
+    }
+
+    public Boolean getTax() {
+        return tax;
+    }
+
+    public void setTax(Boolean tax) {
+        this.tax = tax;
+    }
+
+    public BigDecimal getTaxPrice() {
+        return taxPrice;
+    }
+
+    public void setTaxPrice(BigDecimal taxPrice) {
+        this.taxPrice = taxPrice;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderInfoItemDTO{" +
+                "orderId='" + orderId + '\'' +
+                ", imageUrl='" + imageUrl + '\'' +
+                ", bn='" + bn + '\'' +
+                ", barcode='" + barcode + '\'' +
+                ", name='" + name + '\'' +
+                ", cost=" + cost +
+                ", price=" + price +
+                ", itemcode='" + itemcode + '\'' +
+                ", amount=" + amount +
+                ", nums=" + nums +
+                ", tax=" + tax +
+                ", taxPrice=" + taxPrice +
+                '}';
+    }
+}

+ 32 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/OrderProductInfoDTO.java

@@ -0,0 +1,32 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class OrderProductInfoDTO {
+
+    @JsonProperty("product_id")
+    private String productId;
+
+    @JsonProperty("goods_id")
+    private String goodsId;
+
+    public String getProductId() {
+        return productId;
+    }
+
+    public void setProductId(String productId) {
+        this.productId = productId;
+    }
+
+    public String getGoodsId() {
+        return goodsId;
+    }
+
+    public void setGoodsId(String goodsId) {
+        this.goodsId = goodsId;
+    }
+}

+ 82 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/PayInfoDTO.java

@@ -0,0 +1,82 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单支付信息
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class PayInfoDTO implements Serializable {
+
+    private static final long serialVersionUID = -5010666187874182199L;
+
+    private BigDecimal money;
+
+    /**
+     * 默认线下支付:offline
+     */
+    @JsonProperty("pay_mode")
+    private String payMode;
+
+    private String request;
+
+    private String response;
+
+    @JsonProperty("out_trade_no")
+    private String outTradeNo;
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public String getPayMode() {
+        return payMode;
+    }
+
+    public void setPayMode(String payMode) {
+        this.payMode = payMode;
+    }
+
+    public String getRequest() {
+        return request;
+    }
+
+    public void setRequest(String request) {
+        this.request = request;
+    }
+
+    public String getResponse() {
+        return response;
+    }
+
+    public void setResponse(String response) {
+        this.response = response;
+    }
+
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    @Override
+    public String toString() {
+        return "PayInfoDTO{" +
+                "money=" + money +
+                ", payMode='" + payMode + '\'' +
+                ", request='" + request + '\'' +
+                ", response='" + response + '\'' +
+                ", outTradeNo='" + outTradeNo + '\'' +
+                '}';
+    }
+}

+ 96 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/SeaportInfoDTO.java

@@ -0,0 +1,96 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 跨境信息
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class SeaportInfoDTO implements Serializable {
+
+    private static final long serialVersionUID = -5010285187875875199L;
+
+    /**
+     * 口岸代码:默认珠海海关口岸代码
+     */
+    @JsonProperty("seaport_code")
+    private String seaportCode;
+
+    private String platform;
+
+    @JsonProperty("identity_card")
+    private String identityCard;
+
+    @JsonProperty("identity_name")
+    private String identityName;
+
+    @JsonProperty("identity_mobile")
+    private String identityMobile;
+
+    @JsonProperty("order_product_info")
+    private List<OrderProductInfoDTO> orderProductInfoList;
+
+    public String getSeaportCode() {
+        return seaportCode;
+    }
+
+    public void setSeaportCode(String seaportCode) {
+        this.seaportCode = seaportCode;
+    }
+
+    public String getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
+    public String getIdentityCard() {
+        return identityCard;
+    }
+
+    public void setIdentityCard(String identityCard) {
+        this.identityCard = identityCard;
+    }
+
+    public String getIdentityName() {
+        return identityName;
+    }
+
+    public void setIdentityName(String identityName) {
+        this.identityName = identityName;
+    }
+
+    public String getIdentityMobile() {
+        return identityMobile;
+    }
+
+    public void setIdentityMobile(String identityMobile) {
+        this.identityMobile = identityMobile;
+    }
+
+    public List<OrderProductInfoDTO> getOrderProductInfoList() {
+        return orderProductInfoList;
+    }
+
+    public void setOrderProductInfoList(List<OrderProductInfoDTO> orderProductInfoList) {
+        this.orderProductInfoList = orderProductInfoList;
+    }
+
+    @Override
+    public String toString() {
+        return "SeaportInfoDTO{" +
+                "seaportCode='" + seaportCode + '\'' +
+                ", platform='" + platform + '\'' +
+                ", identityCard='" + identityCard + '\'' +
+                ", identityName='" + identityName + '\'' +
+                ", identityMobile='" + identityMobile + '\'' +
+                ", orderProductInfoList=" + orderProductInfoList +
+                '}';
+    }
+}

+ 71 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/dto/SendOrderToVmcShopDTO.java

@@ -0,0 +1,71 @@
+package com.kmall.admin.haikong.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 免税mall创建订单
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class SendOrderToVmcShopDTO implements Serializable {
+
+    private static final long serialVersionUID = -5010285187874182199L;
+
+    @JsonProperty("orderinfo")
+    private OrderInfoDTO orderInfo;
+
+    @JsonProperty("order_items")
+    private List<OrderInfoItemDTO> orderInfoItems;
+
+    @JsonProperty("payinfo")
+    private PayInfoDTO payInfo;
+
+    @JsonProperty("seaport_info")
+    private SeaportInfoDTO seaportInfo;
+
+    public OrderInfoDTO getOrderInfo() {
+        return orderInfo;
+    }
+
+    public void setOrderInfo(OrderInfoDTO orderInfo) {
+        this.orderInfo = orderInfo;
+    }
+
+    public List<OrderInfoItemDTO> getOrderInfoItems() {
+        return orderInfoItems;
+    }
+
+    public void setOrderInfoItems(List<OrderInfoItemDTO> orderInfoItems) {
+        this.orderInfoItems = orderInfoItems;
+    }
+
+    public PayInfoDTO getPayInfo() {
+        return payInfo;
+    }
+
+    public void setPayInfo(PayInfoDTO payInfo) {
+        this.payInfo = payInfo;
+    }
+
+    public SeaportInfoDTO getSeaportInfo() {
+        return seaportInfo;
+    }
+
+    public void setSeaportInfo(SeaportInfoDTO seaportInfo) {
+        this.seaportInfo = seaportInfo;
+    }
+
+    @Override
+    public String toString() {
+        return "SendOrderToVmcShopDTO{" +
+                "orderInfo=" + orderInfo +
+                ", orderInfoItems=" + orderInfoItems +
+                ", payInfo=" + payInfo +
+                ", seaportInfo=" + seaportInfo +
+                '}';
+    }
+}

+ 38 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/R.java

@@ -0,0 +1,38 @@
+package com.kmall.admin.haikong.utils;
+
+/**
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class R<T> {
+
+    private int code;
+
+    private String result;
+
+    private T data;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+}

+ 73 - 0
kmall-admin/src/main/java/com/kmall/admin/service/InterfaceSendLogService.java

@@ -0,0 +1,73 @@
+package com.kmall.admin.service;
+
+
+import com.kmall.admin.entity.InterfaceSendLogEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 接口日志记录Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-03 16:41:35
+ */
+public interface InterfaceSendLogService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    InterfaceSendLogEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<InterfaceSendLogEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param interfaceSendLog 实体
+     * @return 保存条数
+     */
+    int save(InterfaceSendLogEntity interfaceSendLog);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param interfaceSendLog 实体
+     * @return 更新条数
+     */
+    int update(InterfaceSendLogEntity interfaceSendLog);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[]ids);
+}

+ 2 - 1
kmall-admin/src/main/java/com/kmall/admin/service/OrderProcessRecordService.java

@@ -4,6 +4,7 @@ package com.kmall.admin.service;
 import com.kmall.admin.entity.OrderProcessRecordEntity;
 import com.kmall.admin.entity.OrderProcessRecordHkNewEntity;
 import com.kmall.admin.haikong.utils.Message;
+import com.kmall.admin.haikong.utils.OutRequestMessage;
 
 import java.util.List;
 import java.util.Map;
@@ -82,5 +83,5 @@ public interface OrderProcessRecordService {
      * @param orderProcessRecordList
      * @return
      */
-    Message saveHkNoticeMsg(List<OrderProcessRecordHkNewEntity> orderProcessRecordList);
+    Message saveHkNoticeMsg(List<OrderProcessRecordHkNewEntity> orderProcessRecordList,OutRequestMessage outRequestMessage) throws Exception;
 }

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

@@ -152,14 +152,6 @@ public interface OrderService {
     int queryOrderListByRecognitionTotal(Map<String, Object> map);
 
     /**
-     * 海控,提交订单并付款
-     * @param param     收银端提交的参数
-     * @param user      当前收银端用户
-     * @return          结果
-     */
-    Map offlineRetailSubmitHaiKong(Map param, SysUserEntity user);
-
-    /**
      * 提交订单并付款
      * @param param
      * @param user

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

@@ -76,4 +76,6 @@ public interface PickUpCodeService {
      * @return
      */
     public String queryPickUpCodeStatus(String orderSn);
+
+    void updatePickUpCodeStatusByOrderSn(String orderSn, String pickUpCodeStatus);
 }

+ 3 - 0
kmall-admin/src/main/java/com/kmall/admin/service/StoreService.java

@@ -3,6 +3,7 @@ package com.kmall.admin.service;
 import com.kmall.admin.dto.StoreDto;
 import com.kmall.admin.dto.StoreIdDto;
 import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.SysMacroEntity;
 
 import java.util.List;
 import java.util.Map;
@@ -89,4 +90,6 @@ public interface StoreService {
      * @return
      */
     List<StoreEntity> queryStoreByAll();
+
+    List<SysMacroEntity> queryListDictionary();
 }

+ 68 - 274
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -14,6 +14,10 @@ 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.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.vo.QueryGoodsVO;
 import com.kmall.admin.service.*;
 import com.kmall.admin.service.kmall2eccs.KtoEccsService;
@@ -24,10 +28,13 @@ import com.kmall.admin.service.shop.ShopErrorPriceRecordService;
 import com.kmall.admin.utils.CalculateTax;
 import com.kmall.admin.utils.GoodsUtils;
 import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.admin.utils.jackson.JacksonUtil;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
 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.redis.JedisCacheManager;
 import com.kmall.manager.manager.redis.JedisUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1749,7 +1756,7 @@ public class GoodsServiceImpl implements GoodsService {
      */
     @Override
     @Transactional
-    public Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId,String sku) {
+    public synchronized Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId, String sku) {
         /**
          * 1.首先根据商品条码跟门店id查询是否有库存,没库存直接返回
          */
@@ -1762,38 +1769,68 @@ public class GoodsServiceImpl implements GoodsService {
         * 2. 查询海仓仓库系统,判断库存是否足够
         * TODO 测试的时候注释,海控仓库系统没有测试环境,上生产时放开注释
         * */
-        /*WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
-        List<Criteria> criteriaList = new ArrayList<>();
-        Criteria criteria = new Criteria();
-        criteria.setItemId(goods.getProdBarcode());
-        criteria.setItemCode(goods.getSku());
-        criteriaList.add(criteria);
-        wareQueryStockParamDTO.setCriteriaList(criteriaList);
-        String queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
-        log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
-        if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
-            log.error("调用库存系统接口出现错误!返回结果为空!");
-            throw new ServiceException("调用库存系统接口出现错误!");
-        }
-        WareQueryStockResponseDTO wareQueryStockResponseDTO = JacksonUtil.fromStringJson(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
-        if (Objects.isNull(wareQueryStockResponseDTO)) {
-            log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
-            throw new ServiceException("解析一步达库存系统响应数据出现错误!");
-        }
-        // 校验库存
-        WareQueryStockResponseDTO.WareQueryStockResponseItemDTO itemDTO = wareQueryStockResponseDTO.getItems().get(0);
-        // 仓库可用库存
-        int wareQuantity = itemDTO.getQuantity() - itemDTO.getLockQuantity();
-        // 海控展销店出区数
+        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();
-        // 扫码只会扫一件商品,保税仓库存 + 展销店库存 - 出区数 >= 购买数
-        if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) >= 1)) {
+        Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
+        if (org.springframework.util.StringUtils.isEmpty(redisCacheWareQuantity)) {
+
+//            WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
+//            List<Criteria> criteriaList = new ArrayList<>();
+//            Criteria criteria = new Criteria();
+//            criteria.setItemId(goods.getProdBarcode());
+//            criteria.setItemCode(goods.getSku());
+//            criteriaList.add(criteria);
+//            wareQueryStockParamDTO.setCriteriaList(criteriaList);
+//            String queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
+//            log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
+//            if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
+//                log.error("调用库存系统接口出现错误!返回结果为空!");
+//                throw new ServiceException("调用库存系统接口出现错误!");
+//            }
+//            WareQueryStockResponseDTO wareQueryStockResponseDTO = JacksonUtil.fromStringJson(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
+
+            /* -----------------↓--------------测试数据,生产请注释-------------------↓------------ */
+            WareQueryStockResponseDTO 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);
+            /* -----------------↑--------------测试数据,生产请注释------------------↑------------- */
+
+
+            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:【{}】,门店ID:【{}】,该商品库存不足!", prodBarcode, sku, storeId);
-            throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店ID:【%s】,该商品库存不足!", prodBarcode, sku, storeId));
-        }*/
+            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));
+        }
+
         goods.setDiscountedPrice(new BigDecimal(0));
         BigDecimal retailPrice = goods.getRetailPrice();
 
@@ -1801,252 +1838,9 @@ public class GoodsServiceImpl implements GoodsService {
 
         Map<String,Object> skuActivitiesMap = new HashMap<>();
 
-//        /**
-//         * 2.查询当前时间,该门店是否有活动,如果有活动,查询开启了哪些营销方式
-//         * 参数: 当前时间  门店id
-//         */
-//        /*List<MkActivitiesEntity> mkActivitiesEntityList = mkActivitiesService.queryByNow(storeId,format.format(new Date()));
-//
-//        if(mkActivitiesEntityList == null || mkActivitiesEntityList.size() == 0){
-//            // 计算税费
-//            GoodsEntity goodsEntity = goodsDao.queryByBarcodeAndSku(prodBarcode, goods.getGoodsSn());
-//            BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity,goods.getActualPaymentAmount(),this).setScale(3,RoundingMode.HALF_UP);
-//            goods.setGoodstaxes(tax.toString());
-//            skuActivitiesMap.put("goods",goods);
-//            return skuActivitiesMap;
-//        }
-//
-//
-//
-//        // 遍历活动集合,查询有哪些活动是开启的
-//        boolean daily = false,coupon = false,combinationPrice = false
-//                ,discount = false,fullGift = false,fullReduction = false
-//                ,getOneFree = false,promotion = false,halfPrice = false;
-//
-//        List<String> topicList = new ArrayList<>(); // 记录有哪些营销活动的topic
-//        Map<String,String> mkaIdMap = new HashMap<>(); // 记录topic跟mkaId的关系
-//        // 将所有的营销活动新增到list中
-//        for(MkActivitiesEntity mkActivitiesEntity : mkActivitiesEntityList){
-//            topicList.add(mkActivitiesEntity.getMkaTopic());
-//            String mkaId = mkaIdMap.putIfAbsent(mkActivitiesEntity.getMkaTopic(), mkActivitiesEntity.getMkaId()+"");
-//            if(StringUtils.isNotEmpty(mkaId)){
-////                mkaId = "'"+mkaId + "','" + mkActivitiesEntity.getMkaId()+"'";
-//                mkaId += String.format(",%s",mkActivitiesEntity.getMkaId());
-//                mkaIdMap.put(mkActivitiesEntity.getMkaTopic(),mkaId);
-//            }
-//        }
-//        // 判断有哪些营销活动
-//        if(topicList.contains("zhjsp")) // 组合价
-//            combinationPrice = true;
-//        if(topicList.contains("dz")) // 打折
-//            discount = true;
-//        if(topicList.contains("mz")) //满赠
-//            fullGift = true;
-//        if(topicList.contains("mj"))  // 满减
-//            fullReduction = true;
-//        if(topicList.contains("mysy")) // 买一送一
-//            getOneFree = true;
-//        if(topicList.contains("rchd")) // 日常活动
-//            daily = true;
-//        if(topicList.contains("yhq")) // 优惠券
-//            coupon = true;
-//        if(topicList.contains("lscx")) // 临时促销
-//            promotion = true;
-//        if(topicList.contains("drjbj"))
-//            halfPrice = true;
-//
-//
-//        // 获取未优惠前的商品价格
-//        retailPrice = goods.getRetailPrice();
-//
-//
-//        // 根据条码查询商品品牌名称 mall_brand  mall_product_store_rela  mall_goods
-//        String brandName = goods.getBrand();
-//
-//        *//**
-//         * 优先级:临时促销 》买一送一=满赠 》 组合价=日常活动 》 打折=满减 》 优惠券
-//         *//*
-//
-//        *//**
-//         * 组合价的做法就是将参与组合的条码带到收银端
-//         * 现根据营销活动id跟条形码,查询有哪些参与该条码组合的商品
-//         *
-//         *
-//         * TODO
-//         *//*
-//        if(combinationPrice){
-//            String mkaId = mkaIdMap.get("zhjsp");
-//            Map<String,Object> param = new HashMap<>();
-//            param.put("mkaId",mkaId);
-//            param.put("prodBarcode",prodBarcode);
-//            List<MkActivitiesCombinationPriceEntity> combinationPriceList = combinationPriceService.queryList(param);
-//            if(combinationPriceList != null && combinationPriceList.size() > 0) {
-//                Map<String, List<MkActivitiesCombinationPriceEntity>> collect =
-//                        combinationPriceList.stream().collect(Collectors.groupingBy(MkActivitiesCombinationPriceEntity::getCombinationType));
-//
-//                skuActivitiesMap.put("zhjsp",collect);
-//            }
-//        }
-//
-//
-//
-//        format = new SimpleDateFormat("yyyy-MM-dd");
-//        String nowTime = format.format(new Date());
-//        *//**
-//         * 满减可能是跟着条码,也可能跟着品牌
-//         * 根据商品品牌跟商品条码去查询是否有优惠金额
-//         *
-//         * 满足金额   购买商品条码   赠品条码
-//         *
-//         *//*
-//        Map<String,Object> fullReductionMap = new HashMap<>();
-//        if(fullReduction){
-//            String mkaId = mkaIdMap.get("mj");
-//            MkActivitiesFullReductionEntity fullReductionEntity = fullReductionService.queryByCodeOrBrand(mkaId,prodBarcode,brandName,nowTime);
-//            if(fullReductionEntity != null) {
-//                if(!StringUtils.isNullOrEmpty(fullReductionEntity.getProductBrand())){
-//                    // 跟着品牌走
-//                    fullReductionMap.put(brandName,fullReductionEntity);
-//                }else{
-//                    // 跟着条码走
-//                    fullReductionMap.put(fullReductionEntity.getBarcode(), fullReductionEntity);
-//                }
-//                skuActivitiesMap.put("mj",fullReductionMap);
-//            }
-//        }
-//
-//        *//**
-//         * 满赠可能是跟着条码,也可能跟着品牌
-//         * 根据商品品牌跟商品条码去查询是否有满赠
-//         * 1.先扫买的商品,然后查询出赠送的商品条码
-//         * 2.先扫赠的商品,然后查询出符合条件的商品条码或者品牌
-//         * 满足的金额   购买的商品条码或者品牌   赠送的商品条码
-//         * TODO
-//         *//*
-//        Map<String,Object> fullGiftMap = new HashMap<>();
-//        if(fullGift){
-//            String mkaId = mkaIdMap.get("mz");
-//            MkActivitiesFullGiftEntity giftEntity = fullGiftService.queryByCodeOrBrand(mkaId,prodBarcode,brandName,nowTime);
-//            if(giftEntity != null) {
-//                if(giftEntity.getProductBrand() != null){
-//                    // 跟着品牌走
-//                    fullGiftMap.put(brandName,giftEntity);
-//                }else{
-//                    // 跟着条码走
-//                    fullGiftMap.put(giftEntity.getBarcode(), giftEntity);
-//                }
-//                skuActivitiesMap.put("mz",fullGiftMap);
-//            }
-//        }
-//
-//        *//**
-//         * 买一送一可能是跟着条码,也可能跟着品牌
-//         * 根据商品品牌跟商品条码去查询是否有送的商品
-//         * 有两个场景
-//         * 1.先扫买的商品,然后查询出赠送的商品条码
-//         * 2.先扫赠的商品,然后查询出符合条件的商品条码或者品牌
-//         * 所以就需要一个map
-//         * key为购买的商品条码或者商品品牌  value为赠送的商品条码
-//         * 但是品牌是根据条码查询的,所以最终map里面的结构是
-//         * key 商品条码 value 赠品条码
-//         *//*
-//        if(getOneFree){
-//            String mkaId = mkaIdMap.get("mysy");
-//            MkActivitiesGetOneFreeGoodsEntity getOneFreeGoodsEntity = getOneFreeGoodsService.queryByCodeOrBrand(mkaId,prodBarcode,brandName);
-//            if(getOneFreeGoodsEntity != null){
-//                if("无".equals(getOneFreeGoodsEntity.getProductBrand())){
-//                    getOneFreeGoodsEntity.setBrand(false);
-//                    skuActivitiesMap.put("mysy",getOneFreeGoodsEntity);
-//                }else{
-//                    getOneFreeGoodsEntity.setBrand(true);
-//                    skuActivitiesMap.put("mysy",getOneFreeGoodsEntity);
-//                }
-//
-//            }
-//        }
-//
-//
-//        // 第二份半价
-//        if(halfPrice){
-//            String mkaId = mkaIdMap.get("drjbj");
-//            MkActivitiesHalfPriceEntity activitiesHalfPriceEntity = halfPriceService.queryByCodeOrBrand(mkaId,prodBarcode);
-//            if(activitiesHalfPriceEntity != null){
-//                skuActivitiesMap.put("drjbj",activitiesHalfPriceEntity);
-//
-//            }
-//
-//        }
-//
-//
-//        // --------------------------------------------------------------------------------------
-//
-//        *//**
-//         * 优惠券跟着条形码走,一般是设置一个标识,然后最后输入优惠券码后,减扣对应的标识,所以返回一个map数组
-//         *//*
-//
-//        if(coupon){
-//            String mkaId = mkaIdMap.get("yhq");
-//            MkActivitiesCouponEntity couponEntity =  couponService.queryByBarCode(mkaId,prodBarcode,nowTime);
-//            if(couponEntity != null){ // 优惠券码,优惠金额
-//                Map<String,Object> returnMap = new HashMap<>();
-//                returnMap.put(couponEntity.getCouponSn() , couponEntity.getCouponPrice());
-//                skuActivitiesMap.put("yhq",returnMap);
-//            }
-//        }
-//
-//
-//        *//**
-//         * 打折的价格是与条形码对应的,所以需要根据条形码和营销方式id去查询活动价格
-//         *//*
-//
-//        if(discount){
-//            String mkaId = mkaIdMap.get("dz");
-//            MkActivitiesDiscountEntity discountEntity =  discountService.queryByBarCode(mkaId,prodBarcode);
-//            // TODO 可能会直接替代产品价格
-//            if (discountEntity != null) {
-//                goods.setActualPaymentAmount(discountEntity.getActivityPrice());
-//                goods.setRetailPrice(discountEntity.getActivityPrice());
-//
-//                goods.setActivity("打折");
-//            }
-//        }
-//
-//
-//        *//**
-//         * 日常活动跟着条形码走,优先级比临时促销低,但是高于正常价格
-//         *//*
-//        if(daily){
-//            String mkaId = mkaIdMap.get("rchd");
-//            MkDailyActivitiesEntity dailyActivitiesEntity = dailyActivitiesService.queryByBarCode(mkaId,prodBarcode);
-//            if(dailyActivitiesEntity != null){
-//                goods.setActualPaymentAmount(dailyActivitiesEntity.getActivityPrice());
-//                goods.setRetailPrice(dailyActivitiesEntity.getActivityPrice());
-//
-//                goods.setActivity("日常活动");
-//
-//            }
-//        }
-//
-//
-//        *//**
-//         * 临时促销跟着条形码走,优先级应该最高,所以排到了最下面
-//         *//*
-//        if(promotion){
-//            String mkaId = mkaIdMap.get("lscx");
-//            MkActivitiesPromotionEntity promotionEntity = promotionService.queryByBarCode(mkaId,prodBarcode);
-//            // 如果该商品存在临时促销,直接替换活动价格
-//            if(promotionEntity != null){
-//                goods.setActualPaymentAmount(promotionEntity.getActivityPrice());
-//                goods.setRetailPrice(promotionEntity.getActivityPrice());
-//
-//                goods.setActivity("临时促销");
-//
-//            }
-//        }*/
-
         // 计算税费
         GoodsEntity goodsEntity = goodsDao.queryByBarcodeAndSku(prodBarcode, goods.getGoodsSn());
-        BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity,goods.getActualPaymentAmount(),this).setScale(3,RoundingMode.HALF_UP);
+        BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goods.getActualPaymentAmount(),this).setScale(3,RoundingMode.HALF_UP);
         goods.setGoodstaxes(tax.toString());
         goods.setSellVolume(1);
 

+ 59 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/InterfaceSendLogServiceImpl.java

@@ -0,0 +1,59 @@
+package com.kmall.admin.service.impl;
+
+import com.kmall.admin.dao.InterfaceSendLogDao;
+import com.kmall.admin.entity.InterfaceSendLogEntity;
+import com.kmall.admin.service.InterfaceSendLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 接口日志记录Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-03 16:41:35
+ */
+@Service("interfaceSendLogService")
+public class InterfaceSendLogServiceImpl implements InterfaceSendLogService {
+    @Autowired
+    private InterfaceSendLogDao interfaceSendLogDao;
+
+    @Override
+    public InterfaceSendLogEntity queryObject(Integer id) {
+        return interfaceSendLogDao.queryObject(id);
+    }
+
+    @Override
+    public List<InterfaceSendLogEntity> queryList(Map<String, Object> map) {
+        return interfaceSendLogDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return interfaceSendLogDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(InterfaceSendLogEntity interfaceSendLog) {
+        return interfaceSendLogDao.save(interfaceSendLog);
+    }
+
+    @Override
+    public int update(InterfaceSendLogEntity interfaceSendLog) {
+        return interfaceSendLogDao.update(interfaceSendLog);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return interfaceSendLogDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return interfaceSendLogDao.deleteBatch(ids);
+    }
+}

+ 29 - 24
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderProcessRecordServiceImpl.java

@@ -1,19 +1,19 @@
 package com.kmall.admin.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.kmall.admin.dao.MallVmcSendLogDao;
-import com.kmall.admin.dao.OrderDao;
-import com.kmall.admin.dao.OrderProcessRecordDao;
-import com.kmall.admin.dao.StoreSmsConfigDao;
+import com.kmall.admin.dao.*;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.haikong.utils.Message;
+import com.kmall.admin.haikong.utils.OutRequestMessage;
 import com.kmall.admin.service.OrderProcessRecordService;
 import com.kmall.admin.service.PickUpCodeService;
 import com.kmall.api.util.SendMsgUtil;
+import com.kmall.common.constant.Dict;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -44,8 +44,12 @@ public class OrderProcessRecordServiceImpl implements OrderProcessRecordService
      * 免税mall日志记录
      */
     @Autowired
-    private MallVmcSendLogDao mallVmcSendLogDao;
-
+    private InterfaceSendLogDao interfaceSendLogDao;
+    /**
+     * 更新订单清关状态
+     */
+    @Autowired
+    private PickUpCodeDao pickUpCodeDao;
 
 
     @Override
@@ -166,34 +170,35 @@ public class OrderProcessRecordServiceImpl implements OrderProcessRecordService
      * @return
      */
     @Override
-    public Message saveHkNoticeMsg(List<OrderProcessRecordHkNewEntity> orderProcessRecordList) {
-       try{
-           saveVmcSend("hkNotice","hkNotice",JSON.toJSONString(orderProcessRecordList),"免税MALL通知回调接口");
+    @Transactional
+    public Message saveHkNoticeMsg(List<OrderProcessRecordHkNewEntity> orderProcessRecordList, OutRequestMessage outRequestMessage) throws Exception{
+           Date dateTime = new Date();
            Integer count = orderProcessRecordDao.queryHkOrderTotal(orderProcessRecordList);
            if(orderProcessRecordList.size()!=count){
                return Message.error("订单不存在");
            }else{
                orderProcessRecordDao.updateHkNoticeMsg(orderProcessRecordList);
+               orderProcessRecordDao.updateHkNoticeMsgMallOrder(orderProcessRecordList);
+               pickUpCodeDao.updateHkNoticeMsgPickUpCode(orderProcessRecordList);
            }
-       }catch (Exception e){
-           logger.error("saveHkNoticeMsg---海控通知回调接口插入错误="+ JSON.toJSONString(orderProcessRecordList),e);
-           return Message.error("参数错误");
-       }
-        return Message.success(true,"成功");
+
+           saveVmcSend(dateTime, Dict.sendLog.item_mall.getItemName(),"免税MALL通知回调接口",JSON.toJSONString(orderProcessRecordList),JSON.toJSONString(outRequestMessage));
+           return Message.success(true,"成功");
     }
 
     /**
-     * 记录免税Mall通知日志
-     * @param orderSn
-     * @param requestMsg
+     * 记录免税Mall日志发送至KMALL门店端
+     * @param request
      * @param response
      */
-    private void saveVmcSend(String orderSn,String urlType,String requestMsg,String response){
-        MallVmcSendlogEntity mallVmcSendlogEntity = new MallVmcSendlogEntity();
-        mallVmcSendlogEntity.setOrderSn(orderSn);
-        mallVmcSendlogEntity.setVmcType(urlType);
-        mallVmcSendlogEntity.setRequestMsg(requestMsg);
-        mallVmcSendlogEntity.setResponseMsg(response);
-        mallVmcSendLogDao.saveVmcSend(mallVmcSendlogEntity);
+    private void saveVmcSend(Date date,String sendLog,String urlType,String request,String response){
+        InterfaceSendLogEntity interfaceSendLogEntity = new InterfaceSendLogEntity();
+        interfaceSendLogEntity.setRequestDate(date);
+        interfaceSendLogEntity.setSysType(sendLog);
+        interfaceSendLogEntity.setInterfaceType(urlType);
+        interfaceSendLogEntity.setRequestMsg(request);
+        interfaceSendLogEntity.setResponseMsg(response);
+        interfaceSendLogEntity.setResponseDate(new Date());
+        interfaceSendLogDao.save(interfaceSendLogEntity);
     }
 }

+ 165 - 337
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -76,6 +76,7 @@ import com.kmall.common.utils.wechat.WechatReverseApiResult;
 import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
 import com.kmall.manager.manager.alipay.AliPayRequestParams;
 import com.kmall.manager.manager.alipay.AliPayUtil;
+import com.kmall.manager.manager.dto.PayOriginInfoDTO;
 import com.kmall.manager.manager.express.kdn.KdniaoUtil;
 import com.kmall.manager.manager.express.sf.ServiceException;
 import com.kmall.manager.manager.express.sf.entity.RouteEntity;
@@ -252,10 +253,10 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private MkActivitiesPromotionService mkActivitiesPromotionService;
     /**
-     * 免税mall日志记录
+     * 日志记录
      */
     @Autowired
-    private MallVmcSendLogDao mallVmcSendLogDao;
+    private InterfaceSendLogDao interfaceSendLogDao;
 
     /**
      * 同步订单消费信息,重发业务
@@ -585,7 +586,7 @@ public class OrderServiceImpl implements OrderService {
         String orderSn = orderEntity.getOrderSn();
         PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(orderSn);
         if (pickUpCodeEntity != null) {
-            pickUpCodeEntity.setPickUpCodeStatus("1");
+            pickUpCodeEntity.setPickUpCodeStatus(Dict.PickUpCodeStatusEnum.item_1.getStatus());
             pickUpCodeService.update(pickUpCodeEntity);
         }
         TicketMailInfo mailInfo = new TicketMailInfo();
@@ -601,11 +602,12 @@ public class OrderServiceImpl implements OrderService {
             mailInfo.setExprNoBase64Img(exprNoBase64Img);
 
             mailInfo.setExprNo(exprNo);
-            String logoUrl = "/statics/img/yto_logo.jpg";
+            String logoUrl = "/statics/img/sf_img.jpg";
 
             Map<String, String> logoMap = new HashMap<>();
             logoMap.put("yto", "/statics/img/yto_logo.jpg");
             logoMap.put("best", "/statics/img/bestex_logo3.png");
+            logoMap.put("sf", "/statics/img/sf_img.jpg");
             if (StringUtils.isNotEmpty(orderEntity.getShippingCode()) && logoMap.containsKey(orderEntity.getShippingCode())) {
                 logoUrl = logoMap.get(orderEntity.getShippingCode());
             }
@@ -615,7 +617,7 @@ public class OrderServiceImpl implements OrderService {
         AddressEntity addressEntity = addressDao.queryStoreAddress(storeEntity.getId(),Dict.addressStatus.item_1.getItem());
         // 发货人
         mailInfo.setSenderTel(addressEntity.getTelNumber());
-        mailInfo.setSenderName("CW澳洲大药房1");
+        mailInfo.setSenderName(addressEntity.getSenderName());
         mailInfo.setSenderProvince(addressEntity.getProvinceName());
         mailInfo.setSenderCity(addressEntity.getCityName());
         mailInfo.setSenderDistrict(addressEntity.getCountyName());
@@ -2087,297 +2089,6 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * 海控,提交订单并付款
-     * @param param     收银端提交的参数
-     * @param user      当前收银端用户
-     * @return          结果
-     */
-    @Override
-    @Transactional
-    @Deprecated
-    public synchronized Map offlineRetailSubmitHaiKong(Map param, SysUserEntity user) {
-        /*// 解析订单数据 List
-        List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList");
-        // 解析用户信息 LinkedHashMap
-        Map userInfo = (Map) param.get("userInfo");
-        // 解析支付码 String
-        String parCode = (String) param.get("payCode");
-        // 解析sessionId(WebSocket) String
-        String sessionId = (String) param.get("sessionId");
-        // machineCode
-        String machineCode = (String) param.get("machineCode");
-        //选择的方式  1柜取 0邮寄
-        int status = Integer.parseInt(param.get("status").toString());
-        // 会员码
-        String couponBarCode = param.get("couponBarCode").toString();
-
-        Map<String, String> mapAddr = new HashMap<>();
-        if (status == 0) {
-            //省
-            String cmbProvince = (String) param.get("cmbProvince");
-            //市
-            String cmbCity = (String) param.get("cmbCity");
-            //区
-            String cmbArea = (String) param.get("cmbArea");
-            //详细地址
-            String addrUser = (String) param.get("addrUser");
-
-            mapAddr.put("cmbProvince", cmbProvince);
-            mapAddr.put("cmbCity", cmbCity);
-            mapAddr.put("cmbArea", cmbArea);
-            mapAddr.put("addrUser", addrUser);
-        }
-
-        try {
-            machineCode = URLDecoder.decode(machineCode, "UTF-8");
-        } catch (Exception e) {
-            LOGGER.error("机器码:", e);
-        }
-        Map resultObj = Maps.newHashMap();
-        if (user == null) {
-            resultObj.put("errno", 400);
-            resultObj.put("errmsg", "用户登录超时,请重新登录");
-            return resultObj;
-        }
-        if (!user.getRoleType().equalsIgnoreCase("2")) {
-            resultObj.put("errno", 400);
-            resultObj.put("errmsg", "该操作只允许店员账户操作");
-            return resultObj;
-        }
-        if (org.apache.commons.lang3.StringUtils.isEmpty(user.getMerchSn())) {
-            resultObj.put("errno", 400);
-            resultObj.put("errmsg", "操作用户的商户编号为空,请先维护用户商户编号信息再来操作");
-            return resultObj;
-        }
-        Long userId = user.getUserId();
-        Integer storeId = user.getStoreId();
-
-        // TODO 海控需求,下单流程修改,收银端接收会员码,付款码,用户信息,订单数据
-        // 1. 校验库存:保税仓库存 + 展销店库存 - 出区数 >= 购买数
-        // 获取保税仓库存
-        String queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(null);
-        if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
-            LOGGER.error("调用库存系统接口出现错误!返回结果为空!");
-            throw new ServiceException("调用库存系统接口出现错误!");
-        }
-        WareQueryStockResponseDTO wareQueryStockResponseDTO = JacksonUtil.fromStringJson(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
-        if (Objects.isNull(wareQueryStockResponseDTO)) {
-            throw new ServiceException("解析一步达库存系统响应数据出现错误!");
-        }
-        List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
-        // 解析xml,组装成map key=>sku value=>库存
-        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);
-            }
-        });
-        // 订单总价格(含税价)
-        BigDecimal orderPrice = BigDecimal.ZERO;
-        // 商品总价格(不含税)
-        BigDecimal goodsPrice = BigDecimal.ZERO;
-        // 订单所占用的税
-        BigDecimal totalTax = BigDecimal.ZERO;
-
-        List<OrderGoodsEntity> orderGoodsEntities = new ArrayList<>();
-        List<GoodsEntity> goodsEntities = new ArrayList<>();
-
-        // TODO 根据商品条码、sku、门店id查询相对应的商品信息,并组装成对象
-        List<QueryGoodsVO> queryGoodsVOList = new ArrayList<>();
-        goodsList.forEach(map -> {
-            QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
-            queryGoodsVo.setProdBarcode((String) map.get("prodBarcode"));
-            queryGoodsVo.setSku((String) map.get("goodsSn"));
-            queryGoodsVo.setStoreId(storeId);
-            queryGoodsVo.setSellVolume((Integer) map.get("sellVolume"));
-            queryGoodsVo.setRetailPrice(new BigDecimal(String.valueOf(map.get("retailPrice"))));
-            queryGoodsVo.setGoodsTaxes(new BigDecimal(String.valueOf(map.get("goodstaxes"))));
-            queryGoodsVo.setDisCountedPrice(new BigDecimal(String.valueOf(map.get("disCountedPrice"))));
-            queryGoodsVOList.add(queryGoodsVo);
-        });
-        // 将在循环中查询数据库改为一次性查询
-        List<GoodsEntity> goodsEntityList = goodsService.queryGoodsStockByQueryGoodsVoList(queryGoodsVOList);
-        // 复制集合数据
-        ListUtils listUtils = BeanUtils.instantiate(ListUtils.class);
-        listUtils.copyList(goodsEntityList, queryGoodsVOList);
-        // 用来存储是否达到满赠条件的map
-        Map<String, BigDecimal> categoryConditionMap = new HashMap<>();
-        Map<String, BigDecimal> brandConditionMap = new HashMap<>();
-
-        for (QueryGoodsVO goodsEntity : queryGoodsVOList) {
-            OrderGoodsEntity orderGoodsEntity = new OrderGoodsEntity();
-            // 要购买的数量
-            Integer sellVolume = goodsEntity.getSellVolume();
-            // 条码
-            String prodBarcode = goodsEntity.getProdBarcode();
-            // 当前sku
-            String sku = goodsEntity.getSku();
-            // 订单金额(含税价),订单总金额,用户支付的金额
-            BigDecimal retailPrice = goodsEntity.getRetailPrice();
-            // 商品预估税率
-            BigDecimal goodsTaxes = goodsEntity.getGoodsTaxes();
-            // 商品优惠金额
-            BigDecimal disCountedPrice = goodsEntity.getDisCountedPrice();
-            // 商品金额(不包含税的价格),推送海关电子订单需要
-            goodsPrice = goodsPrice.add(retailPrice.subtract(goodsTaxes));
-            // 累加订单价格(含税价)
-            orderPrice = orderPrice.add(retailPrice);
-            // 总税款
-            totalTax = totalTax.add(goodsTaxes);
-            // 当前sku
-            String currentSku = goodsEntity.getSku();
-            // 仓库库存
-            Integer warehouseStock = stockMap.get(currentSku);
-            // 门店库存
-            Integer stockNum = goodsEntity.getStockNum();
-            // 判断库存。。
-            if (!stockMap.containsKey(currentSku)) {
-                LOGGER.error("库存系统中不包含此sku:【{}】,校验库存出错!下单失败!", currentSku);
-                throw new ServiceException(String.format("不包含此sku:【%s】", currentSku));
-            } else {
-                // 保税仓库存 + 展销店库存 - 出区数 >= 购买数
-                // 当前出区数
-                Integer exitRegionNumber = goodsEntity.getExitRegionNumber();
-                // 保税仓库存 + 门店库存 - 出区数 >= 购买数
-                if (!((warehouseStock + stockNum) - exitRegionNumber >= sellVolume)) {
-                    // 库存不足
-                    LOGGER.error("sku【{}】库存不足!商品条码:【{}】,门店库存:【{}】,保税仓库存:【{}】,当前出区数:【{}】", currentSku, prodBarcode, stockNum, warehouseStock, exitRegionNumber);
-                    throw new ServiceException(String.format("sku【%s】库存不足!商品条码:【%s】,门店库存:【%s】,保税仓库存:【%s】,当前出区数:【%s】", currentSku, prodBarcode, stockNum, warehouseStock, exitRegionNumber));
-                }
-            }
-            // 设置订单详情信息
-            GoodsEntity entity = new GoodsEntity(goodsEntity);
-            wrapOrderGoods(orderGoodsEntity, entity);
-            orderGoodsEntities.add(orderGoodsEntity);
-
-            // 设置条件信息,暂不支持门店满赠活动
-            String categoryId = String.valueOf(entity.getCategoryId());
-            String brandId = String.valueOf(entity.getBrandId());
-            if (!categoryConditionMap.containsKey(categoryId)) {
-                categoryConditionMap.put(categoryId, retailPrice);
-            } else {
-                categoryConditionMap.put(categoryId, categoryConditionMap.get(categoryId).add(retailPrice));
-            }
-//            if (!brandConditionMap.containsKey(brandId)) {
-//                brandConditionMap.put(brandId, retailPrice);
-//            } else {
-//                brandConditionMap.put(brandId, brandConditionMap.get(brandId).add(retailPrice));
-//            }
-        }
-        // 2. 判断购买的商品是否能参与满减活动
-        // 2.1 查询当前门店是否有满赠的活动
-        List<MkActivitiesEntity> activitiesEntities = mkActivitiesService.queryByNowByMz(String.valueOf(storeId), DateUtils.format(new Date(), "yyyy-MM-dd"));
-        if (CollectionUtils.isEmpty(activitiesEntities)) {
-            LOGGER.error("----- 该门店【{}】暂无满赠活动! -----", storeId);
-        } else {
-            // 当前门店的活动编号
-            List<Long> activitiesSnList = activitiesEntities.stream().map(MkActivitiesEntity::getMkaId).collect(Collectors.toList());
-            // 活动
-            List<MkActivitiesFullGiftEntity> mkActivitiesFullGiftEntities = mkActivitiesFullGiftService.queryByMkaIdList(activitiesSnList);
-            if (CollectionUtils.isEmpty(mkActivitiesFullGiftEntities)) {
-                LOGGER.error("----- 该门店【{}】暂无满赠活动! -----", storeId);
-            } else {
-                mkActivitiesFullGiftEntities.forEach(mkActivitiesFullGiftEntity -> {
-                    // 存在品牌满赠活动,暂不支持品牌满赠活动
-//                    String brandId = String.valueOf(mkActivitiesFullGiftEntity.getBrandId());
-//                    if (brandConditionMap.containsKey(brandId)) {
-//                        if (brandConditionMap.get(brandId).compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) > 0) {
-//                            // 该品牌满足满赠条件
-//
-//                        }
-//                    }
-                    // 存在分类满赠活动
-                    String categoryId = String.valueOf(mkActivitiesFullGiftEntity.getCategoryId());
-                    if (!CollectionUtils.isEmpty(categoryConditionMap) && categoryConditionMap.containsKey(categoryId)) {
-                        if (categoryConditionMap.get(categoryId).compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) > 0) {
-                            // 该分类满足满赠条件
-                            String giftBarcode = mkActivitiesFullGiftEntity.getGiftBarcode();
-                            String giftGoodsSn = mkActivitiesFullGiftEntity.getGiftGoodsSn();
-                            String shopSn = mkActivitiesFullGiftEntity.getShopSn();
-                            GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(giftBarcode, Integer.parseInt(shopSn), giftGoodsSn);
-                            // 存储赠送数
-                            goodsEntity.setGoodsNumber(mkActivitiesFullGiftEntity.getGiftNumber());
-                            OrderGoodsEntity orderGoodsEntity = new OrderGoodsEntity();
-                            wrapOrderGoods(orderGoodsEntity, goodsEntity);
-                            orderGoodsEntity.setRetailPrice(BigDecimal.ZERO);
-                            orderGoodsEntity.setDiscountedPrice(BigDecimal.ZERO);
-                            orderGoodsEntity.setActualPaymentAmount(BigDecimal.ZERO);
-                            orderGoodsEntities.add(orderGoodsEntity);
-                        }
-                    }
-                });
-            }
-        }
-
-
-        // 3. 校验是否是会员,调用会员系统查询会员信息,查询接口:
-        // 优惠后价格
-        BigDecimal afterDiscountPrice;
-        if (org.springframework.util.StringUtils.isEmpty(couponBarCode)) {
-            // 不是会员,不享受积分抵扣,只能使用门店的优惠券
-            afterDiscountPrice = calculatePreferentialPrice(orderPrice, 0, goodsList, storeId, userInfo);
-        } else {
-            // 会员,计算优惠价
-            String queryMemberInfoResponse;
-            try {
-                // 查询会员信息
-                queryMemberInfoResponse = haiKongMemberTemplate.getMemberInfoByCode("{\"code\":\"" + couponBarCode + "\"}");
-                Response<MemberInfoDTO> response = JacksonUtil.fromListJson(queryMemberInfoResponse, new TypeReference<Response<MemberInfoDTO>>() {
-                });
-                if (Objects.nonNull(response) && response.getSuccess()) {
-                    MemberInfoDTO memberInfoDTO = response.getData();
-                    Integer score = memberInfoDTO.getScore();
-                    if (Objects.nonNull(score) && score > 0) {
-                        // 有积分
-                        afterDiscountPrice = calculatePreferentialPrice(orderPrice, score, goodsList, storeId, userInfo);
-                    } else {
-                        // 无积分
-                        afterDiscountPrice = calculatePreferentialPrice(orderPrice, 0, goodsList, storeId, userInfo);
-                    }
-                } else {
-                    LOGGER.error("查询会员信息失败!响应结果:{}", queryMemberInfoResponse);
-                    throw new ServiceException("查询会员信息失败!请重新下单!");
-                }
-            } catch (Exception e) {
-                LOGGER.error("查询会员信息失败!请重新下单!");
-                throw new ServiceException("查询会员信息失败!请重新下单!");
-            }
-        }
-        // 4. 调用付款接口
-        // 判断是微信的支付码还是支付宝的支付码
-        if (parCode.startsWith("28")) {
-            // 支付宝支付
-            try {
-//                AliPay(user, parCode, order, processRecordEntity, orderWXPayRecordCurrent, store);
-            } catch (Exception e) {
-                e.printStackTrace();
-                throw e;
-            }
-        } else {
-            // 微信支付
-            try {
-//                wxPay(user, parCode, resultObj, order, processRecordEntity, orderWXPayRecordCurrent, store);
-            } catch (Exception e) {
-                e.printStackTrace();
-                throw e;
-            }
-        }
-
-        // 5. 扣减库存
-
-        // 6. 订单入库
-
-
-        return resultObj;*/
-        return null;
-    }
-
-    /**
      * 提交订单并付款
      *
      * @param param 提交的订单数据、包括用户信息、支付码、会话id、机器码(收银台)、取货方式、收货地址信息、会员码
@@ -2546,8 +2257,8 @@ public class OrderServiceImpl implements OrderService {
                     storeMngChangeDao.save(storeMngChangeEntity);
 
                     int validNum = stockNum - sellVolume;
-                    // 园区库存变化记录
-                    MngChangeEntity mngChangeEntity = new MngChangeEntity();
+                    // 园区库存变化记录,不计销售扣减
+                    /*MngChangeEntity mngChangeEntity = new MngChangeEntity();
                     mngChangeEntity.setThirdPartyMerchCode(goodsDto.getThirdPartyMerchCode());
                     mngChangeEntity.setChangeReason("商品销售扣减");
                     mngChangeEntity.setCreateTime(new Date());
@@ -2562,7 +2273,7 @@ public class OrderServiceImpl implements OrderService {
                     mngChangeEntity.setChangeType(Dict.changeType.item_1.getItem());
                     mngChangeEntity.setGoodsId(goodsDto.getId().intValue());
 
-                    mngChangeDao.save(mngChangeEntity);
+                    mngChangeDao.save(mngChangeEntity);*/
 
                     // 如果园区库存数量小于等于0, 则不更新园区库存, 园区库存只做参考
                     int diff = Math.max(goodsNumber - sellVolume, 0);
@@ -2576,7 +2287,7 @@ public class OrderServiceImpl implements OrderService {
                     BeanUtils.copyProperties(goodsDto, productStoreRelaEntity);
                     productStoreRelaEntity.setStockNum(validNum);
                     productStoreRelaEntity.setStoreId(storeId.longValue());
-                    productStoreRelaEntity.setSellVolume(goodsDto.getSellVolume() + sellVolume);
+                    productStoreRelaEntity.setSellVolume(sellVolume);
                     productStoreRelaEntity.setLastSaleTime(new Date());
                     productStoreRelaService.updateStockNumByStoreIdAndSku(productStoreRelaEntity);//修改普通商品库存
 
@@ -2668,6 +2379,7 @@ public class OrderServiceImpl implements OrderService {
             String couponSn = (String) userInfo.get("couponSn");
             order.setMerchOrderSn(merchOrderSn);
             order.setCoupon_name(couponSn); // 借用这个字段来记录是否使用优惠券
+            order.setIdCard(userEntity.getIdNo());
             //插入订单信息和订单商品
             orderDao.saveOrderVo(order);
 
@@ -2856,12 +2568,6 @@ public class OrderServiceImpl implements OrderService {
             consumptionRecords.setOrderSn(order.getOrder_sn());
             consumptionRecords.setConsumptionTime(new Date());
             consumptionRecords.setShopSn(String.valueOf(storeId));
-            // 判断是否有使用生日优惠
-            /*if (isBirth) {
-                consumptionRecords.setIsUseBirthdayOffer("0"); // 使用生日优惠
-            } else {
-                consumptionRecords.setIsUseBirthdayOffer("1"); // 没使用生日优惠
-            }*/
             // 积分消费记录
             String deductionScoreStr = (String) param.get("deductionScore");
             String scoreDeductionPriceStr = (String) param.get("scoreDeductionPrice");
@@ -2911,6 +2617,15 @@ public class OrderServiceImpl implements OrderService {
             WebSocketServer.sendMessage(sessionId, order.getOrder_sn(), order.getStore_id()
                     + "");
 
+            JedisUtil.del(Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId);
+
+            // TODO 推单测试用
+            order.setPayApp("wxpay");
+            order.setRequest("1111111111111111111");
+            order.setResponse("2222222222222222222");
+            // 推单
+            sendOrderInfoToVmcShop(order, orderGoodsVoList);
+
             return resultObj;
         } catch (Exception e) {
             e.printStackTrace();
@@ -2920,6 +2635,114 @@ public class OrderServiceImpl implements OrderService {
         }
     }
 
+    /**
+     * 免税mall创建订单
+     * @param order             订单信息:包含订单信息,支付信息,跨境信息
+     * @param orderGoodsVoList  订单详情数据
+     */
+    private void sendOrderInfoToVmcShop(OrderVo order, List<OrderGoodsVo> orderGoodsVoList) {
+        SendOrderToVmcShopDTO sendOrderToVmcShopDTO = new SendOrderToVmcShopDTO();
+
+        OrderInfoDTO orderInfoDTO = wrapOrderInfo(order);
+        PayInfoDTO payInfoDTO = wrapPayInfo(order);
+        SeaportInfoDTO seaportInfoDTO = wrapSeaportInfo(order);
+        List<OrderProductInfoDTO> orderProductInfoDTOList = orderGoodsVoList.stream().map(this::wrapOrderProductInfo).collect(Collectors.toList());
+        seaportInfoDTO.setOrderProductInfoList(orderProductInfoDTOList);
+        List<OrderInfoItemDTO> orderInfoItemDTOList = orderGoodsVoList.stream().map(this::wrapOrderInfoItem).collect(Collectors.toList());
+
+        sendOrderToVmcShopDTO.setOrderInfo(orderInfoDTO);
+        sendOrderToVmcShopDTO.setOrderInfoItems(orderInfoItemDTOList);
+        sendOrderToVmcShopDTO.setSeaportInfo(seaportInfoDTO);
+        sendOrderToVmcShopDTO.setPayInfo(payInfoDTO);
+
+        String body = JacksonUtil.toJson(sendOrderToVmcShopDTO);
+
+        String orderSn = order.getOrder_sn();
+        try {
+
+            String response = vmcShopTemplate.sendOrder(body);
+
+            com.kmall.admin.haikong.utils.R<String> r = JacksonUtil.fromListJson(response, new TypeReference<com.kmall.admin.haikong.utils.R<String>>() {});
+
+            if (Objects.nonNull(r) && r.getCode() == 0) {
+                pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_0.getStatus());
+                LOGGER.info("推送订单到免税mall成功!响应结果:{}", response);
+            } else {
+                pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
+                LOGGER.error("推送订单到免税mall失败!响应结果:{}", response);
+            }
+        } catch (Exception e) {
+            pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_6.getStatus());
+            LOGGER.error("推送订单到免税mall失败!出现异常!", e);
+        }
+    }
+
+    private SeaportInfoDTO wrapSeaportInfo(OrderVo order) {
+        SeaportInfoDTO seaportInfoDTO = new SeaportInfoDTO();
+        seaportInfoDTO.setSeaportCode("4600");
+        seaportInfoDTO.setPlatform("1");
+        seaportInfoDTO.setIdentityCard(order.getIdCard());
+        seaportInfoDTO.setIdentityName(order.getPay_name());
+        seaportInfoDTO.setIdentityMobile(order.getMobile());
+        return seaportInfoDTO;
+    }
+
+    private PayInfoDTO wrapPayInfo(OrderVo order) {
+        PayInfoDTO payInfoDTO = new PayInfoDTO();
+        payInfoDTO.setMoney(order.getActual_price());
+        payInfoDTO.setPayMode("offline");
+        payInfoDTO.setRequest(order.getRequest());
+        payInfoDTO.setResponse(order.getResponse());
+        payInfoDTO.setOutTradeNo(order.getOrder_sn());
+        return payInfoDTO;
+    }
+
+    private OrderInfoItemDTO wrapOrderInfoItem(OrderGoodsVo orderGoodsVo) {
+        OrderInfoItemDTO orderInfoItemDTO = new OrderInfoItemDTO();
+        orderInfoItemDTO.setOrderId(orderGoodsVo.getOrderSn());
+        orderInfoItemDTO.setImageUrl(orderGoodsVo.getList_pic_url());
+        orderInfoItemDTO.setBn("11111111");
+        orderInfoItemDTO.setBarcode(orderGoodsVo.getBarcode());
+        orderInfoItemDTO.setName(orderGoodsVo.getGoods_name());
+        orderInfoItemDTO.setCost(orderGoodsVo.getMarket_price());
+        orderInfoItemDTO.setPrice(orderGoodsVo.getRetail_price());
+        orderInfoItemDTO.setItemcode(orderGoodsVo.getSku());
+        orderInfoItemDTO.setAmount(orderGoodsVo.getActualPaymentAmount());
+        orderInfoItemDTO.setNums(orderGoodsVo.getNumber());
+        orderInfoItemDTO.setTax(true);
+        orderInfoItemDTO.setTaxPrice(orderGoodsVo.getTaxPrice());
+        return orderInfoItemDTO;
+    }
+
+    private OrderInfoDTO wrapOrderInfo(OrderVo order) {
+        OrderInfoDTO orderInfoDTO = new OrderInfoDTO();
+        orderInfoDTO.setOuterOrderNo(order.getOrder_sn());
+        orderInfoDTO.setPayApp(order.getPayApp());
+        orderInfoDTO.setDlytypeCode("SF");
+        orderInfoDTO.setConsigneeName(order.getPay_name());
+        orderInfoDTO.setConsigneeAreaProvince(order.getProvince());
+        orderInfoDTO.setConsigneeAreaCity(order.getCity());
+        orderInfoDTO.setConsigneeAreaCounty(order.getDistrict());
+        orderInfoDTO.setConsigneeAddress(order.getAddress());
+        orderInfoDTO.setConsigneeZip("519000");
+        orderInfoDTO.setConsigneeTel("0756-8800000");
+        orderInfoDTO.setConsigneeEmail("hk@greedc.com");
+        orderInfoDTO.setConsigneeMobile(order.getMobile());
+        orderInfoDTO.setWeight("?");
+        orderInfoDTO.setQuantity(order.getNumber());
+        orderInfoDTO.setOrderTotal(order.getActual_price());
+        orderInfoDTO.setPlatform("store");
+
+        return orderInfoDTO;
+    }
+
+    private OrderProductInfoDTO wrapOrderProductInfo(OrderGoodsVo orderGoodsVo) {
+        OrderProductInfoDTO orderProductInfoDTO = new OrderProductInfoDTO();
+        orderProductInfoDTO.setProductId(orderGoodsVo.getBarcode());
+        orderProductInfoDTO.setGoodsId(orderGoodsVo.getGoods_sn());
+        return orderProductInfoDTO;
+    }
+
     private void AliPay(SysUserEntity user, String parCode, OrderVo order, OrderProcessRecordEntity processRecordEntity, OrderWXPayRecordEntity orderWXPayRecordCurrent, StoreEntity store) throws Exception {
 
         AliPayRequestParams params = new AliPayRequestParams();
@@ -2939,11 +2762,15 @@ public class OrderServiceImpl implements OrderService {
         params.setSubject(store.getMerchName() + "-" + store.getStoreName() + "-" + orderBizTypeZn);
         params.setStoreId(store.getId() + "");
         params.setTotalAmount(order.getActual_price().setScale(2, BigDecimal.ROUND_HALF_UP) + "");
-        LOGGER.info("调用阿里支付接口的请求参数:" + JacksonUtils.toJson(params));
+        String paramsJson = JacksonUtils.toJson(params);
+        order.setRequest(paramsJson);
+        LOGGER.info("调用阿里支付接口的请求参数:" + paramsJson);
         AliPayMicropayApiResult aliPayMicropayApiResult = AliPayUtil.aliTradePay(params);
         orderWXPayRecordService.updateRecordByAli(orderWXPayRecordCurrent.getId(), aliPayMicropayApiResult);
-        LOGGER.info("调用阿里支付接口的同步返回结果:" + JacksonUtils.toJson(aliPayMicropayApiResult));
-
+        String responseJson = JacksonUtils.toJson(aliPayMicropayApiResult);
+        LOGGER.info("调用阿里支付接口的同步返回结果:" + responseJson);
+        order.setResponse(responseJson);
+        order.setPayApp("alipay");
 
         // 修改订单状态
         //当支付成功时,修改订单,并把其他支付记录撤销
@@ -3052,14 +2879,16 @@ public class OrderServiceImpl implements OrderService {
         } catch (Exception e) {
             e.printStackTrace();
         }
-
+        PayOriginInfoDTO payOriginInfoDTO = new PayOriginInfoDTO();
         WechatMicropayApiResult wechatMicropayApiResult = WechatUtil
                 .wxMicropay(store.getMerchName() + "-" + store.getStoreName(), order.getOrderBizType(), null,
                         orderWXPayRecordCurrent.getOutTradeNoWX(), order.getActual_price().doubleValue(),
-                        ip, parCode);
+                        ip, parCode, payOriginInfoDTO);
         orderWXPayRecordService.updateRecord(orderWXPayRecordCurrent.getId(), wechatMicropayApiResult);
 
-
+        order.setRequest(payOriginInfoDTO.getRequest());
+        order.setResponse(payOriginInfoDTO.getResponse());
+        order.setPayApp("wxpay");
         resultObj.put("shopName", store.getStoreName()); // 根据门店编号查询
         resultObj.put("userName", user.getUsername());
         // 修改订单状态
@@ -3371,7 +3200,7 @@ public class OrderServiceImpl implements OrderService {
                 orderDao.update(order);
                 // 修改小票码
                 PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
-                pickUpCodeEntity.setPickUpCodeStatus("3");
+                pickUpCodeEntity.setPickUpCodeStatus(Dict.PickUpCodeStatusEnum.item_3.getStatus());
                 pickUpCodeService.update(pickUpCodeEntity);
                 //新增退款记录
                 OrderRefundEntity orderRefund = orderRefundLog("wx453456511","wx453456566","26999",order.getId(),user.getUserId(),order.getMerchOrderSn());
@@ -3401,7 +3230,7 @@ public class OrderServiceImpl implements OrderService {
             orderDao.update(order);
             // 修改小票码
             PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
-            pickUpCodeEntity.setPickUpCodeStatus("3");
+            pickUpCodeEntity.setPickUpCodeStatus(Dict.PickUpCodeStatusEnum.item_3.getStatus());
             pickUpCodeService.update(pickUpCodeEntity);
             //新增退款记录
             OrderRefundEntity orderRefund = orderRefundLog(userRefund.getTradeNo(),userRefund.getOutTradeNo(),userRefund.getRefundFee(),order.getId(),user.getUserId(),order.getMerchOrderSn());
@@ -3492,14 +3321,18 @@ public class OrderServiceImpl implements OrderService {
     private void vipIntegralGoBack(OrderEntity order) throws Exception{
         List<IntegralGoBackEntity> changeRecordEntityList = haiKongMemberScoreChangeRecordService.queryIntegralGoBack(order.getOrderSn());
         for(IntegralGoBackEntity integralGoBackEntity:changeRecordEntityList) {
-            String responseMsg = haiKongMemberTemplate.rollbackMemberScore(JSON.toJSONString(integralGoBackEntity));
+           String integralGoBackEntityMsg = JSON.toJSONString(integralGoBackEntity);
+            Date dateResend = new Date();
+            String responseMsg = haiKongMemberTemplate.rollbackMemberScore(integralGoBackEntityMsg);
             Map<String, Object> res = JSON.parseObject(responseMsg, Map.class);
+            LOGGER.info("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口数据]" + responseMsg);
+
+            //解析数据
             if ("true".equals(res.get("success"))) {
                 LOGGER.info("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口数据]" + responseMsg);
             } else {
                 LOGGER.error("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口异常数据]" + responseMsg);
                 HaiKongResendMsgEntity haiKongResendMsgEntity = new HaiKongResendMsgEntity();
-                //haiKongResendMsgEntity.setOpenId(changeRecordEntity.getOpen_id());
                 haiKongResendMsgEntity.setOpenId(integralGoBackEntity.getOpen_id());
                 haiKongResendMsgEntity.setOrderSn(order.getOrderSn());
                 haiKongResendMsgEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.ROLLBACK_MEMBER_SCORE.getUrl());
@@ -3508,6 +3341,7 @@ public class OrderServiceImpl implements OrderService {
                 haiKongResendMsgEntity.setIsValid(1);
                 haiKongResendMsgDao.saveResendMsg(haiKongResendMsgEntity);
             }
+
         }
     }
 
@@ -3518,12 +3352,16 @@ public class OrderServiceImpl implements OrderService {
     private void vmcShopMall(OrderEntity order) {
         LOGGER.info("=======> [vmcShopMall-----调用VMCShop接口开始发送退款订单数据]"+order.getOrderSn());
         String body = JacksonUtil.toJson(order.getOrderSn());
+        InterfaceSendLogEntity interfaceSendLogEntity = new InterfaceSendLogEntity();
+        interfaceSendLogEntity.setRequestDate(new Date());
+        interfaceSendLogEntity.setSysType(Dict.sendLog.item_mall.getItemName());
         String response = vmcShopTemplate.refundOrder(body);
+        Date dateResend = new Date();
         //解析响应数据
         LOGGER.info("=======> [vmcShopMall------发送退款订单数据成功,开始处理后续流程]"+response);
-        //Map<String,String> res = JSON.parseObject(response,Map.class);
+        Map<String,String> res = JSON.parseObject(response,Map.class);
+        interfaceSendLogEntity.setMsgStatus(res.get("code"));
 
-        saveVmcSend(order.getOrderSn(),VmcconnectUrlEnum.ORDERS_CANCEL_ORDER.getMethod(),body,response);
         LOGGER.info(order.getOrderSn()+"[发送退款订单数据]"+JSON.toJSONString(order));
 
     }
@@ -4056,11 +3894,12 @@ public class OrderServiceImpl implements OrderService {
             //图片地址
             mailInfo.setStoreImgUrl(storeEntity.getStoreImgUrl()==null?"/statics/img/cw_qrcode.png":storeEntity.getStoreImgUrl().trim());
             mailInfo.setExprNo(exprNo);
-            String logoUrl = "/statics/img/yto_logo.jpg";
+            String logoUrl = "/statics/img/sf_img.jpg";
 
             Map<String, String> logoMap = new HashMap<>();
             logoMap.put("yto", "/statics/img/yto_logo.jpg");
             logoMap.put("best", "/statics/img/bestex_logo3.png");
+            logoMap.put("sf", "/statics/img/sf_img.jpg");
             if (StringUtils.isNotEmpty(orderEntity.getShippingCode()) && logoMap.containsKey(orderEntity.getShippingCode())) {
                 logoUrl = logoMap.get(orderEntity.getShippingCode());
             }
@@ -4624,10 +4463,9 @@ public class OrderServiceImpl implements OrderService {
         String response = vmcShopTemplate.resendOrder(body);
         //解析响应数据
         LOGGER.info("=======> [resendOrderHkMall---重发订单数据成功,开始处理后续流程]"+response);
-        //记录发送至免税Mall日志
-        saveVmcSend(orderSn,VmcconnectUrlEnum.ORDERS_RETRY_ORDER.getMethod(),body,response);
         Map<String,String> res = JSON.parseObject(response,Map.class);
         if("0".equals(res.get("code"))){
+            pickUpCodeService.updatePickUpCodeStatusByOrderSn(orderSn, Dict.PickUpCodeStatusEnum.item_0.getStatus());
             return R.ok();
         }else{
             return R.error(500,"重发订单失败");
@@ -4635,21 +4473,6 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
-     * 记录发送至免税Mall日志
-     * @param orderSn
-     * @param body
-     * @param response
-     */
-    private void saveVmcSend(String orderSn,String urlType,String body,String response){
-        MallVmcSendlogEntity mallVmcSendlogEntity = new MallVmcSendlogEntity();
-        mallVmcSendlogEntity.setOrderSn(orderSn);
-        mallVmcSendlogEntity.setVmcType(urlType);
-        mallVmcSendlogEntity.setRequestMsg(body);
-        mallVmcSendlogEntity.setResponseMsg(response);
-        mallVmcSendLogDao.saveVmcSend(mallVmcSendlogEntity);
-    }
-
-    /**
      * 设置订单数据
      *
      * @return
@@ -4754,6 +4577,7 @@ public class OrderServiceImpl implements OrderService {
         BigDecimal couponPrice = BigDecimal.ZERO;
         BigDecimal freightPrice = Constant.ZERO;
         BigDecimal actualPrice = Constant.ZERO;
+        Integer number = 0;
         //订单价格计算:订单的总价+运费
         for (GoodsEntity goodsEntity : goodsList) {
             goodsTotalPrice = goodsTotalPrice
@@ -4763,6 +4587,7 @@ public class OrderServiceImpl implements OrderService {
             actualPrice = actualPrice
                     .add(goodsEntity.getActualPaymentAmount()).setScale(2, RoundingMode.HALF_UP);
             couponPrice = couponPrice.add(goodsEntity.getDiscountedPrice()).setScale(2, RoundingMode.HALF_UP);
+            number += goodsEntity.getSellVolume();
         }
 
 
@@ -4778,10 +4603,11 @@ public class OrderServiceImpl implements OrderService {
         orderInfo.setOrder_sn(orderSn);
         orderInfo.setMerchSn(merchSn);
         orderInfo.setUser_id(loginUser.getId().longValue());
+        orderInfo.setNumber(number);
         actualPrice = actualPrice.subtract(couponPrice);
 
         //StoreEntity storeEntity = storeDao.queryObject(storeId);
-        //获取收货人地址
+        //随机获取收货人地址
         AddressEntity addressEntity = addressDao.queryStoreAddress(storeId,Dict.addressStatus.item_2.getItem());
         if(null==addressEntity){
             LOGGER.error("setOrderVo---门店未配置收货人地址:"+storeId);
@@ -4883,6 +4709,8 @@ public class OrderServiceImpl implements OrderService {
         orderGoodsVo.setList_pic_url(goodsDto.getListPicUrl());
         orderGoodsVo.setMarket_price(goodsDto.getStoreRetailPrice());
         orderGoodsVo.setRetail_price(goodsDto.getStoreRetailPrice());
+        orderGoodsVo.setOrderSn(orderInfo.getOrder_sn());
+        orderGoodsVo.setBarcode(goodsDto.getProdBarcode());
 
         orderGoodsVo.setDiscountedPrice(goodsDto.getDiscountedPrice());
         orderGoodsVo.setActualPaymentAmount(goodsDto.getActualPaymentAmount());

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

@@ -98,5 +98,11 @@ public class PickUpCodeServiceImpl implements PickUpCodeService {
         return pickUpCodeDao.deleteBatch(orderSns);
     }
 
+    @Override
     public String queryPickUpCodeStatus(String orderSn){return pickUpCodeDao.queryPickUpCodeStatus(orderSn); }
+
+    @Override
+    public void updatePickUpCodeStatusByOrderSn(String orderSn, String pickUpCodeStatus) {
+        pickUpCodeDao.updatePickUpCodeStatusByOrderSn(orderSn, pickUpCodeStatus);
+    }
 }

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

@@ -288,4 +288,9 @@ public class StoreServiceImpl implements StoreService {
     public List<StoreEntity> queryStoreByAll() {
         return storeDao.queryStoreByAll();
     }
+
+    @Override
+    public List<SysMacroEntity> queryListDictionary() {
+        return storeDao.queryListDictionary();
+    }
 }

+ 5 - 0
kmall-admin/src/main/java/com/kmall/admin/websocket/WebSocketServer.java

@@ -3,10 +3,12 @@ package com.kmall.admin.websocket;
 import com.alibaba.fastjson.JSONObject;
 import com.kmall.admin.entity.OrderEntity;
 import com.kmall.admin.entity.PickUpCodeEntity;
+import com.kmall.admin.haikong.constant.Constants;
 import com.kmall.admin.service.OrderService;
 import com.kmall.admin.service.PickUpCodeService;
 import com.kmall.api.util.SendMsgUtil;
 import com.kmall.common.utils.R;
+import com.kmall.manager.manager.redis.JedisUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -81,6 +83,9 @@ public class WebSocketServer {
         Map<String,Object> dataParam = new HashMap<>();
         dataParam.put("pickUpCodeCreatetime",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
         dataParam.put("storeId",param);
+
+        JedisUtil.del(Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + param);
+
         pickUpList = pickUpCodeService.queryList(dataParam);
         pickUpCodeMap.put(param,pickUpList);
 //        }

+ 1 - 0
kmall-admin/src/main/resources/XmlTemplate/StoreGoodsDtoList.xml

@@ -16,6 +16,7 @@
                 <mapping row="1" col="7">StoreGoodsDto.retailPrice</mapping>
                 <mapping row="1" col="8">StoreGoodsDto.marketPrice</mapping>
                 <mapping row="1" col="9">StoreGoodsDto.bottomLinePrice</mapping>
+                <mapping row="1" col="10">StoreGoodsDto.exitRegionNumber</mapping>
 <!--                <mapping row="1" col="9">StoreGoodsDto.batchSn</mapping>-->
             </section>
             <loopbreakcondition>

+ 1 - 1
kmall-admin/src/main/resources/logback.xml

@@ -6,7 +6,7 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
 -->
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
 
-    <property name="LOG_HOME" value="/data/project/logs/kmall-cw/kmall-admin/"/>
+    <property name="LOG_HOME" value="/data/project/logs/kmall-haikong/kmall-admin/"/>
     <!-- 定义日志的根目录 -->
     <property name="TRACE_DIR" value="trace" />
     <property name="DEBUG_DIR" value="debug" />

+ 11 - 8
kmall-admin/src/main/resources/mybatis/mapper/AddressDao.xml

@@ -33,6 +33,7 @@
         mall_address.address_type,
         mall_address.address_store,
         mall_store.store_name,
+        mall_address.sender_name,
         mall_user.nickname shop_user_name
         from mall_address LEFT JOIN mall_store ON mall_address.address_store = mall_store.id LEFT JOIN mall_user ON mall_address.user_id = mall_user.id
         where mall_address.id = #{id}
@@ -54,6 +55,7 @@
         mall_address.address_type,
         mall_address.address_store,
         mall_store.store_name,
+        mall_address.sender_name,
         mall_user.nickname shop_user_name
         from mall_address LEFT JOIN mall_store ON mall_address.address_store = mall_store.id
         LEFT JOIN mall_user ON mall_address.user_id = mall_user.id
@@ -130,7 +132,8 @@
         `detail_Info`,
         `is_default`,
          address_type,
-         address_store)
+         address_store,
+         sender_name)
         values(
         #{userId},
         #{userName},
@@ -143,7 +146,8 @@
         #{detailInfo},
         #{isDefault},
         #{addressType},
-        #{addressStore}
+        #{addressStore},
+        #{senderName}
         )
     </insert>
 
@@ -161,7 +165,8 @@
             <if test="detailInfo != null">`detail_Info` = #{detailInfo}, </if>
             <if test="isDefault != null">`is_default` = #{isDefault},</if>
             <if test="addressType != null">`address_type` = #{addressType},</if>
-            <if test="addressStore != null">`address_store` = #{addressStore}</if>
+            <if test="addressStore != null">`address_store` = #{addressStore},</if>
+            <if test="senderName != null">`sender_name` = #{senderName}</if>
         </set>
         where id = #{id}
     </update>
@@ -192,12 +197,10 @@
         mall_address.is_default,
         mall_address.address_type,
         mall_address.address_store,
-        mall_store.store_name,
-        mall_user.nickname shop_user_name
-        from mall_address LEFT JOIN mall_store ON mall_address.address_store = mall_store.id LEFT JOIN mall_user ON mall_address.user_id = mall_user.id
+        mall_address.sender_name
+        from mall_address
         where mall_address.address_store = #{id}
-        and mall_address.address_type= #{type}
-        limit 1
+        and mall_address.address_type= #{type} Order By rand() Limit  1
     </select>
 
 </mapper>

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

@@ -253,7 +253,7 @@
 
     <select id="queryGoodsDetailsByProdBarcode" resultType="com.kmall.admin.dto.GoodsDetailsDto">
         SELECT distinct
-        a.goods_sn as GoodsSn,m.retail_price as retailPrice,a.prod_barcode as prodBarcode,a.name,a.brand,a.goods_desc as goodsDesc,a.goods_unit as goodsUnit,a.goods_rate as goodsRate,a.primary_pic_url ,m.stock_num as stockNum,r.value as specification
+        a.goods_sn as GoodsSn, a.goods_sn as sku, m.retail_price as retailPrice,a.prod_barcode as prodBarcode,a.name,a.brand,a.goods_desc as goodsDesc,a.goods_unit as goodsUnit,a.goods_rate as goodsRate,a.primary_pic_url ,m.stock_num as stockNum,r.value as specification
         ,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, m.exit_region_number as exitRegionNumber
         FROM
             mall_goods a

+ 11 - 5
kmall-admin/src/main/resources/mybatis/mapper/MallVmcSendLogDao.xml

@@ -4,21 +4,27 @@
 <mapper namespace="com.kmall.admin.dao.MallVmcSendLogDao">
 
 	<insert id="saveVmcSend" parameterType="com.kmall.admin.entity.MallVmcSendlogEntity" >
-		insert into mall_vmc_send_log
+		insert into mall_interface_send_log
 		(
-			vmc_type,
+			sys_type,
+			interface_type,
 			order_sn,
 			request_msg,
+			msg_type,
 			response_msg,
-			send_date
+			request_date,
+			response_date
 		)
 		values
 		(
-			#{vmcType},
+			#{sysType},
+			#{interfaceType},
 			#{orderSn},
 			#{requestMsg},
 			#{responseMsg},
-			SYSDATE()
+			#{responseMsg},
+			SYSDATE(),
+			#{responseMsg}
 		)
 	</insert>
 	 

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

@@ -431,4 +431,53 @@ select
 <!--		</foreach>-->
 <!--	</update>-->
 
+	<update id="updateHkNoticeMsgMallOrder" parameterType="java.util.List">
+		update mall_order
+		<trim prefix="set" suffixOverrides=",">
+			<trim prefix="shipping_no =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.logisticsNo!=null">
+						when order_sn=#{item.orderSn}
+						then #{item.logisticsNo}
+					</if>
+					<if test="item.logisticsNo==null">
+						when order_sn=#{item.orderSn}
+						then mall_order.logistics_no
+					</if>
+				</foreach>
+			</trim>
+
+			<trim prefix="shipping_code =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.shippingCode!=null">
+						when order_sn=#{item.orderSn}
+						then #{item.shippingCode}
+					</if>
+					<if test="item.shippingCode==null">
+						when order_sn=#{item.orderSn}
+						then mall_order.shipping_code
+					</if>
+				</foreach>
+			</trim>
+
+			<trim prefix="shipping_name =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.shippingName!=null">
+						when order_sn=#{item.orderSn}
+						then #{item.shippingName}
+					</if>
+					<if test="item.shippingName==null">
+						when order_sn=#{item.orderSn}
+						then mall_order.shipping_name
+					</if>
+				</foreach>
+			</trim>
+
+		</trim>
+		where order_sn in
+		<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
+			#{item.orderSn}
+		</foreach>
+	</update>
+
 </mapper>

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

@@ -155,4 +155,47 @@
 	</select>
 
 
+	<update id="updateHkNoticeMsgPickUpCode" parameterType="java.util.List">
+		update mall_pick_up_code
+		<trim prefix="set" suffixOverrides=",">
+
+			<trim prefix="pick_up_code_status =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.clearType!=null and item.clearType=1">
+						when #{item.orderSn}=1
+						then 2
+					</if>
+					<if test="item.clearType!=null and item.clearType=2">
+						when #{item.orderSn}=2
+						then 4
+					</if>
+					<if test="item.clearType!=null and item.clearType=3">
+						when #{item.orderSn}=3
+						then 4
+					</if>
+					<if test="item.clearType!=null and item.clearType=4">
+						when #{item.orderSn}=4
+						then 4
+					</if>
+					<if test="item.clearType==null">
+						when order_sn=#{item.orderSn}
+						then mall_pick_up_code.pick_up_code_status
+					</if>
+				</foreach>
+			</trim>
+
+		</trim>
+		where order_sn in
+		<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
+			#{item.orderSn}
+		</foreach>
+	</update>
+
+    <update id="updatePickUpCodeStatusByOrderSn">
+		update mall_pick_up_code
+		set pick_up_code_status = #{pickUpCodeStatus}
+		where order_sn = #{orderSn}
+	</update>
+
+
 </mapper>

+ 5 - 3
kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml

@@ -86,7 +86,8 @@
             a.attribute_category,
             a.brand_id,
             a.freight_id,
-            supplier_third_id, a.hot_sort_num
+            supplier_third_id, a.hot_sort_num,
+            a.exit_region_number as exitRegionNumber
         FROM
             mall_product_store_rela a
             LEFT JOIN mall_store s ON a.store_id = s.id
@@ -192,7 +193,8 @@
             b.third_party_merch_code thirdPartyMerchCode,
             mb.is_stock_share isStockShare,
             supplier_third_id,
-             a.hot_sort_num
+            a.hot_sort_num,
+            a.exit_region_number as exitRegionNumber
             from mall_product_store_rela a
             left join mall_goods b on a.goods_id = b.id
             left join third_merchant_biz mb on mb.third_party_merch_code = b.third_party_merch_code and mb.merch_sn=b.merch_sn
@@ -603,7 +605,7 @@
         update mall_product_store_rela a
         <set>
             <if test="stockNum != null">a.`stock_num` = #{stockNum},</if>
-            <if test="sellVolume != null">a.`sell_volume` = #{sellVolume},</if>
+            <if test="sellVolume != null">a.`sell_volume` = a.`sell_volume` + #{sellVolume},</if>
         </set>
         where a.store_id = #{storeId} and a.sku = #{sku}
     </update>

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

@@ -396,4 +396,12 @@
 		</foreach>
 	</update>
 
+	<select id="queryListDictionary" resultType="com.kmall.admin.entity.SysMacroEntity">
+		select
+		id as value,
+		store_name as name
+		from mall_store
+		where is_valid = 0
+	</select>
+
 </mapper>

+ 115 - 0
kmall-admin/src/main/resources/mybatis/mapper/shop/InterfaceSendLogDao.xml

@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.InterfaceSendLogDao">
+
+    <resultMap type="com.kmall.admin.entity.InterfaceSendLogEntity" id="interfaceSendLogMap">
+        <result property="id" column="id"/>
+        <result property="sysType" column="sys_type"/>
+        <result property="interfaceType" column="interface_type"/>
+        <result property="requestMsg" column="request_msg"/>
+        <result property="msgStatus" column="msg_status"/>
+        <result property="responseMsg" column="response_msg"/>
+        <result property="requestDate" column="request_date"/>
+        <result property="responseDate" column="response_date"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.InterfaceSendLogEntity">
+		select
+			`id`,
+			`sys_type`,
+			`interface_type`,
+			`request_msg`,
+			`msg_status`,
+			`response_msg`,
+			`request_date`,
+			`response_date`
+		from mall_interface_send_log
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.InterfaceSendLogEntity">
+		select
+    		`id`,
+    		`sys_type`,
+    		`interface_type`,
+    		`request_msg`,
+    		`msg_status`,
+    		`response_msg`,
+    		`request_date`,
+    		`response_date`
+		from mall_interface_send_log
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND interface_type LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_interface_send_log
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND interface_type LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.InterfaceSendLogEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into mall_interface_send_log(
+			`sys_type`,
+			`interface_type`,
+			`request_msg`,
+			`msg_status`,
+			`response_msg`,
+			`request_date`,
+			`response_date`,
+			`exception_msg`
+			)
+		values(
+			#{sysType},
+			#{interfaceType},
+			#{requestMsg},
+			#{msgStatus},
+			#{responseMsg},
+			#{requestDate},
+			#{responseDate},
+			#{exceptionMsg}
+			)
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.InterfaceSendLogEntity">
+		update mall_interface_send_log 
+		<set>
+			<if test="sysType != null">`sys_type` = #{sysType}, </if>
+			<if test="interfaceType != null">`interface_type` = #{interfaceType}, </if>
+			<if test="requestMsg != null">`request_msg` = #{requestMsg}, </if>
+			<if test="msgStatus != null">`msg_status` = #{msgStatus}, </if>
+			<if test="responseMsg != null">`response_msg` = #{responseMsg}, </if>
+			<if test="requestDate != null">`request_date` = #{requestDate}, </if>
+			<if test="responseDate != null">`response_date` = #{responseDate}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_interface_send_log where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_interface_send_log where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

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

@@ -67,6 +67,7 @@
         <property name="filterChainDefinitions">
             <value>
                 /orderProRecordExternal/**=anon
+                /goods/number/**=anon
                 /statics/**=anon
                 /api/**=anon
                 /js/**=anon

+ 1 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -357,6 +357,7 @@
                         <i-button data-toggle="modal" data-target="#orderDetail" style="background-color:#808080;width: 110px;font-family: 微软雅黑" @click="queryOrderDetail(item.orderSn,item.pickUpCodeSn)" v-if="item.pickUpCodeStatus == 2" >{{item.pickUpCodeSn}}</i-button>
                         <i-button data-toggle="modal" data-target="#orderDetail" style="background-color:#FF0000;width: 110px;font-family: 微软雅黑" @click="queryOrderDetail(item.orderSn,item.pickUpCodeSn)" v-if="item.pickUpCodeStatus == 4" >{{item.pickUpCodeSn}}</i-button>
                         <i-button data-toggle="modal" data-target="#orderDetail" style="background-color:#ffc800;width: 110px;font-family: 微软雅黑" @click="queryOrderDetail(item.orderSn,item.pickUpCodeSn)" v-if="item.pickUpCodeStatus == 5" >{{item.pickUpCodeSn}}</i-button>
+                        <i-button data-toggle="modal" data-target="#orderDetail" style="background-color:#000;color: #fff;width: 110px;font-family: 微软雅黑" @click="queryOrderDetail(item.orderSn,item.pickUpCodeSn)" v-if="item.pickUpCodeStatus == 6" >{{item.pickUpCodeSn}}</i-button>
                     </div>
                 </div>
             </div>

+ 5 - 2
kmall-admin/src/main/webapp/WEB-INF/page/shop/address.html

@@ -36,8 +36,8 @@
 		<i-form ref="formValidate" :model="address" :rules="ruleValidate" :label-width="80">
             <Form-item  label="所属门店" prop="addressStore" style="height: 30px;">
                 <i-select v-model="address.addressStore" placeholder="所属门店" label-in-value>
-                    <i-option v-for="store in categoriesStore" :value="store.id"
-                              :key="store.id">{{store.storeName}}
+                    <i-option v-for="store in categoriesStore" :value="store.value"
+                              :key="store.value">{{store.name}}
                     </i-option>
                 </i-select>
             </Form-item>
@@ -48,6 +48,9 @@
                     </i-option>
                 </i-select>
             </Form-item>
+            <Form-item label="发货人名称" prop="senderName">
+                <i-input v-model="address.senderName" placeholder="发货人名称"/>
+            </Form-item>
             <Form-item label="手机号" prop="telNumber">
                 <i-input v-model="address.telNumber" placeholder="手机号"/>
             </Form-item>

+ 72 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/interfacesendlog.html

@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>接口日志记录</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="接口名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+<!--            <div class="buttons-group">-->
+<!--                #if($shiro.hasPermission("interfacesendlog:save"))-->
+<!--                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>-->
+<!--                #end-->
+<!--                #if($shiro.hasPermission("interfacesendlog:update"))-->
+<!--                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>-->
+<!--                #end-->
+<!--                #if($shiro.hasPermission("interfacesendlog:delete"))-->
+<!--                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>-->
+<!--                #end-->
+<!--            </div>-->
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="interfaceSendLog" :rules="ruleValidate" :label-width="80">
+            <Form-item label="请求/响应系统类型" prop="sysType">
+                <i-input v-model="interfaceSendLog.sysType" placeholder="请求/响应系统类型"/>
+            </Form-item>
+            <Form-item label="请求/响应接口类型" prop="interfaceType">
+                <i-input v-model="interfaceSendLog.interfaceType" placeholder="请求/响应接口类型"/>
+            </Form-item>
+            <Form-item label="订单编号" prop="orderSn">
+                <i-input v-model="interfaceSendLog.orderSn" placeholder="订单编号"/>
+            </Form-item>
+            <Form-item label="请求信息" prop="requestMsg">
+                <i-input v-model="interfaceSendLog.requestMsg" placeholder="请求信息"/>
+            </Form-item>
+            <Form-item label="响应状态码" prop="msgStatus">
+                <i-input v-model="interfaceSendLog.msgStatus" placeholder="响应状态码"/>
+            </Form-item>
+            <Form-item label="响应结果" prop="responseMsg">
+                <i-input v-model="interfaceSendLog.responseMsg" placeholder="响应结果"/>
+            </Form-item>
+            <Form-item label="发送时间" prop="requestDate">
+                <i-input v-model="interfaceSendLog.requestDate" placeholder="发送时间"/>
+            </Form-item>
+            <Form-item label="响应时间" prop="responseDate">
+                <i-input v-model="interfaceSendLog.responseDate" placeholder="响应时间"/>
+            </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>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/interfacesendlog.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 73 - 34
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -739,7 +739,7 @@ let vm = new Vue({
                         handle(r.goodsDetails,"add");
                         vm.openSku = false;
                         var data = Object.assign({}, JSON.parse(JSON.stringify(r.goodsDetails)));
-                        console.log("商品详情===>" + JSON.stringify(data));
+                        console.log("商品详情=1=>" + JSON.stringify(data));
                         vm.calGoodsList.push(data);
                         //此时必须异步执行滚动条滑动至底部
                         setTimeout(()=>{
@@ -759,7 +759,7 @@ let vm = new Vue({
                 if(this.goodsList[i].id == value){
                     // var goodsDetails = JSON.parse(JSON.stringify(vm.goodsMap.get(this.goodsList[i].goodsSn)));
                     let goodsDetails = JSON.parse(JSON.stringify(vm.goodsList[i]));
-                    console.log("加法 goods detail =====>" + JSON.stringify(goodsDetails));
+                    // console.log("加法 goods detail =====>" + JSON.stringify(goodsDetails));
                     /*calculateGoodsByMj(goodsDetails,"add");
                     calculateGoodsByMysy(goodsDetails,"add");
                     calculateGoodsByHalfPrice(goodsDetails,"add");*/
@@ -776,7 +776,7 @@ let vm = new Vue({
                 if(this.goodsList[i].id == value){
                     // 获取当前购物车的数量
                     let goodsDetails = JSON.parse(JSON.stringify(vm.goodsList[i]));
-                    console.log("减法 goods detail =====>" + JSON.stringify(goodsDetails));
+                    // console.log("减法 goods detail =====>" + JSON.stringify(goodsDetails));
                     if(goodsDetails.sellVolume === 1){
                         alert("数量至少为1个");
                         return ;
@@ -813,7 +813,6 @@ let vm = new Vue({
             console.log(value);
         },
         deleteItem:function(value){
-            console.log(value);
             // 删除这条记录
             for(var i = 0 ; i < this.goodsList.length ; i++){
                 if(this.goodsList[i].id == value){
@@ -827,7 +826,7 @@ let vm = new Vue({
                     if(vm.brandGetOneFree.get(this.goodsList[i].brand)){
                         var giftBarcode = vm.brandGetOneFree.get(this.goodsList[i].brand).giftBarcode;
                         var muilty = vm.brandGetOneFree.get(this.goodsList[i].brand).buyNum;
-                        var sellNum = this.goodsList[i].sellVolume;;
+                        var sellNum = this.goodsList[i].sellVolume;
                         vm.freeBardcode.set(giftBarcode,sellNum/muilty);
 
                         for(var j = 0 ; j < vm.goodsList.length ; j++){
@@ -850,8 +849,18 @@ let vm = new Vue({
                         vm.halfPrice.set(this.goodsList[i].prodBarcode,1);
                     }
                     var goods = this.goodsList[i];
-                    console.log(goods);
-                    console.log(vm.totalPrice);
+                    // 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);
@@ -877,7 +886,19 @@ let vm = new Vue({
         },
         clearGoodsList:function(){
             confirm('确认清空吗?', function () {
-                alert("清空成功");
+                $.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("未知异常!请联系管理员!");
+                    }
+                })
             })
 
         },
@@ -960,9 +981,8 @@ let vm = new Vue({
         },
         // 计算优惠价格,返回订单详情数据
         calculateOrderPriceSubmit : function () {
-            console.log("11111");
 
-            console.log("点击计算=====>" + JSON.stringify(vm.goodsList));
+            // console.log("点击计算=====>" + JSON.stringify(vm.goodsList));
 
             var couponBarCode = vm.$refs.couponBarCode;
             if (couponBarCode === null || couponBarCode === '') {
@@ -1789,13 +1809,13 @@ function removeByValue(arr, val) {
 function handle(goodsDetails,operatorType){
     vm.goodsDetail = true;
     // goodsDetails.sellVolume = 1;
-    console.log("goodsDetails=====>" + JSON.stringify(goodsDetails));
+    // console.log("goodsDetails=====>" + JSON.stringify(goodsDetails));
     goodsDetails.id = vm.index;
-    console.log("vm.index====>" + vm.index);
+    // console.log("vm.index====>" + vm.index);
     if(!vm.goodsList[vm.index]){
         vm.index = vm.max;
     }
-    console.log("vm.goodsList[vm.index]=====>" + vm.goodsList[vm.index]);
+    // console.log("vm.goodsList[vm.index]=====>" + vm.goodsList[vm.index]);
     vm.max++;
     goodsDetails.goodsDesc = "";
 
@@ -1920,7 +1940,7 @@ function handle(goodsDetails,operatorType){
     vm.showReduceMoney =  Math.round(vm.showReduceMoney * 100) / 100;
 
 
-    console.log("goodsDetails after=====>" + JSON.stringify(vm.goodsList));
+    // console.log("goodsDetails after=====>" + JSON.stringify(vm.goodsList));
 }
 
 // 下单处理
@@ -2020,7 +2040,7 @@ calculateOrderPrice = function() {
         'memberCode': vm.$refs.couponBarCode.value,
         'goodsList' : vm.goodsList
     };
-    console.log("请求参数===>" + JSON.stringify(param));
+    // console.log("请求参数===>" + JSON.stringify(param));
 
     $.ajax({
         type: "POST",
@@ -2031,8 +2051,8 @@ calculateOrderPrice = function() {
             if (r.code === 0) {
                 let calGoodsList = r.data.goodsDetailsDtos;
                 // 更新购物栏中数据
-                console.log("返回====>" + JSON.stringify(r));
-                console.log("计算前数据===>" + JSON.stringify(vm.goodsList));
+                // console.log("返回====>" + JSON.stringify(r));
+                // console.log("计算前数据===>" + JSON.stringify(vm.goodsList));
                 vm.goodsList.clear();
                 calGoodsList.forEach(goods => vm.goodsList.push(goods));
                 vm.actualPrice = r.data.orderTotalPrice;
@@ -2044,8 +2064,8 @@ calculateOrderPrice = function() {
                 vm.scoreLimit = r.data.scoreLimit;
                 vm.beforeScore = r.data.beforeScore;
                 vm.afterScore = r.data.afterScore;
-                console.log("计算后数据===>" + JSON.stringify(calGoodsList));
-                console.log("替换后数据===>" + JSON.stringify(vm.goodsList));
+                // console.log("计算后数据===>" + JSON.stringify(calGoodsList));
+                // console.log("替换后数据===>" + JSON.stringify(vm.goodsList));
 
                 $("#calculateOrderPriceDialog").modal('hide');
                 alert("计算完成");
@@ -2064,7 +2084,7 @@ calculateOrderPrice = function() {
  * @param type                  类型,add:加 minus:减
  */
 handleSellVolume = function (currentGoodsDetail, type) {
-    console.log("处理前商品详情=====>" + JSON.stringify(currentGoodsDetail));
+    // console.log("处理前商品详情=====>" + JSON.stringify(currentGoodsDetail));
     // 当前未被处理的商品数量
     let number = currentGoodsDetail.sellVolume;
     // 当前商品应支付金额
@@ -2082,31 +2102,50 @@ handleSellVolume = function (currentGoodsDetail, type) {
     let currentTotalPrice = new BigNumber(vm.totalPrice);
     // 当前实际支付价
     let currentActualPrice = new BigNumber(vm.actualPrice);
+    let storeId = sessionStorage.getItem("storeId");
+    let sku = currentGoodsDetail.sku;
+    let prodBarcode = currentGoodsDetail.prodBarcode;
     if ('add' === type) {
-        currentGoodsDetail.sellVolume += 1;
-        currentGoodsDetail.goodstaxes = currentGoodsTax.add(singleTax).toString();
-        currentGoodsDetail.actualPaymentAmount = currentActualPaymentAmount.add(singleActualPaymentAmount).toString();
-        vm.totalCount += 1;
-        vm.totalPrice = currentTotalPrice.add(retailPrice).toString();
-        vm.actualPrice = currentActualPrice.add(singleActualPaymentAmount).toString();
+        $.get("../goods/number/add/"+ storeId +"/" + sku + "/" + prodBarcode + "/" + number, function (res) {
+            if (res.code === 0) {
+                currentGoodsDetail.sellVolume += 1;
+                currentGoodsDetail.goodstaxes = currentGoodsTax.add(singleTax).toString();
+                currentGoodsDetail.actualPaymentAmount = currentActualPaymentAmount.add(singleActualPaymentAmount).toString();
+                vm.totalCount += 1;
+                vm.totalPrice = currentTotalPrice.add(retailPrice).toString();
+                vm.actualPrice = currentActualPrice.add(singleActualPaymentAmount).toString();
+            } else if (res.code === 500) {
+                alert(res.msg);
+            } else {
+                alert("未知异常!请联系管理员!");
+            }
+        });
     } else {
-        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();
+        $.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("未知异常!请联系管理员!");
+            }
+        });
     }
 
     for (let i = 0; i < vm.goodsList.length; i++) {
         let goods = vm.goodsList[i];
         if (currentGoodsDetail.prodBarcode === goods.prodBarcode && currentGoodsDetail.goodsSn === goods.goodsSn) {
             let splice = vm.goodsList.splice(i, 1, currentGoodsDetail);
-            console.log("被删除的元素====>" + JSON.stringify(splice));
+            // console.log("被删除的元素====>" + JSON.stringify(splice));
         }
     }
 
-    console.log("处理后商品详情=====>" + JSON.stringify(currentGoodsDetail))
+    // console.log("处理后商品详情=====>" + JSON.stringify(currentGoodsDetail));
 }
 
 

+ 2 - 1
kmall-admin/src/main/webapp/js/shop/address.js

@@ -16,6 +16,7 @@ $(function () {
 					}
 				}
 			},
+			{label: '发货人名称', name: 'senderName', index: 'sender_name', width: 60},
 			{label: '手机号', name: 'telNumber', index: 'tel_number', width: 60},
 			{label: '邮政编码', name: 'postalCode', index: 'postal_Code', width: 60},
 			{label: '省', name: 'provinceName', index: 'province_Name', width: 60},
@@ -150,7 +151,7 @@ let vm = new Vue({
 			});
 		},
 		getCategoriesStore: function () {
-			$.get("../store/queryAll", function (r) {
+			$.get("../store/queryAllDictionary", function (r) {
 				vm.categoriesStore = r.list;
 			});
 		},

+ 8 - 8
kmall-admin/src/main/webapp/js/shop/goods.js

@@ -38,14 +38,14 @@ $(function () {
             //         return '-';
             //     }},
             {label: '商品库存', name: 'goodsNumber', index: 'goodsNumber', width: 100, align: 'right'},
-            {label: '待恢复数量', name: 'toBeRestored', index: 'toBeRestored', width: 100, align: 'right',formatter:function(value){
-                if(value){
-                    return value;
-                }else{
-                    return "0";
-                }
-
-                }},
+            // {label: '待恢复数量', name: 'toBeRestored', index: 'toBeRestored', width: 100, align: 'right',formatter:function(value){
+            //     if(value){
+            //         return value;
+            //     }else{
+            //         return "0";
+            //     }
+            //
+            //     }},
             {label: '日常价', name: 'dailyPrice', index: 'dailyPrice', width: 100, align: 'right'},
             {label: '成本价', name: 'costPrice', index: 'costPrice', width: 100, align: 'right'},
             // {label: '零售价格', name: 'retailPrice', index: 'retail_price', width: 80, align: 'center'},

+ 149 - 0
kmall-admin/src/main/webapp/js/shop/interfacesendlog.js

@@ -0,0 +1,149 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../interfacesendlog/list',
+        datatype: "json",
+        colModel: [
+			{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: 'requestDate', index: 'request_date',align: 'center', width: 70,formatter:function(value){
+					return transDate(value, 'yyyy-MM-dd hh:mm:ss');
+				}},
+			{label: '响应时间', name: 'responseDate', index: 'response_date',align: 'center', width: 70,formatter:function(value){
+					return transDate(value, 'yyyy-MM-dd hh:mm:ss');
+				}},
+			{label: '异常信息', name: 'exceptionMsg', index: 'exception_msg', width: 80}],
+		viewrecords: true,
+        height: 550,
+        rowNum: 10,
+        rowList: [20, 50, 80],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        showList: true,
+        title: null,
+		interfaceSendLog: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    name: ''
+		}
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.interfaceSendLog = {};
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.interfaceSendLog.id == null ? "../interfacesendlog/save" : "../interfacesendlog/update";
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.interfaceSendLog),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ids = getSelectedRows();
+			if (ids == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../interfacesendlog/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(ids),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(id){
+			$.get("../interfacesendlog/info/"+id, function (r) {
+                vm.interfaceSendLog = r.interfaceSendLog;
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+	}
+});

+ 9 - 8
kmall-admin/src/main/webapp/js/shop/storeProductStock.js

@@ -52,14 +52,14 @@ $(function () {
                 }},
             {label: '门店库存', name: 'stockNum', index: 'stockNum', width: 80, align: 'center'},
             {label: '园区库存', name: 'parkStock', index: 'parkStock', width: 80, align: 'center'},
-            {label: '待恢复数量', name: 'toBeRestored', index: 'toBeRestored', width: 100, align: 'right',formatter:function(value){
-                    if(value){
-                        return value;
-                    }else{
-                        return "0";
-                    }
-
-                }},
+            // {label: '待恢复数量', name: 'toBeRestored', index: 'toBeRestored', width: 100, align: 'right',formatter:function(value){
+            //         if(value){
+            //             return value;
+            //         }else{
+            //             return "0";
+            //         }
+            //
+            //     }},
             {label: '零售价格', name: 'retailPrice', index: 'retailPrice', width: 80, align: 'right'},
             {label: '市场价', name: 'marketPrice', index: 'marketPrice', width: 80, align: 'right'},
             {label: '底线价格', name: 'bottomLinePrice', index: 'bottomLinePrice', width: 80, align: 'right',formatter: function (value) {
@@ -69,6 +69,7 @@ $(function () {
                     return '-';
                 }},
             // {label: '库存价格', name: 'stockPrice', index: 'stockPrice', width: 80},
+            {label: '出区数', name: 'exitRegionNumber', index: 'exit_region_number', width: 80, align: 'right'},
             {
                 label: '销售量',
                 name: 'sellVolume',

BIN
kmall-admin/src/main/webapp/statics/img/sf_img.jpg


+ 26 - 0
kmall-api/src/main/java/com/kmall/api/entity/OrderGoodsVo.java

@@ -79,6 +79,16 @@ public class OrderGoodsVo implements Serializable {
      */
     private Integer deductionScore;
 
+    /**
+     * 订单编号
+     */
+    private String orderSn;
+
+    /**
+     * 条码
+     */
+    private String barcode;
+
 
 
     public BigDecimal getDiscountedPrice() {
@@ -329,4 +339,20 @@ public class OrderGoodsVo implements Serializable {
     public void setDeductionScore(Integer deductionScore) {
         this.deductionScore = deductionScore;
     }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
+
+    public String getBarcode() {
+        return barcode;
+    }
+
+    public void setBarcode(String barcode) {
+        this.barcode = barcode;
+    }
 }

+ 65 - 0
kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java

@@ -211,6 +211,31 @@ public class OrderVo implements Serializable {
 
     private String discountApplyType;
 
+    /**
+     * 商品总数量
+     */
+    private Integer number;
+
+    /**
+     * 调用支付接口请求体
+     */
+    private String request;
+
+    /**
+     * 调用支付接口响应
+     */
+    private String response;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 支付方式
+     */
+    private String payApp;
+
     public String getDiscountApplyType() {
         return discountApplyType;
     }
@@ -1004,4 +1029,44 @@ public class OrderVo implements Serializable {
     public void setAliTradeNo(String aliTradeNo) {
         this.aliTradeNo = aliTradeNo;
     }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public String getRequest() {
+        return request;
+    }
+
+    public void setRequest(String request) {
+        this.request = request;
+    }
+
+    public String getResponse() {
+        return response;
+    }
+
+    public void setResponse(String response) {
+        this.response = response;
+    }
+
+    public String getIdCard() {
+        return idCard;
+    }
+
+    public void setIdCard(String idCard) {
+        this.idCard = idCard;
+    }
+
+    public String getPayApp() {
+        return payApp;
+    }
+
+    public void setPayApp(String payApp) {
+        this.payApp = payApp;
+    }
 }

+ 62 - 0
kmall-common/src/main/java/com/kmall/common/constant/Dict.java

@@ -1243,6 +1243,34 @@ public class Dict {
         }
     }
 
+    public enum PickUpCodeStatusEnum {
+        item_0("0", "待清关"),
+        item_1("1", "核销成功"),
+        item_2("2", "清关成功"),
+        item_3("3", "退款"),
+        item_4("4", "清关失败"),
+        item_5("5", "已提货"),
+        item_6("6", "订单推单失败"),
+        ;
+
+        private final String status;
+
+        private final String desc;
+
+        PickUpCodeStatusEnum(String status, String desc) {
+            this.status = status;
+            this.desc = desc;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
     /**
      * effectTimeType
      */
@@ -1979,4 +2007,38 @@ public class Dict {
         }
     }
 
+    /**
+     * 地址类型
+     */
+    public enum sendLog {
+        item_mall("1", "免税MALL"),
+        item_member("2", "会员系统"),
+        item_warehouse("3", "仓库系统"),
+        item_smg("4", "短信");
+
+        private String item;
+        private String itemName;
+
+        sendLog(String item, String itemName) {
+            this.item = item;
+            this.itemName = itemName;
+        }
+
+        public String getItem() {
+            return item;
+        }
+
+        public void setItem(String item) {
+            this.item = item;
+        }
+
+        public String getItemName() {
+            return itemName;
+        }
+
+        public void setItemName(String itemName) {
+            this.itemName = itemName;
+        }
+    }
+
 }

+ 1 - 1
kmall-common/src/main/java/com/kmall/common/utils/Query.java

@@ -17,7 +17,7 @@ public class Query extends LinkedHashMap<String, Object> {
     //当前页码
     private int page;
     //每页条数
-    private int limit = 10;
+    private int limit = 20;
 
     public Query(Map<String, Object> params) {
         this.putAll(params);

+ 37 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/dto/PayOriginInfoDTO.java

@@ -0,0 +1,37 @@
+package com.kmall.manager.manager.dto;
+
+/**
+ * 支付原始信息
+ * @author lhm
+ * @createDate 2021-12-07
+ */
+public class PayOriginInfoDTO {
+
+    private String request;
+
+    private String response;
+
+    public String getRequest() {
+        return request;
+    }
+
+    public void setRequest(String request) {
+        this.request = request;
+    }
+
+    public String getResponse() {
+        return response;
+    }
+
+    public void setResponse(String response) {
+        this.response = response;
+    }
+
+    @Override
+    public String toString() {
+        return "PayOriginInfoDTO{" +
+                "request='" + request + '\'' +
+                ", response='" + response + '\'' +
+                '}';
+    }
+}

+ 91 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/redis/JedisUtil.java

@@ -132,6 +132,97 @@ public class JedisUtil implements Serializable {
     }
 
     /**
+     * 设置缓存(hash),全
+     *
+     * @param key   键
+     * @param map   值
+     * @return      结果
+     */
+    public static String hmset(String key, Map<String, String> map) {
+        String result = null;
+        Jedis jedis = null;
+        try {
+            jedis = getResource();
+            result = jedis.hmset(key, map);
+            logger.debug("set {} = {}", key, map);
+        } catch (Exception e) {
+            logger.warn("set {} ", key, e);
+        } finally {
+            returnResource(jedis);
+        }
+        return result;
+    }
+
+    /**
+     * 设置缓存(hash),单个
+     *
+     * @param key       键
+     * @param entryKey  值
+     * @param value     值
+     * @return      结果
+     */
+    public static Long hset(String key, String entryKey, String value) {
+        Long result = null;
+        Jedis jedis = null;
+        try {
+            jedis = getResource();
+            result = jedis.hset(key, entryKey, value);
+            logger.debug("set {} : {} = {}", key, entryKey, value);
+        } catch (Exception e) {
+            logger.warn("set {} ", key, e);
+        } finally {
+            returnResource(jedis);
+        }
+        return result;
+    }
+
+    /**
+     * 删除hash单条
+     *
+     * @param key       hash key
+     * @param entryKey  entry key
+     * @return          result
+     */
+    public static Long hdel(String key, String entryKey) {
+        Long result = null;
+        Jedis jedis = null;
+        try {
+            jedis = getResource();
+            result = jedis.hdel(key, entryKey);
+            logger.debug("del {} : {}", key, entryKey);
+        } catch (Exception e) {
+            logger.warn("del {} ", key, e);
+        } finally {
+            returnResource(jedis);
+        }
+        return result;
+    }
+
+    /**
+     * 获取缓存(hash)
+     *
+     * @param key       hash的key
+     * @param entryKey  子项的key
+     * @return 值
+     */
+    public static String hget(String key, String entryKey) {
+        String value = null;
+        Jedis jedis = null;
+        try {
+            jedis = getResource();
+            if (jedis.exists(getBytesKey(key))) {
+                value = new String((jedis.hget(getBytesKey(key), getBytesKey(entryKey))));
+                logger.debug("getObject {} = {}", key, value);
+            }
+        } catch (Exception e) {
+            logger.warn("getObject {} ", key, e);
+        } finally {
+            returnResource(jedis);
+        }
+        return value;
+    }
+
+    /**
      * 设置缓存过期时间
      *
      * @param key          键

+ 4 - 1
kmall-manager/src/main/java/com/kmall/manager/manager/wechat/WechatUtil.java

@@ -2,6 +2,7 @@ package com.kmall.manager.manager.wechat;
 
 import com.kmall.common.utils.*;
 import com.kmall.common.utils.wechat.*;
+import com.kmall.manager.manager.dto.PayOriginInfoDTO;
 import com.kmall.manager.manager.pay.wxpay.CommonWxPayPropertiesBuilder;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpEntity;
@@ -465,7 +466,7 @@ public class WechatUtil {
      */
     public static WechatMicropayApiResult wxMicropay(String shop_name, String orderBizType, String attach,
                                                      String out_trade_no, double orderMoney, String ip,
-                                                     String auth_code) {
+                                                     String auth_code, PayOriginInfoDTO payOriginInfoDTO) {
         //初始化请求微信服务器的配置信息包括appid密钥等
         //转换金钱格式
         BigDecimal bdOrderMoney = new BigDecimal(orderMoney, MathContext.DECIMAL32);
@@ -476,6 +477,8 @@ public class WechatUtil {
         String mapToXml = MapUtils.convertMap2Xml(params);
         //请求微信
         String reponseXml = sendMicropaySSLPostToWx(mapToXml);
+        payOriginInfoDTO.setRequest(JacksonUtils.toJson(params));
+        payOriginInfoDTO.setResponse(reponseXml);
         WechatMicropayApiResult result =
                 (WechatMicropayApiResult) XmlUtil.xmlStrToBean(reponseXml, WechatMicropayApiResult.class);
         if (WXTradeState.SUCCESS.getCode().equals(result.getReturn_code()) && "OK".equals(result.getReturn_msg())) {

+ 3 - 3
kmall-manager/src/main/resources/conf/db.properties

@@ -1,16 +1,16 @@
 ########## \u6570\u636E\u5E93\u914D\u7F6E ##########
 
 ####========== \u5F00\u53D1\u73AF\u5883 ==========
-jdbc.url=jdbc:mysql://14.29.226.8:3306/kmall-haikong?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+jdbc.url=jdbc:mysql://14.29.226.8:3306/kmall-haikong?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
 jdbc.username=root
 jdbc.password=G$Debpk^pn
 ####========== \u6D4B\u8BD5\u73AF\u5883 ==========
-#jdbc.url=jdbc:mysql://192.168.1.202:3306/kmall-haikong?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+#jdbc.url=jdbc:mysql://192.168.1.202:3306/kmall-haikong?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
 #jdbc.username=root
 #jdbc.password=t2GlpD6z
 ####========== \u751F\u4EA7\u73AF\u5883 ==========
 # \u5F85\u5B9A
-#jdbc.url=jdbc:mysql://:3306/kmall-haikong?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+#jdbc.url=jdbc:mysql://:3306/kmall-haikong?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
 #jdbc.username=kmall_cw
 #jdbc.password=eb6zHJg%x3
 

+ 3 - 2
kmall-manager/src/main/resources/conf/redis.properties

@@ -5,10 +5,11 @@ redis.env=prod
 
 # \u5F00\u53D1\u73AF\u5883
 redis.dev.keyPrefix=platform
+# \u6D4B\u8BD5redis\uFF0C\u6709\u5BC6\u7801
+#redis.dev.host=183.62.225.124
 redis.dev.host=127.0.0.1
-#redis.dev.host=183.3.221.143
 redis.dev.port=6379
-redis.dev.password=Abc-123#*.-
+#redis.dev.password=Abc-123#*.-
 redis.dev.pool.maxIdle=200
 redis.dev.pool.maxWait=1000
 redis.dev.pool.maxTotal=10000