Browse Source

Merge remote-tracking branch 'upstream/featrue/海控项目1115-qng' into feature/haikong-20211120

# Conflicts:
#	kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
lhm 3 years ago
parent
commit
bccdc14b33
48 changed files with 1903 additions and 107 deletions
  1. 5 0
      kmall-admin/pom.xml
  2. 20 0
      kmall-admin/src/main/java/com/kmall/admin/controller/SysMacroController.java
  3. 67 7
      kmall-admin/src/main/java/com/kmall/admin/controller/vip/Mall2PointsRulesController.java
  4. 12 0
      kmall-admin/src/main/java/com/kmall/admin/dao/CategoryDao.java
  5. 15 0
      kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java
  6. 13 1
      kmall-admin/src/main/java/com/kmall/admin/dao/StoreDao.java
  7. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/SysMacroDao.java
  8. 6 0
      kmall-admin/src/main/java/com/kmall/admin/dao/vip/Mall2PointsRulesDao.java
  9. 21 0
      kmall-admin/src/main/java/com/kmall/admin/dto/Mall2RulesDto.java
  10. 11 0
      kmall-admin/src/main/java/com/kmall/admin/entity/CategoryEntity.java
  11. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ProductStoreRelaEntity.java
  12. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/StoreEntity.java
  13. 23 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderEntity.java
  14. 84 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderInfoEntity.java
  15. 63 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderItemsEntity.java
  16. 60 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectPayinfoEntity.java
  17. 24 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectSeaportInfoEntity.java
  18. 20 0
      kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2DetilEntity.java
  19. 62 20
      kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2PointsRulesEntity.java
  20. 86 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongVmcconnectTemplate.java
  21. 119 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/VmcShopTemplate.java
  22. 4 1
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongConfig.java
  23. 50 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongProperties.java
  24. 48 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/VmcconnectUrlEnum.java
  25. 174 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/HttpsClientUtil.java
  26. 100 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Md5Utils.java
  27. 33 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/VmcconnectSignUtils.java
  28. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/SysMacroService.java
  29. 39 37
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  30. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/SysMacroServiceImpl.java
  31. 123 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java
  32. 16 1
      kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java
  33. 19 0
      kmall-admin/src/main/resources/XmlTemplate/mallRulesList.xml
  34. 48 0
      kmall-admin/src/main/resources/mybatis/mapper/CategoryDao.xml
  35. 53 0
      kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml
  36. 45 0
      kmall-admin/src/main/resources/mybatis/mapper/StoreDao.xml
  37. 9 0
      kmall-admin/src/main/resources/mybatis/mapper/SysMacroDao.xml
  38. 16 0
      kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2PointsRulesDao.xml
  39. 60 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mall2RulesDetil.html
  40. 0 4
      kmall-admin/src/main/webapp/WEB-INF/page/sale/sale.html
  41. 18 21
      kmall-admin/src/main/webapp/WEB-INF/page/vip/mall2pointsrules.html
  42. 210 0
      kmall-admin/src/main/webapp/js/mk/mall2RulesDetil.js
  43. 9 9
      kmall-admin/src/main/webapp/js/shop/goods.js
  44. 76 6
      kmall-admin/src/main/webapp/js/vip/mall2pointsrules.js
  45. BIN
      kmall-admin/src/main/webapp/statics/file/mall2RulesDetil_1.0.xlsx
  46. 3 0
      kmall-common/src/main/java/com/kmall/common/constant/JxlsXmlTemplateName.java
  47. 5 0
      kmall-manager/src/main/resources/conf/haikong.properties
  48. 5 0
      pom.xml

+ 5 - 0
kmall-admin/pom.xml

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

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

+ 15 - 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,16 @@ 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);
 }

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

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

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

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

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

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

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

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

+ 39 - 37
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -36,6 +36,7 @@ import com.kmall.admin.haikong.utils.ListUtils;
 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;
@@ -226,6 +227,9 @@ public class OrderServiceImpl implements OrderService {
     private HaiKongProperties haiKongProperties;
 
     @Autowired
+    private VmcShopTemplate vmcShopTemplate;
+
+    @Autowired
     private MkActivitiesService mkActivitiesService;
 
     /**
@@ -246,6 +250,8 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private MkActivitiesPromotionService mkActivitiesPromotionService;
 
+
+
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -3280,11 +3286,9 @@ public class OrderServiceImpl implements OrderService {
             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,
+                WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn(), totalActualPrice,
                         orderInfo.getActualPrice().doubleValue());
                 OrderRefundEntity orderRefund = new OrderRefundEntity();
                 orderRefund.setRefundId(result.getRefund_id());
@@ -3303,24 +3307,20 @@ public class OrderServiceImpl implements OrderService {
                 } 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);
-
+                //新增退款记录
+                orderRefund.setRestore(1);
+                orderRefundDao.save(orderRefund);
                 //调用免税mall接口退款
-                //HttpUtil.doPostJson()
                 restoreInventoryMsMall(order);
-                orderRefund.setRestore(1);
 
-                orderRefundDao.save(orderRefund);//退款记录
             }
             // 支付宝的退款代码
         } else if (Dict.payFlag.item_alipay.getItem().equals(payFlag)) {
@@ -3381,32 +3381,34 @@ public class OrderServiceImpl implements OrderService {
      * @param order
      */
     private void restoreInventoryMsMall(OrderEntity order) {
-        //调用CCNET接口
-        String msg = OkHttpUtils.post(JSON.toJSONString(order),OmsMerchPropertiesBuilder.instance().getWxOrderResendUrl() + "/refundOrder",JSON.toJSONString(order),"SSL");
-        ResponseData responseData = JacksonUtils.fromStringJson(msg, ResponseData.class);
-        if(responseData.getCode().equalsIgnoreCase("0")) {
-
-            Map<String, Object> map = new HashMap();
-            SysUserEntity user = ShiroUtils.getUserEntity();
-            map.put("orderId", order.getId());
-            List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
-
-            for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
-                ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
-                        .queryByGoodsIdAndStoreId(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;
-                }
-                //还原门店库存
-                if (null != storeRelaEntity.getStockNum()) {
-                    Integer stockNum = storeRelaEntity.getStockNum();
-                    resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, responseData.getCode(), user);
-                }
+        Map<String, Object> map = new HashMap();
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        map.put("orderId", order.getId());
+        List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
+        for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
+            ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
+                    .queryByGoodsIdAndStoreId(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;
+            }
+            //还原门店库存
+            if (null != storeRelaEntity.getStockNum()) {
+                Integer stockNum = storeRelaEntity.getStockNum();
+                resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, "0", user);
+            }
+        }
+        LOGGER.info("=======> 调用VMCShop接口开始发送退款订单数据......");
+        String response = vmcShopTemplate.refundOrder(JacksonUtil.toJson(order.getOrderSn()));
+        // 3. 解析响应数据
+        LOGGER.info("=======> [发送退款订单数据成功,开始处理后续流程]"+response);
+        Map<String,String> res = JSON.parseObject(response,Map.class);
+        if("0".equals(res.get("code"))){
+
+
         }else{
             LOGGER.error(order.getOrderSn()+"[该订单退款失败]"+JSON.toJSONString(order));
         }

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

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

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

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

@@ -916,4 +916,57 @@
         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>
+
+
 </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>

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

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

@@ -495,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>
 
 

+ 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对象解决
+
+		},
+	}
+});

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

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


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

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

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