From ba0b2f6379c204d238346c7c436835530795ccac Mon Sep 17 00:00:00 2001
From: hly <2783385703@qq.com>
Date: Sat, 23 Aug 2025 16:34:38 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/views/model/AppletConfig/hhindex.vue | 30 ++--
.../contoller/ApiMallUserTeacherController.java | 9 ++
.../com/ruoyi/applet/tencent/TaskConsumer.java | 11 ++
.../java/com/ruoyi/job/PartnerLevelCheckJob.java | 178 +++++++++++++++++++++
.../java/com/ruoyi/model/domain/AppletConfig.java | 16 +-
.../service/IAApiAppletHhrWorkOutService.java | 3 +-
.../impl/AApiAppletHhrWorkOutServiceImpl.java | 177 +++++++++++++++++++-
7 files changed, 407 insertions(+), 17 deletions(-)
create mode 100644 ruoyi-catdog/src/main/java/com/ruoyi/job/PartnerLevelCheckJob.java
diff --git a/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue b/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue
index a5377c4..2c41e5b 100644
--- a/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue
+++ b/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue
@@ -99,15 +99,18 @@
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
@@ -159,11 +162,20 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java
index c77c96b..0da79ed 100644
--- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java
+++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java
@@ -50,6 +50,9 @@ public class ApiMallUserTeacherController extends BaseController {
@Autowired
private MemberWechatService memberWechatService;
+ @Autowired
+ private IAApiAppletHhrWorkOutService apiAppletHhrWorkOutService;
+
//mall-首页周边伴宠师
@ApiOperation("mall-首页周边伴宠师接口")
@GetMapping("/getTeacherListIndex")
@@ -370,6 +373,12 @@ public class ApiMallUserTeacherController extends BaseController {
member.setSpreadUid(users.getUserId());
memberMapper.updateById(member);
+ try {
+ apiAppletHhrWorkOutService.checkPartnerUpgrade(users.getUserId());
+ }catch (Exception e){
+ log.error(e.getMessage());
+ }
+
return AjaxResult.success();
}
diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java
index 7661fca..d7234f4 100644
--- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java
+++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java
@@ -107,6 +107,8 @@ public class TaskConsumer implements QueueConsumer {
@Autowired
private IAppletConfigService appletConfigService;
+ @Autowired
+ private IAApiAppletHhrWorkOutService apiAppletHhrWorkOutService;
private class TaskThread extends Thread {
@@ -147,6 +149,8 @@ public class TaskConsumer implements QueueConsumer {
startOrder(h5OrderVO, model.getOrder());
+
+
} catch (Exception e) {
log.error("task消费异常:{}", e);
}
@@ -157,6 +161,13 @@ public class TaskConsumer implements QueueConsumer {
private void smsHandler(Order order) {
try {
Member member = memberService.selectById(order.getMemberId());
+
+ try {
+ apiAppletHhrWorkOutService.checkPartnerUpgrade(member.getSpreadUid());
+ }catch (Exception e){
+ log.error(e.getMessage());
+ }
+
String phone = memberService.getPhoneDecrypted(member.getPhoneEncrypted());
//TODO 查询订单的开始日期和结束日期
diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/job/PartnerLevelCheckJob.java b/ruoyi-catdog/src/main/java/com/ruoyi/job/PartnerLevelCheckJob.java
new file mode 100644
index 0000000..17ad3fc
--- /dev/null
+++ b/ruoyi-catdog/src/main/java/com/ruoyi/job/PartnerLevelCheckJob.java
@@ -0,0 +1,178 @@
+package com.ruoyi.job;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyl.manager.oms.domain.Order;
+import com.cyl.manager.oms.mapper.OrderMapper;
+import com.cyl.manager.ums.domain.Member;
+import com.cyl.manager.ums.mapper.MemberMapper;
+import com.ruoyi.model.domain.AppUsers;
+import com.ruoyi.model.domain.AppletConfig;
+import com.ruoyi.model.service.IAppUsersService;
+import com.ruoyi.model.service.IAppletConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 合伙人等级检查定时任务
+ * 每月检查合伙人是否达到保段要求,未达标则降级
+ *
+ * @author system
+ */
+@Component
+@Slf4j
+public class PartnerLevelCheckJob {
+
+ @Autowired
+ private IAppUsersService appUsersService;
+
+ @Autowired
+ private IAppletConfigService appletConfigService;
+
+ @Autowired
+ private MemberMapper memberMapper;
+
+ @Autowired
+ private OrderMapper orderMapper;
+
+ /**
+ * 每月1号凌晨3点执行合伙人等级检查
+ * 检查上个月的数据是否达到保段要求
+ */
+ @Async
+ @Scheduled(cron = "0 0 3 1 * ?")
+ public void checkPartnerLevel() {
+ log.info("定时任务[合伙人等级检查]开始执行");
+
+ try {
+ // 获取所有合伙人用户(userHh = 1 且 userHhRole > 0)
+ List partners = appUsersService.list(
+ Wrappers.lambdaQuery()
+ .eq(AppUsers::getUserHh, 1)
+ .gt(AppUsers::getUserHhRole, 0)
+ );
+
+ if (partners.isEmpty()) {
+ log.info("当前没有合伙人用户需要检查");
+ return;
+ }
+
+ // 获取上个月的时间范围
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime lastMonthStart = now.minusMonths(1)
+ .with(TemporalAdjusters.firstDayOfMonth())
+ .withHour(0).withMinute(0).withSecond(0).withNano(0);
+ LocalDateTime lastMonthEnd = now.minusMonths(1)
+ .with(TemporalAdjusters.lastDayOfMonth())
+ .withHour(23).withMinute(59).withSecond(59);
+
+ int totalChecked = 0;
+ int totalDowngraded = 0;
+
+ for (AppUsers partner : partners) {
+ totalChecked++;
+
+ // 获取当前等级的保段要求
+ AppletConfig currentLevelConfig = appletConfigService.getOne(
+ Wrappers.lambdaQuery()
+ .eq(AppletConfig::getParamClass, "pet_payment_hh")
+ .eq(AppletConfig::getParamValueNum, partner.getUserHhRole())
+ );
+
+ if (currentLevelConfig == null) {
+ log.warn("合伙人用户ID: {} 的等级配置不存在,跳过检查", partner.getUserId());
+ continue;
+ }
+
+ // 获取保段要求
+ Integer keepUserNum = currentLevelConfig.getKeepUserNum(); // 保段注册人数
+ Integer keepOrderUserNum = currentLevelConfig.getKeepOrderUserNum(); // 保段下单人数
+
+ if (keepUserNum == null || keepOrderUserNum == null) {
+ log.warn("合伙人用户ID: {} 的等级保段要求未配置,跳过检查", partner.getUserId());
+ continue;
+ }
+
+ // 获取用户邀请码
+ String invitationCode = appUsersService.getUserCode(partner.getUserId());
+
+ // 统计上个月通过邀请码注册的用户数
+ Integer monthRegisterUsers = memberMapper.selectCount(
+ Wrappers.lambdaQuery()
+ .eq(Member::getInviteCode, invitationCode)
+ .ge(Member::getCreateTime, lastMonthStart)
+ .le(Member::getCreateTime, lastMonthEnd)
+ );
+
+ // 获取通过邀请码注册的所有用户ID列表
+ List invitedMembers = memberMapper.selectList(
+ Wrappers.lambdaQuery()
+ .select(Member::getId)
+ .eq(Member::getInviteCode, invitationCode)
+ );
+
+ List memberIds = new ArrayList<>();
+ for (Member member : invitedMembers) {
+ memberIds.add(member.getId());
+ }
+
+ // 统计上个月下单用户数(排除待支付和已关闭订单)
+ Integer monthOrderUsers = 0;
+ if (!memberIds.isEmpty()) {
+ List monthOrderList = orderMapper.selectList(
+ Wrappers.lambdaQuery()
+ .select(Order::getMemberId)
+ .in(Order::getMemberId, memberIds)
+ .notIn(Order::getStatus, 0, 4) // 排除待支付和已关闭订单
+ .ge(Order::getCreateTime, lastMonthStart)
+ .le(Order::getCreateTime, lastMonthEnd)
+ .groupBy(Order::getMemberId)
+ );
+ monthOrderUsers = monthOrderList.size();
+ }
+
+ // 检查是否达到保段要求
+ boolean meetRequirement = monthRegisterUsers >= keepUserNum && monthOrderUsers >= keepOrderUserNum;
+
+ log.info("合伙人用户ID: {}, 当前等级: {}, 上月注册用户: {}/{}, 上月下单用户: {}/{}, 是否达标: {}",
+ partner.getUserId(), partner.getUserHhRole(),
+ monthRegisterUsers, keepUserNum,
+ monthOrderUsers, keepOrderUserNum,
+ meetRequirement);
+
+ // 如果未达到保段要求,则降级
+ if (!meetRequirement && partner.getUserHhRole() > 0) {
+ int newLevel = partner.getUserHhRole() - 1;
+
+ // 更新用户等级
+ boolean updateResult = appUsersService.lambdaUpdate()
+ .eq(AppUsers::getUserId, partner.getUserId())
+ .set(AppUsers::getUserHhRole, newLevel)
+ .update();
+
+ if (updateResult) {
+ totalDowngraded++;
+ log.info("合伙人用户ID: {} 因未达保段要求,等级从 {} 降至 {}",
+ partner.getUserId(), partner.getUserHhRole(), newLevel);
+ } else {
+ log.error("合伙人用户ID: {} 等级降级失败", partner.getUserId());
+ }
+ } else if (!meetRequirement && partner.getUserHhRole() == 0) {
+ log.info("合伙人用户ID: {} 已是最低等级(0级),无法继续降级", partner.getUserId());
+ }
+ }
+
+ log.info("定时任务[合伙人等级检查]执行完成,共检查 {} 个合伙人,降级 {} 个", totalChecked, totalDowngraded);
+
+ } catch (Exception e) {
+ log.error("定时任务[合伙人等级检查]执行异常", e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java
index 731caf7..d2ee2ce 100644
--- a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java
+++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java
@@ -157,9 +157,21 @@ public class AppletConfig
private Integer paramValueNum;
/** 参数值-达成人数 */
- @Excel(name = "参数值-达成人数")
+ @Excel(name = "参数值-需要注册人数")
private Integer paramCondition;
+ /** 参数值-达成人数 */
+ @Excel(name = "参数值-需要下单人数")
+ private Integer needOrderUserNum;
+
+ /** 参数值-达成人数 */
+ @Excel(name = "参数值-保段注册人数")
+ private Integer keepUserNum;
+
+ /** 参数值-达成人数 */
+ @Excel(name = "参数值-保段下单人数")
+ private Integer keepOrderUserNum;
+
/** 参数值-百分比 */
@Excel(name = "参数值-百分比")
private BigDecimal paramValueNo;
@@ -168,14 +180,12 @@ public class AppletConfig
@Excel(name = "分类")
private String paramClass;
-
/** 创建人 */
private String createBy;
/** 创建时间 */
private LocalDateTime createTime;
-
/** 修改时间 */
private LocalDateTime updateTime;
diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletHhrWorkOutService.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletHhrWorkOutService.java
index 3394420..0d43a6a 100644
--- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletHhrWorkOutService.java
+++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletHhrWorkOutService.java
@@ -20,6 +20,7 @@ public interface IAApiAppletHhrWorkOutService {
//合伙人工作台 - 根据用户标识查询用户下单详细信息
AjaxResult HhrMyUserGetById(Long appUserId);
-
+ //合伙人等级升级检查
+ AjaxResult checkPartnerUpgrade(Long appUserId);
}
diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java
index a0f7501..491e78a 100644
--- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java
+++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java
@@ -69,8 +69,7 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer
Map map = new HashMap<>();
map.put("info",appUsers); //用户信息
-// map.put("partner_level","初级合伙人"); //合伙人等级
-
+
// 计算合伙人入住天数
long partnerDays = 0;
if (appUsers.getCreateTime() != null) {
@@ -85,8 +84,9 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer
if (petPaymentHh != null){
map.put("partner_new_num",petPaymentHh.getParamValueText()); //合伙人当前合伙人比例
map.put("partner_new_image",petPaymentHh.getParamValueImage()); //合伙人当前合伙人比例
+ map.put("partner_level", petPaymentHh.getParamValue()); //合伙人等级
}else {
- map.put("partner_new_num", 0); //合伙人当前合伙人比例
+// map.put("partner_new_num", 0); //合伙人当前合伙人比例
}
AppletConfig partner_upgrade_num = appletConfigService.selectAppletConfigByClassAndNum("pet_payment_hh", appUsers.getUserHhRole()+1);
@@ -94,10 +94,11 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer
if (partner_upgrade_num != null){
map.put("partner_upgrade_num", partner_upgrade_num.getParamValueText()); //合伙人晋级之后的合伙人比例
}else {
- map.put("partner_upgrade_num", -1); //合伙人晋级之后的合伙人比例
+// map.put("partner_upgrade_num", -1); //合伙人晋级之后的合伙人比例
}
map.put("user_code", appUsersService.getUserCode(appUserId)); //邀请码
+ map.put("level_list", appletConfigService.lambdaQuery().eq(AppletConfig::getParamClass, "pet_payment_hh").list()); //等级列表
map.put("user_code_bj","https://image.hhlm1688.com/img/work/log/indexInfo/11.png"); //邀请码背景图
map.put("user_code_fx","https://image.hhlm1688.com/img/work/log/indexInfo/11.png"); //分享海报背景图
map.put("user_code_url","https://image.hhlm1688.com/img/work/log/indexInfo/11.png"); //分销链接背景图
@@ -387,5 +388,173 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer
return AjaxResult.success("用户下单详细信息成功",map);
}
+ //合伙人等级升级检查
+ @Override
+ public AjaxResult checkPartnerUpgrade(Long appUserId) {
+ try {
+ // 获取用户信息
+ AppUsers appUsers = appUsersService.selectAppUsersByUserId(appUserId);
+ if (appUsers == null) {
+ return AjaxResult.error("用户不存在");
+ }
+
+ // 检查是否为合伙人
+ if (appUsers.getUserHh() == null || appUsers.getUserHh() != 1) {
+ return AjaxResult.error("用户不是合伙人");
+ }
+
+ Integer currentLevel = appUsers.getUserHhRole();
+ if (currentLevel == null) {
+ currentLevel = 0;
+ }
+
+ // 获取下一个等级的配置
+ AppletConfig nextLevelConfig = appletConfigService.getOne(
+ Wrappers.lambdaQuery()
+ .eq(AppletConfig::getParamClass, "pet_payment_hh")
+ .eq(AppletConfig::getParamValueNum, currentLevel + 1)
+ );
+
+ if (nextLevelConfig == null) {
+ return AjaxResult.success("已是最高等级,无法继续升级");
+ }
+
+ // 获取升级要求
+ Integer needRegisterNum = nextLevelConfig.getParamCondition(); // 需要注册人数
+ Integer needOrderUserNum = nextLevelConfig.getNeedOrderUserNum(); // 需要下单人数
+
+ if (needRegisterNum == null || needOrderUserNum == null) {
+ return AjaxResult.error("下一等级升级条件未配置");
+ }
+
+ // 获取当前等级的保段要求
+ AppletConfig currentLevelConfig = appletConfigService.getOne(
+ Wrappers.lambdaQuery()
+ .eq(AppletConfig::getParamClass, "pet_payment_hh")
+ .eq(AppletConfig::getParamValueNum, currentLevel)
+ );
+
+ Integer keepUserNum = 0;
+ Integer keepOrderUserNum = 0;
+ if (currentLevelConfig != null) {
+ keepUserNum = currentLevelConfig.getKeepUserNum() != null ? currentLevelConfig.getKeepUserNum() : 0;
+ keepOrderUserNum = currentLevelConfig.getKeepOrderUserNum() != null ? currentLevelConfig.getKeepOrderUserNum() : 0;
+ }
+
+ // 获取用户邀请码
+ String invitationCode = appUsersService.getUserCode(appUserId);
+
+ // 获取当月时间范围
+ LocalDateTime monthStart = LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).withNano(0);
+ LocalDateTime monthEnd = LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59);
+
+ // 统计累积注册用户
+ Integer totalRegisterUsers = memberMapper.selectCount(
+ Wrappers.lambdaQuery()
+ .eq(Member::getInviteCode, invitationCode)
+ );
+
+ // 统计当月注册用户
+ Integer monthRegisterUsers = memberMapper.selectCount(
+ Wrappers.lambdaQuery()
+ .eq(Member::getInviteCode, invitationCode)
+ .ge(Member::getCreateTime, monthStart)
+ .le(Member::getCreateTime, monthEnd)
+ );
+
+ // 获取通过邀请码注册的所有用户ID列表
+ List invitedMembers = memberMapper.selectList(
+ Wrappers.lambdaQuery()
+ .select(Member::getId)
+ .eq(Member::getInviteCode, invitationCode)
+ );
+
+ List memberIds = new ArrayList<>();
+ for (Member member : invitedMembers) {
+ memberIds.add(member.getId());
+ }
+
+ // 统计累积下单用户
+ Integer totalOrderUsers = 0;
+ Integer monthOrderUsers = 0;
+
+ if (!memberIds.isEmpty()) {
+ // 累积下单用户
+ List totalOrderList = orderMapper.selectList(
+ Wrappers.lambdaQuery()
+ .select(Order::getMemberId)
+ .in(Order::getMemberId, memberIds)
+ .notIn(Order::getStatus, 0, 4) // 排除待支付和已关闭订单
+ .groupBy(Order::getMemberId)
+ );
+ totalOrderUsers = totalOrderList.size();
+
+ // 当月下单用户
+ List monthOrderList = orderMapper.selectList(
+ Wrappers.lambdaQuery()
+ .select(Order::getMemberId)
+ .in(Order::getMemberId, memberIds)
+ .notIn(Order::getStatus, 0, 4) // 排除待支付和已关闭订单
+ .ge(Order::getCreateTime, monthStart)
+ .le(Order::getCreateTime, monthEnd)
+ .groupBy(Order::getMemberId)
+ );
+ monthOrderUsers = monthOrderList.size();
+ }
+
+ // 检查升级条件(累计注册或累计下单达成其中一个条件即可)
+ boolean meetUpgradeCondition = totalRegisterUsers >= needRegisterNum || totalOrderUsers >= needOrderUserNum;
+
+ // 检查当月保段条件
+ boolean meetMonthlyCondition = monthRegisterUsers >= keepUserNum && monthOrderUsers >= keepOrderUserNum;
+
+ Map result = new HashMap<>();
+ result.put("currentLevel", currentLevel);
+ result.put("nextLevel", currentLevel + 1);
+ result.put("totalRegisterUsers", totalRegisterUsers);
+ result.put("needRegisterNum", needRegisterNum);
+ result.put("totalOrderUsers", totalOrderUsers);
+ result.put("needOrderUserNum", needOrderUserNum);
+ result.put("monthRegisterUsers", monthRegisterUsers);
+ result.put("keepUserNum", keepUserNum);
+ result.put("monthOrderUsers", monthOrderUsers);
+ result.put("keepOrderUserNum", keepOrderUserNum);
+ result.put("meetUpgradeCondition", meetUpgradeCondition);
+ result.put("meetMonthlyCondition", meetMonthlyCondition);
+
+ // 如果同时满足升级条件和当月保段条件,则进行升级
+ if (meetUpgradeCondition && meetMonthlyCondition) {
+ boolean upgradeResult = appUsersService.lambdaUpdate()
+ .eq(AppUsers::getUserId, appUserId)
+ .set(AppUsers::getUserHhRole, currentLevel + 1)
+ .update();
+
+ if (upgradeResult) {
+ result.put("upgraded", true);
+ result.put("message", "恭喜!等级升级成功,从等级" + currentLevel + "升至等级" + (currentLevel + 1));
+ log.info("合伙人用户ID: {} 升级成功,从等级 {} 升至等级 {}", appUserId, currentLevel, currentLevel + 1);
+ } else {
+ result.put("upgraded", false);
+ result.put("message", "升级失败,请稍后重试");
+ log.error("合伙人用户ID: {} 升级失败", appUserId);
+ }
+ } else {
+ result.put("upgraded", false);
+ if (!meetUpgradeCondition && !meetMonthlyCondition) {
+ result.put("message", "未达到升级条件且当月未达保段要求");
+ } else if (!meetUpgradeCondition) {
+ result.put("message", "累积数据未达到升级条件");
+ } else {
+ result.put("message", "当月数据未达到保段要求");
+ }
+ }
+
+ return AjaxResult.success("检查完成", result);
+
+ } catch (Exception e) {
+ log.error("合伙人等级升级检查异常,用户ID: {}", appUserId, e);
+ return AjaxResult.error("检查异常: " + e.getMessage());
+ }
+ }
}