浏览代码

Merge remote-tracking branch 'upsteam/master' into dev

# Conflicts:
#	kmall-admin/src/main/webapp/js/shop/offilineOrderList.js
zhh 3 年之前
父节点
当前提交
e4bc85839d
共有 50 个文件被更改,包括 2147 次插入283 次删除
  1. 0 1
      kmall-admin/src/main/java/com/kmall/admin/controller/AddressController.java
  2. 151 0
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/MkActivitiesScoreController.java
  3. 0 2
      kmall-admin/src/main/java/com/kmall/admin/controller/vip/Mall2PointsRulesController.java
  4. 3 0
      kmall-admin/src/main/java/com/kmall/admin/dao/AddressDao.java
  5. 1 1
      kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongMemberScoreChangeRecordDao.java
  6. 23 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesScoreDao.java
  7. 17 0
      kmall-admin/src/main/java/com/kmall/admin/dao/vip/Mall2PointsRulesDao.java
  8. 6 0
      kmall-admin/src/main/java/com/kmall/admin/dto/Mall2RulesDto.java
  9. 79 0
      kmall-admin/src/main/java/com/kmall/admin/dto/ScoreReductionDTO.java
  10. 37 0
      kmall-admin/src/main/java/com/kmall/admin/entity/AddressEntity.java
  11. 1 1
      kmall-admin/src/main/java/com/kmall/admin/entity/haikong/IntegralGoBackEntity.java
  12. 4 4
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/MkActivitiesEntity.java
  13. 219 0
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/MkActivitiesScoreEntity.java
  14. 42 27
      kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2PointsRulesEntity.java
  15. 59 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/constant/Constants.java
  16. 2 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java
  17. 5 3
      kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberScoreChangeResendTask.java
  18. 42 0
      kmall-admin/src/main/java/com/kmall/admin/haikong/vo/PointsRulesAndDetailVO.java
  19. 7 0
      kmall-admin/src/main/java/com/kmall/admin/service/AddressService.java
  20. 1 1
      kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongMemberScoreChangeRecordService.java
  21. 5 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/AddressServiceImpl.java
  22. 227 83
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  23. 1 1
      kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaiKongMemberScoreChangeRecordServiceImpl.java
  24. 151 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesScoreServiceImpl.java
  25. 23 36
      kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java
  26. 99 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesScoreService.java
  27. 9 0
      kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java
  28. 22 0
      kmall-admin/src/main/resources/XmlTemplate/ScoreReductionDTOList.xml
  29. 41 5
      kmall-admin/src/main/resources/mybatis/mapper/AddressDao.xml
  30. 1 1
      kmall-admin/src/main/resources/mybatis/mapper/StoreMngChangeDao.xml
  31. 9 2
      kmall-admin/src/main/resources/mybatis/mapper/haikong/HaiKongMemberScoreChangeRecordDao.xml
  32. 185 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesScoreDao.xml
  33. 68 16
      kmall-admin/src/main/resources/mybatis/mapper/vip/Mall2PointsRulesDao.xml
  34. 0 3
      kmall-admin/src/main/resources/spring/spring-context.xml
  35. 2 1
      kmall-admin/src/main/resources/spring/spring-mvc.xml
  36. 1 0
      kmall-admin/src/main/resources/spring/spring-shiro.xml
  37. 89 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesscore.html
  38. 64 11
      kmall-admin/src/main/webapp/WEB-INF/page/shop/address.html
  39. 17 2
      kmall-admin/src/main/webapp/js/mk/mall2RulesDetil.js
  40. 214 0
      kmall-admin/src/main/webapp/js/mk/mkactivitiesscore.js
  41. 7 1
      kmall-admin/src/main/webapp/js/mk/mkactivityform.js
  42. 4 15
      kmall-admin/src/main/webapp/js/sale/sale.js
  43. 151 65
      kmall-admin/src/main/webapp/js/shop/address.js
  44. 13 0
      kmall-admin/src/main/webapp/js/shop/offilineOrderList.js
  45. 0 1
      kmall-admin/src/main/webapp/js/vip/mall2pointsrules.js
  46. 二进制
      kmall-admin/src/main/webapp/statics/file/activities_score_yyyy_mm_dd_v1.0.0.xlsx
  47. 32 0
      kmall-common/src/main/java/com/kmall/common/constant/Dict.java
  48. 2 0
      kmall-common/src/main/java/com/kmall/common/constant/JxlsXmlTemplateName.java
  49. 10 0
      kmall-common/src/main/java/com/kmall/common/utils/print/ticket/item/TicketHead.java
  50. 1 0
      kmall-manager/src/main/resources/conf/redis.properties

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

