Parcourir la source

训练营下单统计,大盟主统计代码

mac il y a 2 ans
Parent
commit
8497597e1d

+ 34 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/util/SysUtils.java

@@ -0,0 +1,34 @@
+package com.kxs.common.core.util;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 系统模块 操作
+ *
+ * @author 没秃顶的码农
+ * @date 2024-01-11
+ */
+public class SysUtils {
+
+    /**
+     * 通过用户的pidPath查找最近所属的上级
+     *
+     * @param pidPaths PID 路径
+     * @param userIds  用户 ID
+     * @return {@link Boolean}
+     */
+    public static Integer checkUserIsChildren(String[] pidPaths, List<Integer> userIds){
+        // 倒序循环数组
+        for (int i = pidPaths.length - 1; i >= 0; i--) {
+            boolean contains = userIds.contains(Integer.valueOf(pidPaths[i]));
+            if(contains){
+                return Integer.valueOf(pidPaths[i]);
+            }
+        }
+        return null;
+    }
+}

+ 2 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/kxsapp/ShopController.java

@@ -3,6 +3,7 @@ package com.kxs.product.biz.controller.kxsapp;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.common.core.util.R;
+import com.kxs.common.security.annotation.Inner;
 import com.kxs.product.api.model.KxsShopOrder;
 import com.kxs.product.api.dto.kxsapp.shop.GoodsSubmitDTO;
 import com.kxs.product.api.vo.kxsapp.shop.ShopGoodsListVO;
