Browse Source

超级会员套餐优化

huangzhiguo 2 years ago
parent
commit
e19e7b0fae

+ 10 - 0
src/main/java/com/caimei365/tools/controller/BaseApi.java

@@ -3,6 +3,7 @@ package com.caimei365.tools.controller;
 import com.caimei365.tools.service.CmBehaviorRecordService;
 import com.caimei365.tools.service.CmOrganValueSystemService;
 import com.caimei365.tools.service.CmRepurchaseFrequencyService;
+import com.caimei365.tools.service.CmVipCouponService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -26,6 +27,7 @@ public class BaseApi {
     private CmOrganValueSystemService cmOrganValueSystemService;
     @Resource private CmRepurchaseFrequencyService cmRepurchaseFrequencyService;
     @Resource private CmBehaviorRecordService cmBehaviorRecordService;
+    @Resource private CmVipCouponService cmVipCouponService;
 
     @Value(value = "${swagger.enabled}")
     private Boolean swaggerEnabled;
@@ -38,6 +40,14 @@ public class BaseApi {
         return "欢迎使用!";
     }
 
+    /**
+     * 创建优惠券
+     */
+    @GetMapping("/svip/Coupon")
+    public void svipCoupon(){
+        cmVipCouponService.openCoupon();
+    }
+
     /**
      * 数据ip地址
      * @param startId

+ 24 - 1
src/main/java/com/caimei365/tools/mapper/CmBehaviorRecordMapper.java

@@ -1,9 +1,10 @@
 package com.caimei365.tools.mapper;
 
-import com.caimei365.tools.model.po.CmBehaviorRecordPo;
+import com.caimei365.tools.model.po.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -51,5 +52,27 @@ public interface CmBehaviorRecordMapper {
      * @param cmBehaviorRecordPo
      */
     void updateOldData(CmBehaviorRecordPo cmBehaviorRecordPo);
+
+    List<CmVipCouponPo> selSvipCoupon(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    void updateSvipCoupon(CmVipCouponPo cmVipCouponPo);
+
+    void insertVipCouponMonth(CmVipCouponPo cmVipCouponPo);
+
+    List<CmCouponPo> selCoupon();
+
+    void updateCoupon(CmCouponPo cmCouponPo);
+
+    void insertCoupon(CmCouponPo cmCouponPo);
+
+    Integer selById();
+
+    List<CmCouponAssociatePo> selCouponPro(@Param("couponId") String couponId);
+
+    void insertCouponAssociate(CmCouponAssociatePo associate);
+
+    Integer selSvipCouponById();
+
+    void insertRelation(CmVipCouponRelation cmVipCouponRelation);
 }
 

+ 24 - 0
src/main/java/com/caimei365/tools/model/po/CmCouponAssociatePo.java

@@ -0,0 +1,24 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/2/2
+ */
+@Data
+public class CmCouponAssociatePo {
+    private Integer id;
+    private Integer couponId;       //优惠券id
+    private Integer productId;      //商品id(对应活动券)
+    private String pcStatus;        //pc状态 0停用 1启用
+    private String appletsStatus;       //小程序状态 0停用 1启用
+    private Integer sort;       //排序值
+    private Date addTime;       //添加时间
+    private String delFlag;     //删除标记 0否 其余是
+
+}

+ 5 - 0
src/main/java/com/caimei365/tools/model/po/CmCouponPo.java

@@ -18,12 +18,14 @@ import java.util.List;
 public class CmCouponPo implements Serializable {
 
     private static final long serialVersionUID = 1L;
+    private String id;
     private String name;        // 活动主题
     private BigDecimal couponAmount;        // 优惠券金额(面值)
     private BigDecimal touchPrice;        // 优惠满减条件金额
     private Date startDate;        // 使用开始时间(有效期)
     private Date endDate;        // 使用结束时间(有效期)
     private Integer receivePeriod;		// 领取期限(天)
+    private Integer useTimeFlag;		// 领取期限同开始-开始时间
     private Integer receiveFlag;		// 领取期限同开始-结束时间
     private Integer usePeriod;		// 使用期限(天)
     private String status;        // 状态 0未生效 1已生效 2已关闭 3已失效
@@ -57,4 +59,7 @@ public class CmCouponPo implements Serializable {
 
     private Date receiveDate;   // 领取时间
     private Date useEndDate;    // 使用截止时间
+    private String delFlag;    // 删除标记
+    private Date createDate;    // 创建时间
+    private Integer configure;  // 专属优惠券配置 1是、0否
 }

+ 20 - 0
src/main/java/com/caimei365/tools/model/po/CmVipCouponPo.java

@@ -0,0 +1,20 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/2/1
+ */
+@Data
+public class CmVipCouponPo {
+    private String id;
+    private String useTime;    //生效月份
+    private Date updateTime; //更新时间
+    private String status; //0关闭,1未关闭
+    private String delFlag; //删除标记
+}

+ 21 - 0
src/main/java/com/caimei365/tools/model/po/CmVipCouponRelation.java

@@ -0,0 +1,21 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/2/1
+ */
+@Data
+public class CmVipCouponRelation {
+    //优惠券id
+    private String couponId;
+    //优惠券id
+    private String montId;
+    private Date updateTime;
+    private String delFlag;
+}

+ 14 - 0
src/main/java/com/caimei365/tools/service/CmVipCouponService.java

@@ -0,0 +1,14 @@
+package com.caimei365.tools.service;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/2/1
+ */
+public interface CmVipCouponService {
+    /**
+     * 放开优惠券,创建下季度优惠券
+     */
+    void openCoupon();
+}

+ 145 - 0
src/main/java/com/caimei365/tools/service/impl/CmVipCouponServiceImpl.java

@@ -0,0 +1,145 @@
+package com.caimei365.tools.service.impl;
+
+import com.caimei365.tools.mapper.CmBehaviorRecordMapper;
+import com.caimei365.tools.model.po.CmCouponAssociatePo;
+import com.caimei365.tools.model.po.CmCouponPo;
+import com.caimei365.tools.model.po.CmVipCouponPo;
+import com.caimei365.tools.model.po.CmVipCouponRelation;
+import com.caimei365.tools.service.CmVipCouponService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/2/1
+ */
+@Slf4j
+@Service
+public class CmVipCouponServiceImpl implements CmVipCouponService {
+    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+    private static Calendar calendar = Calendar.getInstance();
+
+    @Autowired
+    private CmBehaviorRecordMapper cmBehaviorRecordMapper;
+    /**
+     * 放开优惠券,创建下季度优惠券
+     */
+    @Override
+    public void openCoupon() {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
+        Date date = new Date();
+        String startTime = simpleDateFormat.format(date);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.MONTH,3);
+        Date time = calendar.getTime();
+        String endTime = simpleDateFormat.format(time);
+        CmVipCouponPo vipCouponPo = new CmVipCouponPo();
+
+        List<CmVipCouponPo> cmVipCouponPoList = cmBehaviorRecordMapper.selSvipCoupon(startTime, endTime);
+        // 将本季度优惠券开放
+        if (cmVipCouponPoList.size() != 0) {
+            for (CmVipCouponPo cmVipCouponPo : cmVipCouponPoList) {
+                cmBehaviorRecordMapper.updateSvipCoupon(cmVipCouponPo);
+                // 生成下一季度优惠券
+                vipCouponPo.setUseTime(endTime);
+                vipCouponPo.setStatus("1");
+                vipCouponPo.setUpdateTime(date);
+                vipCouponPo.setDelFlag("1");
+                cmBehaviorRecordMapper.insertVipCouponMonth(vipCouponPo);
+            }
+        }
+        // 修改专属优惠券配置中优惠券的有效时间
+        calendar.setTime(time);
+        calendar.add(Calendar.MONTH,2);
+        Date times =calendar.getTime();
+        String formatTime = simpleDateFormat.format(times);
+        Date startDate = getMinDay(endTime);
+        Date endDate = getMaxDay(formatTime);
+        CmCouponAssociatePo associatePo = new CmCouponAssociatePo();
+        List<CmCouponPo> cmCouponPoList = cmBehaviorRecordMapper.selCoupon();
+        for (CmCouponPo cmCouponPo: cmCouponPoList) {
+
+            cmCouponPo.setConfigure(0);
+            // 修改优惠券配置属性
+            cmBehaviorRecordMapper.updateCoupon(cmCouponPo);
+            // 插入专属优惠券配置中优惠券
+            cmCouponPo.setName("超级会员优惠券"+endTime);
+            cmCouponPo.setStartDate(startDate);
+            cmCouponPo.setEndDate(endDate);
+            cmCouponPo.setConfigure(1);
+            cmCouponPo.setCreateDate(new Date());
+            cmCouponPo.setDelFlag("0");
+            cmBehaviorRecordMapper.insertCoupon(cmCouponPo);
+            // 插入新优惠券商品
+            Integer integer = cmBehaviorRecordMapper.selById();
+            List<CmCouponAssociatePo> associatePoList = cmBehaviorRecordMapper.selCouponPro(cmCouponPo.getId());
+            if (associatePoList.size() != 0) {
+                for (CmCouponAssociatePo couponAssociatePo : associatePoList) {
+                    couponAssociatePo.setCouponId(integer);
+                    cmBehaviorRecordMapper.insertCouponAssociate(couponAssociatePo);
+                }
+            }
+        }
+        log.info("========优惠券创建成功========");
+        /*
+         * vip优惠券月份关系
+         */
+        CmVipCouponRelation relation = new CmVipCouponRelation();
+        Integer cmVipCouponPoId = cmBehaviorRecordMapper.selSvipCouponById();
+        List<CmCouponPo> cmCouponPos = cmBehaviorRecordMapper.selCoupon();
+        if (cmVipCouponPoId != 0 && cmVipCouponPoId != null) {
+            for (int i = 0; i < cmCouponPos.size() ; i++) {
+                relation.setCouponId(cmCouponPos.get(i).getId());
+                relation.setMontId(cmVipCouponPoId.toString());
+                relation.setDelFlag("0");
+                relation.setUpdateTime(date);
+                cmBehaviorRecordMapper.insertRelation(relation);
+            }
+        }
+
+        log.info("========vip优惠券月份关系创建========");
+    }
+
+    /*
+    输入日期字符串比如201703,返回当月第一天的Date
+    */
+    public static Date getMinDay(String month) {
+        try {
+            Date nowDate = sdf.parse(month);
+            calendar = Calendar.getInstance();
+            calendar.setTime(nowDate);
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
+            return calendar.getTime();
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /*
+    输入日期字符串,返回下个月1号0点
+    */
+    public static Date getMaxDay(String month) {
+        try {
+            Date nowDate = sdf.parse(month);
+            calendar = Calendar.getInstance();
+            calendar.setTime(nowDate);
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+            calendar.add(Calendar.DAY_OF_MONTH,1);
+            return calendar.getTime();
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 11 - 0
src/main/java/com/caimei365/tools/task/CmOrganValueSystemTask.java

@@ -2,6 +2,7 @@ package com.caimei365.tools.task;
 
 import com.caimei365.tools.service.CmBehaviorRecordService;
 import com.caimei365.tools.service.CmOrganValueSystemService;
+import com.caimei365.tools.service.CmVipCouponService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Configuration;
@@ -26,6 +27,8 @@ public class CmOrganValueSystemTask {
 
     @Resource private CmBehaviorRecordService cmBehaviorRecordService;
 
+    @Resource private CmVipCouponService cmVipCouponService;
+
     /**
      * 每月一号更新用户活跃状态、用户价值
      */
@@ -41,4 +44,12 @@ public class CmOrganValueSystemTask {
     public void behaviorAccessDuration() {
         cmBehaviorRecordService.updateBehaviorTime();
     }
+
+    /**
+     * 每个季度创建专属优惠券
+     */
+    @Scheduled(cron = "0 00 00 1 5,8,11,2 ?")
+    public void svipCoupon() {
+        cmVipCouponService.openCoupon();
+    }
 }

+ 138 - 0
src/main/resources/mapper/CmBehaviorRecordMapper.xml

@@ -32,5 +32,143 @@
             region = #{region}
         WHERE recordID = #{recordID}
     </update>
+
+
+    <select id="selSvipCoupon" resultType="com.caimei365.tools.model.po.CmVipCouponPo">
+        SELECT id,
+               useTime,
+               updateTime,
+               status,
+               delFlag
+        FROM cm_svip_coupon_month WHERE delFlag != 0 AND useTime BETWEEN #{startTime} AND #{endTime}
+    </select>
+    <update id="updateSvipCoupon">
+        UPDATE cm_svip_coupon_month
+        SET delFlag = 0
+        WHERE id = #{id}
+    </update>
+    <insert id="insertVipCouponMonth">
+        INSERT INTO cm_svip_coupon_month (useTime, updateTime, status,delFlag)
+        VALUES (#{useTime}, #{updateTime}, #{status}, #{delFlag})
+    </insert>
+    <select id="selCoupon" resultType="com.caimei365.tools.model.po.CmCouponPo">
+        SELECT
+        id,
+        name,
+        couponAmount,
+        touchPrice,
+        startDate,
+        endDate,
+        receivePeriod,
+        useTimeFlag,
+        receiveFlag,
+        usePeriod,
+        status,
+        couponType,
+        vipFlag,
+        userId,
+        shopId,
+        productType,
+        pcBanner,
+        appletsBanner,
+        categoryType,
+        couponsMode,
+        moneyCouponPrice,
+        moneyCouponFlag,
+        couponPayWay,
+        moneyCouponType,
+        createDate,
+        delFlag
+        FROM cm_coupon WHERE configure = 1
+    </select>
+
+    <update id="updateCoupon">
+        UPDATE cm_coupon
+        SET configure = #{configure}
+        WHERE id = #{id}
+    </update>
+    <insert id="insertCoupon">
+        INSERT INTO cm_coupon(
+            name,
+            couponPayWay,
+            couponAmount,
+            touchPrice,
+            startDate,
+            endDate,
+            receivePeriod,
+            receiveFlag,
+            useTimeFlag,
+            usePeriod,
+            status,
+            couponType,
+            vipFlag,
+            userId,
+            shopId,
+            productType,
+            pcBanner,
+            appletsBanner,
+            categoryType,
+            couponsMode,
+            createDate,
+            moneyCouponPrice,
+            moneyCouponFlag,
+            moneyCouponType,
+            delFlag,
+            configure
+        ) VALUES (
+             #{name},
+             #{couponPayWay},
+             #{couponAmount},
+             #{touchPrice},
+             #{startDate},
+             #{endDate},
+             #{receivePeriod},
+             #{receiveFlag},
+             #{useTimeFlag},
+             #{usePeriod},
+             #{status},
+             #{couponType},
+             #{vipFlag},
+             #{userId},
+             #{shopId},
+             #{productType},
+             #{pcBanner},
+             #{appletsBanner},
+             #{categoryType},
+             #{couponsMode},
+             #{createDate},
+             #{moneyCouponPrice},
+             #{moneyCouponFlag},
+             #{moneyCouponType},
+             #{delFlag},
+             #{configure}
+         )
+    </insert>
+    <select id="selById" resultType="integer">
+        select max(id) as id from cm_coupon
+    </select>
+    <select id="selCouponPro" resultType="com.caimei365.tools.model.po.CmCouponAssociatePo">
+        select * from cm_coupon_product where couponId = #{couponId}
+    </select>
+    <insert id="insertCouponAssociate">
+        INSERT INTO `cm_coupon_product` (
+            `couponId`, `productId`, `pcStatus`,
+            `appletsStatus`,
+            `sort`, `addTime`, `delFlag`
+        )
+        VALUES
+            (
+                #{couponId}, #{productId}, #{pcStatus},
+                #{appletsStatus},
+                #{sort}, #{addTime}, #{delFlag}
+            )
+    </insert>
+    <select id="selSvipCouponById" resultType="integer">
+        SELECT max(id) as id FROM cm_svip_coupon_month
+    </select>
+    <insert id="insertRelation">
+        INSERT INTO cm_svip_coupon(couponId, montId, updateTime,delFlag)
+        VALUES(#{couponId}, #{montId}, #{updateTime},#{delFlag})
+    </insert>
 </mapper>