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()); + } + } }