Jelajahi Sumber

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

lhm 3 tahun lalu
induk
melakukan
88de784833
98 mengubah file dengan 4206 tambahan dan 665 penghapusan
  1. 6 1
      kmall-admin/pom.xml
  2. 26 75
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  3. 20 0
      kmall-admin/src/main/java/com/kmall/admin/controller/SysMacroController.java
  4. 67 7
      kmall-admin/src/main/java/com/kmall/admin/controller/vip/Mall2PointsRulesController.java
  5. 12 0
      kmall-admin/src/main/java/com/kmall/admin/dao/CategoryDao.java
  6. 11 3
      kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java
  7. 11 0
      kmall-admin/src/main/java/com/kmall/admin/dao/MallVmcSendLogDao.java
  8. 17 0
      kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesFullGiftDao.java
  9. 11 0
      kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesPromotionDao.java
  10. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/OrderDao.java
  11. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/OrderGoodsDao.java
  12. 18 0
      kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java
  13. 13 1
      kmall-admin/src/main/java/com/kmall/admin/dao/StoreDao.java
  14. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/SysMacroDao.java
  15. 10 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesDao.java
  16. 6 0
      kmall-admin/src/main/java/com/kmall/admin/dao/vip/Mall2PointsRulesDao.java
  17. 50 0
      kmall-admin/src/main/java/com/kmall/admin/dto/GoodsDetailsDto.java
  18. 21 0
      kmall-admin/src/main/java/com/kmall/admin/dto/Mall2RulesDto.java
  19. 11 0
      kmall-admin/src/main/java/com/kmall/admin/entity/CategoryEntity.java
  20. 16 2
      kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java
  21. 35 0
      kmall-admin/src/main/java/com/kmall/admin/entity/MallVmcSendlogEntity.java
  22. 65 0
      kmall-admin/src/main/java/com/kmall/admin/entity/MkActivitiesCouponEntity.java
  23. 76 1
      kmall-admin/src/main/java/com/kmall/admin/entity/MkActivitiesFullGiftEntity.java
  24. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ProductStoreRelaEntity.java
  25. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/StoreEntity.java
  26. 23 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderEntity.java
  27. 84 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderInfoEntity.java
  28. 63 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderItemsEntity.java
  29. 60 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectPayinfoEntity.java
  30. 24 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectSeaportInfoEntity.java
  31. 20 0
      kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2DetilEntity.java
  32. 62 20
      kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2PointsRulesEntity.java
  33. 86 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongVmcconnectTemplate.java
  34. 4 4
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongWarehouseTemplate.java
  35. 119 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/VmcShopTemplate.java
  36. 4 1
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongConfig.java
  37. 50 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongProperties.java
  38. 79 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java
  39. 48 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/VmcconnectUrlEnum.java
  40. 1 1
      kmall-admin/src/main/java/com/kmall/admin/haikong/dto/WareQueryStockResponseDTO.java
  41. 13 2
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberSysAccessTokenRefreshTask.java
  42. 174 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/HttpsClientUtil.java
  43. 100 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Md5Utils.java
  44. 37 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Response.java
  45. 33 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/VmcconnectSignUtils.java
  46. 2 10
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/WareSysSignUtils.java
  47. 14 11
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/XmlUtils.java
  48. 42 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceResponseVO.java
  49. 61 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceVO.java
  50. 23 9
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/QueryGoodsVO.java
  51. 11 3
      kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java
  52. 15 0
      kmall-admin/src/main/java/com/kmall/admin/service/MkActivitiesFullGiftService.java
  53. 8 0
      kmall-admin/src/main/java/com/kmall/admin/service/MkActivitiesPromotionService.java
  54. 11 1
      kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java
  55. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/SysMacroService.java
  56. 305 252
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  57. 22 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesFullGiftServiceImpl.java
  58. 12 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesPromotionServiceImpl.java
  59. 695 155
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  60. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/SysMacroServiceImpl.java
  61. 13 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesServiceImpl.java
  62. 123 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java
  63. 9 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesService.java
  64. 16 1
      kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java
  65. 19 0
      kmall-admin/src/main/resources/XmlTemplate/mallRulesList.xml
  66. 48 0
      kmall-admin/src/main/resources/mybatis/mapper/CategoryDao.xml
  67. 10 3
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  68. 27 0
      kmall-admin/src/main/resources/mybatis/mapper/MallVmcSendLogDao.xml
  69. 46 6
      kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesCouponDao.xml
  70. 116 7
      kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesFullGiftDao.xml
  71. 21 1
      kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesPromotionDao.xml
  72. 4 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml
  73. 4 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderGoodsDao.xml
  74. 66 0
      kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml
  75. 45 0
      kmall-admin/src/main/resources/mybatis/mapper/StoreDao.xml
  76. 9 0
      kmall-admin/src/main/resources/mybatis/mapper/SysMacroDao.xml
  77. 26 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesDao.xml
  78. 16 0
      kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2PointsRulesDao.xml
  79. 60 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mall2RulesDetil.html
  80. 30 6
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesfullgift.html
  81. 29 8
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  82. 18 21
      kmall-admin/src/main/webapp/WEB-INF/page/vip/mall2pointsrules.html
  83. 210 0
      kmall-admin/src/main/webapp/js/mk/mall2RulesDetil.js
  84. 10 4
      kmall-admin/src/main/webapp/js/mk/mkactivitiesfullgift.js
  85. 149 28
      kmall-admin/src/main/webapp/js/sale/sale.js
  86. 9 9
      kmall-admin/src/main/webapp/js/shop/goods.js
  87. 76 6
      kmall-admin/src/main/webapp/js/vip/mall2pointsrules.js
  88. TEMPAT SAMPAH
      kmall-admin/src/main/webapp/statics/file/mall2RulesDetil_1.0.xlsx
  89. 138 0
      kmall-admin/src/main/webapp/statics/libs/bignumber.js
  90. 1 1
      kmall-api/pom.xml
  91. 1 1
      kmall-common/pom.xml
  92. 3 0
      kmall-common/src/main/java/com/kmall/common/constant/JxlsXmlTemplateName.java
  93. 1 1
      kmall-framework/pom.xml
  94. 1 1
      kmall-gen/pom.xml
  95. 1 1
      kmall-manager/pom.xml
  96. 5 0
      kmall-manager/src/main/resources/conf/haikong.properties
  97. 1 1
      kmall-schedule/pom.xml
  98. 5 0
      pom.xml

+ 6 - 1
kmall-admin/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>kmall-pt-general</artifactId>
+        <artifactId>kmall-haikong</artifactId>
         <groupId>com.kmall</groupId>
         <version>3.1.0</version>
     </parent>
