huangzhiguo 2 rokov pred
rodič
commit
310f10072d

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

@@ -1,11 +1,15 @@
 package com.caimei365.tools.controller;
 
+import com.caimei365.tools.service.CmOrganValueSystemService;
+import com.caimei365.tools.service.CmRepurchaseFrequencyService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+
 /**
  * Description
  *
@@ -17,6 +21,10 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/tools")
 public class BaseApi {
 
+    @Resource
+    private CmOrganValueSystemService cmOrganValueSystemService;
+    @Resource private CmRepurchaseFrequencyService cmRepurchaseFrequencyService;
+
     @Value(value = "${swagger.enabled}")
     private Boolean swaggerEnabled;
 
@@ -27,5 +35,15 @@ public class BaseApi {
         }
         return "欢迎使用!";
     }
+
+    @GetMapping("/test/Organ")
+    public void organData(){
+        cmOrganValueSystemService.insertOrgan();
+    }
+
+    @GetMapping("/test/Purchase")
+    public void updatePurchase(){
+        cmRepurchaseFrequencyService.insertRepurchase();
+    }
 }
 

+ 73 - 0
src/main/java/com/caimei365/tools/mapper/CmOrganValueSystemMapper.java

@@ -0,0 +1,73 @@
+package com.caimei365.tools.mapper;
+
+import com.caimei365.tools.model.po.CmOrganValueSystemPo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/24
+ */
+@Mapper
+public interface CmOrganValueSystemMapper {
+    /**
+     * 新增用户
+    */
+    List<Integer> newAdd();
+
+    /**
+     * 活跃用户
+     * @return
+     */
+    List<Integer> active();
+
+    /**
+     * 不活跃用户
+     * @return
+     */
+    List<Integer> inactive();
+
+    /**
+     * 流失用户
+     * @return
+     */
+    List<Integer> loss();
+
+    /**
+     * 回流用户
+     * @return
+     */
+    List<Integer> backflow();
+
+    /**
+     * 忠诚用户
+     * @return
+     */
+    List<Integer> loyal();
+
+    /**
+     * 沉默用户
+     * @return
+     */
+    List<Integer> silent();
+
+    /**
+     * 用户价值
+     * @return
+     */
+    List<CmOrganValueSystemPo> customerValue();
+
+    /**
+     * 修改旧数据
+     */
+    void updateOrgan();
+    /**
+     * 批量插入
+     * @param organList
+     */
+    void organBatch(CmOrganValueSystemPo organList);
+}

+ 27 - 0
src/main/java/com/caimei365/tools/mapper/CmRepurchaseFrequencyMapper.java

@@ -0,0 +1,27 @@
+package com.caimei365.tools.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/25
+ */
+@Mapper
+public interface CmRepurchaseFrequencyMapper {
+    /**
+     * 插入复购率
+     * @param storageTime
+     * @return
+     */
+    int inertrePurchase(@Param("storageTime") String storageTime);
+
+    /**
+     * 修改上阶段复购率
+     * @return
+     */
+    int updatePurchase();
+
+}

+ 25 - 0
src/main/java/com/caimei365/tools/model/po/CmOrganValueSystemPo.java

@@ -0,0 +1,25 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/24
+ */
+@Data
+public class CmOrganValueSystemPo {
+    private Integer organID;
+    private Integer userID; // 用户ID
+    private String activeState;    //活跃状态
+    private String customerValue;  //客户价值
+    private Integer stage;  //阶段:0本阶段 1上阶段 2其他阶段
+    private Integer delType;    //是否启用:0禁用状态,1启用状态(本阶段启用,其他阶段禁用)
+
+    private Double payableAmount;   //交易总金额
+    private Double number;  // 交易次数
+    private Integer orderTime;   //最近交易时间
+}

+ 23 - 0
src/main/java/com/caimei365/tools/model/po/CmRepurchaseFrequencyPo.java

@@ -0,0 +1,23 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/25
+ */
+@Data
+public class CmRepurchaseFrequencyPo {
+
+    private Integer repurchaseID ;
+    private String oneMonth ;   //一个月复购率
+    private String threeMonth ; // 三个月复购率
+    private String sixMonth ;   // 六个月复购率
+    private String twelveMonth ;    // 十二个月复购率
+    private String eighteenMonths ; // 十八个月复购率
+    private String twentyFourMonth ;    // 二十四个月复购率
+    private Integer stage ; // 阶段:0本阶段;1上阶段;2其他阶段
+    private String storageTime ;     // 存储时间
+}

+ 12 - 0
src/main/java/com/caimei365/tools/service/CmOrganValueSystemService.java