@@ -99,6 +100,7 @@ public class ShopController {
      * @param endTime 结束时间
      * @return 订单详情
      */
+    @Inner
     @GetMapping("/getDateBetweenOrders")
     public R getDateBetweenOrders(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
 

+ 3 - 0
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/KxsCampService.java

@@ -60,5 +60,8 @@ public interface KxsCampService extends IService<KxsCamp> {
      * @return {@link CampGetByIdVO}
      */
     R getByData(Integer id);
+
+    void prizePoolIsRefreshed();
+
 }
 

+ 141 - 6
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/service/impl/KxsCampServiceImpl.java

@@ -2,6 +2,9 @@ package com.kxs.system.biz.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -12,26 +15,32 @@ import com.kxs.common.core.constant.enums.ErrorTypeEnum;
 import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.core.util.R;
 import com.kxs.common.core.util.RetOps;
+import com.kxs.common.core.util.SysUtils;
 import com.kxs.common.security.util.SecurityUtils;
+import com.kxs.product.api.feign.RemoteKxsProductService;
+import com.kxs.product.api.vo.kxsapp.shop.ShopOrderGoodsUserVO;
 import com.kxs.system.api.model.KxsCampUser;
 import com.kxs.system.api.vo.admin.CampUserExcelVO;
 import com.kxs.system.api.vo.kxsapp.camp.CampGetByIdVO;
 import com.kxs.system.api.vo.kxsapp.camp.CampPageVO;
+import com.kxs.system.biz.constant.enums.CampStatusEnum;
 import com.kxs.system.biz.constant.enums.SysErrorTypeEnum;
 import com.kxs.system.biz.mapper.KxsCampMapper;
 import com.kxs.system.api.model.KxsCamp;
 import com.kxs.system.biz.mapper.KxsCampUserMapper;
+import com.kxs.system.biz.service.KxsCampBonusLogService;
 import com.kxs.system.biz.service.KxsCampService;
+import com.kxs.system.biz.service.KxsCampUserService;
 import com.kxs.user.api.feign.RemoteKxsUserService;
+import com.kxs.user.api.model.KxsLeader;
 import com.kxs.user.api.model.KxsUser;
 import com.pig4cloud.plugin.excel.vo.ErrorMessage;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.BindingResult;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.math.BigDecimal;
+import java.util.*;
 
 /**
  * 训练营(KxsCamp)表服务实现类
@@ -45,7 +54,12 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
 
     private final RemoteKxsUserService remoteKxsUserService;
 
-    private final KxsCampUserMapper kxsCampUserMapper;
+    private final RemoteKxsProductService remoteKxsProductService;
+
+
+    private final KxsCampUserService kxsCampUserService;
+
+
 
     @Override
     public R addData(KxsCamp param) {
@@ -109,7 +123,7 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
                 errorMsg.add(excel.getUserCode() + "创客未找到!");
             }
             //判断创客是否加入
-            KxsCampUser kxsCampUser = kxsCampUserMapper.selectOne(Wrappers.<KxsCampUser>lambdaQuery()
+            KxsCampUser kxsCampUser = kxsCampUserService.getOne(Wrappers.<KxsCampUser>lambdaQuery()
                     .eq(KxsCampUser::getCampId, excel.getCampId())
                     .eq(KxsCampUser::getUserId, user.getId()));
             if(kxsCampUser != null){
@@ -123,7 +137,7 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
                 campUser.setUserId(user.getId());
                 campUser.setUsername(user.getUsername());
                 campUser.setUserCode(user.getUserCode());
-                kxsCampUserMapper.insert(campUser);
+                kxsCampUserService.save(campUser);
             }
             else {
                 // 数据不合法
@@ -153,5 +167,126 @@ public class KxsCampServiceImpl extends ServiceImpl<KxsCampMapper, KxsCamp> impl
         BeanUtil.copyProperties(kxsCamp, campGetByIdVO);
         return R.ok(campGetByIdVO);
     }
+
+    @Override
+    public void prizePoolIsRefreshed() {
+        //查询正在进行中的活动
+        List<KxsCamp> list = baseMapper.selectList(Wrappers.<KxsCamp>lambdaQuery().eq(KxsCamp::getStatus, CampStatusEnum.STATUS_NORMAL.getType()));
+        //查询活动参与的创客
+        for (KxsCamp kxsCamp : list) {
+            //初始化奖金池
+            BigDecimal totalBonusPool = BigDecimal.ZERO;
+            //开机数
+            int openNum;
+            //下单数
+            int orderNum = 0;
+
+            List<KxsCampUser> campUsers = kxsCampUserService.list(Wrappers.<KxsCampUser>lambdaQuery().eq(KxsCampUser::getCampId, kxsCamp.getId()));
+            //清除参与创客的所有统计数据然后封装在map里方便统计
+            Map<Integer, KxsCampUser> campUsersMap = new HashMap<>();
+            for (KxsCampUser campUser : campUsers) {
+                KxsCampUser kxsCampUser = new KxsCampUser();
+                BeanUtil.copyProperties(campUser, kxsCampUser);
+                kxsCampUser.setTeamBonusPool(BigDecimal.ZERO);
+                kxsCampUser.setTeamOrderNum(0);
+                kxsCampUser.setTeamOpenNum(0);
+                campUsersMap.put(campUser.getUserId(), kxsCampUser);
+            }
+
+            //转换为userID集合
+            List<Integer> userIds = campUsers.stream().map(KxsCampUser::getUserId).toList();
+
+
+            /*
+             * 查询当前活动的时间区间所有电签大机的订单
+             */
+            R<List<ShopOrderGoodsUserVO>> ordersR = remoteKxsProductService.getDateBetweenOrders(LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.NORM_DATETIME_PATTERN)
+                    , LocalDateTimeUtil.format(kxsCamp.getEndTime(), DatePattern.NORM_DATETIME_PATTERN), SecurityConstants.FROM_IN);
+            List<ShopOrderGoodsUserVO> orders = RetOps.of(ordersR)
+                    .getData()
+                    .orElse(Collections.emptyList());
+            //循环区间订单查询用户的上级是否包含参与创客的ID
+            for (ShopOrderGoodsUserVO order : orders) {
+                //如果是参与者自己下的单
+                if (userIds.contains(order.getUserId())) {
+                    BigDecimal amount = NumberUtil.mul(NumberUtil.div(order.getTotalPrice(), 600), 90);
+                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+                    orderNum += NumberUtil.div(order.getTotalPrice(), 600).intValue();
+                    //刷新参与创客的团队累计
+                    KxsCampUser kxsCampUser = campUsersMap.get(order.getUserId());
+                    kxsCampUser.setTeamBonusPool(NumberUtil.add(kxsCampUser.getTeamBonusPool(), amount));
+                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + orderNum);
+                    continue;
+                }
+
+                R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(order.getUserId(), SecurityConstants.FROM_IN);
+                KxsUser user = RetOps.of(kxsUserR)
+                        .getData()
+                        .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
+                //下单用户的上级路径
+                String[] pidPaths = user.getPidPath().split(",");
+                //通过用户的pidPath倒序查找最近所属的上级
+                Integer userId = SysUtils.checkUserIsChildren(pidPaths, userIds);
+                if(userId != null){
+                    BigDecimal amount = NumberUtil.mul(NumberUtil.div(order.getTotalPrice(), 600), 90);
+                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+                    orderNum += NumberUtil.div(order.getTotalPrice(), 600).intValue();
+
+                    //刷新参与创客的团队累计
+                    KxsCampUser kxsCampUser = campUsersMap.get(order.getUserId());
+                    kxsCampUser.setTeamBonusPool(NumberUtil.add(kxsCampUser.getTeamBonusPool(), amount));
+                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + orderNum);
+                }
+            }
+
+            /*
+             * 查询活动区间开通的大盟主添加到奖金池
+             */
+            R<List<KxsLeader>> leadersR = remoteKxsUserService.getDateBetweenLeaders(LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.NORM_DATETIME_PATTERN)
+                    , LocalDateTimeUtil.format(kxsCamp.getEndTime(), DatePattern.NORM_DATETIME_PATTERN), SecurityConstants.FROM_IN);
+            List<KxsLeader> leaders = RetOps.of(leadersR)
+                    .getData()
+                    .orElse(Collections.emptyList());
+            for (KxsLeader leader : leaders) {
+                //如果是参与者自己下的单
+                if (userIds.contains(leader.getUserId())) {
+                    BigDecimal amount = new BigDecimal("2000");
+                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+
+                    //刷新参与创客的团队累计
+                    KxsCampUser kxsCampUser = campUsersMap.get(leader.getUserId());
+                    kxsCampUser.setTeamBonusPool(NumberUtil.add(kxsCampUser.getTeamBonusPool(), amount));
+                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + orderNum);
+                    continue;
+                }
+
+                R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(leader.getUserId(), SecurityConstants.FROM_IN);
+                KxsUser user = RetOps.of(kxsUserR)
+                        .getData()
+                        .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
+                //下单用户的上级路径
+                String[] pidPaths = user.getPidPath().split(",");
+                //通过用户的pidPath倒序查找最近所属的上级
+                Integer userId = SysUtils.checkUserIsChildren(pidPaths, userIds);
+                if(userId != null){
+                    BigDecimal amount = new BigDecimal("2000");
+                    totalBonusPool = NumberUtil.add(totalBonusPool, amount);
+
+                    //刷新参与创客的团队累计
+                    KxsCampUser kxsCampUser = campUsersMap.get(leader.getUserId());
+                    kxsCampUser.setTeamBonusPool(NumberUtil.add(kxsCampUser.getTeamBonusPool(), amount));
+                    kxsCampUser.setTeamOrderNum(kxsCampUser.getTeamOrderNum() + orderNum);
+                }
+            }
+
+            kxsCamp.setBonusPool(totalBonusPool);
+            kxsCamp.setOrderNum(orderNum);
+            baseMapper.updateById(kxsCamp);
+            //刷新参与创客的统计
+            kxsCampUserService.updateBatchById(new ArrayList<>(campUsersMap.values()));
+
+        }
+
+    }
 }
 

