Bläddra i källkod

积分规则设置以及免税mall接口对接

qng 3 år sedan
förälder
incheckning
efe221abcd
32 ändrade filer med 1207 tillägg och 77 borttagningar
  1. 21 10
      kmall-admin/src/main/java/com/kmall/admin/controller/vip/Mall2PointsRulesController.java
  2. 12 0
      kmall-admin/src/main/java/com/kmall/admin/dao/CategoryDao.java
  3. 10 0
      kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java
  4. 9 0
      kmall-admin/src/main/java/com/kmall/admin/dao/StoreDao.java
  5. 1 1
      kmall-admin/src/main/java/com/kmall/admin/dao/vip/Mall2PointsRulesDao.java
  6. 5 5
      kmall-admin/src/main/java/com/kmall/admin/dto/Mall2RulesDto.java
  7. 11 0
      kmall-admin/src/main/java/com/kmall/admin/entity/CategoryEntity.java
  8. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ProductStoreRelaEntity.java
  9. 23 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderEntity.java
  10. 84 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderInfoEntity.java
  11. 63 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectOrderItemsEntity.java
  12. 60 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectPayinfoEntity.java
  13. 24 0
      kmall-admin/src/main/java/com/kmall/admin/entity/VmcconnectSeaportInfoEntity.java
  14. 20 0
      kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2DetilEntity.java
  15. 86 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/HaiKongVmcconnectTemplate.java
  16. 117 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/client/VmcShopTemplate.java
  17. 4 1
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongConfig.java
  18. 50 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/config/HaiKongProperties.java
  19. 48 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/VmcconnectUrlEnum.java
  20. 174 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/HttpsClientUtil.java
  21. 100 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/Md5Utils.java
  22. 33 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/utils/VmcconnectSignUtils.java
  23. 77 34
      kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java
  24. 5 8
      kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java
  25. 19 0
      kmall-admin/src/main/resources/XmlTemplate/mallRulesList.xml
  26. 48 0
      kmall-admin/src/main/resources/mybatis/mapper/CategoryDao.xml
  27. 44 9
      kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml
  28. 40 5
      kmall-admin/src/main/resources/mybatis/mapper/StoreDao.xml
  29. 1 1
      kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2PointsRulesDao.xml
  30. 3 3
      kmall-admin/src/main/webapp/js/mk/mall2RulesDetil.js
  31. BIN
      kmall-admin/src/main/webapp/statics/file/mall2RulesDetil_1.0.xlsx
  32. 5 0
      kmall-manager/src/main/resources/conf/haikong.properties

+ 21 - 10
kmall-admin/src/main/java/com/kmall/admin/controller/vip/Mall2PointsRulesController.java

@@ -6,6 +6,7 @@ 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;
@@ -95,22 +96,21 @@ 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, Integer mkaId) {
-        List<Mall2RulesDto> pointsRulesList = new ArrayList<>();//信息
+    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<String, Object>();
+            Map<String, Object> beans = new HashMap<>();
             beans.put("Mall2RulesDto", mall2RulesDto);
-            beans.put("PointsRulesList", pointsRulesList);
+            beans.put("Mall2RulesDtoList", mall2RulesDtoList);
             if (file.isEmpty()) {
                 return R.error("文件不能为空!");
             }
@@ -119,7 +119,7 @@ public class Mall2PointsRulesController {
             e.printStackTrace();
             return R.error("导入失败!");
         }
-        mall2PointsRulesService.rulesUploadDetil(pointsRulesList,mkaId);
+        mall2PointsRulesService.rulesUploadDetil(mall2RulesDtoList,mkaId);
         //上传文件
         return R.ok("导入成功!");
     }
@@ -137,7 +137,7 @@ public class Mall2PointsRulesController {
 
 
     /**
-     * 查看列表
+     * 查看积分列表详情
      */
     @RequestMapping("/detilList")
     @ResponseBody
@@ -145,12 +145,23 @@ public class Mall2PointsRulesController {
         //查询列表数据
         Query query = new Query(params);
 
-        List<Mall2PointsRulesEntity> mall2PointsRulesList = mall2PointsRulesService.queryDetilList(query);
-        int total = mall2PointsRulesService.queryDetilTotal(query);
+        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());
 
         return R.ok().put("page", pageUtil);
     }
 
+    /**
+     * 删除列表详情
+     */
+    @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);
 }

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

@@ -2,7 +2,9 @@ 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;
 
@@ -106,4 +108,12 @@ public interface ProductStoreRelaDao extends BaseDao<ProductStoreRelaEntity> {
     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);
 }

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

@@ -2,6 +2,7 @@ package com.kmall.admin.dao;
 
 import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import org.apache.ibatis.annotations.Param;
 import com.kmall.manager.dao.BaseDao;
 
@@ -25,4 +26,12 @@ public interface StoreDao extends BaseDao<StoreEntity> {
     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);
 }

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

@@ -17,5 +17,5 @@ import java.util.Map;
 public interface Mall2PointsRulesDao extends BaseDao<Mall2PointsRulesEntity> {
 
 
-    Integer queryRulesDetilId(Integer mkaId);
+    Integer queryRulesDetilId(Long mkaId);
 }

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

@@ -12,10 +12,10 @@ public class Mall2RulesDto {
     private String pointsRulesName;
     //门店ID,商品ID,商品分类ID
     private Long rulesId;
-    //商品料件号
-    private String goodsSku;
+    //商品门店名称
+    private String storeName;
     //条码
-    private String barcode;
-    //备注
-    private String remark;
+//    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;
+    }
 }

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

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

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

@@ -0,0 +1,117 @@
+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 java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 海控电商系统调用
+ * @author
+ * @createDate 2021-10-28
+ */
+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);
+//
+//        System.out.println(s);
+//    }
+
+}

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