@@ -0,0 +1,12 @@
+package com.caimei365.tools.service;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/24
+ */
+public interface CmOrganValueSystemService {
+
+    void insertOrgan();
+}

+ 12 - 0
src/main/java/com/caimei365/tools/service/CmRepurchaseFrequencyService.java

@@ -0,0 +1,12 @@
+package com.caimei365.tools.service;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/25
+ */
+public interface CmRepurchaseFrequencyService {
+
+    void insertRepurchase();
+}

+ 117 - 0
src/main/java/com/caimei365/tools/service/impl/CmOrganValueSystemServiceImpl.java

@@ -0,0 +1,117 @@
+package com.caimei365.tools.service.impl;
+
+import com.caimei365.tools.mapper.CmOrganValueSystemMapper;
+import com.caimei365.tools.model.po.CmOrganValueSystemPo;
+import com.caimei365.tools.service.CmOrganValueSystemService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/24
+ */
+@Slf4j
+@Service
+public class CmOrganValueSystemServiceImpl implements CmOrganValueSystemService {
+
+    @Resource private CmOrganValueSystemMapper cmOrganValueSystemMapper;
+
+
+    @Override
+    public void insertOrgan() {
+
+        List<CmOrganValueSystemPo> list = new ArrayList();
+        // 新增用户
+        List<Integer> newAdd = cmOrganValueSystemMapper.newAdd();
+        // 活跃用户
+        List<Integer> active = cmOrganValueSystemMapper.active();
+        // 不活跃用户
+        List<Integer> inactive = cmOrganValueSystemMapper.inactive();
+        // 流失用户
+        List<Integer> loss = cmOrganValueSystemMapper.loss();
+        // 回流用户
+        List<Integer> backflow = cmOrganValueSystemMapper.backflow();
+        // 忠诚用户
+        List<Integer> loyal = cmOrganValueSystemMapper.loyal();
+        // 沉默用户
+        List<Integer> silent = cmOrganValueSystemMapper.silent();
+        // 客户价值
+        List<CmOrganValueSystemPo> customerValue = cmOrganValueSystemMapper.customerValue();
+
+        // 更改上一阶段数据
+        cmOrganValueSystemMapper.updateOrgan();
+
+        log.info("插入--------------------------------》");
+        for(CmOrganValueSystemPo organValueSystem: customerValue) {
+
+            CmOrganValueSystemPo systemPo = new CmOrganValueSystemPo();
+            // 判断用户活跃状态
+            if(newAdd.contains(organValueSystem.getUserID())) {
+                systemPo.setActiveState("新增用户");
+            }
+            if(active.contains(organValueSystem.getUserID())) {
+                systemPo.setActiveState("活跃用户");
+            }
+            if(inactive.contains(organValueSystem.getUserID())) {
+                systemPo.setActiveState("不活跃用户");
+            }
+            if(loss.contains(organValueSystem.getUserID())) {
+                systemPo.setActiveState("流失用户");
+            }
+            if(backflow.contains(organValueSystem.getUserID())) {
+                systemPo.setActiveState("回流用户");
+            }
+            if(loyal.contains(organValueSystem.getUserID())) {
+                systemPo.setActiveState("忠诚用户");
+            }
+            if(silent.contains(organValueSystem.getUserID())) {
+                systemPo.setActiveState("沉默用户");
+            }
+
+            // 判断客户价值
+            // 距今时间
+            Integer orderTimeDay = organValueSystem.getOrderTime();
+            // 购买频率
+            Double number = organValueSystem.getNumber()/24;
+            // 交易金额
+            Double payableAmount = organValueSystem.getPayableAmount()/24;
+            if (orderTimeDay > 60 && number >= 1 && payableAmount < 100000) {
+                systemPo.setCustomerValue("一般保持客户");
+            }
+            if (orderTimeDay < 60 && number < 1 && payableAmount < 100000) {
+                systemPo.setCustomerValue("一般发展客户");
+            }
+            if (orderTimeDay < 60 && number >= 1 && payableAmount < 100000) {
+                systemPo.setCustomerValue("一般价值客户");
+            }
+            if (orderTimeDay > 60 && number < 1 && payableAmount < 100000) {
+                systemPo.setCustomerValue("一般挽留客户");
+            }
+            if (orderTimeDay > 60 && number >= 1 && payableAmount >= 100000) {
+                systemPo.setCustomerValue("重要保持客户");
+            }
+            if (orderTimeDay < 60 && number < 1 && payableAmount >= 100000) {
+                systemPo.setCustomerValue("重要发展客户");
+            }
+            if (orderTimeDay < 60 && number >= 1 && payableAmount >= 100000) {
+                systemPo.setCustomerValue("重要价值客户");
+            }
+            if (orderTimeDay > 60 && number < 1 && payableAmount >= 100000) {
+                systemPo.setCustomerValue("一般保持客户");
+            }
+
+            systemPo.setUserID(organValueSystem.getUserID());
+            systemPo.setStage(0);
+            systemPo.setDelType(1);
+
+            // 添加新数据
+            cmOrganValueSystemMapper.organBatch(systemPo);
+        }
+    }
+}

