Parcourir la source

积分生成规则

lhm il y a 3 ans
Parent
commit
46a25aae8d

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

@@ -3,6 +3,7 @@ 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;
@@ -27,7 +28,7 @@ public interface Mall2PointsRulesDao extends BaseDao<Mall2PointsRulesEntity> {
      * @param nowTime 当前时间
      * @return 积分生成规则
      */
-    List<Mall2PointsRulesEntity> queryListByTime(Date nowTime);
+    List<PointsRulesAndDetailVO> queryListByTime(Date nowTime);
 
     void saveMall2PointsRulesDetil(List<Mall2RulesDto> pointsRulesList);
 

+ 30 - 29
kmall-admin/src/main/java/com/kmall/admin/entity/vip/Mall2PointsRulesEntity.java

@@ -63,14 +63,11 @@ public class Mall2PointsRulesEntity implements Serializable, Comparable<Mall2Poi
      * 备注
      */
     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, Comparable<Mall2Poi
         this.remark = remark;
     }
 
-    public BigDecimal getPointsRulesMoney() {
-        return pointsRulesMoney;
-    }
-
-    public void setPointsRulesMoney(BigDecimal pointsRulesMoney) {
-        this.pointsRulesMoney = pointsRulesMoney;
-    }
-
     public String getPointsRulesNum() {
         return pointsRulesNum;
     }
@@ -226,22 +215,6 @@ public class Mall2PointsRulesEntity implements Serializable, Comparable<Mall2Poi
         this.pointsRulesNum = pointsRulesNum;
     }
 
-    public String getHandselIntegral() {
-        return handselIntegral;
-    }
-
-    public void setHandselIntegral(String handselIntegral) {
-        this.handselIntegral = handselIntegral;
-    }
-
-    public BigDecimal getPointsProportion() {
-        return pointsProportion;
-    }
-
-    public void setPointsProportion(BigDecimal pointsProportion) {
-        this.pointsProportion = pointsProportion;
-    }
-
     public String getPointsTypeStr() {
         return pointsTypeStr;
     }
@@ -250,6 +223,14 @@ public class Mall2PointsRulesEntity implements Serializable, Comparable<Mall2Poi
         this.pointsTypeStr = pointsTypeStr;
     }
 
+    public BigDecimal getRatio() {
+        return ratio;
+    }
+
+    public void setRatio(BigDecimal ratio) {
+        this.ratio = ratio;
+    }
+
     /**
      * 排序用
      * @param o 传进来的对象
@@ -263,4 +244,24 @@ public class Mall2PointsRulesEntity implements Serializable, Comparable<Mall2Poi
             return -1;
         }
     }
+
+    @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 +
+                '}';
+    }
 }

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

+ 68 - 21
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,7 +45,6 @@ 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;
@@ -97,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;
@@ -2748,36 +2745,87 @@ public class OrderServiceImpl implements OrderService {
                 saleRecordDao.save(saleRecordEntity);
             }
 
-            // TODO 查询当前时间积分规则,根据积分生成规则进行增加会员积分
+            // 查询当前时间积分规则以及明细,根据积分生成规则进行增加会员积分
             Integer userEntityId = userEntity.getId();
-            Integer memberScore = order.getActual_price().intValue();
-            //List<Mall2PointsRulesEntity> mall2PointsRulesEntities = mall2PointsRulesService.queryListByTime(new Date()).stream().sorted().collect(Collectors.toList());
-            /*mall2PointsRulesEntities.forEach(mall2PointsRulesEntity -> {
-                // 查询明细
+            // 总的积分:基础积分
+            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);
+                        }
+                    });
 
-
-                } else if (pointsType.equals(Constants.MemberScoreRulesEnum.ONE.getCode())) {
+                }
+                if (pointsType.equals(Constants.MemberScoreRulesEnum.ONE.getCode())) {
                     // 商品类别
-                } else if (pointsType.equals(Constants.MemberScoreRulesEnum.ZERO.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())) {
                     // 门店
-                } else {
-                    LOGGER.error("未知的积分生成规则类型:{}", pointsType);
+                    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(userEntityId);
             if (memberPointsEntity == null) {
                 memberPointsEntity = new Mall2MemberPointsEntity();
                 memberPointsEntity.setUserId(userEntityId + "");
-                memberPointsEntity.setPoints(memberScore);
+                memberPointsEntity.setPoints(memberScore.get());
                 memberPointsEntity.setCreaterSn(userId + "");
                 memberPointsEntity.setCreateTime(new Date());
                 memberPointsDao.save(memberPointsEntity);
             } else {
-                memberPointsEntity.setPoints(memberScore + memberPointsEntity.getPoints());
+                memberPointsEntity.setPoints(memberScore.get() + memberPointsEntity.getPoints());
                 memberPointsEntity.setModerSn(userId + "");
                 memberPointsEntity.setModTime(new Date());
                 memberPointsDao.update(memberPointsEntity);
@@ -2802,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);

+ 2 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/vip/Mall2PointsRulesServiceImpl.java

@@ -5,6 +5,7 @@ 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;
@@ -162,7 +163,7 @@ public class Mall2PointsRulesServiceImpl implements Mall2PointsRulesService {
      * @return 积分生成规则
      */
     @Override