+ 77 - 34
kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java

@@ -1,14 +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.ProductStoreRelaEntity;
-import com.kmall.admin.entity.StoreEntity;
+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;
 
@@ -31,6 +32,9 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
     private StoreDao storeDao;
     @Autowired
     private ProductStoreRelaDao productStoreRelaDao;
+    @Autowired
+    private CategoryDao categoryDao;
+
 
     @Override
     public Mall2PointsRulesEntity queryObject(Integer mprId) {
@@ -74,32 +78,39 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
      * @param mkaId
      */
     @Override
-    public void rulesUploadDetil(List<Mall2RulesDto> pointsRulesList, Integer mkaId) {
+    public void rulesUploadDetil(List<Mall2RulesDto> pointsRulesList, Long mkaId) {
         Integer pointsType = mall2PointsRulesDao.queryRulesDetilId(mkaId);
-        pointsRulesList.forEach(mall2RulesDto -> {
-            switch (pointsType) {
-                //门店
-                case 0:
-                   StoreEntity storeEntity = storeDao.queryObjectByName(mall2RulesDto.getPointsRulesName().trim());
-                   mall2RulesDto.setRulesId(storeEntity.getId());
-                   break;
-                //商品类别
-                case 1:
-
-                    break;
-                //商品
-                case 2:
-                    ProductStoreRelaEntity productStoreRelaEntity = productStoreRelaDao.getByStoreSnAndSku(mall2RulesDto.getPointsRulesName(),mall2RulesDto.getGoodsSku());
-                    mall2RulesDto.setRulesId(productStoreRelaEntity.getId());
-                    break;
-                default:
-                    break;
+        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);
             }
-        });
+        }
 
-        storeDao.updateObjectStore(pointsRulesList);
-
-        productStoreRelaDao.updateProductStoreRela(pointsRulesList);
     }
 
     /**
@@ -108,32 +119,64 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
      * @return
      */
     @Override
-    public List<Mall2PointsRulesEntity> queryDetilList(Query query) {
-        Integer id = (Integer) query.get("mkaId");
+    public Map<String,Object> queryDetilList(Query query) {
+        Long id = Long.parseLong(query.get("mkaId")+"");
         Integer pointsType = mall2PointsRulesDao.queryRulesDetilId(id);
-            switch (pointsType) {
+        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 null;
+                return map;
+
     }
 
     /**
-     * 查询积分明细总数
-     * @param query
-     * @return
+     * 积分明细删除
+     * @param mprIds
+     * @param typeId
      */
     @Override
-    public int queryDetilTotal(Query query) {
-        return 0;
+    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;
+        }
     }
 }

+ 5 - 8
kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java

@@ -1,6 +1,7 @@
 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;
 
@@ -72,19 +73,15 @@ public interface Mall2PointsRulesService {
      */
     int deleteBatch(Integer[] mprIds);
 
-    void rulesUploadDetil(List<Mall2RulesDto> pointsRulesList, Integer mkaId);
+    void rulesUploadDetil(List<Mall2RulesDto> pointsRulesList, Long mkaId);
 
     /**
      * 查询积分明细数据
      * @param query
      * @return
      */
-    List<Mall2PointsRulesEntity> queryDetilList(Query query);
+    Map<String,Object> queryDetilList(Query query);
 
-    /**
-     * 查询积分明细总数
-     * @param query
-     * @return
-     */
-    int queryDetilTotal(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>

+ 44 - 9
kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml

@@ -922,16 +922,51 @@
         and p.sku = #{sku}
     </select>
 
-    <update id="updateProductStoreRela" parameterType="java.util.List">
-        <foreach collection="list" item="item" index="index" separator=";">
-            update mall_product_store_rela
-            <set>
-               points_rules_id = #{shopSn,jdbcType=VARCHAR}
-            </set>
-            where
-            store_id = #{shopSn,jdbcType=VARCHAR}
-            and sku = #{item.sku,jdbcType=VARCHAR}
+    <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>

+ 40 - 5
kmall-admin/src/main/resources/mybatis/mapper/StoreDao.xml

@@ -340,13 +340,48 @@
 		</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>
 
-	<update id="updateObjectStore" parameterType="java.util.List">
+	<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
-		<set>
-			<if test="mkaId != null">`points_rules_id` = #{mkaId}, </if>
-		</set>
-		where id = #{rulesId}
+		<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>

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

@@ -132,7 +132,7 @@
 		</foreach>
 	</delete>
 	
-	<select id="queryRulesDetilId" parameterType="java.lang.Integer" resultType="java.lang.Integer">
+	<select id="queryRulesDetilId" parameterType="java.lang.Long" resultType="java.lang.Integer">
        select points_type from mall2_points_rules where mpr_id=#{mkaId}
 	</select>
 

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

@@ -25,8 +25,8 @@ $(function () {
         datatype: "json",
         colModel: [
 			{label: 'Id', name: 'id', index: 'id', key: true, hidden: true},
-			{label: '积分规则类型', name: 'pointsRulesMoney', index: 'points_rules_money', width: 80, align: 'center'},
-			{label: '对应的商品/门店/类别名称', name: 'pointsRulesNum', index: 'points_rules_num', width: 80, align: 'center'},
+			{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},
@@ -129,7 +129,7 @@ let vm = new Vue({
 			confirm('确定要删除选中的记录?', function () {
 				$.ajax({
 					type: "POST",
-				    url: "../mkactivitieshalfprice/delete",
+				    url: "../mall2pointsrules/deleteDetil/"+vm.mkaId,
 				    contentType: "application/json",
 				    data: JSON.stringify(mafrIds),
 				    success: function (r) {

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


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