@@ -153,6 +153,11 @@
             <artifactId>amqp-client</artifactId>
             <version>${amqp-client-version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.4</version>
+        </dependency>
 
 
     </dependencies>

+ 26 - 75
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -4,10 +4,12 @@ import com.kmall.admin.dto.OrderExpressDto;
 import com.kmall.admin.dto.SystemFormatDto;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
 import com.kmall.admin.service.*;
 import com.kmall.admin.utils.CalculateTax;
 import com.kmall.admin.utils.ParamUtils;
 import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.common.constant.Dict;
 import com.kmall.common.constant.JxlsXmlTemplateName;
 import com.kmall.common.utils.*;
@@ -30,7 +32,6 @@ import net.sf.json.JSONObject;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -1071,24 +1072,23 @@ public class OrderController {
     }
 
     /**
-     * 退款
+     * 海控退款
      * @param param
      * @return
      * @throws IOException
      */
-    @RequestMapping("/orderRefund")
+    @RequestMapping("/orderHkRefund")
     public R orderRefund( @RequestBody Map param) {
 
         SysUserEntity user = ShiroUtils.getUserEntity();
         Integer orderId = (Integer) param.get("orderId");
         OrderEntity orderInfo = orderService.queryObject(orderId.longValue());
-
         String sessionId = (String) param.get("sessionId");
-
         try {
             return orderService.orderRefund(orderInfo,sessionId,user);
         } catch (Exception e) {
             e.printStackTrace();
+            logger.error("[海控退款异常]"+orderInfo.getOrderSn());
         }
         return R.ok();
 
@@ -1363,9 +1363,17 @@ public class OrderController {
 
     }
 
+    @PostMapping("/calculateOrderDiscountPrice")
+    public R calculateOrderDiscountPrice(@RequestBody CalculateOrderDiscountPriceVO calculateOrderDiscountPriceVo) {
 
+        try {
+            CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO = orderService.calculateOrderDiscountPrice(calculateOrderDiscountPriceVo);
+            return R.ok().put("data", calculateOrderDiscountPriceResponseVO);
+        } catch (Exception e) {
+            return R.error("计算出错!请联系管理员!" + e.getMessage());
+        }
 
-
+    }
 
 
 
@@ -1396,32 +1404,6 @@ public class OrderController {
         if (systemFormatList != null && systemFormatList.size() > 0) {
             for (SystemFormatDto systemFormat : systemFormatList) {
 
-//                // 如果有退款,获取销售时间的年月和退款时间的年月
-//                if (StringUtils.isNotEmpty(systemFormat.getOutRefundNo())){
-//                    Date saleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(systemFormat.getTimeStampDetails());
-//                    Date refundDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(systemFormat.getRefundTime());
-//                    Calendar saleC = Calendar.getInstance();
-//                    saleC.setTime(saleDate);
-//                    Calendar refundC = Calendar.getInstance();
-//                    refundC.setTime(refundDate);
-//                    int saleYear = saleC.get(Calendar.YEAR);// 销售的年
-//                    int refundYear = refundC.get(Calendar.YEAR);// 退款的年
-//                    int saleMonth = saleC.get(Calendar.MONTH);
-//                    int refundMonth = refundC.get(Calendar.MONTH);
-//
-//                    // 如果是同一年并且销售时间是比退款时间少的话
-//                    if (saleMonth<refundMonth && saleYear==refundYear){
-//                        systemFormat.setOrderStatus(Dict.orderStatus.item_301.getItem());
-//                    }
-//                    if (saleYear!= refundYear){
-//                        systemFormat.setOrderStatus(Dict.orderStatus.item_301.getItem());
-//                    }
-//
-//
-//                }
-
-
-//                LinkedHashMap<String, Object> map = new LinkedHashMap<>(32);
                 List<Entry> entries = new ArrayList<>();
                 if (Objects.nonNull(systemFormat.getTaxRate()) && Objects.nonNull(systemFormat.getTotalSalesInclTax())){
 
@@ -1490,49 +1472,7 @@ public class OrderController {
                     primeCost = gp.setScale(2,BigDecimal.ROUND_HALF_UP).toString();
                     systemFormat.setPrimeCost(primeCost);
                 }
-                /*map.put("ReceiptNo",systemFormat.getReceiptNo());
-                map.put("StoreName",systemFormat.getStoreName());
-                map.put("CashRegisterNo",systemFormat.getCashRegisterNo());
-                map.put("TimeStampDetails",systemFormat.getTimeStampDetails());
-                map.put("StaffID",systemFormat.getStaffID());
-                map.put("StaffName",systemFormat.getStaffName());
-                map.put("PayFlag",systemFormat.getPayFlag());
-                map.put("OrderStatus",orderStatus);
-                map.put("OrderSnWx",systemFormat.getOrderSnWx());
-                map.put("OrderSnAli",systemFormat.getOrderSnAli());
-                map.put("HSCode",systemFormat.getHsCode());
-                map.put("HSCodeName",systemFormat.getHsCodeName());
-                map.put("EmatouCode",systemFormat.getEmatouCode());
-                map.put("PLU",systemFormat.getPlu());
-                map.put("MychemID",systemFormat.getMychemID());
-                map.put("ProductNameEN",systemFormat.getProductNameEN());
-                map.put("ProductNameCN",systemFormat.getProductNameCN());
-                map.put("Barcode",systemFormat.getBarcode());
-                map.put("PackSize",systemFormat.getPackSize());
-                map.put("ProductSpecification",systemFormat.getProductSpecification());
-                map.put("Brand",systemFormat.getBrand());
-                map.put("EDLP",systemFormat.getEdlp());
-                map.put("CurrentPrice",systemFormat.getCurrentPrice());
-                map.put("CostPrice",systemFormat.getCostPrice());
-//                map.put("PrimeCost",systemFormat.getPrimeCost());
-//                map.put("GoodsNumber",systemFormat.getGoodsNumber());
-                map.put("DeductionRate",systemFormat.getDeductionRate());
-                map.put("UnitSold",systemFormat.getUnitSold());
-                map.put("Sales",systemFormat.getSales());
-                map.put("TaxAmount",systemFormat.getTaxAmount());
-                map.put("TotalSalesInclTax",systemFormat.getTotalSalesInclTax());
-                map.put("TaxRate",systemFormat.getTaxRate());
-                map.put("GP1",systemFormat.getGp1());
-                map.put("GP2",systemFormat.getGp2());
-                map.put("ProductCategory",systemFormat.getProductCategory());
-                map.put("SupplierName",systemFormat.getSupplierName());
-                map.put("TransactionType",systemFormat.getTransactionType());
-                map.put("SaleReturnType",systemFormat.getSaleReturnType());
-
-
-                map.put("Remark",systemFormat.getRemark());
-
-                list.add(map);*/
+
 
                 entries.add(new Entry("ReceiptNo",systemFormat.getReceiptNo()));
                 entries.add(new Entry("StoreName",systemFormat.getStoreName()));
@@ -1635,4 +1575,15 @@ public class OrderController {
         return entries;
     }
 
+
+    /**
+     * 重发订单
+     * @param orderSn
+     * @return
+     */
+    @RequestMapping("/resendOrderHkMall/{orderSn}")
+    public R resendOrderHkMall(@PathVariable("orderSn") String orderSn){
+        return orderService.resendOrderHkMall(orderSn);
+    }
+
 }

+ 20 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/SysMacroController.java

@@ -1,6 +1,9 @@
 package com.kmall.admin.controller;
 
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.json.JsonWriteContext;
 import com.kmall.admin.entity.SysMacroEntity;
+import com.kmall.admin.service.StoreService;
 import com.kmall.admin.service.SysMacroService;
 import com.kmall.common.utils.PageUtils;
 import com.kmall.common.utils.Query;
@@ -24,6 +27,8 @@ import java.util.Map;
 public class SysMacroController {
     @Autowired
     private SysMacroService sysMacroService;
+    @Autowired
+    private StoreService storeService;
 
     /**
      * 查看列表
@@ -110,4 +115,19 @@ public class SysMacroController {
 
         return R.ok().put("list", list);
     }
+
+    /**
+     * 查询数据字典
+     *
+     * @param id
+     * @return
+     */
+    @RequestMapping("/queryMacrosByValueRuRules")
+    public R queryMacrosByValueRules(@RequestParam Integer id) {
+
+        List<SysMacroEntity> list = sysMacroService.queryMacrosByValueRules(id);
+
+        return R.ok().put("list", list);
+    }
+
 }

+ 67 - 7
kmall-admin/src/main/java/com/kmall/admin/controller/vip/Mall2PointsRulesController.java

@@ -1,18 +1,24 @@
 package com.kmall.admin.controller.vip;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.kmall.admin.dto.Mall2RulesDto;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
+import com.kmall.common.constant.JxlsXmlTemplateName;
 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 com.kmall.common.utils.excel.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
 import com.kmall.admin.service.vip.Mall2PointsRulesService;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 积分规则表Controller
@@ -26,7 +32,8 @@ import com.kmall.admin.service.vip.Mall2PointsRulesService;
 public class Mall2PointsRulesController {
     @Autowired
     private Mall2PointsRulesService mall2PointsRulesService;
-
+    @Autowired
+    private ExcelUtil excelUtil;
     /**
      * 查看列表
      */
@@ -89,19 +96,72 @@ public class Mall2PointsRulesController {
     @ResponseBody
     public R delete(@RequestBody Integer[]mprIds) {
         mall2PointsRulesService.deleteBatch(mprIds);
-
         return R.ok();
     }
 
     /**
-     * 查看所有列表
+     * 上传文件积分明细信息
+     */
+    @RequestMapping("/rulesUpload")
+    @ResponseBody
+    public R rulesUpload(@RequestParam("file") MultipartFile file, Long mkaId) {
+        List<Mall2RulesDto> mall2RulesDtoList = new ArrayList<>();//信息
+        try {
+            Mall2RulesDto mall2RulesDto = new Mall2RulesDto();
+            Map<String, Object> beans = new HashMap<>();
+            beans.put("Mall2RulesDto", mall2RulesDto);
+            beans.put("Mall2RulesDtoList", mall2RulesDtoList);
+            if (file.isEmpty()) {
+                return R.error("文件不能为空!");
+            }
+            excelUtil.readExcel(JxlsXmlTemplateName.MALL_RULES_LIST, beans, file.getInputStream());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error("导入失败!");
+        }
+        mall2PointsRulesService.rulesUploadDetil(mall2RulesDtoList,mkaId);
+        //上传文件
+        return R.ok("导入成功!");
+    }
+
+    /**
+     * 查看所有明细列表
      */
     @RequestMapping("/queryAll")
     @ResponseBody
-    public R queryAll(@RequestParam Map<String, Object> params) {
+    public R queryRulesDetilAll(@RequestParam Map<String, Object> params) {
+
+
+        return R.ok().put("list", null);
+    }
+
+
+    /**
+     * 查看积分列表详情
+     */
+    @RequestMapping("/detilList")
+    @ResponseBody
+    public R detilList(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        Map<String,Object> map = mall2PointsRulesService.queryDetilList(query);
+        List<Mall2DetilEntity> mall2PointsRulesList = (List<Mall2DetilEntity>)map.get("list");
+        int total = (int)map.get("total");
+
+        PageUtils pageUtil = new PageUtils(mall2PointsRulesList, total, query.getLimit(), query.getPage());
 
-        List<Mall2PointsRulesEntity> list = mall2PointsRulesService.queryList(params);
+        return R.ok().put("page", pageUtil);
+    }
 
-        return R.ok().put("list", list);
+    /**
+     * 删除列表详情
+     */
+    @RequestMapping("/deleteDetil/{mkaId}")
+    @ResponseBody
+    public R deleteDetil(@PathVariable("mkaId") Long typeId,@RequestBody Integer[]mprIds) {
+        mall2PointsRulesService.deleteDetil(mprIds,typeId);
+        return R.ok();
     }
+
 }

+ 12 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/CategoryDao.java

@@ -1,6 +1,8 @@
 package com.kmall.admin.dao;
 
+import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.CategoryEntity;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
 
@@ -18,4 +20,14 @@ public interface CategoryDao extends BaseDao<CategoryEntity> {
     List<CategoryEntity> queryObjectByStoreId(@Param("storeId") Long storeId);
 
     CategoryEntity queryByName(@Param("categoryName") String categoryName);
+
+    List<Mall2DetilEntity> queryCategoryRulesDetil(Long pointsRulesId);
+
+    int queryCategoryDetilTotal(Long id);
+
+    void updateCategoryRulesDetil(Integer[] mprIds);
+
+    Long queryObjectCategoryByName(String trim);
+
+    void updateObjectCategory(List<Mall2RulesDto> pointsRulesList);
 }

+ 11 - 3
kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java

@@ -3,7 +3,7 @@ package com.kmall.admin.dao;
 import com.kmall.admin.dto.GoodsDetailsDto;
 import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
@@ -110,8 +110,16 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
     /**
      * 查询库存及sku的信息,查询出来的库存是门店的库存
      *
-     * @param queryGoodsVoList 查询条件,包含商品条码、sku、门店id
+     * @param queryGoodsVOList 查询条件,包含商品条码、sku、门店id
      * @return 商品信息
      */
-    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVo> queryGoodsVoList);
+    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVO> queryGoodsVOList);
+
+    /**
+     * 根据产品条码和sku查询保税展示补货的商品
+     * @param prodBarcode   商品条码
+     * @param sku           sku
+     * @return              商品信息
+     */
+    GoodsEntity queryGoodsInfoByProductBarcodeAndSku(@Param("prodBarcode") String prodBarcode, @Param("sku") String sku);
 }

+ 11 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/MallVmcSendLogDao.java

@@ -0,0 +1,11 @@
+package com.kmall.admin.dao;
+
+public interface MallVmcSendLogDao {
+
+    /**
+     * 新增免税mall请求日志
+     * @param mallVmcSendlogEntity
+     */
+    public void saveVmcSend(com.kmall.admin.entity.MallVmcSendlogEntity mallVmcSendlogEntity);
+
+}

+ 17 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesFullGiftDao.java

@@ -5,6 +5,8 @@ import com.kmall.admin.entity.MkActivitiesFullGiftEntity;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 营销活动-满赠Dao
  *
@@ -26,4 +28,19 @@ public interface MkActivitiesFullGiftDao extends BaseDao<MkActivitiesFullGiftEnt
                                                   @Param("prodBarcode") String prodBarcode,
                                                   @Param("brandName") String brandName,
                                                   @Param("nowTime") String nowTime);
+
+    /**
+     * 根据营销活动编号获取满赠活动信息
+     * @param mkaIdList     营销活动编号集合
+     * @return              满赠营销活动信息
+     */
+    List<MkActivitiesFullGiftEntity> queryByMkaIdList(List<Long> mkaIdList);
+
+    /**
+     * 查询活动id对应的满赠活动规则
+     * @param mkaId 活动id
+     * @param storeId 门店id
+     * @return      满赠活动规则
+     */
+    MkActivitiesFullGiftEntity queryObjectByMkaIdAndStoreId(@Param("mkaId") Integer mkaId, @Param("storeId") String storeId);
 }

+ 11 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/MkActivitiesPromotionDao.java

@@ -5,6 +5,8 @@ import com.kmall.admin.entity.MkActivitiesPromotionEntity;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 营销活动-临时促销Dao
  *
@@ -31,4 +33,13 @@ public interface MkActivitiesPromotionDao extends BaseDao<MkActivitiesPromotionE
     void updatePriceBySku(@Param("updatePrice") String updatePrice,
                           @Param("sku") String sku,
                           @Param("mkaId") Long mkaId);
+
+    /**
+     * 查询活动id对应的限时特价活动规则
+     *
+     * @param mkaId   活动id
+     * @param storeId 门店id
+     * @return 限时特价活动规则
+     */
+    List<MkActivitiesPromotionEntity> queryListByMkaIdAndStoreId(@Param("mkaId") int mkaId, @Param("storeId") String storeId);
 }

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

@@ -183,4 +183,6 @@ public interface OrderDao extends BaseDao<OrderEntity> {
      * @param orderSnList 订单号
      */
     void updateOrderStatusByOrderSnList(List<String> orderSnList);
+
+    Integer queryObjectByMerchOrderSnHkMall(@Param("merchOrderSn")String merchOrderSn);
 }

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

@@ -40,4 +40,6 @@ public interface OrderGoodsDao extends BaseDao<OrderGoodsEntity> {
      * @return 订单详情
      */
     List<OrderGoodsRestoreVo> queryListByOrderIds(List<Integer> orderIdList);
+
+    List<OrderGoodsEntity> queryListHkMall(Map<String, Object> map);
 }

+ 18 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java

@@ -1,7 +1,10 @@
 package com.kmall.admin.dao;
 
+import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.ProductStoreRelaEntity;
+import com.kmall.admin.entity.StoreEntity;
 import com.kmall.admin.entity.StoreTransferInventoryOrderDetailEntity;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import org.apache.ibatis.annotations.Param;
 import com.kmall.manager.dao.BaseDao;
 
@@ -101,4 +104,19 @@ public interface ProductStoreRelaDao extends BaseDao<ProductStoreRelaEntity> {
      * @param productStoreRelaEntities 门店库存信息
      */
     int restoreBatch(List<ProductStoreRelaEntity> productStoreRelaEntities);
+
+    ProductStoreRelaEntity getByStoreNameAndSku(@Param("storeName") String storeName, @Param("sku") String sku);
+
+    void updateProductStoreRela(List<Mall2RulesDto> pointsRulesList);
+
+    List<Mall2DetilEntity> queryProductStoreRulesDetil(Long id);
+
+    int queryProductDetilTotal(Long id);
+
+    void updateProductStoreRulesDetil(Integer[] mprIds);
+
+    Long queryproductStoreByName(@Param("sku")String sku,@Param("storeId")Long storeId);
+
+    ProductStoreRelaEntity queryByGoodsIdAndStoreIdHkMall(@Param("storeId") Long storeId, @Param("goodsId") Long goodsId);
+
 }

+ 13 - 1
kmall-admin/src/main/java/com/kmall/admin/dao/StoreDao.java

@@ -1,6 +1,8 @@
 package com.kmall.admin.dao;
 
+import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import org.apache.ibatis.annotations.Param;
 import com.kmall.manager.dao.BaseDao;
 
@@ -20,6 +22,16 @@ public interface StoreDao extends BaseDao<StoreEntity> {
     StoreEntity queryObjectByNumber(@Param("storeNumber") String storeNumber);
 
     List<StoreEntity> queryExportList(Map<String, Object> map);
-//    StoreEntity queryObjectByDistId(@Param("distId") Integer distId);
+
     List<StoreEntity> queryStoreByAll();
+
+    void updateObjectStore(List<Mall2RulesDto> item);
+
+    List<Mall2DetilEntity> queryStoreRulesDetil(Long id);
+
+    int queryStoreDetilTotal(Long id);
+
+    void updateStoreRulesDetil(Integer[] mprIds);
+
+    Long queryObjectRulesByName(String trim);
 }

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

@@ -21,4 +21,6 @@ public interface SysMacroDao extends BaseDao<SysMacroEntity> {
      * @return
      */
     List<SysMacroEntity> queryMacrosByValue(@Param("value") String value);
+
+    List<SysMacroEntity> queryMacrosByValueRules(Integer id);
 }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesDao.java

@@ -24,4 +24,14 @@ public interface MkActivitiesDao extends BaseDao<MkActivitiesEntity> {
     List<MkActivitiesEntity> queryByNow(@Param("storeId") String storeId, @Param("currentTime") String currentTime);
 
     List<MkActivitiesEntity> queryByTopic(@Param("storeId") String storeId, @Param("currentTime")String currentTime, @Param("topic") String topic);
+
+    /**
+     * 根据门店id和当前时间查询有哪些营销方式
+     * 查询当前时间是否有满赠的活动
+     *
+     * @param storeId     门店id
+     * @param currentTime 当前时间
+     * @return 满赠活动列表
+     */
+    List<MkActivitiesEntity> queryByNowByMz(@Param("storeId") String storeId, @Param("currentTime") String currentTime);
 }

+ 6 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/vip/Mall2PointsRulesDao.java

@@ -1,8 +1,12 @@
 package com.kmall.admin.dao.vip;
 
+import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
 import com.kmall.manager.dao.BaseDao;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 积分规则表Dao
  *
@@ -12,4 +16,6 @@ import com.kmall.manager.dao.BaseDao;
  */
 public interface Mall2PointsRulesDao extends BaseDao<Mall2PointsRulesEntity> {
 
+
+    Integer queryRulesDetilId(Long mkaId);
 }

+ 50 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/GoodsDetailsDto.java

@@ -64,6 +64,26 @@ public class GoodsDetailsDto {
     //商品库存
     private Integer goodsNumber;
 
+    /**
+     * 购物栏商品数量
+     */
+    private Integer sellVolume;
+
+    /**
+     * 购物栏商品下标
+     */
+    private Integer id;
+
+    /**
+     * 赠送数量
+     */
+    private Integer giftNumber;
+
+    /**
+     * 海控展销店出区数
+     */
+    private Integer exitRegionNumber;
+
     public BigDecimal getRmarketPrice() {
         return rmarketPrice;
     }
@@ -256,5 +276,35 @@ public class GoodsDetailsDto {
         this.ciqProdModel = ciqProdModel;
     }
 
+    public Integer getGiftNumber() {
+        return giftNumber;
+    }
+
+    public void setGiftNumber(Integer giftNumber) {
+        this.giftNumber = giftNumber;
+    }
+
+    public Integer getExitRegionNumber() {
+        return exitRegionNumber;
+    }
+
+    public void setExitRegionNumber(Integer exitRegionNumber) {
+        this.exitRegionNumber = exitRegionNumber;
+    }
 
+    public Integer getSellVolume() {
+        return sellVolume;
+    }
+
+    public void setSellVolume(Integer sellVolume) {
+        this.sellVolume = sellVolume;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
 }

+ 21 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/Mall2RulesDto.java

@@ -0,0 +1,21 @@
+package com.kmall.admin.dto;
+
+import lombok.Data;
+
+@Data
+public class Mall2RulesDto {
+
+    private Long mkaId;
+    //积分类型
+    private String rulesType;
+    //积分生成规则Name(门店,商品类别,商品)
+    private String pointsRulesName;
+    //门店ID,商品ID,商品分类ID
+    private Long rulesId;
+    //商品门店名称
+    private String storeName;
+    //条码
+//    private String barcode;
+//    //备注
+//    private String remark;
+}

+ 11 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/CategoryEntity.java

@@ -55,6 +55,9 @@ public class CategoryEntity extends Tree<CategoryEntity> {
 
     private String share;
 
+    //积分生成规则id
+    private Long pointsRulesId;
+
     public String getStoreName() {
         return storeName;
     }
@@ -312,4 +315,12 @@ public class CategoryEntity extends Tree<CategoryEntity> {
     public void setShare(String share) {
         this.share = share;
     }
+
+    public Long getPointsRulesId() {
+        return pointsRulesId;
+    }
+
+    public void setPointsRulesId(Long pointsRulesId) {
+        this.pointsRulesId = pointsRulesId;
+    }
 }

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

@@ -1,6 +1,6 @@
 package com.kmall.admin.entity;
 
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import org.springframework.beans.BeanUtils;
 
 import java.io.Serializable;
@@ -274,11 +274,25 @@ public class GoodsEntity implements Serializable {
 
     private Integer toBeRestored;
 
+    /**
+     * 预估税
+     */
+    private BigDecimal goodsTaxes;
+
     public GoodsEntity() {
     }
 
-    public GoodsEntity(QueryGoodsVo queryGoodsVo) {
+    public GoodsEntity(QueryGoodsVO queryGoodsVo) {
         BeanUtils.copyProperties(this, queryGoodsVo);
+        this.goodsNumber = queryGoodsVo.getSellVolume();
+    }
+
+    public BigDecimal getGoodsTaxes() {
+        return goodsTaxes;
+    }
+
+    public void setGoodsTaxes(BigDecimal goodsTaxes) {
+        this.goodsTaxes = goodsTaxes;
     }
 
     public BigDecimal getCosmThresholdValue() {

+ 35 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/MallVmcSendlogEntity.java

@@ -0,0 +1,35 @@
+package com.kmall.admin.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class MallVmcSendlogEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Integer id;
+    /**
+     * 请求类型
+     */
+    private String vmcType;
+    /**
+     * 订单编号
+     */
+    private String orderSn;
+    /**
+     * 请求信息
+     */
+    private String requestMsg;
+    /**
+     * 响应信息
+     */
+    private String responseMsg;
+    /**
+     * 发送时间
+     */
+    private Data sendDate;
+}

+ 65 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/MkActivitiesCouponEntity.java

@@ -65,6 +65,31 @@ public class MkActivitiesCouponEntity implements Serializable {
     private Date updateTime;
 
     /**
+     * 活动类别,0:按品牌 1:按商品分类 2:按商品
+     */
+    private String activityType;
+
+    /**
+     * 品牌id
+     */
+    private Integer brandId;
+
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+
+    /**
+     * 分类id
+     */
+    private Integer categoryId;
+
+    /**
+     * 分类名称
+     */
+    private String categoryName;
+
+    /**
      * 设置:编号
      */
     public void setMacId(Long macId) {
@@ -220,4 +245,44 @@ public class MkActivitiesCouponEntity implements Serializable {
     public Date getUpdateTime() {
         return updateTime;
     }
+
+    public String getActivityType() {
+        return activityType;
+    }
+
+    public void setActivityType(String activityType) {
+        this.activityType = activityType;
+    }
+
+    public Integer getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(Integer brandId) {
+        this.brandId = brandId;
+    }
+
+    public Integer getCategoryId() {
+        return categoryId;
+    }
+
+    public void setCategoryId(Integer categoryId) {
+        this.categoryId = categoryId;
+    }
+
+    public String getBrandName() {
+        return brandName;
+    }
+
+    public void setBrandName(String brandName) {
+        this.brandName = brandName;
+    }
+
+    public String getCategoryName() {
+        return categoryName;
+    }
+
+    public void setCategoryName(String categoryName) {
+        this.categoryName = categoryName;
+    }
 }

+ 76 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/MkActivitiesFullGiftEntity.java

@@ -28,6 +28,10 @@ public class MkActivitiesFullGiftEntity implements Serializable {
      */
     private String shopSn;
     /**
+     * 门店名称
+     */
+    private String shopName;
+    /**
      * 商品编码
      */
     private String goodsSn;
@@ -36,6 +40,10 @@ public class MkActivitiesFullGiftEntity implements Serializable {
      */
     private String barcode;
     /**
+     * 商品品牌id
+     */
+    private Long brandId;
+    /**
      * 商品品牌
      */
     private String productBrand;
@@ -51,8 +59,26 @@ public class MkActivitiesFullGiftEntity implements Serializable {
      * 赠品条码
      */
     private String giftBarcode;
+    /**
+     * 赠品sku
+     */
     private String giftGoodsSn;
-
+    /**
+     * 赠品数量
+     */
+    private Integer giftNumber;
+    /**
+     * 满赠类型,0:按品牌 1:按分类
+     */
+    private String fullGiftType;
+    /**
+     * 商品分类id
+     */
+    private Long categoryId;
+    /**
+     * 商品分类名
+     */
+    private String categoryName;
     /**
      * 营销活动编号
      */
@@ -117,6 +143,15 @@ public class MkActivitiesFullGiftEntity implements Serializable {
     public String getShopSn() {
         return shopSn;
     }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
     /**
      * 设置:商品编码
      */
@@ -281,4 +316,44 @@ public class MkActivitiesFullGiftEntity implements Serializable {
     public void setGiftGoodsSn(String giftGoodsSn) {
         this.giftGoodsSn = giftGoodsSn;
     }
+
+    public Long getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(Long brandId) {
+        this.brandId = brandId;
+    }
+
+    public String getFullGiftType() {
+        return fullGiftType;
+    }
+
+    public void setFullGiftType(String fullGiftType) {
+        this.fullGiftType = fullGiftType;
+    }
+
+    public Long getCategoryId() {
+        return categoryId;
+    }
+
+    public void setCategoryId(Long categoryId) {
+        this.categoryId = categoryId;
+    }
+
+    public String getCategoryName() {
+        return categoryName;
+    }
+
+    public void setCategoryName(String categoryName) {
+        this.categoryName = categoryName;
+    }
+
+    public Integer getGiftNumber() {
+        return giftNumber;
+    }
+
+    public void setGiftNumber(Integer giftNumber) {
+        this.giftNumber = giftNumber;
+    }
 }

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

@@ -143,6 +143,8 @@ public class ProductStoreRelaEntity implements Serializable {
     private Date lastSaleTime;
 
     private Integer toBeRestored;
+    //积分生成规则id
+    private Long pointsRulesId;
 
 
     public Date getLastSaleTime() {
@@ -608,4 +610,12 @@ public class ProductStoreRelaEntity implements Serializable {
     public void setToBeRestored(Integer toBeRestored) {
         this.toBeRestored = toBeRestored;
     }
+
+    public Long getPointsRulesId() {
+        return pointsRulesId;
+    }
+
+    public void setPointsRulesId(Long pointsRulesId) {
+        this.pointsRulesId = pointsRulesId;
+    }
 }

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

@@ -86,6 +86,8 @@ public class StoreEntity implements Serializable {
     private String storeImgUrl;
     //门店电话号码
     private String telephoneNumber;
+    //积分生成规则id
+    private Long pointsRulesId;
 
     public String getTelephoneNumber() {
         return telephoneNumber;
@@ -344,4 +346,12 @@ public class StoreEntity implements Serializable {
     public void setModTime(Date modTime) {
         this.modTime = modTime;
     }
+
+    public Long getPointsRulesId() {
+        return pointsRulesId;
+    }
+
+    public void setPointsRulesId(Long pointsRulesId) {
+        this.pointsRulesId = pointsRulesId;
+    }
 }

+ 23 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderEntity.java

@@ -0,0 +1,23 @@
+package com.kmall.admin.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 免税mall订单组装实体类
+ */
+@Data
+public class VmcconnectOrderEntity implements Serializable{
+    private static final long serialVersionUID = 1L;
+
+    //订单主要信息
+    private VmcconnectOrderInfoEntity orderinfo;
+    //订单明细数据
+    private List<VmcconnectOrderItemsEntity> order_items;
+    //订单支付数据
+    private VmcconnectPayinfoEntity payinfo;
+    //跨境信息
+    private VmcconnectPayinfoEntity seaport_info;
+}

+ 84 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderInfoEntity.java

@@ -0,0 +1,84 @@
+package com.kmall.admin.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单主表信息
+ */
+@Data
+public class VmcconnectOrderInfoEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 外部订单号,门店侧订单号
+     */
+    private String outer_order_no;
+    /**
+     * 支付方式
+     */
+    private String pay_app;
+    /**
+     * 配送方式 默认:SF
+     */
+    private String dlytype_code;
+    /**
+     * 收货人
+     */
+    private String consignee_name;
+    /**
+     * 收货地址省份
+     */
+    private String consignee_area_province;
+    /**
+     * 收货地址城市
+     */
+    private String consignee_area_city;
+    /**
+     * 收货地址地区
+     */
+    private String consignee_area_county;
+    /**
+     * 收货地址详细地址
+     */
+    private String consignee_address;
+    /**
+     * 收货人的邮编
+     */
+    private String consignee_zip;
+    /**
+     * 收货人的联系电话
+     */
+    private String consignee_tel;
+    /**
+     * 收货人的邮箱
+     */
+    private String consignee_email;
+    /**
+     * 收货人的手机号
+     */
+    private String consignee_mobile;
+    /**
+     * 订单商品总重量(克)
+     */
+    private BigDecimal weight;
+    /**
+     * 订单包含商品数量
+     */
+    private Integer quantity;
+    /**
+     * 配送费用
+     */
+    //private BigDecimal cost_freight;
+    /**
+     * 订单应付总金额
+     */
+    private BigDecimal order_total;
+    /**
+     * 下单的平台
+     */
+    private BigDecimal platform;
+
+}

+ 63 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderItemsEntity.java

@@ -0,0 +1,63 @@
+package com.kmall.admin.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ *订单明细
+ */
+@Data
+public class VmcconnectOrderItemsEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单id
+     */
+    private  String order_id;
+    /**
+     * 货品ID
+     */
+//    private  Integer product_id;
+    /**
+     * 商品ID
+     */
+//    private  Long goods_id;
+    /**
+     * 图片地址
+     */
+    private  String Image_url;
+    /**
+     * 明细商品货号
+     */
+    private  String bn;
+    /**
+     * 条码
+     */
+    private  String barcode;
+    /**
+     * 商品明细名称
+     */
+    private  String name;
+    /**
+     * 明细商品的成本
+     */
+    private BigDecimal cost;
+    /**
+     * 销售价
+     */
+    private  BigDecimal price;
+    /**
+     * 商品编码
+     */
+    private  String itemcode;
+    /**
+     * 明细商品总额(成交价x数量)
+     */
+    private  BigDecimal amount;
+    /**
+     * 明细商品购买数量
+     */
+    private  Integer nums;
+}

+ 60 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectPayinfoEntity.java

@@ -0,0 +1,60 @@
+package com.kmall.admin.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 支付数据
+ */
+@Data
+public class VmcconnectPayinfoEntity implements Serializable{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 支付货币金额
+     */
+    private BigDecimal money;
+    /**
+     * 付款方式 online=在线支付 offline=线下支付 deposit=预付款支付
+     */
+    private String pay_mode;
+    /**
+     * 收款者名称
+     */
+//    private String payee_name;
+//    /**
+//     * 收款者账号
+//     */
+//    private String payee_account;
+//    /**
+//     * 收款者银行
+//     */
+//    private String payee_bank;
+//    /**
+//     * 付款者名称
+//     */
+//    private String payer_name;
+//    /**
+//     * 付款者账户
+//     */
+//    private String payer_account;
+//    /**
+//     * 付款者银行
+//     */
+//    private String  payer_bank;
+    /**
+     * 发送给支付企业的原始请求
+     */
+    private String request;
+    /**
+     * 支付成功后回调的原始请求
+     */
+    private String response;
+    /**
+     * 支付平台流水号
+     */
+    private String out_trade_no;
+
+}

+ 24 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectSeaportInfoEntity.java

@@ -0,0 +1,24 @@
+package com.kmall.admin.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 跨境信息
+ */
+@Data
+public class VmcconnectSeaportInfoEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    //口岸代码  默认:4600
+    private String seaport_code;
+    //跨境商品平台来源 1:广州跨境通保税 2:自营保税  默认:1
+    private String platform;
+    //订购人身份证号码
+    private String identity_card;
+    //订购人姓名
+    private String identity_name;
+    //订购人手机号
+    private String identity_mobile;
+}

+ 20 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2DetilEntity.java

@@ -0,0 +1,20 @@
+package com.kmall.admin.entity.vip;
+
+import lombok.Data;
+
+@Data
+public class Mall2DetilEntity {
+
+    /**
+     * 对应的商品,门店,类别ID
+     */
+    private Long id;
+    /**
+     * 积分规则类型
+     */
+    private Integer rulesType;
+    /**
+     *  对应的商品,门店,类别名称
+     */
+    private String rulesName;
+}

+ 62 - 20
kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2PointsRulesEntity.java

@@ -1,6 +1,7 @@
 package com.kmall.admin.entity.vip;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -19,9 +20,9 @@ public class Mall2PointsRulesEntity implements Serializable {
      */
     private Integer mprId;
     /**
-     * 积分类型  00.按金额  10.按数量
+     * 积分类型 :0.门店 ,1.商品类别,2.门店商品'
      */
-    private String pointsType;
+    private Integer pointsType;
     /**
      * 积分规则适用开始时间
      */
@@ -35,26 +36,35 @@ public class Mall2PointsRulesEntity implements Serializable {
      */
     private String isValid;
     /**
-     * +创建人编号
+     * 创建人编号
      */
     private String createrSn;
     /**
-     * +创建时间,yyyy-MM-dd HH:mm:ss
+     * 创建时间,yyyy-MM-dd HH:mm:ss
      */
     private Date createTime;
     /**
-     * +修改人编号
+     * 修改人编号
      */
     private String moderSn;
     /**
-     * +修改时间,yyyy-MM-dd HH:mm:ss
+     * 修改时间,yyyy-MM-dd HH:mm:ss
      */
     private Date modTime;
     /**
-     * +时间戳
+     * 时间戳
      */
     private Date tstm;
-
+    /**
+     * 备注
+     */
+    private String remark;
+    //积分金额
+    private BigDecimal pointsRulesMoney;
+    //对应积分数
+    private String pointsRulesNum;
+    //赠送积分
+    private String handselIntegral;
     /**
      * 设置:主键
      */
@@ -71,14 +81,14 @@ public class Mall2PointsRulesEntity implements Serializable {
     /**
      * 设置:积分类型  00.按金额  10.按数量
      */
-    public void setPointsType(String pointsType) {
+    public void setPointsType(Integer pointsType) {
         this.pointsType = pointsType;
     }
 
     /**
      * 获取:积分类型  00.按金额  10.按数量
      */
-    public String getPointsType() {
+    public Integer getPointsType() {
         return pointsType;
     }
     /**
@@ -121,68 +131,100 @@ public class Mall2PointsRulesEntity implements Serializable {
         return isValid;
     }
     /**
-     * 设置:+创建人编号
+     * 设置:创建人编号
      */
     public void setCreaterSn(String createrSn) {
         this.createrSn = createrSn;
     }
 
     /**
-     * 获取:+创建人编号
+     * 获取:创建人编号
      */
     public String getCreaterSn() {
         return createrSn;
     }
     /**
-     * 设置:+创建时间,yyyy-MM-dd HH:mm:ss
+     * 设置:创建时间,yyyy-MM-dd HH:mm:ss
      */
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
 
     /**
-     * 获取:+创建时间,yyyy-MM-dd HH:mm:ss
+     * 获取:创建时间,yyyy-MM-dd HH:mm:ss
      */
     public Date getCreateTime() {
         return createTime;
     }
     /**
-     * 设置:+修改人编号
+     * 设置:修改人编号
      */
     public void setModerSn(String moderSn) {
         this.moderSn = moderSn;
     }
 
     /**
-     * 获取:+修改人编号
+     * 获取:修改人编号
      */
     public String getModerSn() {
         return moderSn;
     }
     /**
-     * 设置:+修改时间,yyyy-MM-dd HH:mm:ss
+     * 设置:修改时间,yyyy-MM-dd HH:mm:ss
      */
     public void setModTime(Date modTime) {
         this.modTime = modTime;
     }
 
     /**
-     * 获取:+修改时间,yyyy-MM-dd HH:mm:ss
+     * 获取:修改时间,yyyy-MM-dd HH:mm:ss
      */
     public Date getModTime() {
         return modTime;
     }
     /**
-     * 设置:+时间戳
+     * 设置:时间戳
      */
     public void setTstm(Date tstm) {
         this.tstm = tstm;
     }
 
     /**
-     * 获取:+时间戳
+     * 获取:时间戳
      */
     public Date getTstm() {
         return tstm;
     }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public BigDecimal getPointsRulesMoney() {
+        return pointsRulesMoney;
+    }
+
+    public void setPointsRulesMoney(BigDecimal pointsRulesMoney) {
+        this.pointsRulesMoney = pointsRulesMoney;
+    }
+
+    public String getPointsRulesNum() {
+        return pointsRulesNum;
+    }
+
+    public void setPointsRulesNum(String pointsRulesNum) {
+        this.pointsRulesNum = pointsRulesNum;
+    }
+
+    public String getHandselIntegral() {
+        return handselIntegral;
+    }
+
+    public void setHandselIntegral(String handselIntegral) {
+        this.handselIntegral = handselIntegral;
+    }
 }

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

@@ -0,0 +1,86 @@
+package com.kmall.admin.haikong.client;
+
+import com.alibaba.fastjson.JSON;
+import com.kmall.admin.haikong.config.HaiKongProperties;
+import com.kmall.admin.haikong.constant.VmcconnectUrlEnum;
+import com.kmall.admin.haikong.utils.HttpsClientUtil;
+import com.kmall.admin.haikong.utils.VmcconnectSignUtils;
+import org.apache.http.entity.StringEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class HaiKongVmcconnectTemplate {
+
+    @Autowired
+    private HaiKongProperties haiKongProperties;
+
+    /**
+     * 获取免税MALL请求结果
+     * @param methodParams
+     * @param method
+     * @return
+     */
+    public String vmcconnectSign(String methodParams,String method){
+        Map<String,String> params = new HashMap<>();
+        params.put("appid",haiKongProperties.getVmcconnectAppId());
+        params.put("method", method);
+        params.put("method_params",methodParams);
+        params.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
+        params.put("sign", VmcconnectSignUtils.createSign(params,haiKongProperties.getVmcconnectSecretKey()));
+        StringEntity stringEntity = new StringEntity(JSON.toJSONString(params),"UTF-8");
+        return HttpsClientUtil.vmcconnectPost(haiKongProperties.getVmcconnectUrl(),stringEntity);
+    }
+
+
+    /**
+     *新建订单
+     */
+    public String createOrder(String json) throws Exception {
+        return vmcconnectSign(json, VmcconnectUrlEnum.ORDERS_CREATE_ORDER.getMethod());
+    }
+
+    /**
+     *取消订单
+     */
+    public String ordersCancelOrder(String json) throws Exception {
+        return vmcconnectSign(json,VmcconnectUrlEnum.ORDERS_CREATE_ORDER.getMethod());
+    }
+
+    /**
+     *查订单通关查询接口
+     */
+    public String ordersOuterStatus(String json) throws Exception {
+        return vmcconnectSign(json,VmcconnectUrlEnum.ORDERS_CREATE_ORDER.getMethod());
+    }
+
+    /**
+     *重试订单接口
+     */
+    public String ordersRetryOrder(String json) throws Exception {
+        return vmcconnectSign(json,VmcconnectUrlEnum.ORDERS_RETRY_ORDER.getMethod());
+    }
+
+
+
+//    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.retry.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);
+//        StringEntity stringEntity = new StringEntity(JSON.toJSONString(params),"UTF-8");
+//        String msg = HttpsClientUtil.vmcconnectPost("https://testmall.greedc.com/openapi/vmcconnect/json",stringEntity);
+//        System.out.println(msg);
+//
+//    }
+
+}

+ 4 - 4
kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongWarehouseTemplate.java

@@ -72,8 +72,8 @@ public class HaiKongWarehouseTemplate {
 
         criteria.setImperfectGrade("a");
         criteria.setInventoryType("SY");
-        criteria.setItemCode("test");
-        criteria.setItemId("SSS");
+        criteria.setItemCode("708177112730");
+//        criteria.setItemId("");
         criteria.setOwnerCode("44048600Y8");
         criteria.setWarehouseCode("20");
 
@@ -83,12 +83,12 @@ public class HaiKongWarehouseTemplate {
         criteria1.setImperfectGrade("a");
         criteria1.setInventoryType("SY");
         criteria1.setItemCode("test");
-        criteria1.setItemId("SSS");
+//        criteria1.setItemId("SSS");
         criteria1.setOwnerCode("44048600Y8");
         criteria1.setWarehouseCode("20");
 
         criteriaList.add(criteria);
-        criteriaList.add(criteria1);
+//        criteriaList.add(criteria1);
 
         wareQueryStockParamDTO.setCriteriaList(criteriaList);
 

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

@@ -0,0 +1,119 @@
+package com.kmall.admin.haikong.client;
+
+import com.alibaba.fastjson.JSON;
+import com.kmall.admin.haikong.config.HaiKongProperties;
+import com.kmall.admin.haikong.constant.VmcconnectUrlEnum;
+import com.kmall.admin.haikong.utils.OkHttpUtils;
+import com.kmall.admin.haikong.utils.VmcconnectSignUtils;
+import okhttp3.MediaType;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 海控电商系统调用
+ * @author
+ * @createDate 2021-10-28
+ */
+@Component
+public class VmcShopTemplate {
+
+    @Autowired
+    private HaiKongProperties haiKongProperties;
+
+    private RequestBody requestBody(String body) {
+        return RequestBody.create(MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE), body);
+    }
+
+    /**
+     * 获取免税MALL请求结果
+     * @param methodParams
+     * @param method
+     * @return
+     */
+    public String vmcconnectSign(String methodParams,String method){
+        Map<String,String> params = new HashMap<>();
+        params.put("appid",haiKongProperties.getVmcconnectAppId());
+        params.put("method", method);
+        params.put("method_params",methodParams);
+        params.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
+        params.put("sign", VmcconnectSignUtils.createSign(params,haiKongProperties.getVmcconnectSecretKey()));
+        return JSON.toJSONString(params);
+    }
+
+    /**
+     * 发送订单(新建订单接口)
+     * @param body  订单数据
+     * @return      响应
+     */
+    public String sendOrder(String body) {
+        Request request = new Request.Builder()
+                .post(requestBody(vmcconnectSign(body, VmcconnectUrlEnum.ORDERS_CREATE_ORDER.getMethod())))
+                .url(haiKongProperties.getVmcconnectUrl())
+                .build();
+        return OkHttpUtils.retry(request,haiKongProperties.getRequestRetry());
+    }
+
+    /**
+     * 重发订单(重试订单接口)
+     * @param body  订单数据
+     * @return      响应
+     */
+    public String resendOrder(String body) {
+        Request request = new Request.Builder()
+                .post(requestBody(vmcconnectSign(body, VmcconnectUrlEnum.ORDERS_RETRY_ORDER.getMethod())))
+                .url(haiKongProperties.getVmcconnectUrl())
+                .build();
+        return OkHttpUtils.retry(request,haiKongProperties.getRequestRetry());
+    }
+
+    /**
+     * 退款(取消订单接口)
+     * @param body  订单数据
+     * @return      响应
+     */
+    public String refundOrder(String body) {
+        Request request = new Request.Builder()
+                .post(requestBody(vmcconnectSign(body,VmcconnectUrlEnum.ORDERS_CANCEL_ORDER.getMethod())))
+                .url(haiKongProperties.getVmcconnectUrl())
+                .build();
+        return OkHttpUtils.retry(request,haiKongProperties.getRequestRetry());
+    }
+
+    /**
+     *查订单通关查询接口
+     */
+    public String ordersOuterStatus(String body){
+        Request request = new Request.Builder()
+                .post(requestBody(vmcconnectSign(body,VmcconnectUrlEnum.ORDERS_OUTER_STATUS.getMethod())))
+                .url(haiKongProperties.getVmcconnectUrl())
+                .build();
+        return OkHttpUtils.retry(request,haiKongProperties.getRequestRetry());
+    }
+
+
+//    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.retry.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, 1);
+//        Map<String,String> res = JSON.parseObject(s,Map.class);
+//        System.out.println(res);
+//    }
+
+}

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

@@ -26,7 +26,10 @@ public class HaiKongConfig {
         haiKongProperties.setMemberAppId(environment.getProperty("haikong.member.appId"));
         haiKongProperties.setMemberAppSecret(environment.getProperty("haikong.member.appSecret"));
         haiKongProperties.setRetry(Integer.parseInt(environment.getProperty("haikong.retry")));
-
+        haiKongProperties.setVmcconnectUrl(environment.getProperty("haikong.vmcconnect.url"));
+        haiKongProperties.setVmcconnectAppId(environment.getProperty("haikong.vmcconnect.appId"));
+        haiKongProperties.setVmcconnectSecretKey(environment.getProperty("haikong.vmcconnect.secretKey"));
+        haiKongProperties.setVmcconnectSecretKey(environment.getProperty("haikong.vmcconnect.requestRetry"));
         return haiKongProperties;
     }
 

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

@@ -48,6 +48,24 @@ public class HaiKongProperties {
 
     private String wareSignMethod;
 
+    //免税mall系统地址及秘钥
+    /**
+     * 免税mall系统url
+     */
+    private String VmcconnectUrl;
+    /**
+     * 免税mall系统AppId
+     */
+    private String VmcconnectAppId;
+    /**
+     * 免税mall系统秘钥
+     */
+    private String VmcconnectSecretKey;
+    /**
+     * 重试次数
+     */
+    private Integer requestRetry;
+
 
     public String getMemberUrl() {
         return memberUrl;
@@ -152,4 +170,36 @@ public class HaiKongProperties {
     public void setWareSignMethod(String wareSignMethod) {
         this.wareSignMethod = wareSignMethod;
     }
+
+    public String getVmcconnectUrl() {
+        return VmcconnectUrl;
+    }
+
+    public void setVmcconnectUrl(String vmcconnectUrl) {
+        VmcconnectUrl = vmcconnectUrl;
+    }
+
+    public String getVmcconnectAppId() {
+        return VmcconnectAppId;
+    }
+
+    public void setVmcconnectAppId(String vmcconnectAppId) {
+        VmcconnectAppId = vmcconnectAppId;
+    }
+
+    public String getVmcconnectSecretKey() {
+        return VmcconnectSecretKey;
+    }
+
+    public void setVmcconnectSecretKey(String vmcconnectSecretKey) {
+        VmcconnectSecretKey = vmcconnectSecretKey;
+    }
+
+    public Integer getRequestRetry() {
+        return requestRetry;
+    }
+
+    public void setRequestRetry(Integer requestRetry) {
+        this.requestRetry = requestRetry;
+    }
 }

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

@@ -12,4 +12,83 @@ public class Constants {
 
     public static final String MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY = "haikong_memberSys_refreshToken";
 
+    /**
+     * 活动主题枚举
+     */
+    public enum ActivityTopicEnum {
+        /**
+         * 满赠活动
+         */
+        MZ("mz", "满赠", 3),
+        /**
+         * 限时特价活动
+         */
+        LSCX("lscx", "限时特价", 1),
+        /**
+         * 优惠券活动
+         */
+        YHJ("yhj", "优惠券", 5)
+        ;
+
+        private final String topicCode;
+
+        private final String topicName;
+
+        private final Integer priority;
+
+        ActivityTopicEnum(String topicCode, String topicName, Integer priority) {
+            this.topicCode = topicCode;
+            this.topicName = topicName;
+            this.priority = priority;
+        }
+
+        public String getTopicCode() {
+            return topicCode;
+        }
+
+        public String getTopicName() {
+            return topicName;
+        }
+
+        public Integer getPriority() {
+            return priority;
+        }
+    }
+
+    /**
+     * 活动类型
+     */
+    public enum ActivityType {
+        /**
+         * 按品牌参加活动
+         */
+        BRAND("0", "商品品牌"),
+        /**
+         * 按分类参加活动
+         */
+        CATEGORY("1", "商品分类"),
+        /**
+         * 按单个商品参加活动
+         */
+        PRODUCT("2", "商品")
+        ;
+
+        private final String activityTypeCode;
+
+        private final String activityType;
+
+        ActivityType(String activityTypeCode, String activityType) {
+            this.activityTypeCode = activityTypeCode;
+            this.activityType = activityType;
+        }
+
+        public String getActivityTypeCode() {
+            return activityTypeCode;
+        }
+
+        public String getActivityType() {
+            return activityType;
+        }
+    }
+
 }

+ 48 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/constant/VmcconnectUrlEnum.java

@@ -0,0 +1,48 @@
+package com.kmall.admin.haikong.constant;
+
+/**
+ * 免税mall接口方法名
+ */
+public enum VmcconnectUrlEnum {
+
+    /**
+     * 订单创建接口
+     */
+    ORDERS_CREATE_ORDER("POST", "vmc.orders.create.order"),
+    /**
+     * 订单取消接口
+     */
+    ORDERS_CANCEL_ORDER("POST", "vmc.orders.cancel.order"),
+    /**
+     * 订单通关查询接口
+     */
+    ORDERS_OUTER_STATUS("POST", "vmc.orders.read.outer_status"),
+    /**
+     * 重试订单接口
+     */
+    ORDERS_RETRY_ORDER("POST", "vmc.orders.retry.order"),
+    ;
+
+
+    /**
+     * 请求方式
+     */
+    private final String mode;
+    /**
+     * 请求地址
+     */
+    private final String method;
+
+    VmcconnectUrlEnum(String method, String mode) {
+        this.mode = mode;
+        this.method = method;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public String getMode() {
+        return mode;
+    }
+}

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

@@ -44,7 +44,7 @@ public class WareQueryStockResponseDTO implements Serializable {
      * 商品库存详细信息
      */
     @XmlAccessorType(XmlAccessType.FIELD)
-    private static class WareQueryStockResponseItemDTO {
+    public static class WareQueryStockResponseItemDTO {
 
         /**
          * 仓库编码

+ 13 - 2
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberSysAccessTokenRefreshTask.java

@@ -14,6 +14,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
+import java.io.IOException;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -58,14 +59,24 @@ public class MemberSysAccessTokenRefreshTask {
     }
 
     private void handleResponse(String json, Boolean a) {
-        Response<AccessTokenDTO> response = JacksonUtil.fromListJson(json, new TypeReference<Response<AccessTokenDTO>>() {
-        });
+        Response<AccessTokenDTO> response = null;
+        try {
+            response = JacksonUtil.getObjectMapper().readValue(json, new TypeReference<Response<AccessTokenDTO>>() {
+            });
+        } catch (IOException e) {
+            log.error("解析海控会员系统响应结果失败!", e);
+            return;
+        }
         if (Objects.nonNull(response) && response.getSuccess()) {
             AccessTokenDTO accessTokenDTO = response.getData();
             JedisUtil.set(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY, JacksonUtil.toJson(accessTokenDTO), (60 * 60 * 2) - (60 * 2));
             if (a) {
                 JedisUtil.set(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY, Optional.ofNullable(accessTokenDTO.getRefreshToken()).orElse(""), (60 * 60 * 24 * 7));
             }
+        } else if (Objects.nonNull(response) && !response.getSuccess() && Response.ErrorCodeEnum.INVALID_REFRESH.getErrorCode().equals(response.getErrorCode())) {
+            log.info("海控会员系统RefreshToken已失效,重新获取AccessToken与RefreshToken!");
+            JedisUtil.del(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY);
+            refresh();
         } else {
             log.error("请求海控会员系统AccessToken返回响应为空!");
         }

+ 174 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/HttpsClientUtil.java

@@ -0,0 +1,174 @@
+package com.kmall.admin.haikong.utils;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.*;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+public class HttpsClientUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(HttpsClientUtil.class);
+
+
+    private static RequestConfig requestConfig = RequestConfig.custom()
+            .setSocketTimeout(5000)
+            .setConnectTimeout(5000)
+            .setConnectionRequestTimeout(5000)
+            .build();//设置请求和传输超时时间
+    private final static String charset = "UTF-8";
+
+    /**
+     * 忽略SSL证书校验的POST请求.
+     * @param url
+     * @return
+     * @throws IOException
+     */
+    public static String post (String url, StringEntity stringEntity){
+        HttpResponse res = null;
+        try {
+            stringEntity.setContentType(ContentType.APPLICATION_JSON.toString());
+            res = postnew(url,stringEntity);
+            return  EntityUtils.toString(res.getEntity(), charset);
+        } catch (IOException e) {
+           log.error("数据请求失败",e);
+        }
+        return null;
+    }
+
+    /**
+     * 忽略SSL证书校验的POST请求.
+     * @param url
+     * @return
+     * @throws IOException
+     */
+    public static String vmcconnectPost(String url, StringEntity stringEntity){
+        HttpResponse res = null;
+        try {
+            stringEntity.setContentType(ContentType.MULTIPART_FORM_DATA.toString());
+            res = postnew(url,stringEntity);
+            return  EntityUtils.toString(res.getEntity(), charset);
+        } catch (IOException e) {
+            log.error("请求免税MALL接口异常",e);
+        }
+        return null;
+    }
+
+    /**
+     * 忽略SSL证书校验的POST.
+     * @param httpUrl
+     * @param map Map
+     * @return
+     */
+    public static String post(String httpUrl, Map<String, Object> map) throws IOException {
+        //设置参数
+        List<NameValuePair> list = new ArrayList<NameValuePair>();
+        Iterator iterator = map.entrySet().iterator();
+        while(iterator.hasNext()){
+            Map.Entry<String,String> entry = (Map.Entry<String, String>) iterator.next();
+            list.add(new BasicNameValuePair(entry.getKey(),String.valueOf(entry.getValue())));
+        }
+        if(list.size() > 0){
+            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
+            HttpResponse res = null;
+            if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                return EntityUtils.toString(res.getEntity(), charset);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 忽略SSL证书校验的POST.
+     * @param url
+     * @param httpEntity HttpEntity
+     * @return
+     * @throws IOException
+     */
+    public static HttpResponse post(String url, HttpEntity httpEntity) throws IOException {
+        CloseableHttpClient sslClient = createSSLClient();
+        HttpPost post = new HttpPost(url);
+        post.setEntity(httpEntity);
+        post.setConfig(requestConfig);
+        HttpResponse response = sslClient.execute(post);
+        return response;
+    }
+
+    /**
+     * 忽略SSL证书校验的POST.
+     * @param url
+     * @param httpEntity HttpEntity
+     * @return
+     * @throws IOException
+     */
+    public static HttpResponse postnew(String url, HttpEntity httpEntity) throws IOException {
+        CloseableHttpClient sslClient = createSSLClient();
+        HttpPost post = new HttpPost(url);
+        post.setEntity(httpEntity);
+        post.setConfig(requestConfig);
+        HttpResponse response = sslClient.execute(post);
+        return response;
+    }
+
+    /**
+     * 忽略SSL证书校验的CloseableHttpClient.
+     * @return
+     */
+    public static CloseableHttpClient createSSLClient(){
+        // 在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。
+        // 创建SSLContext对象,并使用我们指定的信任管理器初始化,信任所有
+        X509TrustManager x509mgr = new X509TrustManager() {
+            //  该方法检查客户端的证书,若不信任该证书则抛出异常
+            public void checkClientTrusted(X509Certificate[] xcs, String string) {
+            }
+            //   该方法检查服务端的证书,若不信任该证书则抛出异常
+            public void checkServerTrusted(X509Certificate[] xcs, String string) {
+            }
+            //  返回受信任的X509证书数组。
+            public X509Certificate[] getAcceptedIssuers() {
+                return null;
+            }
+        };
+        SSLContext sslContext = null;
+        try {
+            sslContext = SSLContext.getInstance("TLS");
+            sslContext.init(null, new TrustManager[] { x509mgr }, null);
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new HostnameVerifier() {
+                @Override
+                public boolean verify(String hostname, SSLSession sslSession) {
+                    // 对hostname不做验证信任所有,此处有安全隐患
+                    return true;
+                }
+            });
+            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+        } catch (NoSuchAlgorithmException e) {
+            log.error(e.getMessage(), e);
+        } catch (KeyManagementException e) {
+            log.error(e.getMessage(), e);
+        }
+        return HttpClients.createDefault();
+    }
+
+}

+ 100 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Md5Utils.java

@@ -0,0 +1,100 @@
+package com.kmall.admin.haikong.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+
+/**
+ * Md5加密方法
+ * 
+ * @author cadmin
+ */
+public class Md5Utils
+{
+    private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);
+
+    private static byte[] md5(String s)
+    {
+        MessageDigest algorithm;
+        try
+        {
+            algorithm = MessageDigest.getInstance("MD5");
+            algorithm.reset();
+            algorithm.update(s.getBytes("UTF-8"));
+            byte[] messageDigest = algorithm.digest();
+            return messageDigest;
+        }
+        catch (Exception e)
+        {
+            log.error("MD5 Error...", e);
+        }
+        return null;
+    }
+
+    private static final String toHex(byte hash[])
+    {
+        if (hash == null)
+        {
+            return null;
+        }
+        StringBuffer buf = new StringBuffer(hash.length * 2);
+        int i;
+
+        for (i = 0; i < hash.length; i++)
+        {
+            if ((hash[i] & 0xff) < 0x10)
+            {
+                buf.append("0");
+            }
+            buf.append(Long.toString(hash[i] & 0xff, 16));
+        }
+        return buf.toString();
+    }
+
+    public static String hash(String s)
+    {
+        try
+        {
+            return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8");
+        }
+        catch (Exception e)
+        {
+            log.error("not supported charset...{}", e);
+            return s;
+        }
+    }
+
+
+    /**
+     * MD5加密,返回32位密文
+     * @param plainText
+     * @return String
+     * @throws UnsupportedEncodingException
+     */
+    public static String encryption(String plainText){
+        String re_md5 = new String();
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.update(plainText.getBytes("UTF-8"));
+            byte b[] = md.digest();
+            int i;
+            StringBuffer buf = new StringBuffer("");
+            for (int offset = 0; offset < b.length; offset++) {
+                i = b[offset];
+                if (i < 0)
+                    i += 256;
+                if (i < 16)
+                    buf.append("0");
+                buf.append(Integer.toHexString(i));
+            }
+            re_md5 = buf.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return re_md5;
+    }
+
+
+}

+ 37 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Response.java

@@ -1,5 +1,7 @@
 package com.kmall.admin.haikong.utils;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 /**
  * 通用响应处理, 对接海控
  * @author lhm
@@ -9,8 +11,10 @@ public class Response<T> {
 
     private Boolean success;
 
+    @JsonProperty("error_code")
     private Integer errorCode;
 
+    @JsonProperty("error_message")
     private String errorMessage;
 
     private T data;
@@ -89,4 +93,37 @@ public class Response<T> {
                 ", totalCount=" + totalCount +
                 '}';
     }
+
+    /**
+     * 错误响应码枚举
+     */
+    public enum ErrorCodeEnum {
+        /**
+         * 无效的refresh_token
+         */
+        INVALID_REFRESH(1005, "无效的refresh_token");
+
+        /**
+         * 错误码
+         */
+        private final Integer errorCode;
+
+        /**
+         * 错误消息
+         */
+        private final String errorMessage;
+
+        ErrorCodeEnum(Integer errorCode, String errorMessage) {
+            this.errorCode = errorCode;
+            this.errorMessage = errorMessage;
+        }
+
+        public Integer getErrorCode() {
+            return errorCode;
+        }
+
+        public String getErrorMessage() {
+            return errorMessage;
+        }
+    }
 }

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

@@ -0,0 +1,33 @@
+package com.kmall.admin.haikong.utils;
+
+
+import org.apache.commons.lang.StringUtils;
+
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * 免税mall签名工具类
+ */
+public class VmcconnectSignUtils {
+
+
+    public static String createSign(Map<String,String> params,String secretKey){
+        // 排序
+        String[] keys = params.keySet().toArray(new String[0]);
+        Arrays.sort(keys);
+        // 拼接
+        StringBuilder stringBuffer = new StringBuilder();
+        for (String key : keys) {
+            String value = params.get(key);
+            if (StringUtils.isNotEmpty(key) && StringUtils.isNotEmpty(value)) {
+                stringBuffer.append(key).append("=").append(value).append("&");
+            }
+        }
+        String signNew = Md5Utils.encryption(Md5Utils.encryption(stringBuffer.toString().substring(0,stringBuffer.toString().length()-1))+secretKey);
+        return signNew;
+    }
+
+
+
+}

+ 2 - 10
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/WareSysSignUtils.java

@@ -4,6 +4,7 @@ import cn.hutool.core.map.MapUtil;
 import org.apache.commons.lang.StringUtils;
 
 import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.util.Arrays;
@@ -39,16 +40,7 @@ public class WareSysSignUtils {
 
     public static String getSignRequest(String url, String body, String secretKey) throws Exception {
         String sign = signRequest(formatUrl(url), body, secretKey);
-        Map<String, String> formatUrl = formatUrl(url);
-        StringBuilder head = new StringBuilder(url.substring(0, url.indexOf("?")));
-        formatUrl.keySet().forEach(key -> {
-            formatUrl.put(key, java.net.URLEncoder.encode(new String(formatUrl.get(key).getBytes(StandardCharsets.UTF_8))));
-            head.append("&").append(key).append("=").append(formatUrl.get(key));
-        });
-        String s = head.toString();
-        String substring = s.substring(0, s.indexOf("&"));
-        String substring1 = s.substring(s.indexOf("&") + 1);
-        return substring + "?" + substring1 + "&sign=" + sign;
+        return url + "&sign=" + sign;
     }
 
 

+ 14 - 11
kmall-admin/src/main/java/com/kmall/admin/haikong/utils/XmlUtils.java

@@ -8,6 +8,7 @@ import javax.xml.bind.Unmarshaller;
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.Objects;
 
 /**
  * @author lhm
@@ -41,7 +42,7 @@ public class XmlUtils {
             marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
 
             StringWriter writer = new StringWriter();
-            writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
+            writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
             marshaller.marshal(obj, writer);
             return writer.toString();
         } catch (Exception e) {
@@ -57,20 +58,22 @@ public class XmlUtils {
      * @return
      */
     public static <T> Object toObject(String xml, Class<T> c) throws Exception {
-        Object xmlObject = null;
         Reader reader = null;
-        JAXBContext context = JAXBContext.newInstance(c);
-        // XML 转为对象的接口
-        Unmarshaller unmarshaller = context.createUnmarshaller();
+        try {
+            JAXBContext context = JAXBContext.newInstance(c);
+            // XML 转为对象的接口
+            Unmarshaller unmarshaller = context.createUnmarshaller();
 
-        reader = new StringReader(xml);
-        xmlObject = unmarshaller.unmarshal(reader);
+            reader = new StringReader(xml);
 
-        if (null != reader) {
-            reader.close();
+            return unmarshaller.unmarshal(reader);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (Objects.nonNull(reader)) {
+                reader.close();
+            }
         }
-
-        return xmlObject;
     }
 
 

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

@@ -0,0 +1,42 @@
+package com.kmall.admin.haikong.vo;
+
+import com.kmall.admin.dto.GoodsDetailsDto;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 计算优惠后价格响应类
+ * @author lhm
+ * @createDate 2021-11-22
+ */
+public class CalculateOrderDiscountPriceResponseVO {
+
+    private BigDecimal orderTotalPrice;
+
+    private List<GoodsDetailsDto> goodsDetailsDtos;
+
+    public BigDecimal getOrderTotalPrice() {
+        return orderTotalPrice;
+    }
+
+    public void setOrderTotalPrice(BigDecimal orderTotalPrice) {
+        this.orderTotalPrice = orderTotalPrice;
+    }
+
+    public List<GoodsDetailsDto> getGoodsDetailsDtos() {
+        return goodsDetailsDtos;
+    }
+
+    public void setGoodsDetailsDtos(List<GoodsDetailsDto> goodsDetailsDtos) {
+        this.goodsDetailsDtos = goodsDetailsDtos;
+    }
+
+    @Override
+    public String toString() {
+        return "CalculateOrderDiscountPriceResponseVO{" +
+                "orderTotalPrice=" + orderTotalPrice +
+                ", goodsDetailsDtos=" + goodsDetailsDtos +
+                '}';
+    }
+}

+ 61 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/vo/CalculateOrderDiscountPriceVO.java

@@ -0,0 +1,61 @@
+package com.kmall.admin.haikong.vo;
+
+import com.kmall.admin.dto.GoodsDetailsDto;
+
+import java.util.List;
+
+/**
+ * 计算优惠后价格请求参数
+ * @author lhm
+ * @createDate 2021-11-19
+ */
+public class CalculateOrderDiscountPriceVO {
+
+    private String storeId;
+
+    private String memberCode;
+
+    private List<GoodsDetailsDto> goodsList;
+
+    public CalculateOrderDiscountPriceVO() {
+    }
+
+    public CalculateOrderDiscountPriceVO(String storeId, String memberCode, List<GoodsDetailsDto> goodsList) {
+        this.storeId = storeId;
+        this.memberCode = memberCode;
+        this.goodsList = goodsList;
+    }
+
+    public String getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(String storeId) {
+        this.storeId = storeId;
+    }
+
+    public String getMemberCode() {
+        return memberCode;
+    }
+
+    public void setMemberCode(String memberCode) {
+        this.memberCode = memberCode;
+    }
+
+    public List<GoodsDetailsDto> getGoodsList() {
+        return goodsList;
+    }
+
+    public void setGoodsList(List<GoodsDetailsDto> goodsList) {
+        this.goodsList = goodsList;
+    }
+
+    @Override
+    public String toString() {
+        return "CalculateOrderDiscountPriceVO{" +
+                "storeId='" + storeId + '\'' +
+                ", memberCode='" + memberCode + '\'' +
+                ", goodsList=" + goodsList +
+                '}';
+    }
+}

+ 23 - 9
kmall-admin/src/main/java/com/kmall/admin/haikong/vo/QueryGoodsVo.java → kmall-admin/src/main/java/com/kmall/admin/haikong/vo/QueryGoodsVO.java

@@ -8,7 +8,7 @@ import java.util.Objects;
  * @author lhm
  * @createDate 2021-11-15
  */
-public class QueryGoodsVo {
+public class QueryGoodsVO {
 
     /**
      * 商品条码
@@ -38,7 +38,7 @@ public class QueryGoodsVo {
     /**
      * 商品预估税
      */
-    private BigDecimal goodstaxes;
+    private BigDecimal goodsTaxes;
 
     /**
      * 商品优惠金额
@@ -120,6 +120,11 @@ public class QueryGoodsVo {
      */
     private Integer exitRegionNumber;
 
+    /**
+     * 总价格,含税价
+     */
+    private BigDecimal totalPrice;
+
     public String getProdBarcode() {
         return prodBarcode;
     }
@@ -160,12 +165,12 @@ public class QueryGoodsVo {
         this.retailPrice = retailPrice;
     }
 
-    public BigDecimal getGoodstaxes() {
-        return goodstaxes;
+    public BigDecimal getGoodsTaxes() {
+        return goodsTaxes;
     }
 
-    public void setGoodstaxes(BigDecimal goodstaxes) {
-        this.goodstaxes = goodstaxes;
+    public void setGoodsTaxes(BigDecimal goodsTaxes) {
+        this.goodsTaxes = goodsTaxes;
     }
 
     public BigDecimal getDisCountedPrice() {
@@ -296,15 +301,23 @@ public class QueryGoodsVo {
         this.exitRegionNumber = exitRegionNumber;
     }
 
+    public BigDecimal getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(BigDecimal totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
     @Override
     public String toString() {
-        return "QueryGoodsVo{" +
+        return "QueryGoodsVO{" +
                 "prodBarcode='" + prodBarcode + '\'' +
                 ", sku='" + sku + '\'' +
                 ", storeId=" + storeId +
                 ", sellVolume=" + sellVolume +
                 ", retailPrice=" + retailPrice +
-                ", goodstaxes=" + goodstaxes +
+                ", goodsTaxes=" + goodsTaxes +
                 ", disCountedPrice=" + disCountedPrice +
                 ", goodsNumber=" + goodsNumber +
                 ", goodsSn='" + goodsSn + '\'' +
@@ -321,6 +334,7 @@ public class QueryGoodsVo {
                 ", ciqProdModel='" + ciqProdModel + '\'' +
                 ", toBeRestored=" + toBeRestored +
                 ", exitRegionNumber=" + exitRegionNumber +
+                ", totalPrice=" + totalPrice +
                 '}';
     }
 
@@ -342,7 +356,7 @@ public class QueryGoodsVo {
         if (Objects.isNull(obj)) {
             return false;
         }
-        if (obj instanceof QueryGoodsVo) {
+        if (obj instanceof QueryGoodsVO) {
             return this.hashCode() == obj.hashCode();
         }
         return false;

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

@@ -6,7 +6,7 @@ import com.kmall.admin.dto.GoodsPanoramaDto;
 import com.kmall.admin.entity.GoodsEntity;
 import com.kmall.admin.entity.TaxErrorRecordEntity;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
 
 import java.util.List;
@@ -231,8 +231,16 @@ public interface GoodsService {
 
     /**
      * 查询库存及sku的信息,查询出来的库存是门店的库存
-     * @param queryGoodsVoList 查询条件,包含商品条码、sku、门店id
+     * @param queryGoodsVOList 查询条件,包含商品条码、sku、门店id
      * @return              商品信息
      */
-    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVo> queryGoodsVoList);
+    List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVO> queryGoodsVOList);
+
+    /**
+     * 根据产品条码和sku查询保税展示补货的商品
+     * @param prodBarcode   商品条码
+     * @param sku           sku
+     * @return              商品信息
+     */
+    GoodsEntity queryGoodsInfoByProductBarcodeAndSku(String prodBarcode, String sku);
 }

+ 15 - 0
kmall-admin/src/main/java/com/kmall/admin/service/MkActivitiesFullGiftService.java

@@ -89,4 +89,19 @@ public interface MkActivitiesFullGiftService {
      * @return
      */
     MkActivitiesFullGiftEntity queryByCodeOrBrand(String mkaId, String prodBarcode, String brandName, String nowTime);
+
+    /**
+     * 根据营销活动编号获取满赠活动信息
+     * @param mkaIdList     营销活动编号集合
+     * @return              满赠营销活动信息
+     */
+    List<MkActivitiesFullGiftEntity> queryByMkaIdList(List<Long> mkaIdList);
+
+    /**
+     * 查询活动id对应的满赠活动规则
+     * @param mkaId 活动id
+     * @param storeId 门店id
+     * @return      满赠活动规则
+     */
+    MkActivitiesFullGiftEntity queryObjectByMkaIdAndStoreId(Integer mkaId, String storeId);
 }

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

@@ -104,4 +104,12 @@ public interface MkActivitiesPromotionService {
      * @param mkaId
      */
     void updatePriceBySku(String updatePrice, String sku, Long mkaId);
+
+    /**
+     * 查询活动id对应的限时特价活动规则
+     * @param mkaId 活动id
+     * @param storeId 门店id
+     * @return      限时特价活动规则
+     */
+    List<MkActivitiesPromotionEntity> queryListByMkaIdAndStoreId(int mkaId, String storeId);
 }

+ 11 - 1
kmall-admin/src/main/java/com/kmall/admin/service/OrderService.java

@@ -3,6 +3,8 @@ package com.kmall.admin.service;
 import com.kmall.admin.dto.*;
 import com.kmall.admin.entity.*;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.common.utils.Query;
 import com.kmall.common.utils.R;
 import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
@@ -10,7 +12,6 @@ import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult
 import com.kmall.common.utils.print.ticket.item.Ticket;
 import com.kmall.common.utils.wechat.WechatRefundApiResult;
 import net.sf.json.JSONObject;
-import org.apache.ibatis.annotations.Param;
 
 import java.io.IOException;
 import java.util.List;
@@ -234,4 +235,13 @@ public interface OrderService {
     void toBeRestored(String orderSn);
 
     Ticket printMsgEwb(long longValue, String sessionId);
+
+    /**
+     * 计算优惠价格,活动价格
+     * @param calculateOrderDiscountPriceVo 请求参数
+     * @return  商品集合
+     */
+    CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPrice(CalculateOrderDiscountPriceVO calculateOrderDiscountPriceVo);
+
+    R resendOrderHkMall(String orderSn);
 }

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

@@ -71,4 +71,6 @@ public interface SysMacroService {
     int deleteBatch(Long[] macroIds);
 
     List<SysMacroEntity> queryMacrosByValue(String value);
+
+    List<SysMacroEntity> queryMacrosByValueRules(Integer id);
 }

+ 305 - 252
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -13,7 +13,8 @@ import com.kmall.admin.entity.*;
 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.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.admin.service.*;
 import com.kmall.admin.service.kmall2eccs.KtoEccsService;
 import com.kmall.admin.service.mk.MkActivitiesService;
@@ -28,6 +29,8 @@ import com.kmall.common.constant.Dict;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.common.utils.*;
 import com.kmall.manager.manager.redis.JedisUtil;
+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;
@@ -47,6 +50,9 @@ import java.util.stream.Collectors;
  */
 @Service("goodsService")
 public class GoodsServiceImpl implements GoodsService {
+
+    private static final Logger log = LoggerFactory.getLogger(GoodsServiceImpl.class);
+
     @Autowired
     private MerchDao merchDao;
     @Autowired
@@ -120,6 +126,9 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private KtoEccsService ktoEccsService;
 
+    @Autowired
+    private HaiKongWarehouseTemplate haiKongWarehouseTemplate;
+
     @Override
     public GoodsEntity queryObject(Integer id) {
         Map<String, Object> map = new HashMap<String, Object>();
@@ -1733,7 +1742,7 @@ public class GoodsServiceImpl implements GoodsService {
 
     /**
      * 查询产品价格
-     *
+     * 改进后的逻辑:
      * @param prodBarcode
      * @param storeId
      * @return
@@ -1748,264 +1757,298 @@ public class GoodsServiceImpl implements GoodsService {
         if(goods == null) {
             return null;
         }
+
+        /*
+        * 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();
+        // 海控展销店出区数
+        Integer exitRegionNumber = goods.getExitRegionNumber();
+        // 门店库存
+        String stockNum = goods.getStockNum();
+        // 扫码只会扫一件商品,保税仓库存 + 展销店库存 - 出区数 >= 购买数
+        if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) >= 1)) {
+            // 库存不足
+            log.error("商品条码:【{}】,sku:【{}】,门店ID:【{}】,该商品库存不足!", prodBarcode, sku, storeId);
+            throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店ID:【%s】,该商品库存不足!", prodBarcode, sku, storeId));
+        }*/
         goods.setDiscountedPrice(new BigDecimal(0));
         BigDecimal retailPrice = goods.getRetailPrice();
 
-
         goods.setActualPaymentAmount(retailPrice.setScale(2,RoundingMode.HALF_UP));
 
         Map<String,Object> skuActivitiesMap = new HashMap<>();
 
-        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
-        /**
-         * 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("临时促销");
-
-            }
-        }
+//        /**
+//         * 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);
         goods.setGoodstaxes(tax.toString());
-
+        goods.setSellVolume(1);
 
         skuActivitiesMap.put("goods",goods);
         return skuActivitiesMap;
@@ -2414,12 +2457,12 @@ public class GoodsServiceImpl implements GoodsService {
     /**
      * 查询库存及sku的信息,查询出来的库存是门店的库存
      *
-     * @param queryGoodsVoList 查询条件,包含商品条码、sku、门店id
+     * @param queryGoodsVOList 查询条件,包含商品条码、sku、门店id
      * @return 商品信息
      */
     @Override
-    public List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVo> queryGoodsVoList) {
-        return goodsDao.queryGoodsStockByQueryGoodsVoList(queryGoodsVoList);
+    public List<GoodsEntity> queryGoodsStockByQueryGoodsVoList(List<QueryGoodsVO> queryGoodsVOList) {
+        return goodsDao.queryGoodsStockByQueryGoodsVoList(queryGoodsVOList);
     }
 
     /**
@@ -2714,5 +2757,15 @@ public class GoodsServiceImpl implements GoodsService {
 
     }
 
-
+    /**
+     * 根据产品条码和sku查询保税展示补货的商品
+     *
+     * @param prodBarcode 商品条码
+     * @param sku         sku
+     * @return 商品信息
+     */
+    @Override
+    public GoodsEntity queryGoodsInfoByProductBarcodeAndSku(String prodBarcode, String sku) {
+        return goodsDao.queryGoodsInfoByProductBarcodeAndSku(prodBarcode, sku);
+    }
 }

+ 22 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesFullGiftServiceImpl.java

@@ -150,4 +150,26 @@ public class MkActivitiesFullGiftServiceImpl implements MkActivitiesFullGiftServ
     public MkActivitiesFullGiftEntity queryByCodeOrBrand(String mkaId, String prodBarcode, String brandName, String nowTime) {
         return mkActivitiesFullGiftDao.queryByCodeOrBrand(mkaId,prodBarcode,brandName,nowTime);
     }
+
+    /**
+     * 根据营销活动编号获取满赠活动信息
+     *
+     * @param mkaIdList 营销活动编号集合
+     * @return 满赠营销活动信息
+     */
+    @Override
+    public List<MkActivitiesFullGiftEntity> queryByMkaIdList(List<Long> mkaIdList) {
+        return mkActivitiesFullGiftDao.queryByMkaIdList(mkaIdList);
+    }
+
+    /**
+     * 查询活动id对应的满赠活动规则
+     * @param mkaId 活动id
+     * @param storeId 门店id
+     * @return      满赠活动规则
+     */
+    @Override
+    public MkActivitiesFullGiftEntity queryObjectByMkaIdAndStoreId(Integer mkaId, String storeId) {
+        return mkActivitiesFullGiftDao.queryObjectByMkaIdAndStoreId(mkaId, storeId);
+    }
 }

+ 12 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/MkActivitiesPromotionServiceImpl.java

@@ -156,4 +156,16 @@ public class MkActivitiesPromotionServiceImpl implements MkActivitiesPromotionSe
     public void updatePriceBySku(String updatePrice, String sku, Long mkaId) {
         mkActivitiesPromotionDao.updatePriceBySku(updatePrice,sku,mkaId);
     }
+
+    /**
+     * 查询活动id对应的限时特价活动规则
+     *
+     * @param mkaId   活动id
+     * @param storeId 门店id
+     * @return 限时特价活动规则
+     */
+    @Override
+    public List<MkActivitiesPromotionEntity> queryListByMkaIdAndStoreId(int mkaId, String storeId) {
+        return mkActivitiesPromotionDao.queryListByMkaIdAndStoreId(mkaId, storeId);
+    }
 }

+ 695 - 155
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.ImmutableBiMap;
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.gson.Gson;
 import com.google.gson.internal.LinkedTreeMap;
@@ -21,7 +20,7 @@ import com.kmall.admin.dao.vip.Mall2MemberPointsDao;
 import com.kmall.admin.dao.vip.Mall2PointsRulesDao;
 import com.kmall.admin.dto.*;
 import com.kmall.admin.entity.*;
-import com.kmall.admin.entity.kmall2eccs.KtoEccsEntity;
+import com.kmall.admin.entity.mk.MkActivitiesEntity;
 import com.kmall.admin.entity.mk.store.MkStorePromOrderRealEntity;
 import com.kmall.admin.entity.record.NewRetailOrderRestoreStockRecordEntity;
 import com.kmall.admin.entity.vip.Mall2MemberConsumptionRecordsEntity;
@@ -29,15 +28,21 @@ import com.kmall.admin.entity.vip.Mall2MemberPointsEntity;
 import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
 import com.kmall.admin.fromcomm.dao.SysConfigDao;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.haikong.constant.Constants;
+import com.kmall.admin.haikong.constant.VmcconnectUrlEnum;
+import com.kmall.admin.haikong.dto.WareQueryStockResponseDTO;
 import com.kmall.admin.haikong.utils.ListUtils;
-import com.kmall.admin.haikong.vo.QueryGoodsVo;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
+import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
 import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
+import com.kmall.admin.haikong.client.VmcShopTemplate;
 import com.kmall.admin.haikong.config.HaiKongProperties;
 import com.kmall.admin.haikong.dto.MemberInfoDTO;
 import com.kmall.admin.haikong.utils.Response;
 import com.kmall.admin.service.*;
 import com.kmall.admin.service.kmall2eccs.KtoEccsService;
+import com.kmall.admin.service.mk.MkActivitiesService;
 import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
 import com.kmall.admin.service.mk.store.MkStoreTicketDiscountService;
 import com.kmall.admin.service.record.NewRetailOrderRestoreStockRecordService;
@@ -48,6 +53,7 @@ import com.kmall.admin.utils.data.response.ResponseMessageData;
 import com.kmall.admin.utils.jackson.JacksonUtil;
 import com.kmall.admin.utils.oms.OmsSign;
 import com.kmall.admin.utils.pdf.BarcodeUtil;
+import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceVO;
 import com.kmall.admin.websocket.WebSocketServer;
 import com.kmall.api.entity.OrderGoodsRestoreVo;
 import com.kmall.api.entity.OrderGoodsVo;
@@ -95,6 +101,7 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 
@@ -194,9 +201,6 @@ public class OrderServiceImpl implements OrderService {
     private Mall2LowPriceWarningDao lowPriceWarningDao;
 
     @Autowired
-    private MkActivitiesCouponService mkActivitiesCouponService;
-
-    @Autowired
     private OrderRefundService orderRefundService;
     @Autowired
     private OrderExceptionRecordService orderExceptionRecordService;
@@ -204,10 +208,6 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private AddressInfoService addressInfoService;
 
-
-    @Autowired
-    private KtoEccsService ktoEccsService;
-
     @Autowired
     private CustomsClearanceTimeliness customsClearanceTimeliness;
 
@@ -219,6 +219,38 @@ public class OrderServiceImpl implements OrderService {
 
     @Autowired
     private HaiKongProperties haiKongProperties;
+    /**
+     * 免税mall接口工具类
+     */
+    @Autowired
+    private VmcShopTemplate vmcShopTemplate;
+
+    @Autowired
+    private MkActivitiesService mkActivitiesService;
+
+    /**
+     * 满赠
+     */
+    @Autowired
+    private MkActivitiesFullGiftService mkActivitiesFullGiftService;
+
+    /**
+     * 优惠券
+     */
+    @Autowired
+    private MkActivitiesCouponService mkActivitiesCouponService;
+
+    /**
+     * 限时特价
+     */
+    @Autowired
+    private MkActivitiesPromotionService mkActivitiesPromotionService;
+    /**
+     * 免税mall日志记录
+     */
+    @Autowired
+    private MallVmcSendLogDao mallVmcSendLogDao;
+
 
 
     @Override
@@ -808,8 +840,6 @@ public class OrderServiceImpl implements OrderService {
         map.put("orderId", order.getId());
         List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
 
-        // TODO 退单的库存明细存入表中,准备发送到中控
-        List<KtoEccsEntity> ktoEccsEntities = new LinkedList<>();
         for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
             ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
                     .queryByGoodsIdAndStoreId(order.getStoreId().longValue(), orderGoodsEntity.getGoodsId().longValue());
@@ -820,42 +850,17 @@ public class OrderServiceImpl implements OrderService {
             if (sellVolume.compareTo(Constant.ZERO) < 0) {
                 sellVolume = Constant.ZERO;
             }
-
+//            GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
+//            if (goodsEntity != null) {
+//                stockNum = goodsEntity.getGoodsNumber();
+//                //还原商户商品库存
+//                resetGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
+//            }
             Integer stockNum = 0;
-            GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
-            if (goodsEntity != null) {
-                stockNum = goodsEntity.getGoodsNumber();
-                //还原商户商品库存
-                resetGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
-            }
             if (null != storeRelaEntity.getStockNum()) {
                 stockNum = storeRelaEntity.getStockNum();
                 resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
             }
-
-
-//            orderGoodsVoList
-            KtoEccsEntity ktoEccsEntity = new KtoEccsEntity();
-            ktoEccsEntity.setRequestData(JSON.toJSONString(orderGoodsEntity));
-            ktoEccsEntity.setRequestType("04");
-            ktoEccsEntity.setSendStatus("00");
-            if (user != null) {
-                ktoEccsEntity.setCreaterSn(user.getUserId() + "");
-            } else {
-                ktoEccsEntity.setCreaterSn("9999");
-            }
-            ktoEccsEntity.setCreateTime(new Date());
-            ktoEccsEntities.add(ktoEccsEntity);
-        }
-        if (ktoEccsEntities.size() > 0) {
-            if (ktoEccsEntities.size() > 50) {
-                List<List<KtoEccsEntity>> partition = Lists.partition(ktoEccsEntities, 50);
-                for (List<KtoEccsEntity> ktoEccs : partition) {
-                    ktoEccsService.saveBatch(ktoEccs);
-                }
-            } else {
-                ktoEccsService.saveBatch(ktoEccsEntities);
-            }
         }
     }
 
@@ -939,8 +944,6 @@ public class OrderServiceImpl implements OrderService {
             }
             goodsDao.update(goodsEntity);
 
-//            storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
-//            productStoreRelaDao.update(storeRelaEntity);
             String username = "system";
             if (user != null) {
                 username = user.getUsername();
@@ -1006,6 +1009,44 @@ public class OrderServiceImpl implements OrderService {
     }
 
     /**
+     * 海控还原门店商品库存
+     * @param stockNum
+     * @param storeRelaEntity
+     * @param orderGoodsEntity
+     * @param sellVolume
+     * @param user
+     */
+    private void resetStoreGoodsStockMall(Integer stockNum, ProductStoreRelaEntity storeRelaEntity,
+                                      OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume,SysUserEntity user) {
+        storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString())); // 减退库存
+        //库存数量 + 商品数量
+        storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
+        //待退款数量 - 商品数量
+        storeRelaEntity.setToBeRestored(storeRelaEntity.getToBeRestored() - orderGoodsEntity.getNumber());
+        productStoreRelaDao.update(storeRelaEntity);
+
+        String username = "system";
+        if (user != null) {
+            username = user.getUsername();
+        }
+        StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+        storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
+        storeMngChangeEntity.setChangeReason("前端退款");
+        storeMngChangeEntity.setGoodsId(storeRelaEntity.getGoodsId().intValue());
+        storeMngChangeEntity.setStoreId(storeRelaEntity.getStoreId().intValue());
+        storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
+        storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
+        storeMngChangeEntity.setStoreOriginalNum(stockNum);
+        storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
+        storeMngChangeEntity.setCreateTime(new Date());
+        storeMngChangeEntity.setModTime(new Date());
+        storeMngChangeEntity.setCreaterSn(username);
+        storeMngChangeEntity.setModerSn(username);
+        storeMngChangeEntity.setIsValid(0);
+        storeMngChangeDao.save(storeMngChangeEntity);
+    }
+
+    /**
      * 查询该退款订单编号是否是推广渠道订单,是则修改渠道定时扫描状态
      *
      * @param orderInfo
@@ -2036,9 +2077,23 @@ public class OrderServiceImpl implements OrderService {
             LOGGER.error("调用库存系统接口出现错误!返回结果为空!");
             throw new ServiceException("调用库存系统接口出现错误!");
         }
-        // TODO 解析xml,组装成map key=>sku value=>库存
+        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;
         // 商品总价格(不含税)
@@ -2047,27 +2102,31 @@ public class OrderServiceImpl implements OrderService {
         BigDecimal totalTax = BigDecimal.ZERO;
 
         List<OrderGoodsEntity> orderGoodsEntities = new ArrayList<>();
+        List<GoodsEntity> goodsEntities = new ArrayList<>();
 
         // TODO 根据商品条码、sku、门店id查询相对应的商品信息,并组装成对象
-        List<QueryGoodsVo> queryGoodsVoList = new ArrayList<>();
+        List<QueryGoodsVO> queryGoodsVOList = new ArrayList<>();
         goodsList.forEach(map -> {
-            QueryGoodsVo queryGoodsVo = new QueryGoodsVo();
+            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.setGoodsTaxes(new BigDecimal(String.valueOf(map.get("goodstaxes"))));
             queryGoodsVo.setDisCountedPrice(new BigDecimal(String.valueOf(map.get("disCountedPrice"))));
-            queryGoodsVoList.add(queryGoodsVo);
+            queryGoodsVOList.add(queryGoodsVo);
         });
         // 将在循环中查询数据库改为一次性查询
-        List<GoodsEntity> goodsEntityList = goodsService.queryGoodsStockByQueryGoodsVoList(queryGoodsVoList);
+        List<GoodsEntity> goodsEntityList = goodsService.queryGoodsStockByQueryGoodsVoList(queryGoodsVOList);
         // 复制集合数据
         ListUtils listUtils = BeanUtils.instantiate(ListUtils.class);
-        listUtils.copyList(goodsEntityList, queryGoodsVoList);
+        listUtils.copyList(goodsEntityList, queryGoodsVOList);
+        // 用来存储是否达到满赠条件的map
+        Map<String, BigDecimal> categoryConditionMap = new HashMap<>();
+        Map<String, BigDecimal> brandConditionMap = new HashMap<>();
 
-        for (QueryGoodsVo goodsEntity : queryGoodsVoList) {
+        for (QueryGoodsVO goodsEntity : queryGoodsVOList) {
             OrderGoodsEntity orderGoodsEntity = new OrderGoodsEntity();
             // 要购买的数量
             Integer sellVolume = goodsEntity.getSellVolume();
@@ -2078,7 +2137,7 @@ public class OrderServiceImpl implements OrderService {
             // 订单金额(含税价),订单总金额,用户支付的金额
             BigDecimal retailPrice = goodsEntity.getRetailPrice();
             // 商品预估税率
-            BigDecimal goodsTaxes = goodsEntity.getGoodstaxes();
+            BigDecimal goodsTaxes = goodsEntity.getGoodsTaxes();
             // 商品优惠金额
             BigDecimal disCountedPrice = goodsEntity.getDisCountedPrice();
             // 商品金额(不包含税的价格),推送海关电子订单需要
@@ -2089,29 +2148,91 @@ public class OrderServiceImpl implements OrderService {
             totalTax = totalTax.add(goodsTaxes);
             // 当前sku
             String currentSku = goodsEntity.getSku();
-            // TODO 判断库存。。
-            if (!stockMap.containsKey(currentSku)) {
-                LOGGER.error("库存系统中不包含此sku:【{}】,校验库存出错!下单失败!", currentSku);
-                throw new ServiceException(String.format("不包含此sku:【%s】", currentSku));
-            }
             // 仓库库存
             Integer warehouseStock = stockMap.get(currentSku);
-            // 当前出区数
-            Integer exitRegionNumber = goodsEntity.getExitRegionNumber();
             // 门店库存
             Integer stockNum = goodsEntity.getStockNum();
-            // 保税仓库存 + 门店库存 - 出区数 >= 购买数
-            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));
+            // 判断库存。。
+            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);
-            orderGoodsEntity = wrapOrderGoods(orderGoodsEntity, entity);
+            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);
+                        }
+                    }
+                });
+            }
         }
-        // 2. 校验是否是会员,调用会员系统查询会员信息,查询接口:
+
+
+        // 3. 校验是否是会员,调用会员系统查询会员信息,查询接口:
         // 优惠后价格
         BigDecimal afterDiscountPrice;
         if (org.springframework.util.StringUtils.isEmpty(couponBarCode)) {
@@ -2136,6 +2257,7 @@ public class OrderServiceImpl implements OrderService {
                         afterDiscountPrice = calculatePreferentialPrice(orderPrice, 0, goodsList, storeId, userInfo);
                     }
                 } else {
+                    LOGGER.error("查询会员信息失败!响应结果:{}", queryMemberInfoResponse);
                     throw new ServiceException("查询会员信息失败!请重新下单!");
                 }
             } catch (Exception e) {
@@ -2143,7 +2265,7 @@ public class OrderServiceImpl implements OrderService {
                 throw new ServiceException("查询会员信息失败!请重新下单!");
             }
         }
-        // 3. 调用付款接口
+        // 4. 调用付款接口
         // 判断是微信的支付码还是支付宝的支付码
         if (parCode.startsWith("28")) {
             // 支付宝支付
@@ -2163,9 +2285,9 @@ public class OrderServiceImpl implements OrderService {
             }
         }
 
-        // 4. 扣减库存
+        // 5. 扣减库存
 
-        // 5. 推送订单到免税mall
+        // 6. 订单入库
 
 
         return resultObj;
@@ -2181,7 +2303,9 @@ public class OrderServiceImpl implements OrderService {
         // 设置商品信息
         BeanUtils.copyProperties(goodsEntity, orderGoodsEntity);
         // 设置订单信息
-        
+        // 销售数
+        orderGoodsEntity.setNumber(goodsEntity.getGoodsNumber());
+        // TODO other...
         return orderGoodsEntity;
     }
 
@@ -3160,7 +3284,6 @@ public class OrderServiceImpl implements OrderService {
                 orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
             return R.error("订单已退款");
         }
-
         if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
             return R.error("订单正在准备,请稍等!");
         }
@@ -3175,12 +3298,10 @@ public class OrderServiceImpl implements OrderService {
         }
 
         String payFlag = order.getPayFlag();
-
         String key  = "kmall_order_refund_" + order.getOrderSn();
         if (JedisUtil.exists(key)) {
             return R.error("订单退款操作过快,请等待!");
         }
-
         JedisUtil.set(key, System.currentTimeMillis() + "", 3);
         if (orderInfo.getPayStatus() == Integer.parseInt(Dict.payStatus.item_3.getItem())) {
             return R.error("订单正在退款中,请勿重复退款");
@@ -3196,67 +3317,34 @@ public class OrderServiceImpl implements OrderService {
         cdl.await();
 
         if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
-
             Double totalActualPrice = orderDao.getTotalActualPrice(orderInfo.getMerchOrderSn());
             if (totalActualPrice == null) {
                 totalActualPrice = 0d;
             }
-            String refundResult = "";
             if (orderInfo.getOrderStatus() != Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
-                LOGGER.info("微信退款开始");
-
-                WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn().toString(), totalActualPrice,
+                LOGGER.info("[微信退款开始--------orderRefund]"+order.getOrderSn());
+                WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn(), totalActualPrice,
                         orderInfo.getActualPrice().doubleValue());
-                OrderRefundEntity orderRefund = new OrderRefundEntity();
-                orderRefund.setRefundId(result.getRefund_id());
-                orderRefund.setOutRefundNo(result.getOut_trade_no());
-                orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
-                orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款处理中
-                orderRefund.setModTime(new Date());
-                orderRefund.setRefundTime(new Date());
-                orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
-                orderRefund.setUserId(user.getUserId().intValue());
-                orderRefund.setRefundId(order.getUserId() + "");
-                orderRefund.setCreateTime(new Date());
-                List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
-                if (list.size() > 1) {//多条订单
-                    orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
-                } else {
-                    orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
-                }
-
-
                 order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
                 order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
-                LOGGER.info("微信退款");
-
-                orderDao.update(order);//修改为退款成功
+                //修改为退款成功
+                orderDao.update(order);
                 // 修改小票码
                 PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
                 pickUpCodeEntity.setPickUpCodeStatus("3");
                 pickUpCodeService.update(pickUpCodeEntity);
+                //还原库存,调用免税mall接口退款
+                restoreInventoryMsMall(order);
+                //新增退款记录
+                OrderRefundEntity orderRefund = orderRefundLog(result.getRefund_id(),result.getOut_trade_no(),result.getRefund_fee(),order.getId(),user.getUserId(),order.getMerchOrderSn());
+                orderRefundDao.save(orderRefund);
 
-                // 判断该订单是否进入oms系统
-                if (!arrivedOms(order.getOrderSn())) {
-                    // oms无该订单,则直接退款
-                    restoreInventory(order, "收银端退款");
-                    orderRefund.setRestore(1);
-                } else {
-                    // 如果oms有订单,统一进入锁库存情况
-                    orderRefund.setRestore(0);
-                    toBeRestoreInventory(order);
-                }
-
-                orderRefundDao.save(orderRefund);//退款记录
             }
             // 支付宝的退款代码
         } else if (Dict.payFlag.item_alipay.getItem().equals(payFlag)) {
-
-
-
+            LOGGER.info("[支付宝退款开始--------orderRefund]"+order.getOrderSn());
             AliPayMicropayApiResult userRefund = AliPayUtil.aliTradeRefund(order.getOrderSn(), order.getActualPrice().toString(),
                     "用户退款", order.getStoreId() + "");
-
             // 是否已退款校验
             try {
                 String fundChange = userRefund.getFundChange();
@@ -3264,56 +3352,109 @@ public class OrderServiceImpl implements OrderService {
                     return R.error("资金已退回,请勿重复退款!");
                 }
             } catch (Exception e) {
-
+                LOGGER.error("[支付宝退款校验出错]",e.getMessage());
             }
-
             LOGGER.info(userRefund.getSubMsg());
-
-            OrderRefundEntity orderRefund = new OrderRefundEntity();
-            orderRefund.setRefundId(userRefund.getTradeNo());
-            orderRefund.setOutRefundNo(userRefund.getOutTradeNo());
-            orderRefund.setRefundMoney(new BigDecimal(userRefund.getRefundFee()));
-
-
-            orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款成功
-            orderRefund.setModTime(new Date());
-            orderRefund.setRefundTime(new Date());
-            orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
-            orderRefund.setUserId(user.getUserId().intValue());
-            orderRefund.setRefundId(order.getUserId() + "");
-            orderRefund.setCreateTime(new Date());
-            List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
-            if (list.size() > 1) {//多条订单
-                orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
-            } else {
-                orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
-            }
-
-
             order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
             order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
-            orderDao.update(order);//修改为退款成功
+            //修改为退款成功
+            orderDao.update(order);
             // 修改小票码
             PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
             pickUpCodeEntity.setPickUpCodeStatus("3");
             pickUpCodeService.update(pickUpCodeEntity);
-            // 判断该订单是否进入oms系统
-            if (!arrivedOms(order.getOrderSn())) {
-                // oms无该订单,则直接退款
-                restoreInventory(order, "收银端退款");
-                orderRefund.setRestore(1);
-            } else {
-                // 如果oms有订单,统一进入锁库存情况
-                orderRefund.setRestore(0);
-                toBeRestoreInventory(order);
+            //还原库存,调用免税mall接口退款
+            restoreInventoryMsMall(order);
+            //新增退款记录
+            OrderRefundEntity orderRefund = orderRefundLog(userRefund.getTradeNo(),userRefund.getOutTradeNo(),userRefund.getRefundFee(),order.getId(),user.getUserId(),order.getMerchOrderSn());
+            orderRefundDao.save(orderRefund);
+        }
+
+        return R.ok("退款成功");
+    }
+
+
+    /**
+     * 新增退款记录
+     * @param refundId
+     * @param OutTradeNo
+     * @param refundFee
+     * @param orderId
+     * @param userId
+     * @param merchOrderSn
+     * @return
+     */
+    private OrderRefundEntity orderRefundLog(String refundId,String OutTradeNo,String refundFee,Long orderId,Long userId,String merchOrderSn){
+        OrderRefundEntity orderRefund = new OrderRefundEntity();
+        orderRefund.setRefundId(refundId);
+        orderRefund.setOutRefundNo(OutTradeNo);
+        orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(refundFee)).divide(Constant.ONE_HUNDRED));
+        orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款处理中
+        orderRefund.setModTime(new Date());
+        orderRefund.setRefundTime(new Date());
+        orderRefund.setOrderId(orderId.intValue());
+        orderRefund.setUserId(userId.intValue());
+        orderRefund.setRefundId(userId + "");
+        orderRefund.setCreateTime(new Date());
+        Integer sum = orderDao.queryObjectByMerchOrderSnHkMall(merchOrderSn);
+        if (sum > 1) {//多条订单
+            orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
+        } else {
+            orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
+        }
+        orderRefund.setRestore(1);
+        return orderRefund;
+    }
+
+    /**
+     * 海控订单退款
+     * @param order
+     */
+    private void restoreInventoryMsMall(OrderEntity order) {
+        Map<String, Object> map = new HashMap();
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        map.put("orderId", order.getId());
+        //mall_order_goodsd,订单明细
+        List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryListHkMall(map);
+        for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
+            ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
+                    .queryByGoodsIdAndStoreIdHkMall(order.getStoreId().longValue(), orderGoodsEntity.getGoodsId().longValue());
+            if (null == storeRelaEntity || null == storeRelaEntity.getSellVolume()) {
+                storeRelaEntity.setSellVolume(0);
+            }
+            //销售量 - 商品数量
+            BigDecimal sellVolume = new BigDecimal(storeRelaEntity.getSellVolume() - orderGoodsEntity.getNumber());//销售量
+            if (sellVolume.compareTo(Constant.ZERO) < 0) {
+                sellVolume = Constant.ZERO;
             }
 
-            orderRefundDao.save(orderRefund);//退款记录
+            //还原门店库存
+            if (null != storeRelaEntity.getStockNum()) {
+                resetStoreGoodsStockMall(storeRelaEntity.getStockNum(), storeRelaEntity, orderGoodsEntity, sellVolume, user);
+            }
         }
+        //调用免税mall接口
+        vmcShopMall(order);
+    }
+
+    /**
+     *海控免税mall接口
+     * @param order
+     */
+    private void vmcShopMall(OrderEntity order) {
+        LOGGER.info("=======> [调用VMCShop接口开始发送退款订单数据]"+order.getOrderSn());
+        String body = JacksonUtil.toJson(order.getOrderSn());
+        String response = vmcShopTemplate.refundOrder(body);
+        //解析响应数据
+        LOGGER.info("=======> [发送退款订单数据成功,开始处理后续流程]"+response);
+        //Map<String,String> res = JSON.parseObject(response,Map.class);
+
+        saveVmcSend(order.getOrderSn(),VmcconnectUrlEnum.ORDERS_CANCEL_ORDER.getMethod(),body,response);
+        LOGGER.info(order.getOrderSn()+"[发送退款订单数据]"+JSON.toJSONString(order));
 
-        return R.ok("退款成功");
     }
 
+
     @Transactional
     public void toBeRestoreInventory(OrderEntity order) {
 
@@ -3873,6 +4014,405 @@ public class OrderServiceImpl implements OrderService {
             return TicketPrintUtil.print(head, goodsList, cashInfo, cusListing, mailInfo);
     }
 
+    /**
+     * 计算优惠价格,活动价格
+     *
+     * @param calculateOrderDiscountPriceVo 请求参数
+     * @return 商品集合
+     */
+    @Override
+    public CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPrice(CalculateOrderDiscountPriceVO calculateOrderDiscountPriceVo) {
+        if (Objects.isNull(calculateOrderDiscountPriceVo)) {
+            LOGGER.error("计算活动优惠价格,请求参数为null!");
+            throw new ServiceException("计算活动优惠价格,请求参数为null!");
+        }
+        CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO = new CalculateOrderDiscountPriceResponseVO();
+        String storeId = calculateOrderDiscountPriceVo.getStoreId();
+        String memberCode = calculateOrderDiscountPriceVo.getMemberCode();
+        List<GoodsDetailsDto> goodsDetailsDtos = calculateOrderDiscountPriceVo.getGoodsList();
+        BigDecimal orderTotalPrice = BigDecimal.ZERO;
+        List<QueryGoodsVO> goodsVos = new ArrayList<>();
+        for (GoodsDetailsDto good : goodsDetailsDtos) {
+            QueryGoodsVO queryGoodsVo = new QueryGoodsVO();
+            BeanUtils.copyProperties(good, queryGoodsVo);
+            queryGoodsVo.setSku(good.getGoodsSn());
+            queryGoodsVo.setStoreId(Integer.parseInt(storeId));
+            orderTotalPrice = orderTotalPrice.add(good.getActualPaymentAmount());
+            goodsVos.add(queryGoodsVo);
+        }
+        calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
+        calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
+
+        // 查询商品表
+        List<GoodsEntity> goodsEntities = goodsService.queryGoodsStockByQueryGoodsVoList(goodsVos);
+
+        /*
+         * 2.查询当前时间,该门店是否有活动,如果有活动,查询开启了哪些营销方式
+         * 参数: 当前时间  门店id
+         */
+        List<MkActivitiesEntity> mkActivitiesEntityList = mkActivitiesService.queryByNow(storeId, DateUtils.format(new Date(), "yyyy-MM-dd"));
+        // 活动优先级判定,特价>打折>满减/满赠>优惠券>积分抵扣;
+//        List<Constants.ActivityTopicEnum> activityTopicEnums = Arrays.asList(Constants.ActivityTopicEnum.values());
+//        for (MkActivitiesEntity mkActivitiesEntity : mkActivitiesEntityList) {
+//            for (Constants.ActivityTopicEnum activityTopicEnum : activityTopicEnums) {
+//                if (activityTopicEnum.get) {
+//
+//                }
+//            }
+//        }
+        /*
+         * 活动相关规则:
+         * 1. 优先优惠券再去计算积分
+         * 2. 满赠的赠品商品在推送定时时零售价为0
+         * 3. 任何活动都优先于积分计算
+         * 4. 活动之间具有互斥性
+         */
+        if (CollectionUtils.isEmpty(mkActivitiesEntityList) && org.springframework.util.StringUtils.isEmpty(memberCode)) {
+            LOGGER.info("门店【{}】,在当前时间无相关活动信息!", storeId);
+            for (GoodsDetailsDto goodsDetailsDto : goodsDetailsDtos) {
+                GoodsEntity goodsEntity = new GoodsEntity();
+                BeanUtils.copyProperties(goodsDetailsDto, goodsEntity);
+                goodsEntity.setGoodsRate(new BigDecimal(goodsDetailsDto.getGoodsRate()));
+                // 无活动情况,实际支付价 = 零售价
+                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity , goodsEntity.getRetailPrice(), goodsService).setScale(3,RoundingMode.HALF_UP);
+                // 预估税
+                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+            }
+            calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
+            return calculateOrderDiscountPriceResponseVO;
+        }
+
+        List<Integer> brandIdList = goodsEntities.stream().map(GoodsEntity::getBrandId).collect(Collectors.toList());
+        List<Integer> categoryIdList = goodsEntities.stream().map(GoodsEntity::getCategoryId).collect(Collectors.toList());
+        // 活动互斥标识
+        AtomicBoolean activityFlag = new AtomicBoolean(true);
+        // 判断活动类型,并确定购物栏中商品是否满足活动条件
+        mkActivitiesEntityList.forEach(mkActivitiesEntity -> {
+            String mkaStoreId = mkActivitiesEntity.getMkaStoreId();
+            Long mkaId = mkActivitiesEntity.getMkaId();
+            String mkaTopic = mkActivitiesEntity.getMkaTopic();
+            Constants.ActivityTopicEnum activityTopicEnum = Constants.ActivityTopicEnum.valueOf(mkaTopic);
+            // 活动之间的优先级:特价>打折>满减/满赠>优惠券>积分抵扣
+            if (activityTopicEnum == Constants.ActivityTopicEnum.LSCX && activityFlag.get()) {
+                // 判断商品是否符合限时特价活动要求
+                List<MkActivitiesPromotionEntity> mkActivitiesPromotionEntities = mkActivitiesPromotionService.queryListByMkaIdAndStoreId(mkaId.intValue(), storeId);
+                if (CollectionUtils.isEmpty(mkActivitiesPromotionEntities)) {
+                    LOGGER.error("查询临时促销活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
+                    throw new ServiceException(String.format("查询临时促销活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
+                }
+                // 限时特价,直接替换实际支付价即可,并且拿特价计算税款
+                mkActivitiesPromotionEntities.forEach(mkActivitiesPromotionEntity -> {
+                    String entityBarcode = mkActivitiesPromotionEntity.getBarcode();
+                    String entityGoodsSn = mkActivitiesPromotionEntity.getGoodsSn();
+                    BigDecimal activityPrice = mkActivitiesPromotionEntity.getActivityPrice();
+                    String shopSn = mkActivitiesPromotionEntity.getShopSn();
+                    goodsEntities.forEach(goodsEntity -> {
+                        String sku = goodsEntity.getSku();
+                        String prodBarcode = goodsEntity.getProdBarcode();
+                        String storeId2 = String.valueOf(goodsEntity.getStoreId());
+                        BigDecimal retailPrice = goodsEntity.getRetailPrice();
+                        if (entityBarcode.equals(prodBarcode) && entityGoodsSn.equals(sku) && shopSn.equals(storeId2)) {
+                            GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                            BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, activityPrice, goodsService).setScale(3, RoundingMode.HALF_UP);
+                            BeanUtils.copyProperties(goodsDetailsDto, goodsEntity);
+                            goodsDetailsDto.setActualPaymentAmount(activityPrice);
+                            goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                            goodsDetailsDto.setActivity("限时促销");
+                            goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
+                            goodsDetailsDtos.add(goodsDetailsDto);
+                            activityFlag.set(false);
+                        }
+                    });
+                });
+            } else if (activityTopicEnum == Constants.ActivityTopicEnum.MZ && activityFlag.get()) {
+                // 判断商品是否符合满赠活动要求
+                MkActivitiesFullGiftEntity mkActivitiesFullGiftEntity = mkActivitiesFullGiftService.queryObjectByMkaIdAndStoreId(mkaId.intValue(), storeId);
+                if (Objects.isNull(mkActivitiesFullGiftEntity)) {
+                    LOGGER.error("查询满赠活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
+                    throw new ServiceException(String.format("查询满赠活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
+                }
+                Long brandId = mkActivitiesFullGiftEntity.getBrandId();
+                Long categoryId = mkActivitiesFullGiftEntity.getCategoryId();
+                Constants.ActivityType fullGiftActivityType = Constants.ActivityType.valueOf(mkActivitiesFullGiftEntity.getFullGiftType());
+                switch (fullGiftActivityType) {
+                    case BRAND:
+                        if (brandIdList.contains(brandId.intValue())) {
+                            // 活动包含该商品品牌,此次订单该品牌商品
+                            List<GoodsEntity> goodsEntityList = goodsEntities.stream().filter(goodsEntity -> brandId.intValue() == goodsEntity.getBrandId()).collect(Collectors.toList());
+                            AtomicReference<BigDecimal> brandTotalPrice = new AtomicReference<>(BigDecimal.ZERO);
+                            goodsEntityList.forEach(goodsEntity -> {
+                                brandTotalPrice.set(brandTotalPrice.get().add(goodsEntity.getRetailPrice()));
+                            });
+                            if (brandTotalPrice.get().compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) >= 0) {
+                                // 满足满赠条件
+                                String giftGoodsSn = mkActivitiesFullGiftEntity.getGiftGoodsSn();
+                                String giftBarcode = mkActivitiesFullGiftEntity.getGiftBarcode();
+                                GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(giftBarcode, Integer.parseInt(mkaStoreId), giftGoodsSn);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActualPaymentAmount(BigDecimal.ZERO);
+                                goodsDetailsDto.setActivity("满赠商品");
+                                goodsDetailsDto.setGiftNumber(mkActivitiesFullGiftEntity.getGiftNumber());
+                                goodsDetailsDto.setDiscountedPrice(goodsEntity.getRetailPrice());
+                                // 添加进商品详情列表
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
+                            }
+                        }
+                        break;
+                    case CATEGORY:
+                        if (categoryIdList.contains(categoryId.intValue())) {
+                            // 活动包含该商品分类
+                            List<GoodsEntity> goodsEntityList = goodsEntities.stream().filter(goodsEntity -> brandId.equals(mkActivitiesFullGiftEntity.getCategoryId())).collect(Collectors.toList());
+                            AtomicReference<BigDecimal> categoryTotalPrice = new AtomicReference<>(BigDecimal.ZERO);
+                            goodsEntityList.forEach(goodsEntity -> {
+                                categoryTotalPrice.set(categoryTotalPrice.get().add(goodsEntity.getRetailPrice()));
+                            });
+                            if (categoryTotalPrice.get().compareTo(mkActivitiesFullGiftEntity.getQualifiedAmount()) >= 0) {
+                                // 满足满赠条件
+                                String giftGoodsSn = mkActivitiesFullGiftEntity.getGiftGoodsSn();
+                                String giftBarcode = mkActivitiesFullGiftEntity.getGiftBarcode();
+                                GoodsEntity goodsEntity = goodsService.queryGoodsStockByBarcodeAndStoreIdAndSku(giftBarcode, Integer.parseInt(mkaStoreId), giftGoodsSn);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActualPaymentAmount(BigDecimal.ZERO);
+                                goodsDetailsDto.setActivity("满赠商品");
+                                goodsDetailsDto.setGiftNumber(mkActivitiesFullGiftEntity.getGiftNumber());
+                                goodsDetailsDto.setDiscountedPrice(goodsEntity.getRetailPrice());
+                                // 添加进商品详情列表
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
+                            }
+                        }
+                        break;
+                    default:
+                        LOGGER.error("未知满赠类型【{},{}】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode());
+                        throw new ServiceException(String.format("未知满赠类型【%s,%s】!请联系管理员!", fullGiftActivityType.getActivityType(), fullGiftActivityType.getActivityTypeCode()));
+                }
+            } else if (activityTopicEnum == Constants.ActivityTopicEnum.YHJ && activityFlag.get()) {
+                // 判断商品是否符合优惠券活动要求
+                Map<String, Object> params = new HashMap<>();
+                params.put("shop_sn", storeId);
+                params.put("mka_id", mkaId);
+                List<MkActivitiesCouponEntity> mkActivitiesCouponEntities = mkActivitiesCouponService.queryList(params);
+                if (CollectionUtils.isEmpty(mkActivitiesCouponEntities)) {
+                    LOGGER.error("查询优惠券活动信息结果为空!mka_id:{}, store_id:{}", mkaId, storeId);
+                    throw new ServiceException(String.format("查询优惠券活动信息结果为空!mka_id:%s, store_id:%s", mkaId, storeId));
+                }
+                MkActivitiesCouponEntity mkActivitiesCouponEntity = mkActivitiesCouponEntities.get(0);
+                Integer couponEntityBrandId = mkActivitiesCouponEntity.getBrandId();
+                Integer couponEntityCategoryId = mkActivitiesCouponEntity.getCategoryId();
+                Integer couponEntityStoreId = Integer.parseInt(mkActivitiesCouponEntity.getShopSn());
+                BigDecimal couponPrice = mkActivitiesCouponEntity.getCouponPrice();
+                Constants.ActivityType couponActivityType = Constants.ActivityType.valueOf(mkActivitiesCouponEntity.getActivityType());
+                switch (couponActivityType) {
+                    case BRAND:
+                        goodsEntities.forEach(goodsEntity -> {
+                            if (couponEntityBrandId.equals(goodsEntity.getBrandId())) {
+                                BigDecimal retailPrice = goodsEntity.getRetailPrice();
+                                String sku = goodsEntity.getSku();
+                                String prodBarcode = goodsEntity.getProdBarcode();
+                                if (couponPrice.compareTo(retailPrice) <= 0) {
+                                    LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
+                                    throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
+                                }
+                                BigDecimal discountAfterPrice = retailPrice.subtract(couponPrice);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setActualPaymentAmount(discountAfterPrice);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActivity("优惠券活动");
+                                goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
+                            }
+                        });
+                        break;
+                    case CATEGORY:
+                        goodsEntities.forEach(goodsEntity -> {
+                            if (couponEntityCategoryId.equals(goodsEntity.getCategoryId())) {
+                                BigDecimal retailPrice = goodsEntity.getRetailPrice();
+                                String sku = goodsEntity.getSku();
+                                String prodBarcode = goodsEntity.getProdBarcode();
+                                if (couponPrice.compareTo(retailPrice) <= 0) {
+                                    LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
+                                    throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
+                                }
+                                BigDecimal discountAfterPrice = retailPrice.subtract(couponPrice);
+                                GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                goodsDetailsDto.setActualPaymentAmount(discountAfterPrice);
+                                goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                goodsDetailsDto.setActivity("优惠券活动");
+                                goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
+                                goodsDetailsDtos.add(goodsDetailsDto);
+                                activityFlag.set(false);
+                            }
+                        });
+                        break;
+                    case PRODUCT:
+                        mkActivitiesCouponEntities.forEach(mkActivitiesCouponEntity1 -> {
+                            // 单个商品优惠券,有多条记录
+                            String activityProductBarcode = mkActivitiesCouponEntity1.getBarcode();
+                            String activitySku = mkActivitiesCouponEntity1.getGoodsSn();
+                            goodsEntities.forEach(goodsEntity -> {
+                                String sku = goodsEntity.getSku();
+                                String prodBarcode = goodsEntity.getProdBarcode();
+                                // 条码、sku、门店都需一致
+                                if (activitySku.equals(sku) && activityProductBarcode.equals(prodBarcode) && couponEntityStoreId.equals(goodsEntity.getStoreId())) {
+                                    BigDecimal retailPrice = goodsEntity.getRetailPrice();
+                                    if (couponPrice.compareTo(retailPrice) <= 0) {
+                                        LOGGER.error("优惠券优惠金额【{}】大于或等于商品【条码:{},sku:{}】的零售价【{}】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice);
+                                        throw new ServiceException(String.format("优惠券优惠金额【%s】大于或等于商品【条码:%s,sku:%s】的零售价【%s】,请检查优惠券金额设置!", couponPrice, prodBarcode, sku, retailPrice));
+                                    }
+                                    BigDecimal discountAfterPrice = retailPrice.subtract(couponPrice);
+                                    GoodsDetailsDto goodsDetailsDto = new GoodsDetailsDto();
+                                    BeanUtils.copyProperties(goodsEntity, goodsDetailsDto);
+                                    // 除了限时促销(需要向海关备案),其它活动都拿海关备案价来算税款
+                                    BigDecimal tax = CalculateTax.calculateFinalTax(goodsEntity, goodsEntity.getRetailPrice(), goodsService).setScale(3, RoundingMode.HALF_UP);
+                                    goodsDetailsDto.setActualPaymentAmount(discountAfterPrice);
+                                    goodsDetailsDto.setGoodstaxes(String.valueOf(tax.multiply(new BigDecimal(goodsDetailsDto.getSellVolume()))));
+                                    goodsDetailsDto.setActivity("优惠券活动");
+                                    goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(discountAfterPrice));
+                                    goodsDetailsDtos.add(goodsDetailsDto);
+                                    activityFlag.set(false);
+                                }
+                            });
+                        });
+                        break;
+                    default:
+                        LOGGER.error("未知的优惠券活动分类类型:【{},{}】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
+                        throw new ServiceException(String.format("未知的优惠券活动分类类型:【%s,%s】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
+                }
+            } else {
+                LOGGER.error("未知的满赠活动分类类型:【{},{}】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName());
+                throw new ServiceException(String.format("未知的满赠活动分类类型:【%s,%s】,请联系管理员!", activityTopicEnum.getTopicCode(), activityTopicEnum.getTopicName()));
+            }
+        });
+
+        // 计算完活动优惠后,计算积分抵扣。(活动与积分抵扣不互斥)
+        if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
+            String memberInfoByCodeResponseJson;
+            Response<MemberInfoDTO> response;
+            try {
+                // 查询会员信息
+                memberInfoByCodeResponseJson = haiKongMemberTemplate.getMemberInfoByCode("{\"code\":" + memberCode + "}");
+                response = JacksonUtil.fromListJson(memberInfoByCodeResponseJson, new TypeReference<Response<MemberInfoDTO>>() {
+                });
+            } catch (Exception e) {
+                LOGGER.error("请求会员系统失败或处理响应失败!", e);
+                throw new ServiceException(e);
+            }
+            BigDecimal afterDiscountPrice;
+            if (Objects.nonNull(response) && response.getSuccess()) {
+                MemberInfoDTO memberInfoDTO = response.getData();
+                Integer score = memberInfoDTO.getScore();
+                if (Objects.nonNull(score) && score > 0) {
+                    // 有积分
+                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, storeId, memberCode);
+                    calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
+                    // 订单完成后再添加积分消费记录,以及同步积分信息
+                }
+            } else if (Objects.nonNull(response)) {
+                LOGGER.error("查询会员信息失败!响应结果:{}", memberInfoByCodeResponseJson);
+                throw new ServiceException(String.format("错误码:%s,错误信息:%s", response.getErrorCode(), response.getErrorMessage()));
+            }
+        }
+        calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
+        orderTotalPrice = BigDecimal.ZERO;
+        for (GoodsDetailsDto goodsDetailsDto : goodsDetailsDtos) {
+            orderTotalPrice = orderTotalPrice.add(goodsDetailsDto.getActualPaymentAmount());
+        }
+        calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
+        return calculateOrderDiscountPriceResponseVO;
+    }
+
+    /**
+     * 计算积分抵扣后的订单总金额
+     * @param orderTotalPrice   订单商品详情
+     * @param score             积分
+     * @param storeId           门店id
+     * @param memberCode        会员码
+     * @return                  积分抵扣后的订单总金额
+     */
+    private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice, Integer score, String storeId, String memberCode) {
+        // 1. 判断是否有积分,是否需要计算积分抵扣后的价格
+        AtomicBoolean isCalculateScorePrice = new AtomicBoolean(false);
+        if (Objects.nonNull(score) && score > 0) {
+            isCalculateScorePrice.set(true);
+        }
+        // 2. 计算积分抵扣后的总价格
+        if (isCalculateScorePrice.get()) {
+            // 3-1. 计算总价的50%,百分比可以进行设置
+            BigDecimal halfPrice = orderTotalPrice.multiply(new BigDecimal("0.5")).setScale(2, BigDecimal.ROUND_HALF_UP);
+            Integer scoreLimit = haiKongProperties.getScoreLimit();
+            if (score < scoreLimit) {
+                LOGGER.warn("用户【{}】的积分数量为:{},最低需要30积分才能抵扣!", memberCode, score);
+                return orderTotalPrice;
+            } else {
+                // 3-2. 计算出积分能抵扣的价格
+                int scoreMayDeductionPrice = (int) (score / scoreLimit);
+                BigDecimal scoreMayDeductionPriceDecimal = new BigDecimal(scoreMayDeductionPrice);
+                // 3-3. 计算积分抵扣后的价格
+                if (halfPrice.compareTo(scoreMayDeductionPriceDecimal) > 0) {
+                    // 积分能抵扣的金额大于订单总额的50%,按50%抵扣
+                    scoreMayDeductionPriceDecimal = halfPrice;
+                }
+                orderTotalPrice = orderTotalPrice.subtract(scoreMayDeductionPriceDecimal);
+                LOGGER.info("会员【{}】,积分抵扣前剩余:{},积分抵扣订单金额后剩余:{},积分抵扣后的订单总额为:{}", memberCode, score, scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)), orderTotalPrice);
+            }
+        } else {
+            LOGGER.info("会员【{}】的积分为0,不参加积分抵扣!", memberCode);
+        }
+        return orderTotalPrice;
+    }
+
+    /**
+     * 重发订单
+     * @param orderSn
+     * @return
+     */
+    @Override
+    public R resendOrderHkMall(String orderSn) {
+        LOGGER.info("=======> [调用VMCShop接口开始发送退款订单数据]"+orderSn);
+        String body = JacksonUtil.toJson(orderSn);
+        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"))){
+            return R.ok();
+        }else{
+            return R.error(500,"重发订单失败");
+        }
+    }
+
+    /**
+     * 记录发送至免税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);
+    }
 
     /**
      * 设置订单数据

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

@@ -63,4 +63,9 @@ public class SysMacroServiceImpl implements SysMacroService {
     public List<SysMacroEntity> queryMacrosByValue(String value) {
         return sysMacroDao.queryMacrosByValue(value);
     }
+
+    @Override
+    public List<SysMacroEntity> queryMacrosByValueRules(Integer id) {
+        return sysMacroDao.queryMacrosByValueRules(id);
+    }
 }

+ 13 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesServiceImpl.java

@@ -115,6 +115,19 @@ public class MkActivitiesServiceImpl implements MkActivitiesService {
         return mkActivitiesDao.queryByNow(storeId,currentTime);
     }
 
+    /**
+     * 根据门店id和当前时间查询有哪些营销方式
+     * 查询当前时间是否有满赠的活动
+     *
+     * @param storeId     门店id
+     * @param currentTime 当前时间
+     * @return 满赠活动列表
+     */
+    @Override
+    public List<MkActivitiesEntity> queryByNowByMz(String storeId, String currentTime) {
+        return mkActivitiesDao.queryByNowByMz(storeId, currentTime);
+    }
+
     @Override
     public List<MkActivitiesEntity> queryByTopic(String storeId, String currentTime, String topic) {
         return mkActivitiesDao.queryByTopic(storeId,currentTime,topic);

+ 123 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java

@@ -1,8 +1,15 @@
 package com.kmall.admin.service.impl.vip;
 
+import com.kmall.admin.dao.CategoryDao;
+import com.kmall.admin.dao.ProductStoreRelaDao;
+import com.kmall.admin.dao.StoreDao;
+import com.kmall.admin.dto.Mall2RulesDto;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
+import com.kmall.common.utils.Query;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -21,6 +28,13 @@ import com.kmall.admin.service.vip.Mall2PointsRulesService;
 public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
     @Autowired
     private Mall2PointsRulesDao mall2PointsRulesDao;
+    @Autowired
+    private StoreDao storeDao;
+    @Autowired
+    private ProductStoreRelaDao productStoreRelaDao;
+    @Autowired
+    private CategoryDao categoryDao;
+
 
     @Override
     public Mall2PointsRulesEntity queryObject(Integer mprId) {
@@ -56,4 +70,113 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
     public int deleteBatch(Integer[]mprIds) {
         return mall2PointsRulesDao.deleteBatch(mprIds);
     }
+
+
+    /**
+     * 积分规则明细导入
+     * @param pointsRulesList
+     * @param mkaId
+     */
+    @Override
+    public void rulesUploadDetil(List<Mall2RulesDto> pointsRulesList, Long mkaId) {
+        Integer pointsType = mall2PointsRulesDao.queryRulesDetilId(mkaId);
+        if(pointsRulesList.size()>0){
+            pointsRulesList.forEach(mall2RulesDto -> {
+                switch (pointsType) {
+                    //门店
+                    case 0:
+                        mall2RulesDto.setRulesId(storeDao.queryObjectRulesByName(mall2RulesDto.getPointsRulesName().trim()));
+                        break;
+                    //商品类别
+                    case 1:
+
+                        mall2RulesDto.setRulesId(categoryDao.queryObjectCategoryByName(mall2RulesDto.getPointsRulesName().trim()));
+                        break;
+                    //商品
+                    case 2:
+                        Long id = storeDao.queryObjectRulesByName(mall2RulesDto.getStoreName().trim());
+                        mall2RulesDto.setRulesId(productStoreRelaDao.queryproductStoreByName(mall2RulesDto.getPointsRulesName().trim(),id));
+                        break;
+                    default:
+                        break;
+                }
+                mall2RulesDto.setMkaId(mkaId);
+            });
+            if(pointsType==0){
+                storeDao.updateObjectStore(pointsRulesList);
+            }else if(pointsType==1){
+                categoryDao.updateObjectCategory(pointsRulesList);
+            }else{
+                productStoreRelaDao.updateProductStoreRela(pointsRulesList);
+            }
+        }
+
+    }
+
+    /**
+     * 查询积分明细数据
+     * @param query
+     * @return
+     */
+    @Override
+    public Map<String,Object> queryDetilList(Query query) {
+        Long id = Long.parseLong(query.get("mkaId")+"");
+        Integer pointsType = mall2PointsRulesDao.queryRulesDetilId(id);
+        Map<String,Object> map = new HashMap<>();
+        List<Mall2DetilEntity> mall2DetilEntities = null;
+        int total = 0 ;
+                switch (pointsType) {
+                //门店
+                case 0:
+                    mall2DetilEntities = storeDao.queryStoreRulesDetil(id);
+                    total = storeDao.queryStoreDetilTotal(id);
+                    map.put("list",mall2DetilEntities);
+                    map.put("total",total);
+                    break;
+                //商品类别
+                case 1:
+                    mall2DetilEntities = categoryDao.queryCategoryRulesDetil(id);
+                    total = categoryDao.queryCategoryDetilTotal(id);
+                    map.put("list",mall2DetilEntities);
+                    map.put("total",total);
+                    break;
+                //商品
+                case 2:
+                    mall2DetilEntities = productStoreRelaDao.queryProductStoreRulesDetil(id);
+                    total = productStoreRelaDao.queryProductDetilTotal(id);
+                    map.put("list",mall2DetilEntities);
+                    map.put("total",total);
+                    break;
+                default:
+                    break;
+            }
+                return map;
+
+    }
+
+    /**
+     * 积分明细删除
+     * @param mprIds
+     * @param typeId
+     */
+    @Override
+    public void deleteDetil(Integer[] mprIds,Long typeId) {
+        Integer pointsType = mall2PointsRulesDao.queryRulesDetilId(typeId);
+        switch (pointsType) {
+            //门店
+            case 0:
+                storeDao.updateStoreRulesDetil(mprIds);
+                break;
+            //商品类别
+            case 1:
+                categoryDao.updateCategoryRulesDetil(mprIds);
+                break;
+            //商品
+            case 2:
+                productStoreRelaDao.updateProductStoreRulesDetil(mprIds);
+                break;
+            default:
+                break;
+        }
+    }
 }

+ 9 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesService.java

@@ -79,5 +79,14 @@ public interface MkActivitiesService {
      */
     List<MkActivitiesEntity> queryByNow(String storeId, String currentTime);
 
+    /**
+     * 根据门店id和当前时间查询有哪些营销方式
+     * 查询当前时间是否有满赠的活动
+     * @param storeId       门店id
+     * @param currentTime   当前时间
+     * @return              满赠活动列表
+     */
+    List<MkActivitiesEntity> queryByNowByMz(String storeId, String currentTime);
+
     List<MkActivitiesEntity> queryByTopic(String storeId, String format, String topic);
 }

+ 16 - 1
kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java

@@ -1,6 +1,9 @@
 package com.kmall.admin.service.vip;
 
+import com.kmall.admin.dto.Mall2RulesDto;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
+import com.kmall.common.utils.Query;
 
 import java.util.List;
 import java.util.Map;
@@ -17,7 +20,7 @@ public interface Mall2PointsRulesService {
     /**
      * 根据主键查询实体
      *
-     * @param id 主键
+     * @param mprId 主键
      * @return 实体
      */
     Mall2PointsRulesEntity queryObject(Integer mprId);
@@ -69,4 +72,16 @@ public interface Mall2PointsRulesService {
      * @return 删除条数
      */
     int deleteBatch(Integer[] mprIds);
+
+    void rulesUploadDetil(List<Mall2RulesDto> pointsRulesList, Long mkaId);
+
+    /**
+     * 查询积分明细数据
+     * @param query
+     * @return
+     */
+    Map<String,Object> queryDetilList(Query query);
+
+
+    void deleteDetil(Integer[] mprIds,Long typeId);
 }

+ 19 - 0
kmall-admin/src/main/resources/XmlTemplate/mallRulesList.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workbook>
+    <worksheet name="Sheet1">
+        <section startRow="0" endRow="0"/>
+        <loop startRow="1" endRow="1" items="Mall2RulesDtoList" var="Mall2RulesDto"
+              varType="com.kmall.admin.dto.Mall2RulesDto">
+            <section startRow="1" endRow="1">
+                <mapping row="1" col="0">Mall2RulesDto.rulesType</mapping>
+                <mapping row="1" col="1">Mall2RulesDto.pointsRulesName</mapping>
+                <mapping row="1" col="2">Mall2RulesDto.storeName</mapping>
+            </section>
+            <loopbreakcondition>
+                <rowcheck offset="0">
+                    <cellcheck offset="0"></cellcheck>
+                </rowcheck>
+            </loopbreakcondition>
+        </loop>
+    </worksheet>
+</workbook>

+ 48 - 0
kmall-admin/src/main/resources/mybatis/mapper/CategoryDao.xml

@@ -251,4 +251,52 @@
 		and is_show = 1
 	</select>
 
+
+	<select id="queryCategoryRulesDetil" parameterType="java.lang.Long" resultType="com.kmall.admin.entity.vip.Mall2DetilEntity">
+		select
+		mc.id,
+		mc.name as rulesName
+		from mall_category mc
+		where mc.is_show = 1 AND mc.points_rules_id = #{id}
+	</select>
+
+
+	<select id="queryCategoryDetilTotal" parameterType="java.lang.Long" resultType="java.lang.Integer">
+		select count(*) from mall_category
+		where is_show = 1 AND points_rules_id = #{id}
+	</select>
+
+	<update id="updateCategoryRulesDetil">
+		update mall_category set points_rules_id=null where id in
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</update>
+
+	<select id="queryObjectCategoryByName" parameterType="java.lang.String" resultType="java.lang.Long">
+		select
+		mc.id
+		from mall_category mc
+		where mc.is_show = 1 AND mc.name = #{trim}
+	</select>
+
+	<!--批量修改-->
+	<update id="updateObjectCategory" parameterType="list">
+		update mall_category
+		<trim prefix="set" suffixOverrides=",">
+			<trim prefix="points_rules_id =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.mkaId!=null">
+						when id=#{item.rulesId}
+						then #{item.mkaId}
+					</if>
+				</foreach>
+			</trim>
+		</trim>
+		where id in
+		<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
+			#{item.rulesId}
+		</foreach>
+	</update>
+
 </mapper>

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

@@ -254,7 +254,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.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
+        ,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
         LEFT JOIN mall_goods_specification r ON r.goods_id = a.id
@@ -1142,8 +1142,9 @@
 
     <select id="queryGoodsStockByQueryGoodsVoList" resultType="com.kmall.admin.entity.GoodsEntity">
         SELECT
-            a.id,a.sku,a.goods_number,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId',a.goods_rate as goodsRate,
-            a.hs_code as hsCode , a.legal_unit1_qty as legalUnit1Qty , a.legal_unit2_qty as legalUnit2Qty,a.ciq_prod_model as ciqProdModel,a.to_be_restored, r.stock_num, r.exit_region_number as exitRegionNumber
+            a.id,a.sku,a.goods_number,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice, r.retail_price as retailPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId',a.goods_rate as goodsRate,
+            a.hs_code as hsCode , a.legal_unit1_qty as legalUnit1Qty , a.legal_unit2_qty as legalUnit2Qty,a.ciq_prod_model as ciqProdModel,a.to_be_restored, r.stock_num, r.exit_region_number as exitRegionNumber,
+            a.category_id as categoryId, a.brand_id as brandId
         FROM
             mall_goods a
         LEFT JOIN mall_product_store_rela r ON r.goods_id = a.id
@@ -1157,5 +1158,11 @@
         and r.stock_num > 0
     </select>
 
+    <!-- 根据产品条码和sku查询保税展示补货的商品 -->
+    <select id="queryGoodsInfoByProductBarcodeAndSku" resultMap="goodsMap">
+        select mg.*,
+        from mall_goods mg
+        where mg.goods_biz_type = '02' and mg.prod_barcode = #{prodBarcode} and mg.sku = #{sku}
+    </select>
 
 </mapper>

+ 27 - 0
kmall-admin/src/main/resources/mybatis/mapper/MallVmcSendLogDao.xml

@@ -0,0 +1,27 @@
+<?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.MallVmcSendLogDao">
+
+	<insert id="saveVmcSend" parameterType="com.kmall.admin.entity.MallVmcSendlogEntity" >
+		insert into mall_vmc_send_log
+		(
+			vmc_type,
+			order_sn,
+			request_msg,
+			response_msg,
+			send_date
+		)
+		values
+		(
+			#{vmcType},
+			#{orderSn},
+			#{requestMsg},
+			#{responseMsg},
+			SYSDATE()
+		)
+	</insert>
+	 
+
+
+</mapper>

+ 46 - 6
kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesCouponDao.xml

@@ -16,6 +16,11 @@
         <result property="createrSn" column="creater_sn"/>
         <result property="moderSn" column="moder_sn"/>
         <result property="updateTime" column="update_time"/>
+        <result property="activityType" column="activity_type"/>
+        <result property="brandId" column="brand_id"/>
+        <result property="categoryId" column="category_id"/>
+        <result property="brandName" column="brand_name"/>
+        <result property="categoryName" column="category_name"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.MkActivitiesCouponEntity">
@@ -31,7 +36,12 @@
 			`create_time`,
 			`creater_sn`,
 			`moder_sn`,
-			`update_time`
+			`update_time`,
+			`activity_type`,
+			`brand_id`,
+			`category_id`,
+			`brand_name`,
+			`category_name`
 		from mk_activities_coupon
 		where mac_id = #{id}
 	</select>
@@ -49,7 +59,12 @@
     		`create_time`,
     		`creater_sn`,
     		`moder_sn`,
-    		`update_time`
+    		`update_time`,
+			`activity_type`,
+			`brand_id`,
+			`category_id`,
+			`brand_name`,
+			`category_name`
 		from mk_activities_coupon
 		WHERE 1=1
 		<if test="name != null and name.trim() != ''">
@@ -100,7 +115,12 @@
 			`create_time`,
 			`creater_sn`,
 			`moder_sn`,
-			`update_time`)
+			`update_time`,
+			`activity_type`,
+			`brand_id`,
+			`category_id`,
+			`brand_name`,
+			`category_name`)
 		values(
 			#{goodsSn},
 			#{barcode},
@@ -112,7 +132,12 @@
 			#{createTime},
 			#{createrSn},
 			#{moderSn},
-			#{updateTime})
+			#{updateTime},
+			#{activityType},
+			#{brandId},
+			#{categoryId},
+			#{brandName},
+			#{categoryName})
 	</insert>
 
 	<update id="update" parameterType="com.kmall.admin.entity.MkActivitiesCouponEntity">
@@ -129,6 +154,11 @@
 			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
 			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
 			<if test="updateTime != null">`update_time` = #{updateTime}</if>
+			<if test="activityType != null">`activity_type` = #{activityType}</if>
+			<if test="brandId != null">`brand_id` = #{brandId}</if>
+			<if test="categoryId != null">`category_id` = #{categoryId}</if>
+			<if test="brandName != null">`brand_name` = #{brandName}</if>
+			<if test="categoryName != null">`category_name` = #{categoryName}</if>
 		</set>
 		where mac_id = #{macId}
 	</update>
@@ -157,7 +187,12 @@
 			`create_time`,
 			`creater_sn`,
 			`moder_sn`,
-			`update_time`
+			`update_time`,
+			`activity_type`,
+			`brand_id`,
+			`category_id`,
+			`brand_name`,
+			`category_name`
 		from mk_activities_coupon
 		where mka_id = #{mkaId}
 		and barcode = #{prodBarcode}
@@ -180,7 +215,12 @@
 			`create_time`,
 			`creater_sn`,
 			`moder_sn`,
-			`update_time`
+			`update_time`,
+			`activity_type`,
+			`brand_id`,
+			`category_id`,
+			`brand_name`,
+			`category_name`
 		from mk_activities_coupon
 		where coupon_sn = #{couponSn}
 		<if test="currentTime != null and currentTime.trim() != ''">

+ 116 - 7
kmall-admin/src/main/resources/mybatis/mapper/MkActivitiesFullGiftDao.xml

@@ -20,6 +20,12 @@
         <result property="createrSn" column="creater_sn"/>
         <result property="moderSn" column="moder_sn"/>
         <result property="updateTime" column="update_time"/>
+		<result property="fullGiftType" column="full_gift_type"/>
+		<result property="brandId" column="brand_id"/>
+		<result property="categoryId" column="category_id"/>
+		<result property="categoryName" column="category_name"/>
+		<result property="shopName" column="shop_name"/>
+		<result property="giftNumber" column="gift_number"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.MkActivitiesFullGiftEntity">
@@ -39,7 +45,13 @@
 			create_time,
 			creater_sn,
 			moder_sn,
-			update_time
+			update_time,
+			full_gift_type,
+			brand_id,
+			category_id,
+			category_name,
+			shop_name,
+			gift_number
 		from mk_activities_full_gift
 		where mafr_id = #{id}
 	</select>
@@ -61,7 +73,13 @@
     		create_time,
     		creater_sn,
     		moder_sn,
-    		update_time
+    		update_time,
+			full_gift_type,
+			brand_id,
+			category_id,
+			category_name,
+			shop_name,
+			gift_number
 		from mk_activities_full_gift
 		WHERE 1=1
 		<if test="name != null and name.trim() != ''">
@@ -116,7 +134,13 @@
 			create_time,
 			creater_sn,
 			moder_sn,
-			update_time)
+			update_time,
+			full_gift_type,
+			brand_id,
+			category_id,
+			category_name,
+			shop_name,
+			gift_number)
 		values(
 			#{productName},
 			#{shopSn},
@@ -132,7 +156,13 @@
 			#{createTime},
 			#{createrSn},
 			#{moderSn},
-			#{updateTime})
+			#{updateTime},
+			#{fullGiftType},
+			#{brandId},
+			#{categoryId},
+			#{categoryName},
+			#{shopName},
+			#{giftNumber})
 	</insert>
 
 	<update id="update" parameterType="com.kmall.admin.entity.MkActivitiesFullGiftEntity">
@@ -152,7 +182,13 @@
 			<if test="createTime != null">create_time = #{createTime}, </if>
 			<if test="createrSn != null">creater_sn = #{createrSn}, </if>
 			<if test="moderSn != null">moder_sn = #{moderSn}, </if>
-			<if test="updateTime != null">update_time = #{updateTime}</if>
+			<if test="updateTime != null">update_time = #{updateTime}, </if>
+			<if test="updateTime != null">full_gift_type = #{fullGiftType}, </if>
+			<if test="updateTime != null">brand_id = #{brandId}, </if>
+			<if test="updateTime != null">category_id = #{categoryId}, </if>
+			<if test="updateTime != null">category_name = #{categoryName}, </if>
+			<if test="shopName != null">shop_name = #{shopName}, </if>
+			<if test="giftNumber != null">gift_number = #{giftNumber}, </if>
 		</set>
 		where mafr_id = #{mafrId}
 	</update>
@@ -185,14 +221,87 @@
 			create_time,
 			creater_sn,
 			moder_sn,
-			update_time
+			update_time,
+			full_gift_type,
+			brand_id,
+			category_id,
+			category_name,
+			category_name,
+			shop_name,
+			gift_number
 		from mk_activities_full_gift
 		where
 			mka_id = #{mkaId}
 			<if test="brandName != 'all'">
 				and (barcode = #{prodBarcode} or product_brand = #{brandName})
 			</if>
-			and deadline &gt;= #{nowTime}
+			and deadline &lt;= #{nowTime}
+	</select>
+
+	<!--     /**
+     * 根据营销活动编号获取满赠活动信息
+     * @param mkaIdList     营销活动编号集合
+     * @return              满赠营销活动信息
+     */ -->
+	<select id="queryByMkaIdList" resultType="com.kmall.admin.entity.MkActivitiesFullGiftEntity">
+		select
+			mafr_id,
+			product_name,
+			shop_sn,
+			goods_sn,
+			barcode,
+			product_brand,
+			product_series,
+			qualified_amount,
+			gift_barcode,
+			gift_goods_sn,
+			mka_id,
+			deadline,
+			create_time,
+			creater_sn,
+			moder_sn,
+			update_time,
+			full_gift_type,
+			brand_id,
+			category_id,
+			category_name,
+			category_name,
+			shop_name,
+			gift_number
+		from mk_activities_full_gift
+		where mka_id in
+		<foreach collection="list" open="(" separator="," close=")" item="item">
+			#{item}
+		</foreach>
+	</select>
+
+	<select id="queryObjectByMkaIdAndStoreId" resultType="com.kmall.admin.entity.MkActivitiesFullGiftEntity">
+		select
+			mafr_id,
+			product_name,
+			shop_sn,
+			goods_sn,
+			barcode,
+			product_brand,
+			product_series,
+			qualified_amount,
+			gift_barcode,
+			gift_goods_sn,
+			mka_id,
+			deadline,
+			create_time,
+			creater_sn,
+			moder_sn,
+			update_time,
+			full_gift_type,
+			brand_id,
+			category_id,
+			category_name,
+			category_name,
+			shop_name,
+			gift_number
+		from mk_activities_full_gift
+		where mka_id = #{mkaId} and shop_sn = #{storeId}
 	</select>
 
 </mapper>

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

@@ -204,8 +204,28 @@
 		and activity.mka_store_id = #{storeId}
 	</select>
 
+    <select id="queryListByMkaIdAndStoreId" resultType="com.kmall.admin.entity.MkActivitiesPromotionEntity">
+		select
+			map_id,
+			product_name,
+			activity_price,
+			shop_sn,
+			goods_sn,
+			barcode,
+			product_brand,
+			product_series,
+			mka_id,
+			deadline,
+			create_time,
+			creater_sn,
+			moder_sn,
+			update_time
+		from mk_activities_promotion
+		where mka_id = #{mkaId} and shop_sn = #{storeId}
+	</select>
+
 
-	<update id="updatePriceBySku" >
+    <update id="updatePriceBySku" >
 		update mk_activities_promotion set activity_price = #{updatePrice} where goods_sn = #{sku}
 		and mka_id = #{mkaId}
 	</update>

+ 4 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -2422,4 +2422,8 @@
         </foreach>
     </update>
 
+    <select id="queryObjectByMerchOrderSnHkMall" parameterType="java.lang.String" resultType="java.lang.Integer">
+        select count(*) from mall_order a where merch_order_sn = #{merchOrderSn}
+    </select>
+
 </mapper>

+ 4 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderGoodsDao.xml

@@ -312,5 +312,9 @@
             </if>
     </select>
 
+    <select id="queryListHkMall" resultType="com.kmall.admin.entity.OrderGoodsEntity">
+        select id,goods_id,number from mall_order_goods WHERE order_id = #{orderId}
+    </select>
+
 
 </mapper>

+ 66 - 0
kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml

@@ -916,4 +916,70 @@
         and p.sku = #{sku}
     </select>
 
+    <select id="getByStoreNameAndSku" resultType="com.kmall.admin.entity.ProductStoreRelaEntity">
+        select p.id,p.store_id as storeId,p.sku from mall_product_store_rela p , mall_store s
+        where p.store_id = s.id and s.store_name = #{storeName}
+        and p.sku = #{sku}
+    </select>
+
+    <select id="queryProductStoreRulesDetil" parameterType="java.lang.Long" resultType="com.kmall.admin.entity.vip.Mall2DetilEntity">
+        select
+            a.id,
+            a.sku as rulesName
+        from mall_product_store_rela a
+        where a.points_rules_id = #{id}
+    </select>
+
+    <select id="queryProductDetilTotal" parameterType="java.lang.Long" resultType="java.lang.Integer">
+        select count(*) from mall_product_store_rela a
+        where a.points_rules_id = #{id}
+    </select>
+
+    <update id="updateProductStoreRulesDetil">
+        update mall_product_store_rela set points_rules_id=null where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <select id="queryproductStoreByName" resultType="java.lang.Long">
+        select
+            a.id
+        from mall_product_store_rela a
+        where a.sku = #{sku} and a.store_id= #{storeId}
+    </select>
+
+    <!--批量修改-->
+    <update id="updateProductStoreRela" parameterType="list">
+        update mall_product_store_rela
+        <trim prefix="set" suffixOverrides=",">
+            <trim prefix="points_rules_id =case" suffix="end,">
+                <foreach collection="list" item="item" index="index">
+                    <if test="item.mkaId!=null">
+                        when id=#{item.rulesId}
+                        then #{item.mkaId}
+                    </if>
+                </foreach>
+            </trim>
+        </trim>
+        where id in
+        <foreach collection="list" item="item" index="index" separator="," open="(" close=")">
+            #{item.rulesId}
+        </foreach>
+    </update>
+
+
+    <select id="queryByGoodsIdAndStoreIdHkMall" resultType="com.kmall.admin.entity.ProductStoreRelaEntity">
+        select
+          id,
+          store_id,
+          stock_num,
+          goods_id,
+          sell_volume,
+          merch_sn,
+          to_be_restored
+        from mall_product_store_rela
+        where goods_id = #{goodsId} and store_id = #{storeId}
+    </select>
+
 </mapper>

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

@@ -339,4 +339,49 @@
 			AND s.id = #{id}
 		</if>
 	</select>
+
+	<select id="queryStoreRulesDetil" parameterType="java.lang.Long" resultType="com.kmall.admin.entity.vip.Mall2DetilEntity">
+		select
+			id,
+			store_name as rulesName
+		from mall_store where is_valid = 1 and points_rules_id = #{id}
+	</select>
+
+	<select id="queryStoreDetilTotal" parameterType="java.lang.Long" resultType="java.lang.Integer">
+		select count(*) from mall_store where is_valid = 1 and points_rules_id = #{id}
+	</select>
+
+	<update id="updateStoreRulesDetil">
+		update mall_store set points_rules_id=null where id in
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</update>
+
+	<select id="queryObjectRulesByName" parameterType="java.lang.String" resultType="java.lang.Long">
+		select
+		id
+		from mall_store
+		where store_name = #{storeName}
+	</select>
+
+	<!--批量修改-->
+	<update id="updateObjectStore" parameterType="list">
+		update mall_store
+		<trim prefix="set" suffixOverrides=",">
+			<trim prefix="points_rules_id =case" suffix="end,">
+				<foreach collection="list" item="item" index="index">
+					<if test="item.mkaId!=null">
+						when id=#{item.rulesId}
+						then #{item.mkaId}
+					</if>
+				</foreach>
+			</trim>
+		</trim>
+		where id in
+		<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
+			#{item.rulesId}
+		</foreach>
+	</update>
+
 </mapper>

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

@@ -137,4 +137,13 @@
           AND exists(SELECT 1 from sys_macro m WHERE m.id = sys_macro.parent_id and m.value =#{value} )
           AND `type` = '1'
     </select>
+
+    <select id="queryMacrosByValueRules" parameterType="java.lang.Integer" resultType="com.kmall.admin.entity.SysMacroEntity">
+    select
+    `name`,
+    `value`
+    from sys_macro
+    where parent_id = #{id}
+    </select>
+
 </mapper>

+ 26 - 0
kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesDao.xml

@@ -190,4 +190,30 @@
 			and mka_topic = #{topic}
 			and mka_status = 1
 	</select>
+
+	<!-- 查询满赠的活动 -->
+    <select id="queryByNowByMz" resultType="com.kmall.admin.entity.mk.MkActivitiesEntity">
+		select
+			mka_id,
+			mka_topic,
+			merch_sn,
+			third_merch_sn,
+			mka_store_id,
+			mka_status,
+			mka_start_time,
+			mkd_end_time,
+			mka_end_early,
+			mkd_end_early_time,
+			create_time,
+			creater_sn,
+			update_time,
+			moder_sn
+		from mk_activities ma
+		where
+			mka_store_id = #{storeId}
+			and mka_start_time &lt; #{currentTime}
+			and mkd_end_time &gt; #{currentTime}
+			and mka_topic = 'mz'
+			and mka_status = 1
+	</select>
 </mapper>

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

@@ -20,6 +20,8 @@
 		select
 			`mpr_id`,
 			`points_type`,
+			 points_rules_money as pointsRulesMoney,
+			 points_rules_num as pointsRulesNum,
 			`points_begin_time`,
 			`points_end_time`,
 			`is_valid`,
@@ -36,6 +38,8 @@
 		select
     		`mpr_id`,
     		`points_type`,
+			 points_rules_money as pointsRulesMoney,
+			 points_rules_num as pointsRulesNum,
     		`points_begin_time`,
     		`points_end_time`,
     		`is_valid`,
@@ -74,6 +78,8 @@
 		insert into mall2_points_rules(
 			`mpr_id`,
 			`points_type`,
+			 points_rules_money,
+			 points_rules_num,
 			`points_begin_time`,
 			`points_end_time`,
 			`is_valid`,
@@ -85,6 +91,8 @@
 		values(
 			#{mprId},
 			#{pointsType},
+			#{pointsRulesMoney},
+			#{pointsRulesNum},
 			#{pointsBeginTime},
 			#{pointsEndTime},
 			#{isValid},
@@ -99,6 +107,8 @@
 		update mall2_points_rules
 		<set>
 			<if test="pointsType != null">`points_type` = #{pointsType}, </if>
+			<if test="pointsRulesMoney != null">`points_rules_money` = #{pointsRulesMoney}, </if>
+			<if test="pointsRulesNum != null">`points_rules_num` = #{pointsRulesNum}, </if>
 			<if test="pointsBeginTime != null">`points_begin_time` = #{pointsBeginTime}, </if>
 			<if test="pointsEndTime != null">`points_end_time` = #{pointsEndTime}, </if>
 			<if test="isValid != null">`is_valid` = #{isValid}, </if>
@@ -121,5 +131,11 @@
 			#{mprId}
 		</foreach>
 	</delete>
+	
+	<select id="queryRulesDetilId" parameterType="java.lang.Long" resultType="java.lang.Integer">
+       select points_type from mall2_points_rules where mpr_id=#{mkaId}
+	</select>
+
+
 
 </mapper>

+ 60 - 0
kmall-admin/src/main/webapp/WEB-INF/page/mk/mall2RulesDetil.html

@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<Card v-show="showList">
+        <p slot="title">积分规则详情</p>
+        <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" style="width: 100%;margin-top: 8px;">
+                <i-col style="display: inline-grid;">
+                    <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
+                            :format="['xls','xlsx']"
+                            action="../mall2pointsrules/rulesUpload" :before-upload="beforeUpload"  :data="uploadData" >
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">导入</i-button>
+                    </Upload>
+                </i-col>
+                <a href="../statics/file/mall2RulesDetil_1.0.xlsx">模板下载</a>
+            </div>
+            <div class="buttons-group">
+<!--                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>-->
+<!--                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>-->
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                <i-button type="warning" @click="reloadMkactivities" v-show="!isMkactivitiesShow">返回积分规则设置页</i-button>
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </Card>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="mkActivitiesHalfPrice" :rules="ruleValidate" :label-width="80">
+            <Form-item label="积分规则类型" prop="productName">
+                <i-input v-model="mkActivitiesHalfPrice.productName" placeholder="产品中文名"/>
+            </Form-item>
+            <Form-item label="对应的商品/门店/类别" prop="goodsSn">
+                <i-input v-model="mkActivitiesHalfPrice.goodsSn" 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/mk/mall2RulesDetil.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 30 - 6
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesfullgift.html

@@ -39,27 +39,51 @@
 
     <Card v-show="!showList">
         <p slot="title">{{title}}</p>
-		<i-form ref="formValidate" :model="mkActivitiesFullGift" :rules="ruleValidate" :label-width="80">
+		<i-form ref="formValidate" :model="mkActivitiesFullGift" :rules="ruleValidate" :label-width="120">
             <!--<Form-item label="产品中文名" prop="productName">
                 <i-input v-model="mkActivitiesFullGift.productName" placeholder="产品中文名"/>
             </Form-item>-->
-            <Form-item label="商品编码" prop="goodsSn">
+            <!--<Form-item label="商品编码" prop="goodsSn">
                 <i-input v-model="mkActivitiesFullGift.goodsSn" placeholder="商品编码"/>
             </Form-item>
             <Form-item label="条形码" prop="barcode">
                 <i-input v-model="mkActivitiesFullGift.barcode" placeholder="条形码"/>
+            </Form-item>-->
+            <Form-item label="注意:">
+                <p style="color: red; font-size: 20px">品牌与分类只能选其一,如两者都填写,最终按满赠类型进行判断</p>
+            </Form-item>
+            <Form-item label="门店ID" prop="shopSn">
+                <i-input v-model="mkActivitiesFullGift.shopSn" placeholder="门店ID"/>
+            </Form-item>
+            <Form-item label="门店名称" prop="shopName">
+                <i-input v-model="mkActivitiesFullGift.shopName" placeholder="门店名称"/>
+            </Form-item>
+            <Form-item label="商品品牌ID" prop="brandId">
+                <i-input v-model="mkActivitiesFullGift.brandId" placeholder="商品品牌ID"/>
             </Form-item>
-            <Form-item label="商品品牌" prop="productBrand">
-                <i-input v-model="mkActivitiesFullGift.productBrand" placeholder="商品品牌"/>
+            <Form-item label="商品品牌名称" prop="productBrand">
+                <i-input v-model="mkActivitiesFullGift.productBrand" placeholder="商品品牌名称"/>
+            </Form-item>
+            <Form-item label="商品分类ID" prop="categoryId">
+                <i-input v-model="mkActivitiesFullGift.categoryId" placeholder="商品分类ID"/>
+            </Form-item>
+            <Form-item label="商品分类名称" prop="categoryName">
+                <i-input v-model="mkActivitiesFullGift.categoryName" placeholder="商品分类名称"/>
             </Form-item>
             <!--<Form-item label="商品系列" prop="productSeries">
                 <i-input v-model="mkActivitiesFullGift.productSeries" placeholder="商品系列"/>
             </Form-item>-->
+            <Form-item label="满赠活动类型" prop="fullGiftType">
+                <i-input v-model="mkActivitiesFullGift.fullGiftType" placeholder="满赠活动类型,0:按品牌,1:按分类,2:按门店"/>
+            </Form-item>
             <Form-item label="满足条件金额" prop="qualifiedAmount">
                 <i-input v-model="mkActivitiesFullGift.qualifiedAmount" placeholder="满足条件金额"/>
             </Form-item>
-            <Form-item label="赠品条码" prop="giftBarcode">
-                <i-input v-model="mkActivitiesFullGift.giftBarcode" placeholder="赠品条码"/>
+            <Form-item label="赠品商品条码" prop="giftBarcode">
+                <i-input v-model="mkActivitiesFullGift.giftBarcode" placeholder="赠品商品条码"/>
+            </Form-item>
+            <Form-item label="赠品商品编码" prop="giftGoodsSn">
+                <i-input v-model="mkActivitiesFullGift.giftGoodsSn" placeholder="赠品商品编码"/>
             </Form-item>
             <Form-item label="截止日期" prop="deadline">
                 <i-input v-model="mkActivitiesFullGift.deadline" placeholder="截止日期 yyyy-mm-dd"/>

+ 29 - 8
kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html

@@ -156,7 +156,7 @@
                             <img style="height: 400px;width: 400px;" :src="goods.primaryPicUrl" class="img-rounded"/>
                             <h1 style="margin: 8px;"><strong>{{goods.name}}</strong></h1>
                             <p style="margin: 8px;">单价: <strong>{{goods.retailPrice}}</strong> /元</p>
-                            <p style="margin: 8px;">税费: <strong>{{goods.goodstaxes}}</strong> /元</p>
+                            <p style="margin: 8px;">优惠前税费: <strong>{{goods.goodstaxes}}</strong> /元</p>
                             <p style="margin: 8px;">规格: {{goods.specification}}</p>
                             <p style="margin: 8px;">条形码: {{goods.prodBarcode}}</p>
                             <!--<span style="margin: 8px;">商品描述: {{goods.goodsDesc}}</span>-->
@@ -217,6 +217,7 @@
                         <i-button type="error" @click="clearGoodsList" class="goods-button"><i class="fa fa-pencil-square-o"></i>&nbsp;清空</i-button>
                         <i-button data-toggle="modal" @click="pendingOrder" class="goods-button" ><i class="fa fa-pencil-square-o"></i>&nbsp;订单挂起</i-button>
                         <i-button data-toggle="modal" @click="toResumePending" class="goods-button" ><i class="fa fa-pencil-square-o"></i>&nbsp;恢复挂起</i-button>
+                        <i-button data-toggle="modal" @click="calculateOrderPrice" type="primary" class="goods-button" ><i class="fa fa-pencil-square-o"></i>&nbsp;计算优惠后价格</i-button>
                         <i-button data-toggle="modal" @click="toOrderSubmit" type="primary" class="goods-button" ><i class="fa fa-pencil-square-o"></i>&nbsp;提交订单</i-button>
 
 <!--                        45636914-->
@@ -247,10 +248,10 @@
                                     </div>
                                     <div class="modal-body">
                                         <form>
-                                            <div class="form-group">
+                                            <!--<div class="form-group">
                                                 <label for="customPhone" class="control-label">会员码:</label>
                                                 <input autocomplete="off" type="text" class="form-control" ref="couponBarCode" id="couponBarCode" @blur="customPhoneBlur" />
-                                            </div>
+                                            </div>-->
                                             <div class="form-group">
                                                 <label for="customPhone" class="control-label">手机号:</label>
                                                 <input autocomplete="off" type="text" class="form-control" ref="customPhone" id="customPhone" @blur="customPhoneBlur" />
@@ -297,6 +298,29 @@
                             </div>
                         </div>
 
+                        <div class="modal fade" id="calculateOrderPriceDialog"  role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                            <div class="modal-dialog">
+                                <div class="modal-content">
+                                    <div class="modal-header">
+                                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                                        <h4 class="modal-title" id="calculateOrderPriceModalLabel">录入会员码</h4>
+                                    </div>
+                                    <div class="modal-body">
+                                        <form>
+                                            <div class="form-group">
+                                                <label for="customPhone" class="control-label">会员码:</label>
+                                                <input autocomplete="off" type="text" class="form-control" ref="couponBarCode" id="couponBarCode" @blur="customPhoneBlur" />
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="modal-footer">
+                                        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                                        <button type="button" class="btn btn-primary" @click="calculateOrderPriceSubmit">计算优惠价</button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
                         <!--付款码 -->
                         <div class="modal fade" id="payModal"  role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                             <div class="modal-dialog">
@@ -433,7 +457,7 @@
 <!--                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="resendOrder" id="resendOrder" data-dismiss="modal">重发订单</button>-->
 <!--                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="forceSendToOms" id="forceSendToOms" data-dismiss="modal">强推清关</button>-->
                             <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="verification" id="verification" data-dismiss="modal">核销</button>
-                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="verEwbtion" id="verEwbtion" data-dismiss="modal">打印快递单</button>
+<!--                            <button type="button" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="verEwbtion" id="verEwbtion" data-dismiss="modal">打印快递单</button>-->
                         </div>
                     </div>
                 </div><!-- /.modal -->
@@ -471,10 +495,6 @@
 
                 </div>
 
-<!--                <div class="modal-footerNew">-->
-<!--                    <button type="button" v-if="openSku" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="saveNew" id="saveNew" data-dismiss="modal">确定</button>-->
-<!--                    <button type="button" v-if="openSku" style="margin:0 30px 0 20px;font-size: 25px;" class="btn btn-primary" @click="cancelNew" id="cancelNew" data-dismiss="modal">取消</button>-->
-<!--                </div>-->
             </div>
 
 
@@ -509,6 +529,7 @@
     };
 </script>
 <script src="${rc.contextPath}/statics/dist/js7_jsAddress.js"></script>
+<script src="${rc.contextPath}/statics/libs/bignumber.js"></script>
 <script src="${rc.contextPath}/js/sale/sale.js?_${date.systemTime}"></script>
 <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
 <script src="${rc.contextPath}/statics/libs/bootstrap.min.js"></script>

+ 18 - 21
kmall-admin/src/main/webapp/WEB-INF/page/vip/mall2pointsrules.html

@@ -34,32 +34,29 @@
     <Card v-show="!showList">
         <p slot="title">{{title}}</p>
 		<i-form ref="formValidate" :model="mall2PointsRules" :rules="ruleValidate" :label-width="80">
-            <Form-item label="积分类型  00.按金额  10.按数量" prop="pointsType">
-                <i-input v-model="mall2PointsRules.pointsType" placeholder="积分类型  00.按金额  10.按数量"/>
-            </Form-item>
-            <Form-item label="积分规则适用开始时间" prop="pointsBeginTime">
-                <i-input v-model="mall2PointsRules.pointsBeginTime" placeholder="积分规则适用开始时间"/>
-            </Form-item>
-            <Form-item label="积分规则适用结束时间" prop="pointsEndTime">
-                <i-input v-model="mall2PointsRules.pointsEndTime" placeholder="积分规则适用结束时间"/>
-            </Form-item>
-            <Form-item label="积分规则是否有效" prop="isValid">
-                <i-input v-model="mall2PointsRules.isValid" placeholder="积分规则是否有效"/>
+
+            <Form-item  label="积分类型" prop="pointsRulesId" style="height: 30px;">
+                <i-select v-model="mall2PointsRules.pointsType" placeholder="积分类型" @on-change="changeCategories"
+                          label-in-value style="width: 268px;height: 30px;">
+                    <i-option v-for="category in categories" :value="category.value"
+                              :key="category.value">{{category.name}}
+                    </i-option>
+                </i-select>
             </Form-item>
-            <Form-item label="+创建人编号" prop="createrSn">
-                <i-input v-model="mall2PointsRules.createrSn" placeholder="+创建人编号"/>
+            <Form-item label="积分金额" prop="pointsRulesMoney">
+                <i-input v-model="mall2PointsRules.pointsRulesMoney" placeholder="积分金额"/>
             </Form-item>
-            <Form-item label="+创建时间,yyyy-MM-dd HH:mm:ss" prop="createTime">
-                <i-input v-model="mall2PointsRules.createTime" placeholder="+创建时间,yyyy-MM-dd HH:mm:ss"/>
+            <Form-item label="对应积分数" prop="pointsRulesNum">
+                <i-input v-model="mall2PointsRules.pointsRulesNum" placeholder="对应积分数"/>
             </Form-item>
-            <Form-item label="+修改人编号" prop="moderSn">
-                <i-input v-model="mall2PointsRules.moderSn" placeholder="+修改人编号"/>
+            <Form-item label="适用开始时间" prop="pointsBeginTime">
+                <i-input type="date"  v-model="mall2PointsRules.pointsBeginTime" placeholder="积分规则适用开始时间"/>
             </Form-item>
-            <Form-item label="+修改时间,yyyy-MM-dd HH:mm:ss" prop="modTime">
-                <i-input v-model="mall2PointsRules.modTime" placeholder="+修改时间,yyyy-MM-dd HH:mm:ss"/>
+            <Form-item label="适用结束时间" prop="pointsEndTime">
+                <i-input type="date"  v-model="mall2PointsRules.pointsEndTime" placeholder="积分规则适用结束时间"/>
             </Form-item>
-            <Form-item label="+时间戳" prop="tstm">
-                <i-input v-model="mall2PointsRules.tstm" placeholder="+时间戳"/>
+            <Form-item label="是否有效" prop="isValid">
+                <i-input v-model="mall2PointsRules.isValid" placeholder="积分规则是否有效"/>
             </Form-item>
             <Form-item>
                 <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>

+ 210 - 0
kmall-admin/src/main/webapp/js/mk/mall2RulesDetil.js

@@ -0,0 +1,210 @@
+$(function () {
+
+
+	let flag = getQueryString("flag");
+	if(flag != null && flag == "false"){
+		vm.isMkactivitiesShow = false;
+	}
+	let mkCode = getQueryString("mkCode");
+	if(mkCode){
+		vm.mkCode = mkCode;
+	}
+
+	let storeId = getQueryString("storeId");
+	console.log(storeId);
+	if(storeId){
+		vm.storeId = storeId;
+	}
+	let mkaId = getQueryString("mkaId");
+	if(mkaId){
+		vm.mkaId = mkaId;
+	}
+
+    $("#jqGrid").jqGrid({
+        url: '../mall2pointsrules/detilList',
+        datatype: "json",
+        colModel: [
+			{label: 'Id', name: 'id', index: 'id', key: true, hidden: true},
+			{label: 'id', name: 'id', index: 'id', width: 80, align: 'center'},
+			{label: '对应的商品/门店/类别名称', name: 'rulesName', index: 'rulesName', width: 80, align: 'center'},
+			{label: '备注', name: 'remark', index: 'remark', width: 80, align: 'center'},],
+		viewrecords: true,
+		postData: {'mkaId': vm.mkaId},
+        height: 550,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        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,
+		mkActivitiesHalfPrice: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    name: ''
+		},
+        isMkactivitiesShow: true,
+        mkCode: '',
+		uploadData:[],
+		storeId : '',
+		mkaId : ''
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.mkActivitiesHalfPrice = {};
+		},
+		update: function (event) {
+            let mafrId = getSelectedRow();
+			if (mafrId == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(mafrId)
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.mkActivitiesHalfPrice.mafrId == null ? "../mkactivitieshalfprice/save" : "../mkactivitieshalfprice/update";
+
+			//添加上层的门店编号与营销方式编号
+
+			vm.mkActivitiesHalfPrice.shopSn = vm.storeId;
+			vm.mkActivitiesHalfPrice.mkaId = vm.mkaId;
+
+            $.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.mkActivitiesHalfPrice),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let mafrIds = getSelectedRows();
+			if (mafrIds == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../mall2pointsrules/deleteDetil/"+vm.mkaId,
+				    contentType: "application/json",
+				    data: JSON.stringify(mafrIds),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(mafrId){
+			$.get("../mkactivitieshalfprice/info/"+mafrId, function (r) {
+                vm.mkActivitiesHalfPrice = r.mkActivitiesHalfPrice;
+            });
+		},
+        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);
+        },
+        //返回积分规则设置页
+        reloadMkactivities: function () {
+            window.location.href = "/vip/mall2pointsrules.html";
+        },
+		uploadExcelSuccess: function (data) {
+			// console.log(data);
+			if(data.code==0){
+				alert('导入成功', function (index) {
+					$("#jqGrid").trigger("reloadGrid");
+				});
+			}else{
+				alert(data.msg);
+			}
+		},
+		uploadExcelError: function () {
+			alert('上传出现异常,请重试!');
+		},
+		uploadExcelFormatError: function (file) {
+			this.$Notice.warning({
+				title: '文件格式不正确',
+				desc: '文件 ' + file.name + ' 格式不正确,请上传 xls 或 xlsx 格式的文件。'
+			});
+		},beforeUpload(){
+			vm.uploadData = {
+				mkaId : vm.mkaId
+			}
+			let promise = new Promise((resolve) => {
+				this.$nextTick(function () {
+					resolve(true);
+				});
+			});
+			return promise; //通过返回一个promis对象解决
+
+		},
+	}
+});

+ 10 - 4
kmall-admin/src/main/webapp/js/mk/mkactivitiesfullgift.js

@@ -23,13 +23,19 @@ $(function () {
         datatype: "json",
         colModel: [
 			{label: 'mafrId', name: 'mafrId', index: 'mafr_id', key: true, hidden: true},
-			{label: '产品中文名', name: 'productName', index: 'product_name', width: 80, align: 'center'},
+			/*{label: '产品中文名', name: 'productName', index: 'product_name', width: 80, align: 'center'},
 			{label: '商品编码', name: 'goodsSn', index: 'goods_sn', width: 80, align: 'center'},
-			{label: '条形码', name: 'barcode', index: 'barcode', width: 80, align: 'center'},
-			{label: '商品品牌', name: 'productBrand', index: 'product_brand', width: 80, align: 'center'},
+			{label: '条形码', name: 'barcode', index: 'barcode', width: 80, align: 'center'},*/
+			{label: '门店ID', name: 'shopSn', index: 'shop_sn', width: 80, align: 'center'},
+			{label: '门店名称', name: 'shopName', index: 'shop_name', width: 80, align: 'center'},
+			{label: '商品品牌ID', name: 'brandId', index: 'brand_id', width: 80, align: 'center'},
+			{label: '商品品牌名称', name: 'productBrand', index: 'product_brand', width: 80, align: 'center'},
+			{label: '商品分类ID', name: 'categoryId', index: 'category_id', width: 80, align: 'center'},
+			{label: '商品分类名称', name: 'categoryName', index: 'category_name', width: 80, align: 'center'},
 			// {label: '商品系列', name: 'productSeries', index: 'product_series', width: 80, align: 'center'},
 			{label: '满足条件金额', name: 'qualifiedAmount', index: 'qualified_amount', width: 80, align: 'center'},
-			{label: '赠品条码', name: 'giftBarcode', index: 'gift_barcode', width: 80, align: 'center'},
+			{label: '赠品商品条码', name: 'giftBarcode', index: 'gift_barcode', width: 80, align: 'center'},
+			{label: '赠品商品编码', name: 'giftGoodsSn', index: 'gift_goods_sn', width: 80, align: 'center'},
 			{label: '截止日期', name: 'deadline', index: 'deadline', width: 80, align: 'center'}],
 		viewrecords: true,
 		postData: {'mkaId': vm.mkaId},

+ 149 - 28
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -590,6 +590,8 @@ let vm = new Vue({
 
         canRefund:true,
         openSku:false,
+        // 保存商品详情的list
+        calGoodsList : []
 
     },
     watch: {
@@ -627,7 +629,6 @@ let vm = new Vue({
         // 退款开始
         debounceRefund:debounce(function(){
             toRefund();
-            // alert(123113131);
         },2000),
         queryGoods: function(){
             vm.storeId = sessionStorage.getItem("storeId");
@@ -697,6 +698,9 @@ let vm = new Vue({
                             calculateGoodsPrice(r);
                             handle(r.goodsDetails,"add");
                             vm.openSku = false;
+                            var data = Object.assign({}, JSON.parse(JSON.stringify(r.goodsDetails)));
+                            console.log("商品详情===>" + JSON.stringify(data));
+                            vm.calGoodsList.push(data);
                             //此时必须异步执行滚动条滑动至底部
                             setTimeout(()=>{
                                 overflowLi.scrollTop = overflowLi.scrollHeight;
@@ -719,6 +723,9 @@ let vm = new Vue({
                         calculateGoodsPrice(r);
                         handle(r.goodsDetails,"add");
                         vm.openSku = false;
+                        var data = Object.assign({}, JSON.parse(JSON.stringify(r.goodsDetails)));
+                        console.log("商品详情===>" + JSON.stringify(data));
+                        vm.calGoodsList.push(data);
                         //此时必须异步执行滚动条滑动至底部
                         setTimeout(()=>{
                             overflowLi.scrollTop = overflowLi.scrollHeight;
@@ -735,12 +742,15 @@ let vm = new Vue({
             // 增加数量
             for(var i = 0 ; i < this.goodsList.length ; i++){
                 if(this.goodsList[i].id == value){
-                    var goodsDetails = JSON.parse(JSON.stringify(vm.goodsMap.get(this.goodsList[i].goodsSn)));
-                    calculateGoodsByMj(goodsDetails,"add");
+                    // 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));
+                    /*calculateGoodsByMj(goodsDetails,"add");
                     calculateGoodsByMysy(goodsDetails,"add");
-                    calculateGoodsByHalfPrice(goodsDetails,"add");
+                    calculateGoodsByHalfPrice(goodsDetails,"add");*/
                     // calculateGoodsByMz(goodsDetails,"add");
-                    handle(goodsDetails,"add");
+                    handleSellVolume(goodsDetails, "add");
+                    // handle(goodsDetails,"add");
                     break;
                 }
             }
@@ -750,16 +760,14 @@ let vm = new Vue({
             for(var i = 0 ; i < this.goodsList.length ; i++){
                 if(this.goodsList[i].id == value){
                     // 获取当前购物车的数量
-                    var g = JSON.parse(JSON.stringify(this.goodsList[i]));
-
-                    console.log(g);
-                    var goodsDetails = JSON.parse(JSON.stringify(vm.goodsMap.get(this.goodsList[i].goodsSn)));
-                    if(g.sellVolume === 1){
+                    let goodsDetails = JSON.parse(JSON.stringify(vm.goodsList[i]));
+                    console.log("减法 goods detail =====>" + JSON.stringify(goodsDetails));
+                    if(goodsDetails.sellVolume === 1){
                         alert("数量至少为1个");
                         return ;
                     }
                     // 如果不为空,证明减的是买A送B中的B,这时候要还原赠送资格跟B的扣减
-                    var freeMap = vm.freeBardcode.get(goodsDetails.prodBarcode);
+                    /*var freeMap = vm.freeBardcode.get(goodsDetails.prodBarcode);
                     if((freeMap || freeMap == 0) && g.actualPaymentAmount == 0){
                         vm.freeBardcode.set(goodsDetails.prodBarcode,freeMap + 1);
                         goodsDetails.sellVolume = -1;
@@ -778,9 +786,9 @@ let vm = new Vue({
                         goodsDetails.discountedPrice = -goodsDetails.discountedPrice;
                         goodsDetails.goodstaxes = - goodsDetails.goodstaxes;
                         goodsDetails.retailPrice = - goodsDetails.retailPrice;
-                    }
-
-                    handle(goodsDetails,"minus");
+                    }*/
+                    handleSellVolume(goodsDetails, "minus");
+                    // handle(goodsDetails,"minus");
                     break;
                 }
             }
@@ -926,6 +934,27 @@ let vm = new Vue({
                 vm.$refs.couponSn.value = "";
             this.userInfo.couponSn = "";
         },
+        // 点击计算优惠价按钮,弹出输入框
+        calculateOrderPrice : function () {
+            if (this.calGoodsList.length == 0) {
+                alert("请选择商品");
+                return;
+            }
+            $("#calculateOrderPriceDialog").modal('show');
+
+        },
+        // 计算优惠价格,返回订单详情数据
+        calculateOrderPriceSubmit : function () {
+            console.log("11111");
+
+            console.log("点击计算=====>" + JSON.stringify(vm.goodsList));
+
+            var couponBarCode = vm.$refs.couponBarCode;
+            if (couponBarCode === null || couponBarCode === '') {
+                alert("无会员码,不能参加积分抵扣活动!\n计算中...");
+            }
+            calculateOrderPrice();
+        },
         // 提交订单
         submitOrder:function(){
             vm.parCode = this.$refs.payCode.currentValue
@@ -1151,9 +1180,13 @@ let vm = new Vue({
             })
         },
         resendOrder:function(){
-            confirm('确认重发电子订单吗?', function () {
-                $.get("../order/resendOrderToCCNET/"+vm.orderEntity.orderSn+"/clsOrder", function (r) {
-                    alert(r.msg);
+            confirm('确认重发订单吗?', function () {
+                $.get("../order/resendOrderHkMall/"+vm.orderEntity.orderSn, function (r) {
+                    if(r.code == "0"){
+                        alert(r.msg);
+                    } else {
+                        alert(r.msg);
+                    }
                 });
             })
         },
@@ -1759,16 +1792,18 @@ function removeByValue(arr, val) {
 function handle(goodsDetails,operatorType){
     vm.goodsDetail = true;
     // goodsDetails.sellVolume = 1;
+    console.log("goodsDetails=====>" + JSON.stringify(goodsDetails));
     goodsDetails.id = 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]);
     vm.max++;
     goodsDetails.goodsDesc = "";
 
-
     // 判断当前商品是否是赠品
-        var freeMap = vm.freeBardcode.get(goodsDetails.prodBarcode);
+        /*var freeMap = vm.freeBardcode.get(goodsDetails.prodBarcode);
         if(freeMap && "minus" != operatorType){
             goodsDetails.actualPaymentAmount = 0;
             goodsDetails.discountedPrice = goodsDetails.retailPrice;
@@ -1779,7 +1814,7 @@ function handle(goodsDetails,operatorType){
                 for(var i = 0 ; i < vm.goodsList.length ; i++){
                     var shopcartGoods = vm.goodsList[i];
                     var shopcartFree = vm.freeBardcode.get(shopcartGoods.prodBarcode);
-                    if(shopcartFree /*&& shopcartGoods.actualPaymentAmount*/){
+                    if(shopcartFree /!*&& shopcartGoods.actualPaymentAmount*!/){
                         // if("minus" != operatorType){
                             var shopcartSellNum = shopcartGoods.sellVolume;
                             if(shopcartFree > shopcartSellNum){
@@ -1815,13 +1850,7 @@ function handle(goodsDetails,operatorType){
 
                 }
             }
-        }
-
-
-
-
-
-
+        }*/
 
     goodsDetails.discountedPrice =  Math.round(goodsDetails.discountedPrice * 100) / 100;
     goodsDetails.actualPaymentAmount =  Math.round(goodsDetails.actualPaymentAmount * 100) / 100;
@@ -1892,6 +1921,9 @@ function handle(goodsDetails,operatorType){
     vm.discountedPrice =  Math.round(vm.discountedPrice * 100) / 100;
     vm.actualPrice =  Math.round(vm.actualPrice * 100) / 100;
     vm.showReduceMoney =  Math.round(vm.showReduceMoney * 100) / 100;
+
+
+    console.log("goodsDetails after=====>" + JSON.stringify(vm.goodsList));
 }
 
 // 下单处理
@@ -1956,7 +1988,7 @@ function toRefund(){
         vm.canRefund = false;
         $.ajax({
             type: "POST",
-            url: "../order/orderRefund",
+            url: "../order/orderHkRefund",
             contentType: "application/json",
             data: JSON.stringify({'orderId':vm.currentOrderNo,'sessionId':vm.sessionId}),
             success: function (r) {
@@ -1974,4 +2006,93 @@ function toRefund(){
     })
 }
 
+/**
+ * 计算当前购物栏商品优惠价格
+ */
+calculateOrderPrice = function() {
+    let param = {
+        'storeId': sessionStorage.getItem("storeId"),
+        'memberCode': vm.$refs.couponBarCode.value,
+        'goodsList' : vm.goodsList
+    };
+    console.log("请求参数===>" + JSON.stringify(param));
+
+    $.ajax({
+        type: "POST",
+        url: "../order/calculateOrderDiscountPrice",
+        contentType: "application/json",
+        data: JSON.stringify(param),
+        success: function (r) {
+            if (r.code === 0) {
+                let calGoodsList = r.data.goodsDetailsDtos;
+                // 更新购物栏中数据
+                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;
+                console.log("计算后数据===>" + JSON.stringify(calGoodsList));
+                console.log("替换后数据===>" + JSON.stringify(vm.goodsList));
+
+                $("#calculateOrderPriceDialog").modal('hide');
+            } else if (r.code === 500) {
+                alert(r.msg);
+            } else {
+                alert("计算失败,请联系管理员");
+            }
+        }
+    });
+}
+
+/**
+ * 处理加减按钮操作
+ * @param currentGoodsDetail    当前操作的商品详情
+ * @param type                  类型,add:加 minus:减
+ */
+handleSellVolume = function (currentGoodsDetail, type) {
+    console.log("处理前商品详情=====>" + JSON.stringify(currentGoodsDetail));
+    // 当前未被处理的商品数量
+    let number = currentGoodsDetail.sellVolume;
+    // 当前商品应支付金额
+    let currentActualPaymentAmount = new BigNumber(currentGoodsDetail.actualPaymentAmount);
+    // 当前商品税款
+    let currentGoodsTax = new BigNumber(currentGoodsDetail.goodstaxes);
+    // 当前商品零售价
+    let retailPrice = new BigNumber(currentGoodsDetail.retailPrice);
+    // 单个商品时的税款
+    let singleTax = currentGoodsTax.divide(number);
+    // 单个商品时的应支付金额
+    let singleActualPaymentAmount = currentActualPaymentAmount.divide(number);
+
+    // 当前总价
+    let currentTotalPrice = new BigNumber(vm.totalPrice);
+    // 当前实际支付价
+    let currentActualPrice = new BigNumber(vm.actualPrice);
+    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();
+    } 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();
+    }
+
+    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(currentGoodsDetail))
+}
+
 

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

@@ -28,15 +28,15 @@ $(function () {
                     return '普通货物';
                 }
             },
-            {label: '库存是否共享', name: 'isStockShare', index: 'isStockShare', width: 100, align: 'center',
-                formatter: function (value) {
-                    if (value == '0') {
-                        return '否';
-                    } else if (value == '1') {
-                        return '是';
-                    }
-                    return '-';
-                }},
+            // {label: '库存是否共享', name: 'isStockShare', index: 'isStockShare', width: 100, align: 'center',
+            //     formatter: function (value) {
+            //         if (value == '0') {
+            //             return '否';
+            //         } else if (value == '1') {
+            //             return '是';
+            //         }
+            //         return '-';
+            //     }},
             {label: '商品库存', name: 'goodsNumber', index: 'goodsNumber', width: 100, align: 'right'},
             {label: '待恢复数量', name: 'toBeRestored', index: 'toBeRestored', width: 100, align: 'right',formatter:function(value){
                 if(value){

+ 76 - 6
kmall-admin/src/main/webapp/js/vip/mall2pointsrules.js

@@ -3,11 +3,51 @@ $(function () {
         url: '../mall2pointsrules/list',
         datatype: "json",
         colModel: [
-			{label: 'mprId', name: 'mprId', index: 'mpr_id', key: true, hidden: true},
-			{label: '积分类型  00.按金额  10.按数量', name: 'pointsType', index: 'points_type', width: 80},
-			{label: '积分规则适用开始时间', name: 'pointsBeginTime', index: 'points_begin_time', width: 80},
-			{label: '积分规则适用结束时间', name: 'pointsEndTime', index: 'points_end_time', width: 80},
-			{label: '积分规则是否有效', name: 'isValid', index: 'is_valid', width: 80},
+			{label: 'ID', name: 'mprId', index: 'mpr_id', key: true, hidden: true},
+			{
+				label: '积分类型', name: 'pointsType', index: 'points_type', width: 80, formatter: function (value) {
+					if (value === '0' || value === 0) {
+						return '门店';
+					}
+					if (value == '1') {
+						return '商品类别';
+					}
+					if (value == '2') {
+						return '门店商品';
+					}
+
+				}
+			},
+			{label: '积分金额', name: 'pointsRulesMoney', index: 'points_rules_money', width: 80},
+			{label: '对应积分数', name: 'pointsRulesNum', index: 'points_rules_num', width: 80},
+			{
+				label: '规则适用开始时间', name: 'pointsBeginTime', index: 'points_begin_time',align:"center", width: 200, formatter: function (value) {
+					return transDate(value, 'yyyy-MM-dd');
+				}
+			},
+			{
+				label: '规则适用结束时间', name: 'pointsEndTime', index: 'points_end_time',align:"center", width: 200, formatter: function (value) {
+					return transDate(value, 'yyyy-MM-dd');
+				}
+			},
+			{
+				label: '是否有效', name: 'isValid', index: 'is_valid', width: 80, formatter: function (value) {
+					if (value === '0' || value === 0) {
+						return '是';
+					}
+					if (value == '1') {
+						return '否';
+					}
+				}
+			},
+			{label: '操作', width: 80, align: 'center',
+				formatter: function (value, col, row) {
+					htmlStr = "<button class='btn btn-outline btn-primary' " +
+						"onclick='vm.showMkactivitiesGoods(\""+row.mprId+"\")'>管理详情</button>";
+
+					return htmlStr;
+				}
+			}
 			],
 		viewrecords: true,
         height: 550,
@@ -40,6 +80,8 @@ let vm = new Vue({
 	data: {
         showList: true,
         title: null,
+		categories: [],//一级分类
+		categoriesTwo: [],
 		mall2PointsRules: {},
 		ruleValidate: {
 			name: [
@@ -58,6 +100,7 @@ let vm = new Vue({
 			vm.showList = false;
 			vm.title = "新增";
 			vm.mall2PointsRules = {};
+			vm.getCategories();
 		},
 		update: function (event) {
             let mprId = getSelectedRow();
@@ -66,7 +109,7 @@ let vm = new Vue({
 			}
 			vm.showList = false;
             vm.title = "修改";
-
+			vm.getCategories();
             vm.getInfo(mprId)
 		},
 		saveOrUpdate: function (event) {
@@ -87,6 +130,11 @@ let vm = new Vue({
                 }
 			});
 		},
+        // 管理商品
+		showMkactivitiesGoods: function(mkaId){
+			var url = "/mk/mall2RulesDetil.html"
+			window.location.href =  url+"?flag=false&mkaId="+mkaId;
+		},
 		del: function (event) {
             let mprIds = getSelectedRows();
 			if (mprIds == null){
@@ -114,6 +162,8 @@ let vm = new Vue({
 		getInfo: function(mprId){
 			$.get("../mall2pointsrules/info/"+mprId, function (r) {
                 vm.mall2PointsRules = r.mall2PointsRules;
+				vm.mall2PointsRules.pointsBeginTime = transDate(r.mall2PointsRules.pointsBeginTime, 'yyyy-MM-dd')
+				vm.mall2PointsRules.pointsEndTime = transDate(r.mall2PointsRules.pointsEndTime, 'yyyy-MM-dd')
             });
 		},
         reloadSearch: function() {
@@ -122,6 +172,26 @@ let vm = new Vue({
             }
             vm.reload();
 		},
+		changeCategories: function (opt) {
+			var value = opt.value;
+			vm.brands = [];
+			if(value){
+				vm.getBrand(value);
+				$.get("./sys/macro/getPointRulesDetil?parentId=" + value, function (r) {
+					vm.categoriesTwo = r.list;
+				});
+			}
+		},
+		getCategories: function () {
+			$.get("../sys/macro/queryMacrosByValueRuRules?id=70", function (r) {
+				vm.categories = r.list;
+			});
+		},
+		getBrand: function () {
+			$.get("../sys/macro/queryMacrosByValueRuRules?id=70" , function (r) {
+				vm.brands = r.list;
+			});
+		},
 		reload: function (event) {
 			vm.showList = true;
 			let page = event;

TEMPAT SAMPAH
kmall-admin/src/main/webapp/statics/file/mall2RulesDetil_1.0.xlsx


+ 138 - 0
kmall-admin/src/main/webapp/statics/libs/bignumber.js

@@ -0,0 +1,138 @@
+//+ Jonas Raoni Soares Silva
+//@ http://jsfromhell.com/classes/bignumber [rev. #4]
+
+BigNumber = function(n, p, r){
+	var o = this, i;
+	if(n instanceof BigNumber){
+		for(i in {precision: 0, roundType: 0, _s: 0, _f: 0}) o[i] = n[i];
+		o._d = n._d.slice();
+		return;
+	}
+	o.precision = isNaN(p = Math.abs(p)) ? BigNumber.defaultPrecision : p;
+	o.roundType = isNaN(r = Math.abs(r)) ? BigNumber.defaultRoundType : r;
+	o._s = (n += "").charAt(0) == "-";
+	o._f = ((n = n.replace(/[^\d.]/g, "").split(".", 2))[0] = n[0].replace(/^0+/, "") || "0").length;
+	for(i = (n = o._d = (n.join("") || "0").split("")).length; i; n[--i] = +n[i]);
+	o.round();
+};
+with({$: BigNumber, o: BigNumber.prototype}){
+	$.ROUND_HALF_EVEN = ($.ROUND_HALF_DOWN = ($.ROUND_HALF_UP = ($.ROUND_FLOOR = ($.ROUND_CEIL = ($.ROUND_DOWN = ($.ROUND_UP = 0) + 1) + 1) + 1) + 1) + 1) + 1;
+	$.defaultPrecision = 40;
+	$.defaultRoundType = $.ROUND_HALF_UP;
+	o.add = function(n){
+		if(this._s != (n = new BigNumber(n))._s)
+			return n._s ^= 1, this.subtract(n);
+		var o = new BigNumber(this), a = o._d, b = n._d, la = o._f,
+		lb = n._f, n = Math.max(la, lb), i, r;
+		la != lb && ((lb = la - lb) > 0 ? o._zeroes(b, lb, 1) : o._zeroes(a, -lb, 1));
+		i = (la = a.length) == (lb = b.length) ? a.length : ((lb = la - lb) > 0 ? o._zeroes(b, lb) : o._zeroes(a, -lb)).length;
+		for(r = 0; i; r = (a[--i] = a[i] + b[i] + r) / 10 >>> 0, a[i] %= 10);
+		return r && ++n && a.unshift(r), o._f = n, o.round();
+	};
+	o.subtract = function(n){
+		if(this._s != (n = new BigNumber(n))._s)
+			return n._s ^= 1, this.add(n);
+		var o = new BigNumber(this), c = o.abs().compare(n.abs()) + 1, a = c ? o : n, b = c ? n : o, la = a._f, lb = b._f, d = la, i, j;
+		a = a._d, b = b._d, la != lb && ((lb = la - lb) > 0 ? o._zeroes(b, lb, 1) : o._zeroes(a, -lb, 1));
+		for(i = (la = a.length) == (lb = b.length) ? a.length : ((lb = la - lb) > 0 ? o._zeroes(b, lb) : o._zeroes(a, -lb)).length; i;){
+			if(a[--i] < b[i]){
+				for(j = i; j && !a[--j]; a[j] = 9);
+				--a[j], a[i] += 10;
+			}
+			b[i] = a[i] - b[i];
+		}
+		return c || (o._s ^= 1), o._f = d, o._d = b, o.round();
+	};
+	o.multiply = function(n){
+		var o = new BigNumber(this), r = o._d.length >= (n = new BigNumber(n))._d.length, a = (r ? o : n)._d,
+		b = (r ? n : o)._d, la = a.length, lb = b.length, x = new BigNumber, i, j, s;
+		for(i = lb; i; r && s.unshift(r), x.set(x.add(new BigNumber(s.join("")))))
+			for(s = (new Array(lb - --i)).join("0").split(""), r = 0, j = la; j; r += a[--j] * b[i], s.unshift(r % 10), r = (r / 10) >>> 0);
+		return o._s = o._s != n._s, o._f = ((r = la + lb - o._f - n._f) >= (j = (o._d = x._d).length) ? this._zeroes(o._d, r - j + 1, 1).length : j) - r, o.round();
+	};
+	o.divide = function(n){
+		if((n = new BigNumber(n)) == "0")
+			throw new Error("Division by 0");
+		else if(this == "0")
+			return new BigNumber;
+		var o = new BigNumber(this), a = o._d, b = n._d, la = a.length - o._f,
+		lb = b.length - n._f, r = new BigNumber, i = 0, j, s, l, f = 1, c = 0, e = 0;
+		r._s = o._s != n._s, r.precision = Math.max(o.precision, n.precision),
+		r._f = +r._d.pop(), la != lb && o._zeroes(la > lb ? b : a, Math.abs(la - lb));
+		n._f = b.length, b = n, b._s = false, b = b.round();
+		for(n = new BigNumber; a[0] == "0"; a.shift());
+		out:
+		do{
+			for(l = c = 0, n == "0" && (n._d = [], n._f = 0); i < a.length && n.compare(b) == -1; ++i){
+				(l = i + 1 == a.length, (!f && ++c > 1 || (e = l && n == "0" && a[i] == "0")))
+				&& (r._f == r._d.length && ++r._f, r._d.push(0));
+				(a[i] == "0" && n == "0") || (n._d.push(a[i]), ++n._f);
+				if(e)
+					break out;
+				if((l && n.compare(b) == -1 && (r._f == r._d.length && ++r._f, 1)) || (l = 0))
+					while(r._d.push(0), n._d.push(0), ++n._f, n.compare(b) == -1);
+			}
+			if(f = 0, n.compare(b) == -1 && !(l = 0))
+				while(l ? r._d.push(0) : l = 1, n._d.push(0), ++n._f, n.compare(b) == -1);
+			for(s = new BigNumber, j = 0; n.compare(y = s.add(b)) + 1 && ++j; s.set(y));
+			n.set(n.subtract(s)), !l && r._f == r._d.length && ++r._f, r._d.push(j);
+		}
+		while((i < a.length || n != "0") && (r._d.length - r._f) <= r.precision);
+		return r.round();
+	};
+	o.mod = function(n){
+		return this.subtract(this.divide(n).intPart().multiply(n));
+	};
+	o.pow = function(n){
+		var o = new BigNumber(this), i;
+		if((n = (new BigNumber(n)).intPart()) == 0) return o.set(1);
+		for(i = Math.abs(n); --i; o.set(o.multiply(this)));
+		return n < 0 ? o.set((new BigNumber(1)).divide(o)) : o;
+	};
+	o.set = function(n){
+		return this.constructor(n), this;
+	};
+	o.compare = function(n){
+		var a = this, la = this._f, b = new BigNumber(n), lb = b._f, r = [-1, 1], i, l;
+		if(a._s != b._s)
+			return a._s ? -1 : 1;
+		if(la != lb)
+			return r[(la > lb) ^ a._s];
+		for(la = (a = a._d).length, lb = (b = b._d).length, i = -1, l = Math.min(la, lb); ++i < l;)
+			if(a[i] != b[i])
+				return r[(a[i] > b[i]) ^ a._s];
+		return la != lb ? r[(la > lb) ^ a._s] : 0;
+	};
+	o.negate = function(){
+		var n = new BigNumber(this); return n._s ^= 1, n;
+	};
+	o.abs = function(){
+		var n = new BigNumber(this); return n._s = 0, n;
+	};
+	o.intPart = function(){
+		return new BigNumber((this._s ? "-" : "") + (this._d.slice(0, this._f).join("") || "0"));
+	};
+	o.valueOf = o.toString = function(){
+		var o = this;
+		return (o._s ? "-" : "") + (o._d.slice(0, o._f).join("") || "0") + (o._f != o._d.length ? "." + o._d.slice(o._f).join("") : "");
+	};
+	o._zeroes = function(n, l, t){
+		var s = ["push", "unshift"][t || 0];
+		for(++l; --l;  n[s](0));
+		return n;
+	};
+	o.round = function(){
+		if("_rounding" in this) return this;
+		var $ = BigNumber, r = this.roundType, b = this._d, d, p, n, x;
+		for(this._rounding = true; this._f > 1 && !b[0]; --this._f, b.shift());
+		for(d = this._f, p = this.precision + d, n = b[p]; b.length > d && !b[b.length -1]; b.pop());
+		x = (this._s ? "-" : "") + (p - d ? "0." + this._zeroes([], p - d - 1).join("") : "") + 1;
+		if(b.length > p){
+			n && (r == $.DOWN ? false : r == $.UP ? true : r == $.CEIL ? !this._s
+			: r == $.FLOOR ? this._s : r == $.HALF_UP ? n >= 5 : r == $.HALF_DOWN ? n > 5
+			: r == $.HALF_EVEN ? n >= 5 && b[p - 1] & 1 : false) && this.add(x);
+			b.splice(p, b.length - p);
+		}
+		return delete this._rounding, this;
+	};
+}

+ 1 - 1
kmall-api/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>kmall-pt-general</artifactId>
+        <artifactId>kmall-haikong</artifactId>
         <groupId>com.kmall</groupId>
         <version>3.1.0</version>
     </parent>

+ 1 - 1
kmall-common/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>kmall-pt-general</artifactId>
+        <artifactId>kmall-haikong</artifactId>
         <groupId>com.kmall</groupId>
         <version>3.1.0</version>
     </parent>

+ 3 - 0
kmall-common/src/main/java/com/kmall/common/constant/JxlsXmlTemplateName.java

@@ -65,4 +65,7 @@ public class JxlsXmlTemplateName {
     //支付宝账单导入
     public static final String ALI_PAYMENT_ORDER_DTO_List = "/XmlTemplate/AliPaymentOrderDtoList.xml";
 
+    //积分规则导入
+    public static final String MALL_RULES_LIST = "/XmlTemplate/mallRulesList.xml";
+
 }

+ 1 - 1
kmall-framework/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>kmall-pt-general</artifactId>
+        <artifactId>kmall-haikong</artifactId>
         <groupId>com.kmall</groupId>
         <version>3.1.0</version>
     </parent>

+ 1 - 1
kmall-gen/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>kmall-pt-general</artifactId>
+        <artifactId>kmall-haikong</artifactId>
         <groupId>com.kmall</groupId>
         <version>3.1.0</version>
     </parent>

+ 1 - 1
kmall-manager/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>kmall-pt-general</artifactId>
+        <artifactId>kmall-haikong</artifactId>
         <groupId>com.kmall</groupId>
         <version>3.1.0</version>
     </parent>

+ 5 - 0
kmall-manager/src/main/resources/conf/haikong.properties

@@ -15,6 +15,11 @@ haikong.ware.companyCode=44048600Y8
 haikong.ware.code=20
 haikong.ware.signMethod=md5
 
+#\u514D\u7A0Emall\u7CFB\u7EDF
+haikong.vmcconnect.url=https://testmall.greedc.com/openapi/vmcconnect/json
+haikong.vmcconnect.appId=5
+haikong.vmcconnect.secretKey=GXfc6ZtDlnxHxmmAHvfRfqvrqgfwRiJX
+haikong.vmcconnect.requestRetry=2
 #### \u751F\u4EA7\u73AF\u5883
 #haikong.member.url=https://ump.greedc.com
 #haikong.member.appId=

+ 1 - 1
kmall-schedule/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>kmall-pt-general</artifactId>
+        <artifactId>kmall-haikong</artifactId>
         <groupId>com.kmall</groupId>
         <version>3.1.0</version>
     </parent>

+ 5 - 0
pom.xml

@@ -173,6 +173,11 @@
             <version>${slf4j-version}</version>
         </dependency>
         <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.4</version>
+        </dependency>
+        <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
             <version>${log4j-version}</version>