+ 36 - 0
src/main/java/com/caimei365/tools/service/impl/CmRepurchaseFrequencyServiceImpl.java

@@ -0,0 +1,36 @@
+package com.caimei365.tools.service.impl;
+
+import com.caimei365.tools.mapper.CmRepurchaseFrequencyMapper;
+import com.caimei365.tools.service.CmRepurchaseFrequencyService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/25
+ */
+@Slf4j
+@Service
+public class CmRepurchaseFrequencyServiceImpl implements CmRepurchaseFrequencyService {
+
+    @Resource private CmRepurchaseFrequencyMapper cmRepurchaseFrequencyMapper;
+
+    @Override
+    public void insertRepurchase() {
+        log.info("复购率插入-----------------》");
+        // 修改复购率
+        cmRepurchaseFrequencyMapper.updatePurchase();
+
+        // 插入本阶段复购率
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
+        String format = simpleDateFormat.format(new Date());
+
+        cmRepurchaseFrequencyMapper.inertrePurchase(format);
+    }
+}

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

@@ -0,0 +1,25 @@
+package com.caimei365.tools.task;
+
+import com.caimei365.tools.service.CmOrganValueSystemService;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import javax.annotation.Resource;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/24
+ */
+public class CmOrganValueSystemTask {
+
+    @Resource private CmOrganValueSystemService cmOrganValueSystemService;
+
+    /**
+     * 每月一号更新用户活跃状态、用户价值
+     */
+    @Scheduled(cron = "0 15 0 1 * ?")
+    public void organData(){
+        cmOrganValueSystemService.insertOrgan();
+    }
+}

+ 25 - 0
src/main/java/com/caimei365/tools/task/CmRepurchaseFrequencyTask.java

@@ -0,0 +1,25 @@
+package com.caimei365.tools.task;
+
+import com.caimei365.tools.service.CmRepurchaseFrequencyService;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import javax.annotation.Resource;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/10/25
+ */
+public class CmRepurchaseFrequencyTask {
+
+    @Resource private CmRepurchaseFrequencyService cmRepurchaseFrequencyService;
+
+    /**
+     * 每月一号更新用户活跃状态、用户价值
+     */
+    @Scheduled(cron = "0 50 23 L * ?")
+    public void organData(){
+        cmRepurchaseFrequencyService.insertRepurchase();
+    }
+}

+ 265 - 0
src/main/resources/mapper/CmOrganValueSystemMapper.xml