@@ -63,7 +63,6 @@ public class AddressController {
     @RequiresPermissions("address:save")
     public R save(@RequestBody AddressEntity address) {
         addressService.save(address);
-
         return R.ok();
     }
 

+ 151 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/mk/MkActivitiesScoreController.java

@@ -0,0 +1,151 @@
+package com.kmall.admin.controller.mk;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.dto.FullReductionDto;
+import com.kmall.admin.dto.ScoreReductionDTO;
+import com.kmall.admin.entity.mk.MkActivitiesScoreEntity;
+import com.kmall.admin.service.mk.MkActivitiesScoreService;
+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 com.kmall.common.utils.excel.ExcelUtil;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * 营销方式-积分抵扣Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-02 16:06:26
+ */
+@Controller
+@RequestMapping("mkactivitiesscore")
+public class MkActivitiesScoreController {
+    @Autowired
+    private MkActivitiesScoreService mkActivitiesScoreService;
+    @Autowired
+    private ExcelUtil excelUtil;
+
+    private final static Logger log = LoggerFactory.getLogger(MkActivitiesScoreController.class);
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+//    @RequiresPermissions("mkactivitiesscore:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<MkActivitiesScoreEntity> mkActivitiesScoreList = mkActivitiesScoreService.queryList(query);
+        int total = mkActivitiesScoreService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(mkActivitiesScoreList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+//    @RequiresPermissions("mkactivitiesscore:info")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        MkActivitiesScoreEntity mkActivitiesScore = mkActivitiesScoreService.queryObject(id);
+
+        return R.ok().put("mkActivitiesScore", mkActivitiesScore);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+//    @RequiresPermissions("mkactivitiesscore:save")
+    @ResponseBody
+    public R save(@RequestBody MkActivitiesScoreEntity mkActivitiesScore) {
+        mkActivitiesScoreService.save(mkActivitiesScore);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+//    @RequiresPermissions("mkactivitiesscore:update")
+    @ResponseBody
+    public R update(@RequestBody MkActivitiesScoreEntity mkActivitiesScore) {
+        mkActivitiesScoreService.update(mkActivitiesScore);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+//    @RequiresPermissions("mkactivitiesscore:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        mkActivitiesScoreService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<MkActivitiesScoreEntity> list = mkActivitiesScoreService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 导入excel
+     */
+    @PostMapping("/upload")
+    @ResponseBody
+    public R storeUpload(@RequestParam("file") MultipartFile file, String storeId, String mkaId) {
+        List<ScoreReductionDTO> scoreReductionDTOList = new ArrayList<>();//信息
+        try {
+
+            ScoreReductionDTO scoreReductionDTO= new ScoreReductionDTO();
+            Map<String, Object> beans = new HashMap<String, Object>();
+            beans.put("ScoreReductionDTO", scoreReductionDTO);
+            beans.put("ScoreReductionDTOList", scoreReductionDTOList);
+            if (file.isEmpty()) {
+                return R.error("文件不能为空!");
+            }
+            excelUtil.readExcel(JxlsXmlTemplateName.SCORE_REDUCTION_DTO_LIST, beans, file.getInputStream());
+        } catch (Exception e) {
+            log.error("导入积分抵扣商品详情失败:", e);
+            return R.error("导入失败!");
+        }
+        try {
+            mkActivitiesScoreService.uploadExcel(scoreReductionDTOList,storeId,mkaId);
+        } catch (RuntimeException e){
+            log.error("积分抵扣商品详情导入数据写入表失败:", e);
+            return R.error(e.getMessage());
+        }
+        //上传文件
+        return R.ok("导入成功!");
+    }
+}

+ 0 - 2
kmall-admin/src/main/java/com/kmall/admin/controller/vip/Mall2PointsRulesController.java

@@ -130,8 +130,6 @@ public class Mall2PointsRulesController {
     @RequestMapping("/queryAll")
     @ResponseBody
     public R queryRulesDetilAll(@RequestParam Map<String, Object> params) {
-
-
         return R.ok().put("list", null);
     }
 

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

@@ -2,6 +2,7 @@ package com.kmall.admin.dao;
 
 import com.kmall.admin.entity.AddressEntity;
 import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * Dao
@@ -12,4 +13,6 @@ import com.kmall.manager.dao.BaseDao;
  */
 public interface AddressDao extends BaseDao<AddressEntity> {
 
+    AddressEntity queryStoreAddress(@Param("id") Long id,@Param("type") String type);
+
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/dao/haikong/HaiKongMemberScoreChangeRecordDao.java

@@ -29,7 +29,7 @@ public interface HaiKongMemberScoreChangeRecordDao {
 
     void deleteBatchByOutBizNo(List<String> outBizNos);
 
-    IntegralGoBackEntity queryIntegralGoBack(String orderSn);
+    List<IntegralGoBackEntity> queryIntegralGoBack(@Param("orderSn") String orderSn);
 
 
     List<HaiKongMemberScoreChangeRecordEntity> queryListByResendStatus();

+ 23 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/MkActivitiesScoreDao.java

@@ -0,0 +1,23 @@
+package com.kmall.admin.dao.mk;
+
+
+import com.kmall.admin.entity.mk.MkActivitiesScoreEntity;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+
+/**
+ * 营销方式-积分抵扣Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-02 16:06:26
+ */
+public interface MkActivitiesScoreDao extends BaseDao<MkActivitiesScoreEntity> {
+
+    MkActivitiesScoreEntity queryEntityByProdBarcodeAndSkuAndStoreIdAndTime(@Param("prodBarcode") String prodBarcode,
+                                                                            @Param("sku") String sku,
+                                                                            @Param("storeId") Integer storeId,
+                                                                            @Param("nowTime") Date nowTime);
+}

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

@@ -1,9 +1,12 @@
 package com.kmall.admin.dao.vip;
 
 import com.kmall.admin.dto.Mall2RulesDto;
+import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
+import com.kmall.admin.haikong.vo.PointsRulesAndDetailVO;
 import com.kmall.manager.dao.BaseDao;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -18,4 +21,18 @@ public interface Mall2PointsRulesDao extends BaseDao<Mall2PointsRulesEntity> {
 
 
     Integer queryRulesDetilId(Long mkaId);
+
+    /**
+     * 查询当前时间的积分规则
+     *
+     * @param nowTime 当前时间
+     * @return 积分生成规则
+     */
+    List<PointsRulesAndDetailVO> queryListByTime(Date nowTime);
+
+    void saveMall2PointsRulesDetil(List<Mall2RulesDto> pointsRulesList);
+
+    List<Mall2RulesDto> querymall2PointsRulesDetil(Long id);
+
+    int querymall2PointsRulesDetilTotal(Long id);
 }

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

@@ -5,15 +5,21 @@ import lombok.Data;
 @Data
 public class Mall2RulesDto {
 
+    private Integer id;
+    //父类ID
     private Long mkaId;
     //积分类型
     private String rulesType;
     //积分生成规则Name(门店,商品类别,商品)
     private String pointsRulesName;
+    //积分生成规则分类id(门店,商品类别,商品)
+    private Integer pointsRulesType;
     //门店ID,商品ID,商品分类ID
     private Long rulesId;
     //商品门店名称
     private String storeName;
+    //当导入商品时,对应的商品门店ID
+    private Long storeId;
     //条码
 //    private String barcode;
 //    //备注

+ 79 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/ScoreReductionDTO.java

@@ -0,0 +1,79 @@
+package com.kmall.admin.dto;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 积分抵扣导入字段
+ * @author lhm
+ * @createDate 2021-12-02
+ */
+public class ScoreReductionDTO implements Serializable {
+
+    private static final long serialVersionUID = 635463165464L;
+
+    private String prodBarcode;
+    private String sku;
+    private Integer storeId;
+    private BigDecimal scoreLimit;
+    private Date deadline;
+    private String deadlineStr;
+    private String reject;
+
+    public String getProdBarcode() {
+        return prodBarcode;
+    }
+
+    public void setProdBarcode(String prodBarcode) {
+        this.prodBarcode = prodBarcode;
+    }
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public Integer getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    public BigDecimal getScoreLimit() {
+        return scoreLimit;
+    }
+
+    public void setScoreLimit(BigDecimal scoreLimit) {
+        this.scoreLimit = scoreLimit;
+    }
+
+    public Date getDeadline() {
+        return deadline;
+    }
+
+    public void setDeadline(Date deadline) {
+        this.deadline = deadline;
+    }
+
+    public String getDeadlineStr() {
+        return deadlineStr;
+    }
+
+    public void setDeadlineStr(String deadlineStr) {
+        this.deadlineStr = deadlineStr;
+    }
+
+    public String getReject() {
+        return reject;
+    }
+
+    public void setReject(String reject) {
+        this.reject = reject;
+    }
+}

+ 37 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/AddressEntity.java

@@ -53,6 +53,19 @@ public class AddressEntity implements Serializable {
     private String detailInfo;
 
     private Integer isDefault;
+    /**
+     *发货收货人地址类型
+     */
+    private String addressType;
+    /**
+     * 所属门店
+     */
+    private String addressStore;
+    /**
+     * 所属门店
+     */
+    private String storeName;
+
 
     /**
      * 翻译会员名
@@ -214,4 +227,28 @@ public class AddressEntity implements Serializable {
     public void setIsDefault(Integer isDefault) {
         this.isDefault = isDefault;
     }
+
+    public String getAddressType() {
+        return addressType;
+    }
+
+    public void setAddressType(String addressType) {
+        this.addressType = addressType;
+    }
+
+    public String getAddressStore() {
+        return addressStore;
+    }
+
+    public void setAddressStore(String addressStore) {
+        this.addressStore = addressStore;
+    }
+
+    public String getStoreName() {
+        return storeName;
+    }
+
+    public void setStoreName(String storeName) {
+        this.storeName = storeName;
+    }
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/haikong/IntegralGoBackEntity.java

@@ -22,7 +22,7 @@ public class IntegralGoBackEntity implements Serializable {
     /**
      * 回退积分数量
      */
-    private String rollback_score;
+    private Integer rollback_score;
     /**
      * 渠道自定义积分变动唯一标识,用于平台幂等性保证
      */

+ 4 - 4
kmall-admin/src/main/java/com/kmall/admin/entity/mk/MkActivitiesEntity.java

@@ -11,7 +11,7 @@ import java.util.Date;
  * @email admin@qhdswl.com
  * @date 2020-09-22 10:16:14
  */
-public class MkActivitiesEntity implements Serializable, Comparable {
+public class MkActivitiesEntity implements Serializable, Comparable<MkActivitiesEntity> {
     private static final long serialVersionUID = 1L;
 
     /**
@@ -99,7 +99,7 @@ public class MkActivitiesEntity implements Serializable, Comparable {
     private String storeName;
 
     /**
-     * 优先级
+     * 优先级,数字越小,优先级越高
      */
     private Integer priority;
 
@@ -349,8 +349,8 @@ public class MkActivitiesEntity implements Serializable, Comparable {
      * @return  结果
      */
     @Override
-    public int compareTo(Object o) {
-        if (this.getPriority() > ((MkActivitiesEntity) o).getPriority()) {
+    public int compareTo(MkActivitiesEntity o) {
+        if (this.getPriority() > o.getPriority()) {
             return 1;
         } else {
             return -1;

+ 219 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/mk/MkActivitiesScoreEntity.java

@@ -0,0 +1,219 @@
+package com.kmall.admin.entity.mk;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 营销方式-积分抵扣实体
+ * 表名 mk_activities_score
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-02 16:06:26
+ */
+public class MkActivitiesScoreEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Integer id;
+    /**
+     * 商品条码
+     */
+    private String prodBarcode;
+    /**
+     * sku
+     */
+    private String sku;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 抵扣比例
+     */
+    private BigDecimal scoreLimit;
+    /**
+     * 营销活动编号
+     */
+    private Long mkaId;
+    /**
+     * 截止日期
+     */
+    private Date deadline;
+    /**
+     * 是否参与,0:参与 1:不参与
+     */
+    private String reject;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+    /**
+     * 设置:
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:商品条码
+     */
+    public void setProdBarcode(String prodBarcode) {
+        this.prodBarcode = prodBarcode;
+    }
+
+    /**
+     * 获取:商品条码
+     */
+    public String getProdBarcode() {
+        return prodBarcode;
+    }
+    /**
+     * 设置:sku
+     */
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    /**
+     * 获取:sku
+     */
+    public String getSku() {
+        return sku;
+    }
+    /**
+     * 设置:门店id
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店id
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:抵扣比例
+     */
+    public void setScoreLimit(BigDecimal scoreLimit) {
+        this.scoreLimit = scoreLimit;
+    }
+
+    /**
+     * 获取:抵扣比例
+     */
+    public BigDecimal getScoreLimit() {
+        return scoreLimit;
+    }
+    /**
+     * 设置:营销活动编号
+     */
+    public void setMkaId(Long mkaId) {
+        this.mkaId = mkaId;
+    }
+
+    /**
+     * 获取:营销活动编号
+     */
+    public Long getMkaId() {
+        return mkaId;
+    }
+    /**
+     * 设置:截止日期
+     */
+    public void setDeadline(Date deadline) {
+        this.deadline = deadline;
+    }
+
+    /**
+     * 获取:截止日期
+     */
+    public Date getDeadline() {
+        return deadline;
+    }
+
+    public String getReject() {
+        return reject;
+    }
+
+    public void setReject(String reject) {
+        this.reject = reject;
+    }
+
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+}

+ 42 - 27
kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2PointsRulesEntity.java

@@ -12,7 +12,7 @@ import java.util.Date;
  * @email admin@qhdswl.com
  * @date 2020-06-15 10:44:07
  */
-public class Mall2PointsRulesEntity implements Serializable {
+public class Mall2PointsRulesEntity implements Serializable, Comparable<Mall2PointsRulesEntity> {
     private static final long serialVersionUID = 1L;
 
     /**
@@ -20,7 +20,7 @@ public class Mall2PointsRulesEntity implements Serializable {
      */
     private Integer mprId;
     /**
-     * 积分类型 :0.门店 ,1.商品类别,2.门店商品'
+     * 积分类型 :0.门店 ,1.商品类别,2.门店商品',数字越大,优先级越高
      */
     private Integer pointsType;
     /**
@@ -63,14 +63,11 @@ public class Mall2PointsRulesEntity implements Serializable {
      * 备注
      */
     private String remark;
-    //积分金额
-    private BigDecimal pointsRulesMoney;
     //对应积分数
     private String pointsRulesNum;
-    //赠送积分
-    private String handselIntegral;
+
     //积分比例
-    private BigDecimal pointsProportion;
+    private BigDecimal ratio;
     /**
      * 设置:主键
      */
@@ -210,14 +207,6 @@ public class Mall2PointsRulesEntity implements Serializable {
         this.remark = remark;
     }
 
-    public BigDecimal getPointsRulesMoney() {
-        return pointsRulesMoney;
-    }
-
-    public void setPointsRulesMoney(BigDecimal pointsRulesMoney) {
-        this.pointsRulesMoney = pointsRulesMoney;
-    }
-
     public String getPointsRulesNum() {
         return pointsRulesNum;
     }
@@ -226,27 +215,53 @@ public class Mall2PointsRulesEntity implements Serializable {
         this.pointsRulesNum = pointsRulesNum;
     }
 
-    public String getHandselIntegral() {
-        return handselIntegral;
+    public String getPointsTypeStr() {
+        return pointsTypeStr;
     }
 
-    public void setHandselIntegral(String handselIntegral) {
-        this.handselIntegral = handselIntegral;
+    public void setPointsTypeStr(String pointsTypeStr) {
+        this.pointsTypeStr = pointsTypeStr;
     }
 
-    public BigDecimal getPointsProportion() {
-        return pointsProportion;
+    public BigDecimal getRatio() {
+        return ratio;
     }
 
-    public void setPointsProportion(BigDecimal pointsProportion) {
-        this.pointsProportion = pointsProportion;
+    public void setRatio(BigDecimal ratio) {
+        this.ratio = ratio;
     }
 
-    public String getPointsTypeStr() {
-        return pointsTypeStr;
+    /**
+     * 排序用
+     * @param o 传进来的对象
+     * @return  结果
+     */
+    @Override
+    public int compareTo(Mall2PointsRulesEntity o) {
+        if (this.getPointsType() < o.getPointsType()) {
+            return 1;
+        } else {
+            return -1;
+        }
     }
 
-    public void setPointsTypeStr(String pointsTypeStr) {
-        this.pointsTypeStr = pointsTypeStr;
+    @Override
+    public String toString() {
+        return "Mall2PointsRulesEntity{" +
+                "mprId=" + mprId +
+                ", pointsType=" + pointsType +
+                ", pointsTypeStr='" + pointsTypeStr + '\'' +
+                ", pointsBeginTime=" + pointsBeginTime +
+                ", pointsEndTime=" + pointsEndTime +
+                ", isValid='" + isValid + '\'' +
+                ", createrSn='" + createrSn + '\'' +
+                ", createTime=" + createTime +
+                ", moderSn='" + moderSn + '\'' +
+                ", modTime=" + modTime +
+                ", tstm=" + tstm +
+                ", remark='" + remark + '\'' +
+                ", pointsRulesNum='" + pointsRulesNum + '\'' +
+                ", ratio=" + ratio +
+                '}';
     }
 }

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

@@ -102,4 +102,63 @@ public class Constants {
         }
     }
 
+    /**
+     * 参与了限时特价的商品是否参与积分抵扣
+     */
+    public enum PromotionActivityRejectEnum {
+        /**
+         * 允许参加积分抵扣
+         */
+        ALLOW("0", "不互斥"),
+        /**
+         * 不允许参加积分抵扣
+         */
+        REJECT("1", "互斥"),
+        ;
+
+        private final String code;
+
+        private final String desc;
+
+        PromotionActivityRejectEnum(String code, String desc) {
+            this.code = code;
+            this.desc = desc;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    /**
+     * 会员积分生成规则类型
+     */
+    public enum MemberScoreRulesEnum{
+        ZERO(0, "门店"),
+        ONE(1, "商品分类"),
+        TWO(2, "商品")
+        ;
+
+        private final Integer code;
+
+        private final String type;
+
+        MemberScoreRulesEnum(Integer code, String type) {
+            this.code = code;
+            this.type = type;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+
+        public String getType() {
+            return type;
+        }
+    }
+
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberOrderSyncResendTask.java

@@ -20,6 +20,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -53,6 +54,7 @@ public class MemberOrderSyncResendTask {
             MemberOrderInfoSyncDTO memberOrderInfoSyncDTO = new MemberOrderInfoSyncDTO();
             BeanUtils.copyProperties(haiKongMemberOrderSyncResendEntity, memberOrderInfoSyncDTO);
             String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
+            haiKongMemberOrderSyncResendEntity.setLastResendTime(new Date());
             log.info("【重发】请求会员消费订单同步接口!请求体:{}", body);
             try {
                 String responseJson = haiKongMemberTemplate.changeMemberScore(body);

+ 5 - 3
kmall-admin/src/main/java/com/kmall/admin/haikong/task/MemberScoreChangeResendTask.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -39,7 +40,7 @@ public class MemberScoreChangeResendTask {
     private HaiKongMemberScoreChangeRecordService haiKongMemberScoreChangeRecordService;
 
     //    @Scheduled(cron = "0 55 0/2 * * ?")
-    @Scheduled(cron = "0/20 0/2 * * * ?")
+    //@Scheduled(cron = "0/20 0/2 * * * ?")
     public void resend() {
         // 查询等待发送和发送失败的记录
         List<HaiKongMemberScoreChangeRecordEntity> haiKongMemberScoreChangeRecordEntities = haiKongMemberScoreChangeRecordService.queryListByResendStatus();
@@ -52,12 +53,13 @@ public class MemberScoreChangeResendTask {
             MemberScoreChangeDTO memberScoreChangeDTO = new MemberScoreChangeDTO();
             BeanUtils.copyProperties(haiKongMemberScoreChangeRecordEntity, memberScoreChangeDTO);
             String body = JacksonUtil.toJson(memberScoreChangeDTO);
+            haiKongMemberScoreChangeRecordEntity.setModifyTime(new Date());
             log.info("【重发】请求会员系统积分变动接口!请求体:{}", body);
             try {
                 String responseJson = haiKongMemberTemplate.changeMemberScore(body);
-                Response<MemberScoreChangeResponseDTO> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<MemberScoreChangeResponseDTO>>() {});
+                Response<String> response = JacksonUtil.fromListJson(responseJson, new TypeReference<Response<String>>() {});
                 if (Objects.nonNull(response) && response.getSuccess()) {
-                    MemberScoreChangeResponseDTO responseData = response.getData();
+                    MemberScoreChangeResponseDTO responseData = JacksonUtil.fromStringJson(response.getData(), MemberScoreChangeResponseDTO.class);
                     haiKongMemberScoreChangeRecordEntity.setStatementId(responseData.getStatementId());
                     haiKongMemberScoreChangeRecordEntity.setResendStatus(HaiKongMemberOrderResendStatusEnum.RESEND_SUCCESS.getStatus());
                     successList.add(haiKongMemberScoreChangeRecordEntity);

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

@@ -0,0 +1,42 @@
+package com.kmall.admin.haikong.vo;
+
+import com.kmall.admin.dto.Mall2RulesDto;
+import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
+
+import java.util.List;
+
+/**
+ * 积分生成规则及其明细
+ * @author lhm
+ * @createDate 2021-12-03
+ */
+public class PointsRulesAndDetailVO {
+
+    private Mall2PointsRulesEntity mall2PointsRulesEntity;
+
+    private List<Mall2RulesDto> mall2PointsRulesDetailList;
+
+    public Mall2PointsRulesEntity getMall2PointsRulesEntity() {
+        return mall2PointsRulesEntity;
+    }
+
+    public void setMall2PointsRulesEntity(Mall2PointsRulesEntity mall2PointsRulesEntity) {
+        this.mall2PointsRulesEntity = mall2PointsRulesEntity;
+    }
+
+    public List<Mall2RulesDto> getMall2PointsRulesDetailList() {
+        return mall2PointsRulesDetailList;
+    }
+
+    public void setMall2PointsRulesDetailList(List<Mall2RulesDto> mall2PointsRulesDetailList) {
+        this.mall2PointsRulesDetailList = mall2PointsRulesDetailList;
+    }
+
+    @Override
+    public String toString() {
+        return "PointsRulesAndDetailVO{" +
+                "mall2PointsRulesEntity=" + mall2PointsRulesEntity +
+                ", mall2PointsRulesDetailList=" + mall2PointsRulesDetailList +
+                '}';
+    }
+}

+ 7 - 0
kmall-admin/src/main/java/com/kmall/admin/service/AddressService.java

@@ -69,4 +69,11 @@ public interface AddressService {
      * @return 删除条数
      */
     int deleteBatch(Integer[] ids);
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    AddressEntity queryStoreAddress(Long id,String type);
 }

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/service/haikong/HaiKongMemberScoreChangeRecordService.java

@@ -28,7 +28,7 @@ public interface HaiKongMemberScoreChangeRecordService {
 
     void deleteBatchByOutBizNo(List<String> outBizNos);
 
-    IntegralGoBackEntity queryIntegralGoBack(String orderSn);
+    List<IntegralGoBackEntity> queryIntegralGoBack(String orderSn);
 
     List<HaiKongMemberScoreChangeRecordEntity> queryListByResendStatus();
 

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

@@ -62,4 +62,9 @@ public class AddressServiceImpl implements AddressService {
     public int deleteBatch(Integer[] ids) {
         return addressDao.deleteBatch(ids);
     }
+
+    @Override
+    public AddressEntity queryStoreAddress(Long id,String type) {
+        return addressDao.queryStoreAddress(id,type);
+    }
 }

+ 227 - 83
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -8,10 +8,8 @@ import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.Maps;
 import com.google.gson.Gson;
 import com.google.gson.internal.LinkedTreeMap;
-import com.kmall.admin.biz.CustomsClearanceTimeliness;
 import com.kmall.admin.dao.*;
 import com.kmall.admin.dao.alarm.Mall2LowPriceWarningDao;
-import com.kmall.admin.dao.haikong.HaiKongMemberScoreChangeRecordDao;
 import com.kmall.admin.dao.mk.Mk2GoodsTopicPriceDao;
 import com.kmall.admin.dao.mk.Mk2MemberBirthdayDao;
 import com.kmall.admin.dao.mk.store.MkStorePromOrderRealDao;
@@ -37,6 +35,7 @@ import com.kmall.admin.haikong.constant.*;
 import com.kmall.admin.haikong.dto.*;
 import com.kmall.admin.haikong.utils.ListUtils;
 import com.kmall.admin.haikong.vo.CalculateOrderDiscountPriceResponseVO;
+import com.kmall.admin.haikong.vo.PointsRulesAndDetailVO;
 import com.kmall.admin.haikong.vo.QueryGoodsVO;
 import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
 import com.kmall.admin.haikong.client.HaiKongWarehouseTemplate;
@@ -46,11 +45,11 @@ import com.kmall.admin.haikong.utils.Response;
 import com.kmall.admin.service.*;
 import com.kmall.admin.service.haikong.HaiKongMemberOrderSyncResendService;
 import com.kmall.admin.service.haikong.HaiKongMemberScoreChangeRecordService;
-import com.kmall.admin.service.kmall2eccs.KtoEccsService;
 import com.kmall.admin.service.mk.MkActivitiesService;
 import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
 import com.kmall.admin.service.mk.store.MkStoreTicketDiscountService;
 import com.kmall.admin.service.record.NewRetailOrderRestoreStockRecordService;
+import com.kmall.admin.service.vip.Mall2PointsRulesService;
 import com.kmall.admin.utils.CalculateTax;
 import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.admin.utils.data.response.ResponseMessage;
@@ -96,7 +95,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.awt.image.LookupOp;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -194,6 +192,8 @@ public class OrderServiceImpl implements OrderService {
     @Autowired
     private Mall2PointsRulesDao pointsRulesDao; // 积分规则
     @Autowired
+    private Mall2PointsRulesService mall2PointsRulesService;
+    @Autowired
     private Mall2MemberPointsDao memberPointsDao; // 用户积分
     @Autowired
     private Mall2MemberConsumptionRecordsDao memberConsumptionRecordsDao; // 会员消费记录
@@ -264,13 +264,18 @@ public class OrderServiceImpl implements OrderService {
      */
     @Autowired
     private HaiKongMemberScoreChangeRecordService haiKongMemberScoreChangeRecordService;
-
     /**
      * 接口重发信息
      */
     @Autowired
     private HaiKongResendMsgDao haiKongResendMsgDao;
 
+    /**
+     * 获取发货、收货人地址
+     */
+    @Autowired
+    private AddressDao addressDao;
+
     @Override
     public OrderEntity queryObject(Long id) {
         return orderDao.queryObject(id);
@@ -485,6 +490,8 @@ public class OrderServiceImpl implements OrderService {
         // 小票头
         TicketHead head = new TicketHead();
         head.setTitle(storeEntity.getStoreName());
+        //门店地址
+        head.setStoreAddress(storeEntity.getStoreAddress());
         //        head.setMemberId(orderEntity.getUserName().toString());
         head.setOrderId(orderEntity.getOrderSn());
         head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(orderEntity.getPayTime()));
@@ -585,15 +592,15 @@ public class OrderServiceImpl implements OrderService {
             }
             mailInfo.setExprLogoUrl(logoUrl);
         }
-        mailInfo.setShopTel(storeEntity.getTelephoneNumber()==null?"0752-2688660":storeEntity.getTelephoneNumber().trim());
-
+        mailInfo.setShopTel(storeEntity.getTelephoneNumber());
+        AddressEntity addressEntity = addressDao.queryStoreAddress(storeEntity.getId(),Dict.addressStatus.item_1.getItem());
         // 发货人
-        mailInfo.setSenderTel("0752-2688660");
-        mailInfo.setSenderName("CW澳洲大药房");
-        mailInfo.setSenderProvince("广东省");
-        mailInfo.setSenderCity("深圳市");
-        mailInfo.setSenderDistrict("南山区");
-        mailInfo.setSenderAddress("前海综合保税区W104");
+        mailInfo.setSenderTel(addressEntity.getTelNumber());
+        mailInfo.setSenderName("CW澳洲大药房1");
+        mailInfo.setSenderProvince(addressEntity.getProvinceName());
+        mailInfo.setSenderCity(addressEntity.getCityName());
+        mailInfo.setSenderDistrict(addressEntity.getCountyName());
+        mailInfo.setSenderAddress(addressEntity.getDetailInfo());
 
         // 收货人
         mailInfo.setConsigneeMob(new StringBuilder(orderEntity.getMobile()).replace(3, 7, "****").toString());
@@ -2495,8 +2502,8 @@ public class OrderServiceImpl implements OrderService {
                 if (stockMap.containsKey(sku)) {
                     // 当前出区数
                     Integer exitRegionNumber = goodsDto.getExitRegionNumber();
-                    // 保税仓库存 + 门店库存 - 出区数 >= 购买数
-                    if (!((warehouseStock + stockNum) - exitRegionNumber >= sellVolume)) {
+                    // 保税仓库存 + 门店库存 - 出区数 > 购买数
+                    if (!((warehouseStock + stockNum) - exitRegionNumber > sellVolume)) {
                         // 库存不足
                         LOGGER.error("sku:【{}】库存不足,门店可用库存:【{}】,仓库可用库存:【{}】,购买数量:【{}】", sku, stockNum, warehouseStock, sellVolume);
                         throw new ServiceException(String.format("sku:【%s】库存不足,门店可用库存:【%s】,仓库可用库存:【%s】,购买数量:【%s】", sku, stockNum, warehouseStock, sellVolume));
@@ -2738,20 +2745,87 @@ public class OrderServiceImpl implements OrderService {
                 saleRecordDao.save(saleRecordEntity);
             }
 
-            // TODO 查询积分规则,根据积分生成规则进行增加会员积分
-            Mall2PointsRulesEntity pointsRules = null;
+            // 查询当前时间积分规则以及明细,根据积分生成规则进行增加会员积分
+            Integer userEntityId = userEntity.getId();
+            // 总的积分:基础积分
+            AtomicReference<Integer> memberScore = new AtomicReference<>(0);
+            List<PointsRulesAndDetailVO> pointsRulesAndDetailVOList = mall2PointsRulesService.queryListByTime(new Date()).stream().sorted().collect(Collectors.toList());
+            // 商品map,key===>sku value===>金额
+            Map<String, BigDecimal> goodsMap = goodsEntities.stream().collect(Collectors.toMap(GoodsEntity::getSku, GoodsEntity::getActualPaymentAmount, (k1, k2) -> k2));
+            // 订单全部的sku
+            Set<String> goodsSkuList = goodsMap.keySet();
+            // 保存不在按商品计算积分的sku
+            List<String> nonGoodsSkuList = new ArrayList<>();
+            // 保存不在按分类计算积分的sku,剩下的就按门店计算,如果门店积分规则没有设置。。。。
+            List<String> nonCategorySkuList = new ArrayList<>();
+            pointsRulesAndDetailVOList.forEach(pointsRulesAndDetailVO -> {
+                Mall2PointsRulesEntity mall2PointsRulesEntity = pointsRulesAndDetailVO.getMall2PointsRulesEntity();
+                List<Mall2RulesDto> mall2PointsRulesDetailList = pointsRulesAndDetailVO.getMall2PointsRulesDetailList();
+                List<String> skuList = mall2PointsRulesDetailList.stream().map(Mall2RulesDto::getPointsRulesName).collect(Collectors.toList());
+                Integer pointsType = mall2PointsRulesEntity.getPointsType();
+                // 积分比例
+                BigDecimal ratio = mall2PointsRulesEntity.getRatio();
+                if (pointsType.equals(Constants.MemberScoreRulesEnum.TWO.getCode())) {
+                    // 商品,优先级最高,查询
+                    goodsSkuList.forEach(sku -> {
+                        if (skuList.contains(sku)) {
+                            // 商品积分生成规则包含这个sku
+                            // 订单中该sku的总金额
+                            BigDecimal money = goodsMap.get(sku);
+                            if (ratio.compareTo(BigDecimal.ZERO) != 0) {
+                                // 算出所积的分
+                                memberScore.set(money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue());
+                            } else {
+                                // 积分比例设置为0,该商品不记积分。
+                                LOGGER.info("商品SKU:【{}】,积分生成规则设置积分比例为:{},故不产生积分!", sku, ratio);
+                            }
+                        } else {
+                            // 不包含sku,则需要判断是否有其他规则
+                            nonGoodsSkuList.add(sku);
+                        }
+                    });
 
+                }
+                if (pointsType.equals(Constants.MemberScoreRulesEnum.ONE.getCode())) {
+                    // 商品类别
+                    nonGoodsSkuList.forEach(sku -> {
+                        if (nonGoodsSkuList.contains(sku)) {
+                            // 订单中该sku的总金额
+                            BigDecimal money = goodsMap.get(sku);
+                            if (ratio.compareTo(BigDecimal.ZERO) != 0) {
+                                // 算出所积的分
+                                memberScore.set(money.multiply(ratio).add(new BigDecimal(memberScore.get())).intValue());
+                            }
+                        } else {
+                            nonCategorySkuList.add(sku);
+                        }
+                    });
+                }
+                if (pointsType.equals(Constants.MemberScoreRulesEnum.ZERO.getCode())) {
+                    // 门店
+                    nonCategorySkuList.forEach(sku -> {
+                        if (nonCategorySkuList.contains(sku)) {
+                            // 订单中该sku的总金额
+                            BigDecimal money = goodsMap.get(sku);
+                            if (ratio.compareTo(BigDecimal.ZERO) != 0) {
+                                // 算出所积的分
+                                memberScore.set(money.multiply(ratio).multiply(new BigDecimal(memberScore.get())).intValue());
+                            }
+                        }
+                    });
+                }
+            });
             // 增加该会员的积分
-            Mall2MemberPointsEntity memberPointsEntity = memberPointsDao.queryByUserId(userEntity.getId());
+            Mall2MemberPointsEntity memberPointsEntity = memberPointsDao.queryByUserId(userEntityId);
             if (memberPointsEntity == null) {
                 memberPointsEntity = new Mall2MemberPointsEntity();
-                memberPointsEntity.setUserId(userEntity.getId() + "");
-                memberPointsEntity.setPoints(order.getActual_price().intValue());
+                memberPointsEntity.setUserId(userEntityId + "");
+                memberPointsEntity.setPoints(memberScore.get());
                 memberPointsEntity.setCreaterSn(userId + "");
                 memberPointsEntity.setCreateTime(new Date());
                 memberPointsDao.save(memberPointsEntity);
             } else {
-                memberPointsEntity.setPoints(order.getActual_price().add(new BigDecimal(memberPointsEntity.getPoints())).intValue());
+                memberPointsEntity.setPoints(memberScore.get() + memberPointsEntity.getPoints());
                 memberPointsEntity.setModerSn(userId + "");
                 memberPointsEntity.setModTime(new Date());
                 memberPointsDao.update(memberPointsEntity);
@@ -2776,10 +2850,9 @@ public class OrderServiceImpl implements OrderService {
             int deductionScore = org.springframework.util.StringUtils.isEmpty(deductionScoreStr) ? 0 : Integer.parseInt(deductionScoreStr);
             String memberPhone = String.valueOf(param.get("memberPhone"));
             BigDecimal scoreDeductionPrice = org.springframework.util.StringUtils.isEmpty(scoreDeductionPriceStr) ? BigDecimal.ZERO : new BigDecimal(scoreDeductionPriceStr);
-            Integer beforeScore = beforeScoreInteger;
-            Integer afterScore = afterScoreStrInteger;
-            consumptionRecords.setBeforeScore(beforeScore);
-            consumptionRecords.setAfterScore(afterScore);
+            consumptionRecords.setBeforeScore(beforeScoreInteger);
+            consumptionRecords.setAfterScore(afterScoreStrInteger);
+            // TODO 需要新增字段:订单赠送积分
             consumptionRecords.setOrderTotalPrice(order.getActual_price());
             consumptionRecords.setScoreDeductionPrice(scoreDeductionPrice);
             consumptionRecords.setMemberCode(memberCode);
@@ -2795,12 +2868,12 @@ public class OrderServiceImpl implements OrderService {
             }
 
             // 积分变动接口,下单扣减
-            if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
+//            if (!org.springframework.util.StringUtils.isEmpty(memberCode)) {
                 syncMemberScoreChangeRecord(openId, order, deductionScore, "下单扣减", HaiKongMemberScoreChangeEventEnum.SUBTRACT.getEvent());
                 // 下单赠送,一元积一分
                 Integer score = order.getActual_price().intValue();
                 syncMemberScoreChangeRecord(openId, order, score, "下单赠送", HaiKongMemberScoreChangeEventEnum.ADD.getEvent());
-            }
+//            }
 
             // 生成取票码
             PickUpCodeEntity pickUpCodeEntity = new PickUpCodeEntity();
@@ -3038,6 +3111,9 @@ public class OrderServiceImpl implements OrderService {
         memberOrderInfoSyncDTO.setOrderAmount(order.getActual_price());
         memberOrderInfoSyncDTO.setOrderScore(deductionScore);
         BeanUtils.copyProperties(memberOrderInfoSyncDTO, haiKongMemberOrderSyncResendEntity);
+        Date date = new Date();
+        haiKongMemberOrderSyncResendEntity.setCreateTime(date);
+        haiKongMemberOrderSyncResendEntity.setLastResendTime(date);
         try {
             String body = JacksonUtil.toJson(memberOrderInfoSyncDTO);
             LOGGER.info("请求会员系统同步消费订单接口!请求体:{}", body);
@@ -3077,6 +3153,9 @@ public class OrderServiceImpl implements OrderService {
         memberScoreChangeDTO.setOutBizNo(order.getOrder_sn());
         memberScoreChangeDTO.setScore(score);
         BeanUtils.copyProperties(memberScoreChangeDTO, haiKongMemberScoreChangeRecordEntity);
+        Date date = new Date();
+        haiKongMemberScoreChangeRecordEntity.setCreateTime(date);
+        haiKongMemberScoreChangeRecordEntity.setModifyTime(date);
         try {
             String body = JacksonUtil.toJson(memberScoreChangeDTO);
             LOGGER.info("请求会员系统积分变动接口!请求体:{}", body);
@@ -3220,15 +3299,15 @@ public class OrderServiceImpl implements OrderService {
         if (orderInfo.getPayStatus() == Integer.parseInt(Dict.payStatus.item_3.getItem())) {
             return R.error("订单正在退款中,请勿重复退款");
         }
-        CountDownLatch cdl = new CountDownLatch(1);
-        service.submit(()-> {
-            try {
+//        CountDownLatch cdl = new CountDownLatch(1);
+//        service.submit(()-> {
+//            try {
                 orderDao.updateOrderRefunding(order.getId());
-            } finally {
-                cdl.countDown();
-            }
-        });
-        cdl.await();
+//            } finally {
+//                cdl.countDown();
+//            }
+//        });
+//        cdl.await();
 
         if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
             Double totalActualPrice = orderDao.getTotalActualPrice(orderInfo.getMerchOrderSn());
@@ -3237,8 +3316,8 @@ public class OrderServiceImpl implements OrderService {
             }
             if (orderInfo.getOrderStatus() != Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
                 LOGGER.info("[微信退款开始--------orderRefund]"+order.getOrderSn());
-                WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn(), totalActualPrice,
-                        orderInfo.getActualPrice().doubleValue());
+//                WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn(), totalActualPrice,
+//                        orderInfo.getActualPrice().doubleValue());
                 order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
                 order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
                 //修改为退款成功
@@ -3248,7 +3327,8 @@ public class OrderServiceImpl implements OrderService {
                 pickUpCodeEntity.setPickUpCodeStatus("3");
                 pickUpCodeService.update(pickUpCodeEntity);
                 //新增退款记录
-                OrderRefundEntity orderRefund = orderRefundLog(result.getRefund_id(),result.getOut_trade_no(),result.getRefund_fee(),order.getId(),user.getUserId(),order.getMerchOrderSn());
+                OrderRefundEntity orderRefund = orderRefundLog("wx453456511","wx453456566","26999",order.getId(),user.getUserId(),order.getMerchOrderSn());
+                //OrderRefundEntity orderRefund = orderRefundLog(result.getRefund_id(),result.getOut_trade_no(),result.getRefund_fee(),order.getId(),user.getUserId(),order.getMerchOrderSn());
                 orderRefundDao.save(orderRefund);
                 //还原库存,调用免税mall接口退款和积分回退接口
                 restoreInventoryMsMall(order);
@@ -3282,7 +3362,7 @@ public class OrderServiceImpl implements OrderService {
             //还原库存,调用免税mall接口退款和积分回退接口
             restoreInventoryMsMall(order);
         }
-        int ss = 1/0;
+        //int ss = 1/0;
         return R.ok("退款成功");
     }
 
@@ -3363,21 +3443,24 @@ public class OrderServiceImpl implements OrderService {
      * @throws Exception
      */
     private void vipIntegralGoBack(OrderEntity order) throws Exception{
-        IntegralGoBackEntity changeRecordEntity = haiKongMemberScoreChangeRecordService.queryIntegralGoBack(order.getOrderSn());
-        String responseMsg =  haiKongMemberTemplate.rollbackMemberScore(JSON.toJSONString(changeRecordEntity));
-        Map<String,Object> res = JSON.parseObject(responseMsg,Map.class);
-        if("true".equals(res.get("success"))){
-            LOGGER.info("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口数据]"+responseMsg);
-        }else{
-            LOGGER.error("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口异常数据]"+responseMsg);
-            HaiKongResendMsgEntity haiKongResendMsgEntity = new HaiKongResendMsgEntity();
-            haiKongResendMsgEntity.setOpenId(changeRecordEntity.getOpen_id());
-            haiKongResendMsgEntity.setOrderSn(order.getOrderSn());
-            haiKongResendMsgEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.ROLLBACK_MEMBER_SCORE.getUrl());
-            haiKongResendMsgEntity.setRequestMsg(JSON.toJSONString(changeRecordEntity));
-            haiKongResendMsgEntity.setResponseMsg(responseMsg);
-            haiKongResendMsgEntity.setIsValid(1);
-            haiKongResendMsgDao.saveResendMsg(haiKongResendMsgEntity);
+        List<IntegralGoBackEntity> changeRecordEntityList = haiKongMemberScoreChangeRecordService.queryIntegralGoBack(order.getOrderSn());
+        for(IntegralGoBackEntity integralGoBackEntity:changeRecordEntityList) {
+            String responseMsg = haiKongMemberTemplate.rollbackMemberScore(JSON.toJSONString(integralGoBackEntity));
+            Map<String, Object> res = JSON.parseObject(responseMsg, Map.class);
+            if ("true".equals(res.get("success"))) {
+                LOGGER.info("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口数据]" + responseMsg);
+            } else {
+                LOGGER.error("=======> [vipIntegralGoBack-----调用会员系统积分全量回退接口异常数据]" + responseMsg);
+                HaiKongResendMsgEntity haiKongResendMsgEntity = new HaiKongResendMsgEntity();
+                //haiKongResendMsgEntity.setOpenId(changeRecordEntity.getOpen_id());
+                haiKongResendMsgEntity.setOpenId(integralGoBackEntity.getOpen_id());
+                haiKongResendMsgEntity.setOrderSn(order.getOrderSn());
+                haiKongResendMsgEntity.setInterfaceType(HaiKongMemberSystemUrlEnum.ROLLBACK_MEMBER_SCORE.getUrl());
+                haiKongResendMsgEntity.setRequestMsg(JSON.toJSONString(integralGoBackEntity));
+                haiKongResendMsgEntity.setResponseMsg(responseMsg);
+                haiKongResendMsgEntity.setIsValid(1);
+                haiKongResendMsgDao.saveResendMsg(haiKongResendMsgEntity);
+            }
         }
     }
 
@@ -3843,6 +3926,8 @@ public class OrderServiceImpl implements OrderService {
             // 小票头
             TicketHead head = new TicketHead();
             head.setTitle(storeEntity.getStoreName());
+            //门店地址
+            head.setStoreAddress(storeEntity.getStoreAddress());
             //        head.setMemberId(orderEntity.getUserName().toString());
             head.setOrderId(orderEntity.getOrderSn());
             head.setTradeTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE").format(orderEntity.getPayTime()));
@@ -3936,15 +4021,16 @@ public class OrderServiceImpl implements OrderService {
             mailInfo.setExprLogoUrl(logoUrl);
             byte[] barCode128 = BarcodeUtil.generateBarCode128(exprNo, 6.0D, null, true, false);
             String exprNoBase64Img = new String(Base64.getEncoder().encode(barCode128));
-            mailInfo.setShopTel(storeEntity.getTelephoneNumber()==null?"0752-2688660":storeEntity.getTelephoneNumber().trim());
+            mailInfo.setShopTel(storeEntity.getTelephoneNumber());
 
+            AddressEntity addressEntity = addressDao.queryStoreAddress(storeEntity.getId(),Dict.addressStatus.item_1.getItem());
             // 发货人
-            mailInfo.setSenderTel("0752-26886602");
+            mailInfo.setSenderTel(addressEntity.getTelNumber());
             mailInfo.setSenderName("CW澳洲大药房");
-            mailInfo.setSenderProvince("广东省");
-            mailInfo.setSenderCity("深圳市");
-            mailInfo.setSenderDistrict("南山区");
-            mailInfo.setSenderAddress("前海综合保税区W104");
+            mailInfo.setSenderProvince(addressEntity.getProvinceName());
+            mailInfo.setSenderCity(addressEntity.getCityName());
+            mailInfo.setSenderDistrict(addressEntity.getCountyName());
+            mailInfo.setSenderAddress(addressEntity.getDetailInfo());
 
             // 收货人
             mailInfo.setConsigneeMob(new StringBuilder(orderEntity.getMobile()).replace(3, 7, "****").toString());
@@ -4010,7 +4096,7 @@ public class OrderServiceImpl implements OrderService {
         /*
          * 活动相关规则:
          * 1. 优先优惠券再去计算积分
-         * 2. 满赠的赠品商品在推送定时时零售价为0
+         * 2. 满赠的赠品商品在推送订单时零售价为0
          * 3. 任何活动都优先于积分计算
          * 4. 活动之间具有互斥性
          */
@@ -4033,6 +4119,9 @@ public class OrderServiceImpl implements OrderService {
         List<Integer> categoryIdList = goodsEntities.stream().map(GoodsEntity::getCategoryId).collect(Collectors.toList());
         // 活动互斥标识
         AtomicBoolean activityFlag = new AtomicBoolean(true);
+        // 限时特价活动标识
+        AtomicBoolean promotionActivityFlag = new AtomicBoolean(false);
+        List<String> promotionSkuList = new ArrayList<>();
         // 判断活动类型并排序,再确定购物栏中商品是否满足活动条件
         mkActivitiesEntityList.stream().sorted().forEach(mkActivitiesEntity -> {
             String mkaStoreId = mkActivitiesEntity.getMkaStoreId();
@@ -4056,6 +4145,11 @@ public class OrderServiceImpl implements OrderService {
                     String entityGoodsSn = mkActivitiesPromotionEntity.getSku();
                     BigDecimal activityPrice = mkActivitiesPromotionEntity.getActivityPrice();
                     String shopSn = mkActivitiesPromotionEntity.getShopSn();
+                    String rejectScore = mkActivitiesPromotionEntity.getRejectScore();
+                    // 如果与积分抵扣互斥的,记录sku
+                    if (!org.springframework.util.StringUtils.isEmpty(rejectScore) && Constants.PromotionActivityRejectEnum.REJECT.getCode().equals(rejectScore)) {
+                        promotionSkuList.add(entityGoodsSn);
+                    }
                     goodsEntities.forEach(goodsEntity -> {
                         String sku = goodsEntity.getSku();
                         String prodBarcode = goodsEntity.getProdBarcode();
@@ -4071,6 +4165,7 @@ public class OrderServiceImpl implements OrderService {
                             goodsDetailsDto.setDiscountedPrice(retailPrice.subtract(activityPrice));
                             goodsDetailsDtos.add(goodsDetailsDto);
                             activityFlag.set(false);
+                            promotionActivityFlag.set(true);
                         }
                     });
                 });
@@ -4301,7 +4396,7 @@ public class OrderServiceImpl implements OrderService {
                 Integer score = memberInfoDTO.getScore();
                 if (Objects.nonNull(score) && score > 0) {
                     // 有积分
-                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, storeId, memberCode, calculateOrderDiscountPriceResponseVO);
+                    afterDiscountPrice = calculatePreferentialPrice(orderTotalPrice, score, storeId, memberCode, calculateOrderDiscountPriceResponseVO, goodsDetailsDtos, promotionActivityFlag, promotionSkuList);
                     LOGGER.info("会员【{}】,当前积分:{},积分抵扣后的订单金额:{},积分抵扣前的订单金额:{}", memberCode, score, afterDiscountPrice, orderTotalPrice);
                     calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(afterDiscountPrice);
                     calculateOrderDiscountPriceResponseVO.setGoodsDetailsDtos(goodsDetailsDtos);
@@ -4330,13 +4425,17 @@ public class OrderServiceImpl implements OrderService {
 
     /**
      * 计算积分抵扣后的订单总金额
-     * @param orderTotalPrice   订单商品详情
+     * @param orderTotalPrice   订单商品总价
      * @param score             积分
      * @param storeId           门店id
      * @param memberCode        会员码
+     * @param goodsDetailsDtos  订单商品详情
+     * @param calculateOrderDiscountPriceResponseVO 响应数据
+     * @param promotionActivityFlag 是否参与了积分抵扣活动
+     * @param promotionSkuList  参与了积分抵扣活动的sku集合
      * @return                  积分抵扣后的订单总金额
      */
-    private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice, Integer score, String storeId, String memberCode, CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO) {
+    private BigDecimal calculatePreferentialPrice(BigDecimal orderTotalPrice, Integer score, String storeId, String memberCode, CalculateOrderDiscountPriceResponseVO calculateOrderDiscountPriceResponseVO, List<GoodsDetailsDto> goodsDetailsDtos, AtomicBoolean promotionActivityFlag, List<String> promotionSkuList) {
         // 1. 判断是否有积分,是否需要计算积分抵扣后的价格
         AtomicBoolean isCalculateScorePrice = new AtomicBoolean(false);
         if (Objects.nonNull(score) && score > 0) {
@@ -4351,6 +4450,10 @@ public class OrderServiceImpl implements OrderService {
                 LOGGER.warn("用户【{}】的积分数量为:{},最低需要30积分才能抵扣!", memberCode, score);
                 return orderTotalPrice;
             } else {
+                // 积分取整
+                int scoreInteger = score % scoreLimit == 0 ? score : score - (score % scoreLimit);
+                // 积分的50%
+                int scoreIntegerHalf = scoreInteger * scoreLimit / 100;
                 // 3-2. 计算出积分能抵扣的价格
                 int scoreMayDeductionPrice = (int) (score / scoreLimit);
                 BigDecimal scoreMayDeductionPriceDecimal = new BigDecimal(scoreMayDeductionPrice);
@@ -4359,17 +4462,48 @@ public class OrderServiceImpl implements OrderService {
                     // 积分能抵扣的金额大于订单总额的50%,按50%抵扣
                     scoreMayDeductionPriceDecimal = halfPrice;
                 }
+                // 参与了积分抵扣活动,不互斥的情况下
+                if (promotionActivityFlag.get() && !CollectionUtils.isEmpty(promotionSkuList)) {
+                    BigDecimal shareScore = BigDecimal.ZERO;
+                    BigDecimal scoreIntegerDecimal = BigDecimal.valueOf(scoreInteger);
+                    BigDecimal scoreLimitDecimal = BigDecimal.valueOf(scoreLimit);
+                    BigDecimal goodsDetailScoreDeductionPrice = BigDecimal.ZERO;
+                    for (int i = 0; i < goodsDetailsDtos.size(); i++) {
+                        GoodsDetailsDto goodsDetailsDto = goodsDetailsDtos.get(i);
+                        // 抵扣积分分摊
+                        int index = goodsDetailsDtos.size() - 1;
+                        if (promotionSkuList.contains(goodsDetailsDto.getSku()) && i < index) {
+                            // 计算抵扣
+                            // 商品总价
+                            BigDecimal actualPaymentAmount = goodsDetailsDto.getActualPaymentAmount();
+                            BigDecimal scoreIntegerHalfDecimal = BigDecimal.valueOf(scoreIntegerHalf);
+                            // 分摊积分
+                            shareScore = shareScore.add(actualPaymentAmount.divide(scoreIntegerDecimal.multiply(scoreIntegerHalfDecimal), 2, BigDecimal.ROUND_HALF_UP));
+                            // 保留两位小数,四舍五入
+                            BigDecimal discountedPrice = shareScore.divide(scoreLimitDecimal, 2, BigDecimal.ROUND_HALF_UP);
+                            goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
+                            goodsDetailsDto.setDiscountedPrice(discountedPrice);
+                        }
+                        if (i == index) {
+                            BigDecimal discountedPrice = scoreIntegerDecimal.subtract(shareScore).divide(scoreLimitDecimal, 2, BigDecimal.ROUND_HALF_UP);
+                            goodsDetailScoreDeductionPrice = goodsDetailScoreDeductionPrice.add(discountedPrice);
+                            goodsDetailsDto.setDiscountedPrice(discountedPrice);
+                        }
+                    }
+                    scoreMayDeductionPriceDecimal = goodsDetailScoreDeductionPrice;
+                }
+
                 orderTotalPrice = orderTotalPrice.subtract(scoreMayDeductionPriceDecimal);
-                int afterScore = score - scoreMayDeductionPriceDecimal.multiply(new BigDecimal(scoreLimit)).intValue();
+                int afterScore = score - scoreIntegerHalf;
                 calculateOrderDiscountPriceResponseVO.setAfterScore(afterScore);
                 calculateOrderDiscountPriceResponseVO.setScoreLimit(scoreLimit);
-                calculateOrderDiscountPriceResponseVO.setDeductionScore(score - afterScore);
+                calculateOrderDiscountPriceResponseVO.setDeductionScore(scoreIntegerHalf);
                 calculateOrderDiscountPriceResponseVO.setOrderTotalPrice(orderTotalPrice);
                 calculateOrderDiscountPriceResponseVO.setScoreDeductionPrice(scoreMayDeductionPriceDecimal);
                 LOGGER.info("会员【{}】,当前积分:{},抵扣订单金额后剩余积分:{}", memberCode, score, afterScore);
             }
         } else {
-            LOGGER.info("会员【{}】的积分为0,不参加积分抵扣!", memberCode);
+            LOGGER.info("会员【{}】的积分小于积分抵扣最低值,不参加积分抵扣!", memberCode);
         }
         return orderTotalPrice;
     }
@@ -4555,7 +4689,13 @@ public class OrderServiceImpl implements OrderService {
         orderInfo.setUser_id(loginUser.getId().longValue());
         actualPrice = actualPrice.subtract(couponPrice);
 
-        StoreEntity storeEntity = storeDao.queryObject(storeId);
+        //StoreEntity storeEntity = storeDao.queryObject(storeId);
+        //获取收货人地址
+        AddressEntity addressEntity = addressDao.queryStoreAddress(storeId,Dict.addressStatus.item_2.getItem());
+        if(null==addressEntity){
+            LOGGER.error("setOrderVo---门店未配置收货人地址:"+storeId);
+            throw new RRException("门店未配置收货人地址");
+        }
         //收货地址和运费
         orderInfo.setConsignee(loginUser.getUsername());
         orderInfo.setMobile(loginUser.getMobile());
@@ -4563,22 +4703,26 @@ public class OrderServiceImpl implements OrderService {
         //根据 前端的选择方式 1 是柜取 0 是 邮寄
         if (status == 0) {
             //省
-            String cmbProvince = (String) mapAddr.get("cmbProvince");
-            //市
-            String cmbCity = (String) mapAddr.get("cmbCity");
-            //区
-            String cmbArea = (String) mapAddr.get("cmbArea");
-            //详细地址
-            String addrUser = (String) mapAddr.get("addrUser");
-            orderInfo.setProvince(cmbProvince);
-            orderInfo.setCity(cmbCity);
-            orderInfo.setDistrict(cmbArea);
-            orderInfo.setAddress(addrUser);
+//            String cmbProvince = (String) mapAddr.get("cmbProvince");
+//            //市
+//            String cmbCity = (String) mapAddr.get("cmbCity");
+//            //区
+//            String cmbArea = (String) mapAddr.get("cmbArea");
+//            //详细地址
+//            String addrUser = (String) mapAddr.get("addrUser");
+//            orderInfo.setProvince(cmbProvince);
+//            orderInfo.setCity(cmbCity);
+//            orderInfo.setDistrict(cmbArea);
+//            orderInfo.setAddress(addrUser);
+            orderInfo.setProvince(addressEntity.getProvinceName());
+            orderInfo.setCity(addressEntity.getCityName());
+            orderInfo.setDistrict(addressEntity.getCountyName());
+            orderInfo.setAddress(addressEntity.getDetailInfo());
         } else {
-            orderInfo.setProvince(storeEntity.getProvinceName());
-            orderInfo.setCity(storeEntity.getCityName());
-            orderInfo.setDistrict(storeEntity.getCountyName());
-            orderInfo.setAddress(storeEntity.getStoreAddress());
+            orderInfo.setProvince(addressEntity.getProvinceName());
+            orderInfo.setCity(addressEntity.getCityName());
+            orderInfo.setDistrict(addressEntity.getCountyName());
+            orderInfo.setAddress(addressEntity.getDetailInfo());
         }
         orderInfo.setAddress_id(1L);
         orderInfo.setDelivery_date(new Date());

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/haikong/HaiKongMemberScoreChangeRecordServiceImpl.java

@@ -61,7 +61,7 @@ public class HaiKongMemberScoreChangeRecordServiceImpl implements HaiKongMemberS
     }
 
     @Override
-    public IntegralGoBackEntity queryIntegralGoBack(String orderSn) {
+    public List<IntegralGoBackEntity> queryIntegralGoBack(String orderSn) {
         return haiKongMemberScoreChangeRecordDao.queryIntegralGoBack(orderSn);
     }
 

+ 151 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/MkActivitiesScoreServiceImpl.java

@@ -0,0 +1,151 @@
+package com.kmall.admin.service.impl.mk;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.google.common.collect.ImmutableBiMap;
+import com.kmall.admin.dao.mk.MkActivitiesScoreDao;
+import com.kmall.admin.dto.ScoreReductionDTO;
+import com.kmall.admin.entity.mk.MkActivitiesScoreEntity;
+import com.kmall.admin.service.mk.MkActivitiesScoreService;
+import com.kmall.common.utils.*;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+/**
+ * 营销方式-积分抵扣Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-02 16:06:26
+ */
+@Service("mkActivitiesScoreService")
+public class MkActivitiesScoreServiceImpl implements MkActivitiesScoreService {
+    @Autowired
+    private MkActivitiesScoreDao mkActivitiesScoreDao;
+
+    @Override
+    public MkActivitiesScoreEntity queryObject(Integer id) {
+        return mkActivitiesScoreDao.queryObject(id);
+    }
+
+    @Override
+    public List<MkActivitiesScoreEntity> queryList(Map<String, Object> map) {
+        return mkActivitiesScoreDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return mkActivitiesScoreDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(MkActivitiesScoreEntity mkActivitiesScore) {
+        return mkActivitiesScoreDao.save(mkActivitiesScore);
+    }
+
+    @Override
+    public int update(MkActivitiesScoreEntity mkActivitiesScore) {
+        return mkActivitiesScoreDao.update(mkActivitiesScore);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return mkActivitiesScoreDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return mkActivitiesScoreDao.deleteBatch(ids);
+    }
+
+    /**
+     * 导入
+     *
+     * @param scoreReductionDTOList 导入的数据
+     * @param storeId               门店id
+     * @param mkaId                 活动id
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void uploadExcel(List<ScoreReductionDTO> scoreReductionDTOList, String storeId, String mkaId) {
+
+        if (!CollectionUtils.isEmpty(scoreReductionDTOList)) {
+            List<MkActivitiesScoreEntity> mkActivitiesScoreEntities = new ArrayList<>();
+
+            scoreReductionDTOList.forEach(scoreReductionDTO -> {
+                Map<String, Object> valideDate = MapBeanUtil.fromObject(scoreReductionDTO);
+                // 校验excel传入的数据
+                ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                builder.put("storeId", "门店编号");
+                builder.put("sku", "商品SKU");
+                builder.put("prodBarcode", "商品条码");
+                builder.put("scoreLimit", "抵扣比例");
+                builder.put("reject", "是否参与");
+                builder.put("deadlineStr", "截止日期");
+
+                R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                if (Integer.valueOf(r.get("code").toString()) != 0) {
+                    throw new RRException(r.get("msg").toString());
+                }
+
+                Date nowTime = new Date();
+
+                MkActivitiesScoreEntity mkActivitiesScoreEntity = queryEntityByProdBarcodeAndSkuAndStoreIdAndTime(scoreReductionDTO.getProdBarcode(), scoreReductionDTO.getSku(), scoreReductionDTO.getStoreId(), nowTime);
+
+                if (Objects.nonNull(mkActivitiesScoreEntity)) {
+                    throw new RRException("该商品已经参与本次活动,商品{"+mkActivitiesScoreEntity.getProdBarcode()+"},sku,{"+mkActivitiesScoreEntity.getSku()+"}", 500);
+                }
+
+                MkActivitiesScoreEntity scoreEntity = new MkActivitiesScoreEntity();
+                BeanUtils.copyProperties(scoreReductionDTO, scoreEntity);
+                Date updateTime = new Date();
+                DateTime dateTime = DateUtil.parseDate(scoreReductionDTO.getDeadlineStr());
+                scoreEntity.setDeadline(dateTime);
+                scoreEntity.setMkaId(Long.parseLong(mkaId));
+                scoreEntity.setCreaterSn("0");
+                scoreEntity.setCreateTime(updateTime);
+                scoreEntity.setModerSn("0");
+                scoreEntity.setUpdateTime(updateTime);
+
+                mkActivitiesScoreEntities.add(scoreEntity);
+            });
+
+            ((MkActivitiesScoreService) AopContext.currentProxy()).saveBatch(mkActivitiesScoreEntities);
+
+        }
+
+    }
+
+    /**
+     * 查询当前时间商品是否有活动信息
+     *
+     * @param prodBarcode 条码
+     * @param sku         sku
+     * @param storeId     门店id
+     * @param nowTime     当前时间
+     * @return 实体
+     */
+    @Override
+    public MkActivitiesScoreEntity queryEntityByProdBarcodeAndSkuAndStoreIdAndTime(String prodBarcode, String sku, Integer storeId, Date nowTime) {
+        return mkActivitiesScoreDao.queryEntityByProdBarcodeAndSkuAndStoreIdAndTime(prodBarcode, sku, storeId, nowTime);
+    }
+
+    /**
+     * 批量新增
+     *
+     * @param mkActivitiesScoreEntities 新增数据
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveBatch(List<MkActivitiesScoreEntity> mkActivitiesScoreEntities) {
+        mkActivitiesScoreDao.saveBatch(mkActivitiesScoreEntities);
+    }
+}

+ 23 - 36
kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java

@@ -5,10 +5,12 @@ 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.admin.haikong.vo.PointsRulesAndDetailVO;
 import com.kmall.common.utils.Query;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -89,25 +91,23 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
                         break;
                     //商品类别
                     case 1:
-
                         mall2RulesDto.setRulesId(categoryDao.queryObjectCategoryByName(mall2RulesDto.getPointsRulesName().trim()));
                         break;
                     //商品
                     case 2:
+                        //获取门店ID
                         Long id = storeDao.queryObjectRulesByName(mall2RulesDto.getStoreName().trim());
+                        mall2RulesDto.setStoreId(id);
                         mall2RulesDto.setRulesId(productStoreRelaDao.queryproductStoreByName(mall2RulesDto.getPointsRulesName().trim(),id));
                         break;
                     default:
                         break;
                 }
                 mall2RulesDto.setMkaId(mkaId);
+                mall2RulesDto.setPointsRulesType(pointsType);
             });
-            if(pointsType==0){
-                storeDao.updateObjectStore(pointsRulesList);
-            }else if(pointsType==1){
-                categoryDao.updateObjectCategory(pointsRulesList);
-            }else{
-                productStoreRelaDao.updateProductStoreRela(pointsRulesList);
+            if(pointsRulesList.size()>0){
+                mall2PointsRulesDao.saveMall2PointsRulesDetil(pointsRulesList);
             }
         }
 
@@ -121,36 +121,12 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
     @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;
+        List<Mall2RulesDto> mall2DetilEntities = mall2PointsRulesDao.querymall2PointsRulesDetil(id);
+        int total = mall2PointsRulesDao.querymall2PointsRulesDetilTotal(id);
+        map.put("list",mall2DetilEntities);
+        map.put("total",total);
+        return map;
 
     }
 
@@ -179,4 +155,15 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
                 break;
         }
     }
+
+    /**
+     * 查询当前时间的积分规则
+     *
+     * @param nowTime 当前时间
+     * @return 积分生成规则
+     */
+    @Override
+    public List<PointsRulesAndDetailVO> queryListByTime(Date nowTime) {
+        return mall2PointsRulesDao.queryListByTime(nowTime);
+    }
 }

+ 99 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/MkActivitiesScoreService.java

@@ -0,0 +1,99 @@
+package com.kmall.admin.service.mk;
+
+
+import com.kmall.admin.dto.ScoreReductionDTO;
+import com.kmall.admin.entity.mk.MkActivitiesScoreEntity;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 营销方式-积分抵扣Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2021-12-02 16:06:26
+ */
+public interface MkActivitiesScoreService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    MkActivitiesScoreEntity queryObject(Integer id);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<MkActivitiesScoreEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param mkActivitiesScore 实体
+     * @return 保存条数
+     */
+    int save(MkActivitiesScoreEntity mkActivitiesScore);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param mkActivitiesScore 实体
+     * @return 更新条数
+     */
+    int update(MkActivitiesScoreEntity mkActivitiesScore);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[]ids);
+
+    /**
+     * 导入
+     * @param scoreReductionDTOList 导入的数据
+     * @param storeId               门店id
+     * @param mkaId                 活动id
+     */
+    void uploadExcel(List<ScoreReductionDTO> scoreReductionDTOList, String storeId, String mkaId);
+
+    /**
+     * 查询当前时间商品是否有活动信息
+     * @param prodBarcode   条码
+     * @param sku           sku
+     * @param storeId       storeId
+     * @param nowTime       当前时间
+     * @return              实体
+     */
+    MkActivitiesScoreEntity queryEntityByProdBarcodeAndSkuAndStoreIdAndTime(String prodBarcode, String sku, Integer storeId, Date nowTime);
+
+    /**
+     * 批量新增
+     * @param mkActivitiesScoreEntities 新增数据
+     */
+    void saveBatch(List<MkActivitiesScoreEntity> mkActivitiesScoreEntities);
+}

+ 9 - 0
kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java

@@ -3,8 +3,10 @@ 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.admin.haikong.vo.PointsRulesAndDetailVO;
 import com.kmall.common.utils.Query;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -84,4 +86,11 @@ public interface Mall2PointsRulesService {
 
 
     void deleteDetil(Integer[] mprIds,Long typeId);
+
+    /**
+     * 查询当前时间的积分规则及其明细
+     * @param nowTime 当前时间
+     * @return        积分生成规则
+     */
+    List<PointsRulesAndDetailVO> queryListByTime(Date nowTime);
 }

+ 22 - 0
kmall-admin/src/main/resources/XmlTemplate/ScoreReductionDTOList.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workbook>
+    <worksheet name="Sheet1">
+        <section startRow="0" endRow="0"/>
+        <loop startRow="1" endRow="1" items="ScoreReductionDTOList" var="ScoreReductionDTO"
+              varType="com.kmall.admin.dto.ScoreReductionDTO">
+            <section startRow="1" endRow="1">
+                <mapping row="1" col="0">ScoreReductionDTO.storeId</mapping>
+                <mapping row="1" col="1">ScoreReductionDTO.prodBarcode</mapping>
+                <mapping row="1" col="2">ScoreReductionDTO.sku</mapping>
+                <mapping row="1" col="3">ScoreReductionDTO.scoreLimit</mapping>
+                <mapping row="1" col="4">ScoreReductionDTO.reject</mapping>
+                <mapping row="1" col="5">ScoreReductionDTO.deadlineStr</mapping>
+            </section>
+            <loopbreakcondition>
+                <rowcheck offset="0">
+                    <cellcheck offset="0"></cellcheck>
+                </rowcheck>
+            </loopbreakcondition>
+        </loop>
+    </worksheet>
+</workbook>

+ 41 - 5
kmall-admin/src/main/resources/mybatis/mapper/AddressDao.xml

@@ -30,8 +30,11 @@
         mall_address.county_Name,
         mall_address.detail_Info,
         mall_address.is_default,
+        mall_address.address_type,
+        mall_address.address_store,
+        mall_store.store_name,
         mall_user.nickname shop_user_name
-        from mall_address LEFT JOIN mall_user ON mall_address.user_id = mall_user.id
+        from mall_address LEFT JOIN mall_store ON mall_address.address_store = mall_store.id LEFT JOIN mall_user ON mall_address.user_id = mall_user.id
         where mall_address.id = #{id}
     </select>
 
@@ -48,8 +51,11 @@
         mall_address.county_Name,
         mall_address.detail_Info,
         mall_address.is_default,
+        mall_address.address_type,
+        mall_address.address_store,
+        mall_store.store_name,
         mall_user.nickname shop_user_name
-        from mall_address
+        from mall_address LEFT JOIN mall_store ON mall_address.address_store = mall_store.id
         LEFT JOIN mall_user ON mall_address.user_id = mall_user.id
         LEFT JOIN mall_merch_user d ON mall_address.user_id=d.user_id
         left join mall_store s on d.store_id = s.id
@@ -122,7 +128,9 @@
         `city_Name`,
         `county_Name`,
         `detail_Info`,
-        `is_default`)
+        `is_default`,
+         address_type,
+         address_store)
         values(
         #{userId},
         #{userName},
@@ -133,7 +141,10 @@
         #{cityName},
         #{countyName},
         #{detailInfo},
-        #{isDefault})
+        #{isDefault},
+        #{addressType},
+        #{addressStore}
+        )
     </insert>
 
     <update id="update" parameterType="com.kmall.admin.entity.AddressEntity">
@@ -148,7 +159,9 @@
             <if test="cityName != null">`city_Name` = #{cityName}, </if>
             <if test="countyName != null">`county_Name` = #{countyName}, </if>
             <if test="detailInfo != null">`detail_Info` = #{detailInfo}, </if>
-            <if test="isDefault != null">`is_default` = #{isDefault}</if>
+            <if test="isDefault != null">`is_default` = #{isDefault},</if>
+            <if test="addressType != null">`address_type` = #{addressType},</if>
+            <if test="addressStore != null">`address_store` = #{addressStore}</if>
         </set>
         where id = #{id}
     </update>
@@ -164,4 +177,27 @@
         </foreach>
     </delete>
 
+    <select id="queryStoreAddress" resultType="com.kmall.admin.entity.AddressEntity">
+        select
+        mall_address.id,
+        mall_address.user_id,
+        mall_address.user_name,
+        mall_address.tel_number,
+        mall_address.postal_Code,
+        mall_address.national_Code,
+        mall_address.province_Name,
+        mall_address.city_Name,
+        mall_address.county_Name,
+        mall_address.detail_Info,
+        mall_address.is_default,
+        mall_address.address_type,
+        mall_address.address_store,
+        mall_store.store_name,
+        mall_user.nickname shop_user_name
+        from mall_address LEFT JOIN mall_store ON mall_address.address_store = mall_store.id LEFT JOIN mall_user ON mall_address.user_id = mall_user.id
+        where mall_address.address_store = #{id}
+        and mall_address.address_type= #{type}
+        limit 1
+    </select>
+
 </mapper>

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

@@ -152,7 +152,7 @@
 			`moder_sn`,
 			`mod_time`,
 			`tstm`,
-			order_sn))
+			order_sn)
 		values(
 			#{storeChangeNum},
 			#{storeOriginalNum},

+ 9 - 2
kmall-admin/src/main/resources/mybatis/mapper/haikong/HaiKongMemberScoreChangeRecordDao.xml

@@ -15,6 +15,13 @@
         <result column="create_time" property="createTime" />
     </resultMap>
 
+    <resultMap id="IntegralGoBack" type="com.kmall.admin.entity.haikong.IntegralGoBackEntity">
+        <result column="open_id" property="open_id" />
+        <result column="score" property="rollback_score" />
+        <result column="statement_id" property="statement_id" />
+        <result column="change_id" property="change_id" />
+    </resultMap>
+
     <select id="queryObjectByOutBizNo" resultType="com.kmall.admin.entity.haikong.HaiKongMemberScoreChangeRecordEntity">
         select *
         from haikong_member_score_change_record
@@ -118,10 +125,10 @@
         </foreach>
     </delete>
 
-    <select id="queryIntegralGoBack" resultType="com.kmall.admin.entity.haikong.IntegralGoBackEntity">
+    <select id="queryIntegralGoBack" parameterType="java.lang.String" resultMap="IntegralGoBack">
         SELECT
             open_id,
-            score as rollback_score,
+            score,
             statement_id,
             change_id
         FROM

+ 185 - 0
kmall-admin/src/main/resources/mybatis/mapper/mk/MkActivitiesScoreDao.xml

@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.mk.MkActivitiesScoreDao">
+
+    <resultMap type="com.kmall.admin.entity.mk.MkActivitiesScoreEntity" id="mkActivitiesScoreMap">
+        <result property="id" column="id"/>
+        <result property="prodBarcode" column="prod_barcode"/>
+        <result property="sku" column="sku"/>
+        <result property="storeId" column="store_id"/>
+        <result property="scoreLimit" column="score_limit"/>
+        <result property="mkaId" column="mka_id"/>
+        <result property="deadline" column="deadline"/>
+        <result property="reject" column="reject"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.mk.MkActivitiesScoreEntity">
+		select
+			`id`,
+			`prod_barcode`,
+			`sku`,
+			`store_id`,
+			`score_limit`,
+			`mka_id`,
+			`deadline`,
+			`reject`,
+			`create_time`,
+			`creater_sn`,
+			`moder_sn`,
+			`update_time`
+		from mk_activities_score
+		where id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.mk.MkActivitiesScoreEntity">
+		select
+    		`id`,
+    		`prod_barcode`,
+    		`sku`,
+    		`store_id`,
+    		`score_limit`,
+    		`mka_id`,
+    		`deadline`,
+    		`reject`,
+    		`create_time`,
+    		`creater_sn`,
+    		`moder_sn`,
+    		`update_time`
+		from mk_activities_score
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mk_activities_score
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+
+	<select id="queryEntityByProdBarcodeAndSkuAndStoreIdAndTime"
+			resultType="com.kmall.admin.entity.mk.MkActivitiesScoreEntity">
+		select
+    		`id`,
+    		`prod_barcode`,
+    		`sku`,
+    		`store_id`,
+    		`score_limit`,
+    		`mka_id`,
+    		`deadline`,
+    		`reject`,
+    		`create_time`,
+    		`creater_sn`,
+    		`moder_sn`,
+    		`update_time`
+		from mk_activities_score
+		where prod_barcode = #{prodBarcode} and sku = #{sku} and store_id = #{storeId} and (deadline &gt; #{nowTime})
+	</select>
+
+	<insert id="save" parameterType="com.kmall.admin.entity.mk.MkActivitiesScoreEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into mk_activities_score(
+			`prod_barcode`,
+			`sku`,
+			`store_id`,
+			`score_limit`,
+			`mka_id`,
+			`deadline`,
+			`reject`,
+			`create_time`,
+			`creater_sn`,
+			`moder_sn`,
+			`update_time`)
+		values(
+			#{prodBarcode},
+			#{sku},
+			#{storeId},
+			#{scoreLimit},
+			#{mkaId},
+			#{deadline},
+			#{reject},
+			#{createTime},
+			#{createrSn},
+			#{moderSn},
+			#{updateTime})
+	</insert>
+
+	<insert id="saveBatch" parameterType="com.kmall.admin.entity.mk.MkActivitiesScoreEntity">
+		insert into mk_activities_score(
+			`prod_barcode`,
+			`sku`,
+			`store_id`,
+			`score_limit`,
+			`mka_id`,
+			`deadline`,
+			`reject`,
+			`create_time`,
+			`creater_sn`,
+			`moder_sn`,
+			`update_time`)
+		values
+		<foreach collection="list" item="item" separator=",">
+			(
+				#{item.prodBarcode},
+				#{item.sku},
+				#{item.storeId},
+				#{item.scoreLimit},
+				#{item.mkaId},
+				#{item.deadline},
+				#{item.reject},
+				#{item.createTime},
+				#{item.createrSn},
+				#{item.moderSn},
+				#{item.updateTime}
+			)
+		</foreach>
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.mk.MkActivitiesScoreEntity">
+		update mk_activities_score 
+		<set>
+			<if test="prodBarcode != null">`prod_barcode` = #{prodBarcode}, </if>
+			<if test="sku != null">`sku` = #{sku}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
+			<if test="scoreLimit != null">`score_limit` = #{scoreLimit}, </if>
+			<if test="mkaId != null">`mka_id` = #{mkaId}, </if>
+			<if test="deadline != null">`deadline` = #{deadline}, </if>
+			<if test="reject != null">`reject` = #{reject}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="updateTime != null">`update_time` = #{updateTime}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mk_activities_score where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mk_activities_score where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+</mapper>

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

@@ -9,6 +9,7 @@
         <result property="pointsBeginTime" column="points_begin_time"/>
         <result property="pointsEndTime" column="points_end_time"/>
         <result property="isValid" column="is_valid"/>
+        <result property="ratio" column="ratio"/>
         <result property="createrSn" column="creater_sn"/>
         <result property="createTime" column="create_time"/>
         <result property="moderSn" column="moder_sn"/>
@@ -19,12 +20,10 @@
 	<select id="queryObject" resultType="com.kmall.admin.entity.vip.Mall2PointsRulesEntity">
 		select
 			`mpr_id`,
-			 points_type as pointsType,
-			 points_rules_money as pointsRulesMoney,
-			 points_rules_num as pointsRulesNum,
+			`points_type` as pointsType,
+			`ratio`,
 			`points_begin_time`,
 			`points_end_time`,
-			 points_proportion as pointsProportion,
 			`is_valid`,
 			`creater_sn`,
 			`create_time`,
@@ -39,11 +38,9 @@
 		select
     		`mpr_id`,
     		`points_type`,
-			 points_rules_money as pointsRulesMoney,
-			 points_rules_num as pointsRulesNum,
+    		`ratio`,
     		`points_begin_time`,
     		`points_end_time`,
-		     points_proportion as pointsProportion,
     		`is_valid`,
     		`creater_sn`,
     		`create_time`,
@@ -80,11 +77,9 @@
 		insert into mall2_points_rules(
 			`mpr_id`,
 			`points_type`,
-			 points_rules_money,
-			 points_rules_num,
+			`ratio`,
 			`points_begin_time`,
 			`points_end_time`,
-			 points_proportion,
 			`is_valid`,
 			`creater_sn`,
 			`create_time`,
@@ -94,11 +89,8 @@
 		values(
 			#{mprId},
 			#{pointsType},
-			#{pointsRulesMoney},
-			#{pointsRulesNum},
 			#{pointsBeginTime},
 			#{pointsEndTime},
-			#{pointsProportion},
 			#{isValid},
 			#{createrSn},
 			#{createTime},
@@ -111,12 +103,10 @@
 		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="pointsProportion != null">`points_proportion` = #{pointsProportion}, </if>
 			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="ratio != null">`ratio` = #{ratio}, </if>
 			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>
 			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
@@ -141,6 +131,68 @@
        select points_type from mall2_points_rules where mpr_id=#{mkaId}
 	</select>
 
+    <select id="queryListByTime" resultType="com.kmall.admin.haikong.vo.PointsRulesAndDetailVO">
+		select
+    		mpr.`mpr_id` as mprId,
+    		mpr.`points_type` as pointsType,
+    		mpr.`points_begin_time` as pointsBeginTime,
+    		mpr.`points_end_time` as pointsEndTime,
+    		mpr.`is_valid` as isValid,
+    		mpr.`ratio` as ratio,
+    		mpr.`creater_sn` as createrSn,
+    		mpr.`create_time` as createTime,
+    		mpr.`moder_sn` as moderSn,
+    		mpr.`mod_time` as modTime,
+    		mpr.`tstm` as tstm,
+			mprs.`id` as id,
+			mprs.`father_id` as fatherId,
+			mprs.`points_rules_type` as pointRulesType,
+			mprs.`points_detil_name` as pointsDetilName,
+			mprs.`points_detil_name_id` as pointsDetilNameId,
+			mprs.`points_store_name` as pointsStoreName,
+			mprs.`points_store_id` as pointsStoreId,
+			mprs.`remark` as remark
+    	from mall2_points_rules mpr
+    	left join mall2_points_rules_detil mprs on mpr.mpr_id = mprs.father_id
+    	where mprs.id is not null and mpr.is_valid = 0 and mpr.points_begin_time &lt;= #{nowTime} and mpr.points_end_time &gt;= #{nowTime}
+	</select>
+
+	<insert id="saveMall2PointsRulesDetil" parameterType="com.kmall.admin.dto.Mall2RulesDto">
+		insert into mall2_points_rules_detil(
+			 father_id,
+			 points_rules_type,
+			 points_detil_name,
+			 points_detil_name_id,
+			 points_store_name,
+			 points_store_id)
+		values
+		<foreach collection="list" item="item" separator=",">
+			(
+			#{item.mkaId},
+			#{item.pointsRulesType},
+			#{item.pointsRulesName},
+			#{item.rulesId},
+			#{item.storeName},
+			#{item.storeId}
+			)
+		</foreach>
+
+	</insert>
 
+	<select id="querymall2PointsRulesDetil" parameterType="java.lang.Long" resultType="com.kmall.admin.dto.Mall2RulesDto">
+		select
+             father_id as id,
+			 points_rules_type as rulesType,
+			 points_detil_name as pointsRulesName,
+			 points_store_name as storeName
+		from mall2_points_rules_detil
+		WHERE
+		father_id = #{id}
+	</select>
+
+	<select id="querymall2PointsRulesDetilTotal" parameterType="java.lang.Long" resultType="java.lang.Integer">
+		select count(*) from mall2_points_rules_detil
+		where father_id = #{id}
+	</select>
 
 </mapper>

+ 0 - 3
kmall-admin/src/main/resources/spring/spring-context.xml

@@ -21,7 +21,4 @@
         <context:exclude-filter type="aspectj" expression="com.kmall.admin.websocket.**"/>
     </context:component-scan>
 
-    <!-- 暴露代理对象,用来保证调用当前bean的其他方法事务不失效,获取当前bean代理对象:((需要转换的Service) AopContext.currentProxy()) -->
-    <aop:aspectj-autoproxy expose-proxy="true"/>
-
 </beans>

+ 2 - 1
kmall-admin/src/main/resources/spring/spring-mvc.xml

@@ -20,7 +20,8 @@
         <context:exclude-filter type="aspectj" expression="com.kmall.admin.task.**"/>
     </context:component-scan>
 
-    <aop:aspectj-autoproxy proxy-target-class="true"/>
+    <!-- 暴露代理对象,用来保证调用当前bean的其他方法事务不失效,获取当前bean代理对象:((需要转换的Service) AopContext.currentProxy()) -->
+    <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
     <mvc:annotation-driven>
         <mvc:message-converters register-defaults="true">
             <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">

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

@@ -101,6 +101,7 @@
     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
           depends-on="lifecycleBeanPostProcessor">
         <property name="proxyTargetClass" value="true"/>
+        <property name="exposeProxy" value="true"/>
     </bean>
     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
         <property name="securityManager" ref="securityManager"/>

+ 89 - 0
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkactivitiesscore.html

@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>营销方式-积分抵扣</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group" 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="../mkactivitiesscore/upload" :before-upload="beforeUpload"  :data="uploadData" >
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">导入</i-button>
+                    </Upload>
+                </i-col>
+                <a href="../statics/file/activities_score_yyyy_mm_dd_v1.0.0.xlsx">积分抵扣模板下载</a>
+            </div>
+            <div class="buttons-group">
+<!--                #if($shiro.hasPermission("mkactivitiesscore:save"))-->
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+<!--                #end-->
+<!--                #if($shiro.hasPermission("mkactivitiesscore:update"))-->
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+<!--                #end-->
+<!--                #if($shiro.hasPermission("mkactivitiesscore:delete"))-->
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+<!--                #end-->
+                <i-button type="warning" @click="reloadMkactivities" v-show="!isMkactivitiesShow">返回营销方式页</i-button>
+            </div>
+        </Row>
+	    <ta2ble id="jqGrid"></ta2ble>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="mkActivitiesScore" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商品条码" prop="prodBarcode">
+                <i-input v-model="mkActivitiesScore.prodBarcode" placeholder="商品条码"/>
+            </Form-item>
+            <Form-item label="sku" prop="sku">
+                <i-input v-model="mkActivitiesScore.sku" placeholder="sku"/>
+            </Form-item>
+            <Form-item label="门店id" prop="storeId">
+                <i-input v-model="mkActivitiesScore.storeId" placeholder="门店id"/>
+            </Form-item>
+            <Form-item label="抵扣比例" prop="scoreLimit">
+                <i-input v-model="mkActivitiesScore.scoreLimit" placeholder="抵扣比例"/>
+            </Form-item>
+            <Form-item label="营销活动编号" prop="mkaId">
+                <i-input v-model="mkActivitiesScore.mkaId" placeholder="营销活动编号"/>
+            </Form-item>
+            <Form-item label="截止日期" prop="deadline">
+                <i-input v-model="mkActivitiesScore.deadline" placeholder="截止日期"/>
+            </Form-item>
+            <!--<Form-item label="创建时间" prop="createTime">
+                <i-input v-model="mkActivitiesScore.createTime" placeholder="创建时间"/>
+            </Form-item>
+            <Form-item label="创建人编号" prop="createrSn">
+                <i-input v-model="mkActivitiesScore.createrSn" placeholder="创建人编号"/>
+            </Form-item>
+            <Form-item label="修改人编号" prop="moderSn">
+                <i-input v-model="mkActivitiesScore.moderSn" placeholder="修改人编号"/>
+            </Form-item>
+            <Form-item label="修改时间" prop="updateTime">
+                <i-input v-model="mkActivitiesScore.updateTime" 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/mkactivitiesscore.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 64 - 11
kmall-admin/src/main/webapp/WEB-INF/page/shop/address.html

@@ -1,31 +1,84 @@
 <!DOCTYPE html>
 <html>
 <head>
-    <title></title>
+    <title>用户详细地址表</title>
     #parse("sys/header.html")
 </head>
 <body>
 <div id="rrapp" v-cloak>
-    <div v-show="showList">
+	<div v-show="showList">
         <Row :gutter="16">
             <div class="search-group">
                 <i-col span="4">
-                    <i-input v-model="q.userName" @on-enter="query" placeholder="收货人姓名"/>
-                </i-col>
-                <i-col span="4">
-                    <i-input v-model="q.telNumber" @on-enter="query" placeholder="联系电话"/>
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
                 </i-col>
                 <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
             </div>
             <div class="buttons-group">
-                <!--#if($shiro.hasPermission("address:delete"))-->
-                <!--<i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>-->
-                <!--#end-->
+                #if($shiro.hasPermission("address:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("address:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("address:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
             </div>
         </Row>
-        <table id="jqGrid"></table>
-        <div id="jqGridPager"></div>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
     </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="address" :rules="ruleValidate" :label-width="80">
+            <Form-item  label="所属门店" prop="addressStore" style="height: 30px;">
+                <i-select v-model="address.addressStore" placeholder="所属门店" label-in-value>
+                    <i-option v-for="store in categoriesStore" :value="store.id"
+                              :key="store.id">{{store.storeName}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item  label="地址类型" prop="addressType" style="height: 30px;">
+                <i-select v-model="address.addressType" placeholder="地址类型" label-in-value>
+                    <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="telNumber">
+                <i-input v-model="address.telNumber" placeholder="手机号"/>
+            </Form-item>
+            <Form-item label="邮政编码" prop="postalCode">
+                <i-input v-model="address.postalCode" placeholder="邮政编码"/>
+            </Form-item>
+<!--            <Form-item label="国家代码" prop="nationalCode">-->
+<!--                <i-input v-model="address.nationalCode" placeholder="国家代码"/>-->
+<!--            </Form-item>-->
+            <Form-item label="省" prop="provinceName">
+                <i-input v-model="address.provinceName" placeholder="省"/>
+            </Form-item>
+            <Form-item label="市" prop="cityName">
+                <i-input v-model="address.cityName" placeholder="市"/>
+            </Form-item>
+            <Form-item label="县(区)" prop="countyName">
+                <i-input v-model="address.countyName" placeholder="县(区)"/>
+            </Form-item>
+            <Form-item label="详细地址" prop="detailInfo">
+                <i-input v-model="address.detailInfo" placeholder="详细地址"/>
+            </Form-item>
+<!--            <Form-item label="是否默认 1默认 0否" prop="isDefault">-->
+<!--                <i-input v-model="address.isDefault" placeholder="是否默认 1默认 0否"/>-->
+<!--            </Form-item>-->
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
 </div>
 
 <script src="${rc.contextPath}/js/shop/address.js?_${date.systemTime}"></script>

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

@@ -25,8 +25,23 @@ $(function () {
         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: 'id', name: 'id', index: 'id', width: 30, align: 'center'},
+			{
+				label: '积分类型', name: 'rulesType', index: 'points_rules_type', width: 80, formatter: function (value) {
+					if (value === '0' || value === 0) {
+						return '门店';
+					}
+					if (value == '1') {
+						return '商品类别';
+					}
+					if (value == '2') {
+						return '门店商品';
+					}
+
+				}
+			},
+			{label: '商品/门店/类别名称', name: 'pointsRulesName', index: 'points_detil_name', width: 80, align: 'center'},
+			{label: '对应的商品门店名称', name: 'storeName', index: 'points_store_name', width: 80, align: 'center'},
 			{label: '备注', name: 'remark', index: 'remark', width: 80, align: 'center'},],
 		viewrecords: true,
 		postData: {'mkaId': vm.mkaId},

+ 214 - 0
kmall-admin/src/main/webapp/js/mk/mkactivitiesscore.js

@@ -0,0 +1,214 @@
+$(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: '../mkactivitiesscore/list',
+        datatype: "json",
+        colModel: [
+			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+			{label: '商品条码', name: 'prodBarcode', index: 'prod_barcode', width: 80},
+			{label: 'sku', name: 'sku', index: 'sku', width: 80},
+			{label: '门店id', name: 'storeId', index: 'store_id', width: 80},
+			{label: '抵扣比例', name: 'scoreLimit', index: 'score_limit', width: 80},
+			{label: '营销活动编号', name: 'mkaId', index: 'mka_id', width: 80},
+			{label: '截止日期', name: 'deadline', index: 'deadline', width: 80},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 80},
+			{label: '创建人编号', name: 'createrSn', index: 'creater_sn', width: 80},
+			{label: '修改人编号', name: 'moderSn', index: 'moder_sn', width: 80},
+			{label: '修改时间', name: 'updateTime', index: 'update_time', width: 80}],
+		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,
+		mkActivitiesScore: {},
+		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.mkActivitiesScore = {};
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.mkActivitiesScore.id == null ? "../mkactivitiesscore/save" : "../mkactivitiesscore/update";
+
+			//添加上层的门店编号与营销方式编号
+			vm.mkActivitiesHalfPrice.shopSn = vm.storeId;
+			vm.mkActivitiesHalfPrice.mkaId = vm.mkaId;
+
+            $.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.mkActivitiesScore),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ids = getSelectedRows();
+			if (ids == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../mkactivitiesscore/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(ids),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(id){
+			$.get("../mkactivitiesscore/info/"+id, function (r) {
+                vm.mkActivitiesScore = r.mkActivitiesScore;
+            });
+		},
+        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 = "/mk/mkactivityform.html?mkCode="+vm.mkCode;
+		},
+		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 = {
+				storeId: vm.storeId,
+				mkaId : vm.mkaId
+			}
+			let promise = new Promise((resolve) => {
+				this.$nextTick(function () {
+					resolve(true);
+				});
+			});
+			return promise; //通过返回一个promis对象解决
+
+		}
+	}
+});

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

@@ -190,6 +190,10 @@ let vm = new Vue({
                 id: 'lscx',
                 name: '临时促销'
             }, {
+                id: 'jfdk',
+                name: '积分抵扣'
+            }
+            /*, {
                 id: 'yhq',
                 name: '优惠券'
             }, {
@@ -213,7 +217,7 @@ let vm = new Vue({
             }, {
                 id: 'drjbj',
                 name: '第二件半价'
-            }
+            }*/
         ],
 	},
 	methods: {
@@ -509,6 +513,8 @@ let vm = new Vue({
             // "/mk/mkstorecampminus.html"
             if(mkaTopic === 'lscx')
                 url = "/mk/mkactivitiespromotion.html";
+            else if(mkaTopic === 'jfdk')
+                url = "/mk/mkactivitiesscore.html";
             else if(mkaTopic === 'yhq')
                 url = "/mk/mkactivitiescoupon.html";
             else if(mkaTopic === 'rchd')

+ 4 - 15
kmall-admin/src/main/webapp/js/sale/sale.js

@@ -1646,20 +1646,9 @@ function getPrintContentOrder(ticket, callback) {
     content += "<div style=\"width: 100%;\">";
     content += "欢迎再次惠顾 --服务电话:" + ticket.ticketMailInfo.shopTel;
     content += "</div>";
-    if(ticket.cusListing.deliveryAddress.indexOf("港惠") != -1){
-        content += "<div style=\"width: 100%;\">";
-        content += "惠州市惠城区港惠购物中心负一层";
-        content += "</div>";
-    }else if(ticket.cusListing.deliveryAddress.indexOf("永旺") != -1){
-        content += "<div style=\"width: 100%;\">";
-        content += "惠州市惠城区东湖西路东湖8区裙楼永旺惠州购物中心二楼CW大药房";
-        content += "</div>";
-    }else{
-        content += "<div style=\"width: 100%;\">";
-        content += "惠州市惠城区港惠购物中心负一层";
-        content += "</div>";
-    }
-
+    content += "<div style=\"width: 100%;\">";
+    content += ticket.ticketHead.storeAddress;
+    content += "</div>";
 
     content += "<div style=\"width: 100%;\">";
     content += "请保管好收银小票。";
@@ -1723,7 +1712,7 @@ function getPrintContentOrder(ticket, callback) {
                 发件人
             </div>
             <div style="width: 100px; display: inline;">
-                <span style="font-weight: bold">${ticket.ticketMailInfo.shopTel}</span> <span style="font-weight: bold">CW澳洲大药房</span>
+                <span style="font-weight: bold">${ticket.ticketMailInfo.senderName}</span> <span style="font-weight: bold">${ticket.ticketMailInfo.senderTel}</span>
             </div>
             <div style="width: 100%">
                 仓库地址:${ticket.ticketMailInfo.senderProvince} ${ticket.ticketMailInfo.senderCity} ${ticket.ticketMailInfo.senderDistrict} ${ticket.ticketMailInfo.senderAddress}

+ 151 - 65
kmall-admin/src/main/webapp/js/shop/address.js

@@ -1,33 +1,42 @@
 $(function () {
-    let userId = getQueryString("userId");
-    let url = '../address/list';
-    if (userId) {
-        url += '?userId=' + userId;
-    }
     $("#jqGrid").jqGrid({
-        url: url,
+        url: '../address/list',
         datatype: "json",
         colModel: [
-            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
-            {label: '会员', name: 'shopUserName', index: 'user_id', width: 240},
-            {label: '收货人姓名', name: 'userName', index: 'user_name', width: 100},
-            {label: '手机', name: 'telNumber', index: 'tel_number', width: 140},
-            {label: '收货地址国家码', name: 'nationalCode', index: 'national_Code', width: 120},
-            {label: '省', name: 'provinceName', index: 'province_Name',align:'center', width: 140},
-            {label: '市', name: 'cityName', index: 'city_Name',align:'center', width: 80},
-            {label: '区', name: 'countyName', index: 'county_Name',align:'center', width: 80},
-            {label: '详细收货地址信息', name: 'detailInfo', index: 'detail_Info', width: 400},
-            {label: '邮编', name: 'postalCode', index: 'postal_Code', width: 80}],
-        viewrecords: true,
+			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+			{label: '所属门店', name: 'addressStore', index: 'address_store', width: 100},
+			{label: '所属门店', name: 'storeName', index: 'storeName', width: 100},
+			{
+				label: '地址类型', name: 'addressType', index: 'address_type', width: 80, formatter: function (value) {
+					if (value === '1' || value === 1) {
+						return '发货地址';
+					}
+					if (value == '2') {
+						return '收货地址';
+					}
+				}
+			},
+			{label: '手机号', name: 'telNumber', index: 'tel_number', width: 60},
+			{label: '邮政编码', name: 'postalCode', index: 'postal_Code', width: 60},
+			{label: '省', name: 'provinceName', index: 'province_Name', width: 60},
+			{label: '市', name: 'cityName', index: 'city_Name', width: 60},
+			{label: '县', name: 'countyName', index: 'county_Name', width: 60},
+			{label: '详细地址', name: 'detailInfo', index: 'detail_Info', width: 160},
+			// {label: '是否默认', name: 'isDefault', index: 'is_default', width: 80},
+			// {label: '纬度', name: 'latitude', index: 'latitude', width: 80},
+			// {label: '经度', name: 'longitude', index: 'longitude', width: 80},
+			// {label: '创建人编号', name: 'createrSn', index: 'creater_sn', width: 80},
+			// {label: '创建时间', name: 'createTime', index: 'create_time', width: 80},
+			// {label: '修改人编号', name: 'moderSn', index: 'moder_sn', width: 80},
+			// {label: '修改时间', name: 'modTime', index: 'mod_time', width: 80}
+			],
+		viewrecords: true,
         height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,
         rownumWidth: 25,
         autowidth: true,
-        shrinkToFit: false,
-        autoScroll: true,   //开启水平滚动条
-        width: 1500,
         multiselect: true,
         pager: "#jqGridPager",
         jsonReader: {
@@ -42,59 +51,136 @@ $(function () {
             order: "order"
         },
         gridComplete: function () {
-            //隐藏grid底部滚动条
-            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "scroll"});
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
         }
     });
 });
 
-var vm = new Vue({
-    el: '#rrapp',
-    data: {
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
         showList: true,
-        q: {
-            userName: '',
-            telNumber: ''
-        }
-    },
-    methods: {
-        query: function () {
+        title: null,
+		address: {},
+		categories: [],//所有地址类型
+		categoriesStore: [],//所有门店
+		brands: [],
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+		    name: ''
+		}
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+			vm.title = "新增";
+			vm.address = {};
+			vm.getCategories();
+			vm.getCategoriesStore();
+		},
+		update: function (event) {
+            let id = getSelectedRow();
+			if (id == null) {
+				return;
+			}
+			vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+			vm.getCategories();
+			vm.getCategoriesStore();
+		},
+		saveOrUpdate: function (event) {
+            let url = vm.address.id == null ? "../address/save" : "../address/update";
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.address),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let ids = getSelectedRows();
+			if (ids == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../address/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(ids),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+		getInfo: function(id){
+			$.get("../address/info/"+id, function (r) {
+                vm.address = r.address;
+            });
+		},
+		getCategories: function () {
+			$.get("../sys/macro/queryMacrosByValueRuRules?id=82", function (r) {
+				vm.categories = r.list;
+			});
+		},
+		getCategoriesStore: function () {
+			$.get("../store/queryAll", function (r) {
+				vm.categoriesStore = r.list;
+			});
+		},
+		getBrand: function () {
+			$.get("../sys/macro/queryMacrosByValueRuRules?id=82" , function (r) {
+				vm.brands = r.list;
+			});
+		},
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
             vm.reload();
-        },
-        reload: function (event) {
-            vm.showList = true;
-            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
-            $("#jqGrid").jqGrid('setGridParam', {
-                postData: {
-                    'userName': vm.q.userName,
-                    'telNumber': vm.q.telNumber
-                },
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
                 page: page
             }).trigger("reloadGrid");
-        },
-        del: function (event) {
-            var ids = getSelectedRows();
-            if (ids == null) {
-                return;
-            }
-
-            confirm('确定要删除选中的记录?', function () {
-                $.ajax({
-                    type: "POST",
-                    url: "../address/delete",
-                    contentType: "application/json",
-                    data: JSON.stringify(ids),
-                    success: function (r) {
-                        if (r.code == 0) {
-                            alert('操作成功', function (index) {
-                                $("#jqGrid").trigger("reloadGrid");
-                            });
-                        } else {
-                            alert(r.msg);
-                        }
-                    }
-                });
+            vm.handleReset('formValidate');
+		},
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
             });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
         }
-    }
+	}
 });

+ 13 - 0
kmall-admin/src/main/webapp/js/shop/offilineOrderList.js

@@ -152,6 +152,19 @@ $(function () {
             // {label: '快递公司', name: 'shippingName', index: 'shipping_name', width: 80},
             // {label: '配送单号', name: 'shippingNo', index: 'shipping_No', width: 80},
             // {label: '快递费用', name: 'shippingFee', index: 'shipping_fee', width: 80},
+            {
+                label: '操作', width: 180, sortable: false,align: 'center',
+                formatter: function (value, col, row) {
+                    let htmlStr = '<button class="btn btn-outline btn-info" onclick="vm.lookDetail(' + row.id + ')"><i class="fa fa-info-circle"></i>详情</button>&nbsp;';
+                    if (row.orderStatus == 201 && (row.orderBizType == '11')) {
+                        htmlStr += '<button class="btn btn-outline btn-primary" onclick="vm.printDetail(' + row.id + ')"><i class="fa fa-print"></i>打印</button>&nbsp;';
+                    }
+                    if (row.orderStatus == 0) {
+                        htmlStr += '<button class="btn btn-outline btn-danger" onclick="vm.cancelUpdate(' + row.id + ')"><i class="fa fa-times-circle-o"></i>&nbsp;取消</button>&nbsp;';
+                    }
+                    // if (row.orderStatus == 201) {
+                    //     htmlStr += '<button class="btn btn-outline btn-danger" onclick="vm.refundUpdate(' + row.id + ')"><i class="fa fa-times-circle-o"></i>&nbsp;退款</button>&nbsp;';
+                    // }
 
         ],
         viewrecords: true,

+ 0 - 1
kmall-admin/src/main/webapp/js/vip/mall2pointsrules.js

@@ -30,7 +30,6 @@ $(function () {
 					return transDate(value, 'yyyy-MM-dd');
 				}
 			},
-			{label: '积分比例', name: 'pointsProportion', index: 'points_proportion', width: 80},
 			{
 				label: '是否有效', name: 'isValid', index: 'is_valid', width: 80, formatter: function (value) {
 					if (value === '0' || value === 0) {

二进制
kmall-admin/src/main/webapp/statics/file/activities_score_yyyy_mm_dd_v1.0.0.xlsx


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

@@ -1947,4 +1947,36 @@ public class Dict {
         }
     }
 
+    /**
+     * 地址类型
+     */
+    public enum addressStatus {
+        item_1("1", "发货人类型"),
+        item_2("2", "收货人类型");
+
+        private String item;
+        private String itemName;
+
+        addressStatus(String item, String itemName) {
+            this.item = item;
+            this.itemName = itemName;
+        }
+
+        public String getItem() {
+            return item;
+        }
+
+        public void setItem(String item) {
+            this.item = item;
+        }
+
+        public String getItemName() {
+            return itemName;
+        }
+
+        public void setItemName(String itemName) {
+            this.itemName = itemName;
+        }
+    }
+
 }

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

@@ -40,6 +40,8 @@ public class JxlsXmlTemplateName {
     public static final String HALF_PRICE_DTO_LIST = "/XmlTemplate/HalfPriceDtoList.xml";
     // 满赠商品导入
     public static final String FREE_GOODS_DTO_LIST = "/XmlTemplate/FreeGoodsDtoList.xml";
+    // 积分抵扣商品导入
+    public static final String SCORE_REDUCTION_DTO_LIST = "/XmlTemplate/ScoreReductionDTOList.xml";
     // 优惠券商品导入
     public static final String COUPON_MERCHANDISE_DTO_LIST = "/XmlTemplate/CouponMerchandiseDtoList.xml";
     // 组合价商品导入

+ 10 - 0
kmall-common/src/main/java/com/kmall/common/utils/print/ticket/item/TicketHead.java

@@ -31,6 +31,9 @@ public class TicketHead implements Serializable {
     // 交易时间
     private String tradeTime;
 
+    // 门店地址
+    private String storeAddress;
+
 
     public String getTitle() {
         return title;
@@ -88,4 +91,11 @@ public class TicketHead implements Serializable {
         this.tradeTime = tradeTime;
     }
 
+    public String getStoreAddress() {
+        return storeAddress;
+    }
+
+    public void setStoreAddress(String storeAddress) {
+        this.storeAddress = storeAddress;
+    }
 }

+ 1 - 0
kmall-manager/src/main/resources/conf/redis.properties

@@ -6,6 +6,7 @@ redis.env=prod
 # \u5F00\u53D1\u73AF\u5883
 redis.dev.keyPrefix=platform
 redis.dev.host=127.0.0.1
+#redis.dev.host=183.3.221.143
 redis.dev.port=6379
 redis.dev.password=Abc-123#*.-
 redis.dev.pool.maxIdle=200