Przeglądaj źródła

feat: 会员自动升级

xdd 1 miesiąc temu
rodzic
commit
86d44ef29c

+ 6 - 1
fs-admin/src/main/java/com/fs/his/task/FsUserTask.java

@@ -1,17 +1,22 @@
 package com.fs.his.task;
 
+import com.fs.his.service.IFsUserService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 @Slf4j
 @Service("fsUserTask")
 public class FsUserTask {
 
+
+    @Autowired
+    private IFsUserService fsUserService;
     /**
      * 推广员自动升级
      */
     public void promoterAutoUpgrade(){
-
+        fsUserService.promoterAutoUpgrade();
     }
 
 }

+ 53 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -1,5 +1,6 @@
 package com.fs.his.mapper;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -411,4 +412,56 @@ public interface FsUserMapper
 
     @Update("update fs_user set status = 0,phone = null,union_id = null,is_del = 1 where user_id = #{userId}")
     void removeUser(Long userId);
+
+    @Select("select user_id from fs_user where user_id > #{lastUserId} order by user_id asc limit 500")
+    List<Long> selectPromoterAutoUpgradeData(@Param("lastUserId") Long lastUserId);
+
+    /**
+     * 获取指定用户的下级人数
+     * @param userId 用户
+     * @return 下级人数
+     */
+    @Select("SELECT COUNT(*) AS downline_count\n" +
+            "FROM fs_user\n" +
+            "WHERE spread_user_id = #{userId}")
+    Long queryDownLineCount(@Param("userId") Long userId);
+
+
+    /**
+     * 获取用户以及下线消费金额
+     * @return
+     */
+    @Select("-- 计算每个用户的个人消费\n" +
+            "WITH user_consumption AS (\n" +
+            "    SELECT \n" +
+            "        u.user_id,\n" +
+            "        u.nick_name,\n" +
+            "        u.phone,\n" +
+            "        COALESCE(SUM(o.pay_price), 0) as self_consumption\n" +
+            "    FROM fs_user u\n" +
+            "    LEFT JOIN fs_store_order o ON u.user_id = o.user_id \n" +
+            "        AND o.status IN (1, 2, 3, -1) AND o.is_pay = 1\n" +
+            "    GROUP BY u.user_id, u.nick_name, u.phone\n" +
+            "),\n" +
+            "-- 计算每个用户的下线总消费\n" +
+            "downline_consumption AS (\n" +
+            "    SELECT \n" +
+            "        u.spread_user_id as upline_id,\n" +
+            "        SUM(uc.self_consumption) as total_downline_consumption\n" +
+            "    FROM fs_user u\n" +
+            "    JOIN user_consumption uc ON u.user_id = uc.user_id\n" +
+            "    WHERE u.spread_user_id > 0  -- 只考虑有上线的用户\n" +
+            "    GROUP BY u.spread_user_id\n" +
+            ")\n" +
+            "-- 合并用户自身消费和下线消费\n" +
+            "SELECT \n" +
+            "\n" +
+            "    uc.self_consumption + COALESCE(dc.total_downline_consumption, 0) as total_money\n" +
+            "FROM user_consumption uc\n" +
+            "LEFT JOIN downline_consumption dc ON uc.user_id = dc.upline_id\n" +
+            "where uc.user_id=#{userId} \n" +
+            "ORDER BY total_money DESC;")
+    BigDecimal queryUserAndUserDownLineMoney(@Param("userId") Long userId);
+
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserService.java

@@ -224,4 +224,6 @@ public interface IFsUserService
 
     R removeUser(Long id);
 
+    void promoterAutoUpgrade();
+
 }

+ 60 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -10,6 +10,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -60,7 +61,10 @@ import com.fs.hisStore.domain.FsUserBillScrm;
 import com.fs.hisStore.domain.FsUserScrm;
 import com.fs.hisStore.enums.BillDetailEnum;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.mapper.FsUserScrmMapper;
 import com.fs.hisStore.service.IFsUserBillScrmService;
+import com.fs.hisStore.service.IFsUserScrmService;
+import com.fs.hisStore.service.impl.FsUserScrmServiceImpl;
 import com.fs.hisStore.vo.FsCompanyUserListQueryVO;
 import com.fs.qw.cache.IQwExternalContactCacheService;
 import com.fs.qw.dto.FsUserTransferParamDTO;
@@ -81,6 +85,7 @@ import com.fs.watch.service.WatchUserService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.http.util.Asserts;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -169,6 +174,9 @@ public class FsUserServiceImpl implements IFsUserService
     @Autowired
     private IFsUserWxService fsUserWxService;
 
+    @Autowired
+    private IFsUserScrmService fsUserScrmService;
+
 
     /**
      * 查询用户
@@ -1281,4 +1289,56 @@ public class FsUserServiceImpl implements IFsUserService
         return R.ok();
     }
 
+
+
+    /**
+     * 分销门槛:1级分销--下级>50人 或者消费累计满5000元 系统自动升级为1级
+     *         2级分销--下级>10人 或者消费累计满1000元 系统自动升级为2级
+     */
+    @Override
+    public void promoterAutoUpgrade() {
+        List<Long> userIds = null;
+        Long lastUserId = 0L;
+
+        do{
+            userIds = fsUserMapper.selectPromoterAutoUpgradeData(lastUserId);
+            if (userIds == null || userIds.isEmpty()) {
+                break;
+            }
+
+            for (Long userId : userIds) {
+                lastUserId = userId;
+
+                try{
+                    Integer userLevel = fsUserScrmService.queryUserLevel(userId);
+
+                    if(ObjectUtil.equal(userLevel,1)) {
+                        logger.info("用户等级为1,无须升级,直接跳过...");
+                        continue;
+                    }
+
+                    Long downLineCount = fsUserMapper.queryDownLineCount(userId);
+                    BigDecimal totalMoney = fsUserMapper.queryUserAndUserDownLineMoney(userId);
+
+                    logger.info("当前用户:{} 下线数:{} 用户和下级总消费金额:{}",userId,downLineCount,totalMoney);
+                    if(ObjectUtil.equal(userLevel,2)){
+                        if(downLineCount > 50 || totalMoney.compareTo(BigDecimal.valueOf(5000)) >= 0) {
+                            logger.info("当前用户: {} ,当前等级为{} 升级为1级{}",userId,userLevel,totalMoney);
+                            fsUserScrmService.upgradeUser(userId);
+                        }
+                    } else if(ObjectUtil.equal(userLevel,3)) {
+                        if(downLineCount > 10 || totalMoney.compareTo(BigDecimal.valueOf(1000)) >= 0) {
+                            logger.info("当前用户: {} ,当前等级为{} 升级为2级{}",userId,userLevel,totalMoney);
+                            fsUserScrmService.upgradeUser(userId);
+                        }
+                    }
+                }catch (Exception e) {
+                    logger.error("自动升级用户 {} 失败!原因: {}",userId, ExceptionUtils.getFullStackTrace(e),e);
+                }
+            }
+
+        }while (!userIds.isEmpty());
+
+    }
+
 }