@@ -0,0 +1,265 @@
+<?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.caimei365.tools.mapper.CmOrganValueSystemMapper">
+
+    <select id="newAdd" resultType="java.lang.Integer">
+        SELECT DISTINCT userID FROM USER WHERE TIMESTAMPDIFF(DAY , registerTime,NOW()) <![CDATA[ <= ]]> 30
+    </select>
+    <select id="active" resultType="java.lang.Integer">
+        SELECT DISTINCT userID FROM USER WHERE TIMESTAMPDIFF(DAY, registerTime, NOW()) > 30 AND TIMESTAMPDIFF(DAY, loginTime, NOW()) <![CDATA[ <= ]]> 90
+        AND userID NOT IN (
+        SELECT DISTINCT userID FROM USER WHERE
+        userID IN (
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(DAY , u.registerTime,NOW()) <![CDATA[ <= ]]> 30 )
+        AND  u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        AND u.userID NOT IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        )
+        AND userID IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR, loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        AND userID IN (
+        SELECT userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2 AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+
+        )
+        )
+        UNION
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE TIMESTAMPDIFF(DAY, u.loginTIme, NOW()) <![CDATA[ <= ]]> 90
+        AND u.userID NOT IN(SELECT userID FROM USER WHERE TIMESTAMPDIFF(DAY, registerTime, NOW()) <![CDATA[ < ]]> 30)
+        AND TIMESTAMPDIFF(YEAR, cod.orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+
+    </select>
+    <select id="inactive" resultType="java.lang.Integer">
+        SELECT DISTINCT userID FROM USER WHERE userID NOT IN ( SELECT  userID FROM USER WHERE TIMESTAMPDIFF(DAY , registerTime,NOW()) <![CDATA[ <= ]]> 30 )
+        AND userID NOT IN (
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE  u.userID NOT IN ( SELECT  userID FROM USER WHERE TIMESTAMPDIFF(DAY , registerTime,NOW()) <![CDATA[ <= ]]> 30 ) -- AND u.userID = 100351
+        AND  u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        AND u.userID NOT IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        UNION
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(DAY, loginTime, NOW()) <![CDATA[ <= ]]> 90
+        UNION
+        SELECT DISTINCT u.userID FROM  USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE u.userID NOT IN (
+        SELECT userID FROM USER WHERE  TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        UNION
+        SELECT DISTINCT userID FROM USER WHERE
+        userID IN (
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(DAY , u.registerTime,NOW()) <![CDATA[ <= ]]> 30 )
+        AND  u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        AND u.userID NOT IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        )
+        AND userID IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR, loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        AND userID IN (
+        SELECT userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2 AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        )
+        AND u.userID IN (
+        SELECT userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        )
+
+    </select>
+    <select id="loss" resultType="java.lang.Integer">
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE u.userID NOT IN (SELECT  userID FROM USER WHERE TIMESTAMPDIFF(DAY , registerTime,NOW()) <![CDATA[ <= ]]> 30 )
+        AND  u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        AND u.userID NOT IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+    </select>
+
+    <select id="backflow" resultType="java.lang.Integer">
+        SELECT DISTINCT userID FROM USER WHERE
+        userID IN (
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(DAY , u.registerTime,NOW()) <![CDATA[ <= ]]> 30 )
+        AND  u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        AND u.userID NOT IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        )
+        AND userID IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR, loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        AND userID IN (
+        SELECT userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2 AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+
+    </select>
+    <select id="loyal" resultType="java.lang.Integer">
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE TIMESTAMPDIFF(DAY, u.loginTIme, NOW()) <![CDATA[ <= ]]> 90
+        AND u.userID NOT IN(SELECT userID FROM USER WHERE TIMESTAMPDIFF(DAY, registerTime, NOW()) <![CDATA[ < ]]> 30)
+        AND TIMESTAMPDIFF(YEAR, cod.orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+    </select>
+    <select id="silent" resultType="java.lang.Integer">
+
+        SELECT DISTINCT u.userID FROM  USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE u.userID NOT IN (
+        SELECT userID FROM USER WHERE  TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        AND u.userID IN
+        (
+        SELECT userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        AND u.userID NOT IN (
+        SELECT DISTINCT userID FROM USER WHERE
+        userID IN (
+        SELECT DISTINCT u.userID FROM USER u LEFT JOIN cm_order cod ON u.userID = cod.userID
+        WHERE u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(DAY , u.registerTime,NOW()) <![CDATA[ <= ]]> 30 )
+        AND  u.userID NOT IN (SELECT  userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2
+        AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        AND u.userID NOT IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR,loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        )
+        AND userID IN (
+        SELECT userID FROM USER WHERE TIMESTAMPDIFF(YEAR, loginTime, NOW()) <![CDATA[ < ]]> 2
+        )
+        AND userID IN (
+        SELECT userID FROM cm_order WHERE TIMESTAMPDIFF(YEAR, orderTime, NOW()) <![CDATA[ < ]]> 2 AND orderNo NOT IN (
+        SELECT orderNo FROM cm_order WHERE
+        STATUS = 6 OR refundType = 2
+        OR orderID IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        )
+        )
+        )
+    </select>
+    <select id="customerValue" resultType="com.caimei365.tools.model.po.CmOrganValueSystemPo">
+        SELECT u.userID as userID,IFNULL(b.payableAmount, 0)as payableAmount,IFNULL(b.num, 0) as number,TIMESTAMPDIFF(DAY, IFNULL(b.orderTime, '2000-01-01 00:00:00'), NOW()) as orderTime
+        FROM USER u LEFT JOIN
+            (SELECT DISTINCT u.userID AS userID,SUM(co.payableAmount) AS payableAmount,COUNT(co.orderNo) AS num,MAX(co.orderTime) AS orderTime FROM USER u LEFT JOIN cm_order co ON u.userID = co.userID
+            WHERE TIMESTAMPDIFF(YEAR, co.orderTime, NOW()) <![CDATA[ < ]]> 2
+            AND co.orderNo NOT IN (
+                SELECT orderNo FROM cm_order WHERE
+                STATUS = 6 OR refundType = 2
+                OR orderID IN (
+                        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+                    )
+            )
+            GROUP BY u.userID
+        ) b ON u.userID = b.userID
+    </select>
+
+    <update id="updateOrgan">
+        UPDATE cm_organ_value_system
+        SET stage = ( CASE stage
+                      WHEN 0 THEN 1
+                      WHEN 1 THEN 2
+            END), delType = 0
+        WHERE organID IS NOT NULL
+    </update>
+
+    <insert id="organBatch" parameterType="java.util.List">
+        insert into cm_organ_value_system
+        (userID, activeState, customerValue, stage, delType)
+        values
+        (#{userID},#{activeState},#{customerValue},#{stage},#{delType})
+    </insert>
+</mapper>

+ 149 - 0
src/main/resources/mapper/CmRepurchaseFrequencyMapper.xml

@@ -0,0 +1,149 @@
+<?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.caimei365.tools.mapper.CmRepurchaseFrequencyMapper">
+    <insert id="inertrePurchase">
+        INSERT INTO cm_repurchase_frequency(oneMonth, threeMonth, sixMonth, twelveMonth, eighteenMonths, twentyFourMonth, stage, storageTime)
+        VALUES(
+        -- 1个月复购率
+        (SELECT IFNULL(SUM(b.repeatOde)/SUM(a.ode), 0) FROM
+        (
+        SELECT userID, COUNT(orderNo) AS ode FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 1
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID
+        ) a LEFT JOIN
+        (
+        SELECT userID, COUNT(orderNo) AS repeatOde FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 1
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID HAVING COUNT(orderNo) > 1
+        ) b ON a.userID = b.userID)
+        ,
+
+        -- 3个月复购率
+        (SELECT IFNULL(SUM(b.repeatOde)/SUM(a.ode), 0) FROM
+        (
+        SELECT userID, COUNT(orderNo) AS ode FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 3
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID
+        ) a LEFT JOIN
+        (
+        SELECT userID, COUNT(orderNo) AS repeatOde FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 3
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID HAVING COUNT(orderNo) > 1
+        ) b ON a.userID = b.userID)
+        ,
+
+        -- 6个月复购率
+        (SELECT IFNULL(SUM(b.repeatOde)/SUM(a.ode), 0) FROM
+        (
+        SELECT userID, COUNT(orderNo) AS ode FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 6
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID
+        ) a LEFT JOIN
+        (
+        SELECT userID, COUNT(orderNo) AS repeatOde FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 6
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID HAVING COUNT(orderNo) > 1
+        ) b ON a.userID = b.userID)
+        ,
+
+        -- 12个月复购率
+        (SELECT IFNULL(SUM(b.repeatOde)/SUM(a.ode), 0) FROM
+        (
+        SELECT userID, COUNT(orderNo) AS ode FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 12
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID
+        ) a LEFT JOIN
+        (
+        SELECT userID, COUNT(orderNo) AS repeatOde FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 12
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID HAVING COUNT(orderNo) > 1
+        ) b ON a.userID = b.userID)
+        ,
+
+        -- 18个月复购率
+        (SELECT IFNULL(SUM(b.repeatOde)/SUM(a.ode), 0) FROM
+        (
+        SELECT userID, COUNT(orderNo) AS ode FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 18
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID
+        ) a LEFT JOIN
+        (
+        SELECT userID, COUNT(orderNo) AS repeatOde FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 18
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID HAVING COUNT(orderNo) > 1
+        ) b ON a.userID = b.userID)
+        ,
+
+        -- 24个月复购率
+        (SELECT IFNULL(SUM(b.repeatOde)/SUM(a.ode), 0) FROM
+        (
+        SELECT userID, COUNT(orderNo) AS ode FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 24
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID
+        ) a LEFT JOIN
+        (
+        SELECT userID, COUNT(orderNo) AS repeatOde FROM cm_order
+        WHERE TIMESTAMPDIFF(MONTH, orderTime, NOW()) <![CDATA[ < ]]> 24
+        AND STATUS !=6 AND refundType != 2
+        AND orderID NOT IN (
+        SELECT orderID FROM cm_order_product WHERE productID IN (6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069) GROUP BY orderID
+        )
+        GROUP BY userID HAVING COUNT(orderNo) > 1
+        ) b ON a.userID = b.userID)
+        ,
+        '0',#{storageTime}
+        )
+
+    </insert>
+    <update id="updatePurchase">
+        UPDATE cm_repurchase_frequency
+        SET stage = (CASE stage
+                     WHEN 0 THEN 1
+                     WHEN 1 THEN 2
+            END)
+    </update>
+</mapper>