+ 11 - 39
kxs-system/kxs-system-biz/src/main/java/com/kxs/system/biz/task/KxsSystemTask.java

@@ -1,22 +1,28 @@
 package com.kxs.system.biz.task;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.NumberUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.constant.enums.ErrorTypeEnum;
 import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.core.util.R;
 import com.kxs.common.core.util.RetOps;
+import com.kxs.common.core.util.SysUtils;
 import com.kxs.common.security.annotation.Inner;
 import com.kxs.product.api.feign.RemoteKxsProductService;
 import com.kxs.product.api.vo.kxsapp.shop.ShopOrderGoodsUserVO;
 import com.kxs.system.api.model.KxsCamp;
+import com.kxs.system.api.model.KxsCampBonusLog;
 import com.kxs.system.api.model.KxsCampUser;
 import com.kxs.system.biz.constant.enums.CampStatusEnum;
+import com.kxs.system.biz.service.KxsCampBonusLogService;
 import com.kxs.system.biz.service.KxsCampService;
 import com.kxs.system.biz.service.KxsCampUserService;
 import com.kxs.user.api.feign.RemoteKxsUserService;
+import com.kxs.user.api.model.KxsLeader;
 import com.kxs.user.api.model.KxsUser;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -26,8 +32,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -45,12 +50,6 @@ public class KxsSystemTask {
 
     private final KxsCampService kxsCampService;
 
-    private final KxsCampUserService kxsCampUserService;
-
-    private final RemoteKxsProductService remoteKxsProductService;
-
-    private final RemoteKxsUserService remoteKxsUserService;
-
 
     /**
      *
@@ -68,40 +67,13 @@ public class KxsSystemTask {
      * 异步执行
      */
     @Inner
-    @GetMapping("/taskSubmitOrderAddCamp")
-    public void taskSubmitOrderAddCamp(@RequestParam("param") String para)  {
-        //查询正在进行中的活动
-        List<KxsCamp> list = kxsCampService.list(Wrappers.<KxsCamp>lambdaQuery().eq(KxsCamp::getStatus, CampStatusEnum.STATUS_NORMAL.getType()));
-        //查询活动参与的创客
-        for (KxsCamp kxsCamp : list) {
-            //初始化奖金池
-            BigDecimal totalBonusPool = BigDecimal.ZERO;
-            int openNum;
-            int orderNum;
-            List<KxsCampUser> campUsers = kxsCampUserService.list(Wrappers.<KxsCampUser>lambdaQuery().eq(KxsCampUser::getCampId, kxsCamp.getId()));
-            //转换为userID集合
-            List<Integer> userIds = campUsers.stream().map(KxsCampUser::getUserId).toList();
-            //查询当前活动的时间区间所有电签大机的订单
-            R<List<ShopOrderGoodsUserVO>> ordersR = remoteKxsProductService.getDateBetweenOrders(LocalDateTimeUtil.format(kxsCamp.getStartTime(), DatePattern.NORM_DATETIME_PATTERN)
-                    , LocalDateTimeUtil.format(kxsCamp.getEndTime(), DatePattern.NORM_DATETIME_PATTERN), SecurityConstants.FROM_IN);
-            List<ShopOrderGoodsUserVO> orders = RetOps.of(ordersR)
-                    .getData()
-                    .orElse(Collections.emptyList());
+    @GetMapping("/prizePoolIsRefreshed")
+    public void prizePoolIsRefreshed(@RequestParam("param") String para)  {
 
-            //循环区间订单查询用户的上级是否包含参与创客的ID
-            for (ShopOrderGoodsUserVO order : orders) {
-                R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(order.getUserId(), SecurityConstants.FROM_IN);
-                KxsUser user = RetOps.of(kxsUserR)
-                        .getData()
-                        .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
-                //下单用户的上级路径
-                String pidPath = user.getPidPath();
-
-            }
+        kxsCampService.prizePoolIsRefreshed();
 
+    }
 
 
-        }
 
-    }
 }