-    public List<Mall2PointsRulesEntity> queryListByTime(Date nowTime) {
+    public List<PointsRulesAndDetailVO> queryListByTime(Date nowTime) {
         return mall2PointsRulesDao.queryListByTime(nowTime);
     }
 }

+ 3 - 2
kmall-admin/src/main/java/com/kmall/admin/service/vip/Mall2PointsRulesService.java

@@ -3,6 +3,7 @@ package com.kmall.admin.service.vip;
 import com.kmall.admin.dto.Mall2RulesDto;
 import com.kmall.admin.entity.vip.Mall2DetilEntity;
 import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
+import com.kmall.admin.haikong.vo.PointsRulesAndDetailVO;
 import com.kmall.common.utils.Query;
 
 import java.util.Date;
@@ -87,9 +88,9 @@ public interface Mall2PointsRulesService {
     void deleteDetil(Integer[] mprIds,Long typeId);
 
     /**
-     * 查询当前时间的积分规则
+     * 查询当前时间的积分规则及其明细
      * @param nowTime 当前时间
      * @return        积分生成规则
      */
-    List<Mall2PointsRulesEntity> queryListByTime(Date nowTime);
+    List<PointsRulesAndDetailVO> queryListByTime(Date nowTime);
 }

+ 29 - 30
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,9 +20,8 @@
 	<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`,
 			`is_valid`,
@@ -38,8 +38,7 @@
 		select
     		`mpr_id`,
     		`points_type`,
-			 points_rules_money as pointsRulesMoney,
-			 points_rules_num as pointsRulesNum,
+    		`ratio`,
     		`points_begin_time`,
     		`points_end_time`,
     		`is_valid`,
@@ -78,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`,
@@ -92,11 +89,8 @@
 		values(
 			#{mprId},
 			#{pointsType},
-			#{pointsRulesMoney},
-			#{pointsRulesNum},
 			#{pointsBeginTime},
 			#{pointsEndTime},
-			#{pointsProportion},
 			#{isValid},
 			#{createrSn},
 			#{createTime},
@@ -109,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>
@@ -139,23 +131,30 @@
        select points_type from mall2_points_rules where mpr_id=#{mkaId}
 	</select>
 
-    <select id="queryListByTime" resultType="com.kmall.admin.entity.vip.Mall2PointsRulesEntity">
+    <select id="queryListByTime" resultType="com.kmall.admin.haikong.vo.PointsRulesAndDetailVO">
 		select
-    		`mpr_id`,
-    		`points_type`,
-			 points_rules_money as pointsRulesMoney,
-			 points_rules_num as pointsRulesNum,
-    		`points_begin_time`,
-    		`points_end_time`,
-		     points_proportion as pointsProportion,
-    		`is_valid`,
-    		`creater_sn`,
-    		`create_time`,
-    		`moder_sn`,
-    		`mod_time`,
-    		`tstm`
-    	from mall2_points_rules
-    	where points_begin_time &lt;= #{nowTime} and points_end_time &gt;= #{nowTime}
+    		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">