+ 14 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/feign/RemoteKxsUserService.java

@@ -4,6 +4,7 @@ package com.kxs.user.api.feign;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.util.R;
 import com.kxs.user.api.dto.kxsapp.user.RealUserDTO;
+import com.kxs.user.api.model.KxsLeader;
 import com.kxs.user.api.model.KxsUser;
 import com.kxs.user.api.model.KxsUserAdvance;
 import com.kxs.user.api.model.KxsUserAmountLog;
@@ -15,6 +16,8 @@ import org.springframework.web.service.annotation.DeleteExchange;
 import org.springframework.web.service.annotation.GetExchange;
 import org.springframework.web.service.annotation.PostExchange;
 
+import java.util.List;
+
 /**
  * @author Lxq
  * @date 2021/6/22
@@ -127,4 +130,15 @@ public interface RemoteKxsUserService {
 	@GetExchange("/user-job/userTotalDebtSub")
 	void userTotalDebtSub(@RequestHeader(SecurityConstants.FROM) String from);
 
+	/**
+	 * 查询指定时间区间的电签大机券订单
+	 *
+	 * @param from  调用标志
+	 * @param startTime 开始时间
+	 * @param endTime 结束时间
+	 */
+	@GetExchange("/leader/getDateBetweenLeaders")
+	R<List<KxsLeader>> getDateBetweenLeaders(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime, @RequestHeader(SecurityConstants.FROM) String from);
+
+
 }

+ 31 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/constant/enums/LeaderTypeEnum.java

@@ -0,0 +1,31 @@
+package com.kxs.user.biz.constant.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+
+/**
+ * 盟主类型枚举
+ *
+ * @author 没秃顶的码农
+ * @date 2024-01-02
+ */
+@Getter
+@RequiredArgsConstructor
+public enum LeaderTypeEnum {
+
+
+    SMALL_LEADER(1, "小盟主"),
+    BIG_LEADER(2, "大盟主");
+
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+
+    /**
+     * 描述
+     */
+    private final String description;
+}

+ 38 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/KxsLeaderController.java

@@ -0,0 +1,38 @@
+package com.kxs.user.biz.controller.kxsapp;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.kxs.common.core.util.R;
+import com.kxs.common.security.annotation.Inner;
+import com.kxs.user.api.model.KxsLeader;
+import com.kxs.user.biz.constant.enums.LeaderTypeEnum;
+import com.kxs.user.biz.service.KxsLeaderService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * KXS 盟主控制器
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-09
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("leader")
+public class KxsLeaderController {
+
+    private final KxsLeaderService kxsLeaderService;
+
+
+    @Inner
+    @GetMapping("getDateBetweenLeaders")
+    public R getDateBetweenLeaders(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime){
+
+        return R.ok(kxsLeaderService.list(Wrappers.<KxsLeader>lambdaQuery()
+                .eq(KxsLeader::getLeaderType, LeaderTypeEnum.BIG_LEADER.getType())
+                .between(KxsLeader::getLastBuyDate, startTime, endTime)));
+    }
+
+}

+ 2 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsLeaderService.java

@@ -3,6 +3,8 @@ package com.kxs.user.biz.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.kxs.user.api.model.KxsLeader;
 
+import java.util.List;
+
 /**
  * 盟主表(KxsLeader)表服务接口
  *

+ 2 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsLeaderServiceImpl.java

@@ -6,6 +6,8 @@ import com.kxs.user.api.model.KxsLeader;
 import com.kxs.user.biz.service.KxsLeaderService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 盟主表(KxsLeader)表服务实现类
  *