From b007d0545d557245e6d5483cc654737d78ed84a9 Mon Sep 17 00:00:00 2001 From: chen-xin-zhi <3588068430@qq.com> Date: Thu, 21 Aug 2025 09:32:15 +0800 Subject: [PATCH] =?UTF-8?q?add=20web=E7=AB=AF=E6=9F=A5=E8=AF=A2=E6=8F=90?= =?UTF-8?q?=E7=8E=B0=E7=94=B3=E8=AF=B7=E8=AF=A6=E6=83=85=20web=E7=AB=AF?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E6=8F=90=E7=8E=B0=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/CourseOrderController.java | 10 +++++ .../project/ProjectDetailController.java | 6 +++ .../WithdrawalApplyController.java | 45 +++++++++++++++++++ .../UserPerformanceSummaryController.java | 12 +++-- .../WithdrawalApplyReviewRequest.java | 40 +++++++++++++++++ .../impl/ProjectCommissionServiceImpl.java | 4 +- .../userInfo/impl/UserInfoServiceImpl.java | 21 ++++++--- .../impl/WechatGetQrcodeServiceImpl.java | 3 +- src/main/resources/application.yml | 2 +- 9 files changed, 128 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/greenorange/promotion/model/dto/withdrawalApply/WithdrawalApplyReviewRequest.java diff --git a/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java b/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java index ec25cf4..450f6ff 100644 --- a/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java +++ b/src/main/java/com/greenorange/promotion/controller/course/CourseOrderController.java @@ -1,5 +1,7 @@ package com.greenorange.promotion.controller.course; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -47,6 +49,7 @@ import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -208,6 +211,13 @@ public class CourseOrderController { Long id = commonRequest.getId(); CourseOrder courseOrder = courseOrderService.getById(id); + // 判断是否超过7天 + Date orderCreateTime = courseOrder.getCreateTime(); + Date now = DateUtil.date(); + // 计算两个时间相隔多少天(向下取整) + long days = DateUtil.between(orderCreateTime, now, DateUnit.DAY); + ThrowUtils.throwIf(days >= 7, ErrorCode.OPERATION_ERROR, "订单已超过7天,无法退款"); + // 修改订单状态 LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(CourseOrder::getId, courseOrder.getId()) diff --git a/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java b/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java index a4f9f46..a878a02 100644 --- a/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java +++ b/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java @@ -156,6 +156,12 @@ public class ProjectDetailController { Long subUserId = subUserProjectCommission.getSubUserId(); // 设置抽佣比例 BigDecimal uniteRate = userCommissionRateMap.get(userId); + if (uniteRate == null && userId == 0) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserMainInfo::getUserId, subUserId); + UserMainInfo userMainInfo = userMainInfoService.getOne(queryWrapper); + uniteRate = userMainInfo.getUniteRate(); + } subUserProjectCommission.setCurrentCommissionRate(uniteRate); // 设置单价 BigDecimal myUnitPrice = subUserProjectCommissionMap.get(userId); diff --git a/src/main/java/com/greenorange/promotion/controller/projectSettlement/WithdrawalApplyController.java b/src/main/java/com/greenorange/promotion/controller/projectSettlement/WithdrawalApplyController.java index 013e295..ae0cbcb 100644 --- a/src/main/java/com/greenorange/promotion/controller/projectSettlement/WithdrawalApplyController.java +++ b/src/main/java/com/greenorange/promotion/controller/projectSettlement/WithdrawalApplyController.java @@ -2,6 +2,7 @@ package com.greenorange.promotion.controller.projectSettlement; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.annotation.SysLog; @@ -10,12 +11,15 @@ import com.greenorange.promotion.common.ErrorCode; import com.greenorange.promotion.common.ResultUtils; import com.greenorange.promotion.constant.UserConstant; import com.greenorange.promotion.exception.ThrowUtils; +import com.greenorange.promotion.model.dto.CommonRequest; import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyAddRequest; import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyQueryRequest; +import com.greenorange.promotion.model.dto.withdrawalApply.WithdrawalApplyReviewRequest; import com.greenorange.promotion.model.entity.FundsChange; import com.greenorange.promotion.model.entity.UserAccount; import com.greenorange.promotion.model.entity.UserMainInfo; import com.greenorange.promotion.model.entity.WithdrawalApply; +import com.greenorange.promotion.model.enums.WithdrawStatusEnum; import com.greenorange.promotion.model.vo.fundsChange.FundsChangeVO; import com.greenorange.promotion.model.vo.fundsChange.FundsItemVO; import com.greenorange.promotion.model.vo.userAccount.UserAccountConditionVO; @@ -173,6 +177,47 @@ public class WithdrawalApplyController { + /** + * Web端管理员查看提现申请详情 + * @param commonRequest 提现申请记录id + * @return 提现申请记录 + */ + @PostMapping("get/id") + @Operation(summary = "Web端管理员查看提现申请详情", description = "参数:提现申请记录id,权限:管理员,方法名:queryWithdrawalApplyById") + @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) +// @SysLog(title = "提现申请记录管理", content = "Web端管理员分页查询提现申请记录") + public BaseResponse queryWithdrawalApplyById(@Valid @RequestBody CommonRequest commonRequest) { + Long id = commonRequest.getId(); + WithdrawalApply withdrawalApply = withdrawalApplyService.getById(id); + WithdrawalApplyVO withdrawalApplyVO = commonService.copyProperties(withdrawalApply, WithdrawalApplyVO.class); + return ResultUtils.success(withdrawalApplyVO); + } + + + + /** + * Web端管理员审核提现申请 + * @param withdrawalApplyReviewRequest 提现申请记录审核请求体 + * @return 是否批准成功 + */ + @PostMapping("review") + @Operation(summary = "Web端管理员审核提现申请", description = "参数:提现申请记录审核请求体,权限:管理员,方法名:approveWithdrawalApplyById") + @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) +// @SysLog(title = "提现申请记录管理", content = "Web端管理员分页查询提现申请记录") + public BaseResponse approveWithdrawalApplyById(@Valid @RequestBody WithdrawalApplyReviewRequest withdrawalApplyReviewRequest) { + Long id = withdrawalApplyReviewRequest.getId(); + String withdrawalStatus = withdrawalApplyReviewRequest.getWithdrawalStatus(); + WithdrawalApply withdrawalApply = withdrawalApplyService.getById(id); + ThrowUtils.throwIf(!withdrawalApply.getWithdrawalStatus().equals(WithdrawStatusEnum.PROCESSING.getValue()), ErrorCode.OPERATION_ERROR, "提现申请记录状态错误"); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(WithdrawalApply::getId, id).set(WithdrawalApply::getWithdrawalStatus, withdrawalStatus); + withdrawalApplyService.update(updateWrapper); + return ResultUtils.success(true); + } + + + + /** * Web端管理员分页查询提现申请记录 * @param withdrawalApplyQueryRequest 提现申请记录查询请求体 diff --git a/src/main/java/com/greenorange/promotion/controller/userInfo/UserPerformanceSummaryController.java b/src/main/java/com/greenorange/promotion/controller/userInfo/UserPerformanceSummaryController.java index 515d188..be2aaf1 100644 --- a/src/main/java/com/greenorange/promotion/controller/userInfo/UserPerformanceSummaryController.java +++ b/src/main/java/com/greenorange/promotion/controller/userInfo/UserPerformanceSummaryController.java @@ -513,14 +513,16 @@ public class UserPerformanceSummaryController { * 0 0 0 * * ?” = 每天 00:00:00 执行一次 * @return 是否更新成功 */ -// @Scheduled(cron = "0 0 0 * * ?") - @Scheduled(cron = "00 16 20 * * ?") + @Scheduled(cron = "0 0 0 * * ?") +// @Scheduled(cron = "00 16 20 * * ?") @Operation(summary = "轮询课程推广待提成记录表", description = "参数:无,权限:管理员,方法名:pollCourseOrder") public void pollCourseOrder() { // 找出下单时间超过7天的订单,分别统计主管和员工的可结算金额 Map toSettleMap = new HashMap<>(); Map totalAmountMap = new HashMap<>(); - List coursePromotionCommissionPendingList = commonService.findByFieldEqTargetField(CoursePromotionCommissionPending::getCommissionStatus, CommissionStatusEnum.PENDING.getValue(), coursePromotionCommissionPendingService); + List coursePromotionCommissionPendingList = commonService.findByFieldEqTargetFieldWithSpecificFields(CoursePromotionCommissionPending::getCommissionStatus, + CommissionStatusEnum.PENDING.getValue(), coursePromotionCommissionPendingService, List.of(CoursePromotionCommissionPending::getId, CoursePromotionCommissionPending::getFirstUserId, CoursePromotionCommissionPending::getSecondUserId, + CoursePromotionCommissionPending::getTotalAmount, CoursePromotionCommissionPending::getFirstReward, CoursePromotionCommissionPending::getSecondReward)); for (CoursePromotionCommissionPending coursePromotionCommissionPending : coursePromotionCommissionPendingList) { Date orderCreateTime = coursePromotionCommissionPending.getOrderCreateTime(); Date now = DateUtil.date(); @@ -536,7 +538,9 @@ public class UserPerformanceSummaryController { } coursePromotionCommissionPendingService.updateBatchById(coursePromotionCommissionPendingList); // 修改用户绩效汇总表 - List userPerformanceSummaryList = userPerformanceSummaryService.list(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(UserPerformanceSummary::getUserId, UserPerformanceSummary::getToRelease, UserPerformanceSummary::getToSettle, UserPerformanceSummary::getNetAmount, UserPerformanceSummary::getId); + List userPerformanceSummaryList = userPerformanceSummaryService.list(lambdaQueryWrapper); for (UserPerformanceSummary userPerformanceSummary : userPerformanceSummaryList) { Long userId = userPerformanceSummary.getUserId(); BigDecimal toSettleAmount = toSettleMap.get(userId); diff --git a/src/main/java/com/greenorange/promotion/model/dto/withdrawalApply/WithdrawalApplyReviewRequest.java b/src/main/java/com/greenorange/promotion/model/dto/withdrawalApply/WithdrawalApplyReviewRequest.java new file mode 100644 index 0000000..2772c66 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/model/dto/withdrawalApply/WithdrawalApplyReviewRequest.java @@ -0,0 +1,40 @@ +package com.greenorange.promotion.model.dto.withdrawalApply; + +import com.greenorange.promotion.annotation.EnumValue; +import com.greenorange.promotion.model.enums.WithdrawStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 提现申请记录审核请求体 + */ +@Data +@Schema(description = "提现申请记录审核请求体", requiredProperties = { + "id", "withdrawalStatus" +}) +public class WithdrawalApplyReviewRequest implements Serializable { + + + /** + * 提现申请ID + */ + @Min(value = 1L, message = "提现申请ID ID不能小于1") + @Schema(description = "提现申请ID", example = "1") + private Long id; + + + /** + * 提现状态[提现中(processing)|提现成功(success)|提现失败(failed)] + */ + @EnumValue(enumClass = WithdrawStatusEnum.class) + @Schema(description = "提现状态[提现中(processing)|提现成功(success)|提现失败(failed)]", example = "processing") + private String withdrawalStatus; + + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/src/main/java/com/greenorange/promotion/service/project/impl/ProjectCommissionServiceImpl.java b/src/main/java/com/greenorange/promotion/service/project/impl/ProjectCommissionServiceImpl.java index 1c93a69..f28f776 100644 --- a/src/main/java/com/greenorange/promotion/service/project/impl/ProjectCommissionServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/project/impl/ProjectCommissionServiceImpl.java @@ -256,7 +256,7 @@ public class ProjectCommissionServiceImpl extends ServiceImpl projectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>(); projectCommissionLambdaQueryWrapper.eq(ProjectCommission::getUserId, userId); - projectCommissionLambdaQueryWrapper.select(ProjectCommission::getProjectDetailId); + projectCommissionLambdaQueryWrapper.select(ProjectCommission::getProjectDetailId, ProjectCommission::getId); List projectCommissionList = this.list(projectCommissionLambdaQueryWrapper); List projectDetailList = commonService.findByFieldInTargetFieldWithSpecificFields(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId, @@ -287,7 +287,7 @@ public class ProjectCommissionServiceImpl extends ServiceImpl subUserProjectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>(); subUserProjectCommissionLambdaQueryWrapper.eq(SubUserProjectCommission::getUserId, userId); - subUserProjectCommissionLambdaQueryWrapper.select(SubUserProjectCommission::getProjectDetailId); + subUserProjectCommissionLambdaQueryWrapper.select(SubUserProjectCommission::getProjectDetailId, SubUserProjectCommission::getId); List subUserProjectCommissionList = subUserProjectCommissionService.list(subUserProjectCommissionLambdaQueryWrapper); for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) { Long projectDetailId = subUserProjectCommission.getProjectDetailId(); diff --git a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java index ffff09f..6d65e26 100644 --- a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java @@ -223,9 +223,14 @@ public class UserInfoServiceImpl extends ServiceImpl // 生成邀请二维码 String invitationQrcode = generateInvitationQrcode(myUserInfo.getInvitationCode(), userRoleEnum); + + // 添加用户主要信息 UserMainInfo userMainInfo = UserMainInfo.builder().userId(myUserInfo.getId()).inviteQrCode(invitationQrcode).build(); userMainInfoService.save(userMainInfo); + // 更新上级用户团队人数 + updateParentUserInfoTeamCount(parentUserInfo.getId()); + // 批量保存当前用户的项目明细抽佣记录和下级用户项目明细抽佣记录 saveBatchProjectCommissionAndSubUserProjectCommission(myUserInfo.getId(), parentUserInfo.getId()); } @@ -461,11 +466,16 @@ public class UserInfoServiceImpl extends ServiceImpl // 生成邀请二维码 String invitationQrcode = generateInvitationQrcode(myUserInfo.getInvitationCode(), UserRoleEnum.STAFF); + + // 添加用户主要信息 UserMainInfo userMainInfo = UserMainInfo.builder().userId(myUserInfo.getId()).inviteQrCode(invitationQrcode).build(); userMainInfoService.save(userMainInfo); -// // 批量保存当前用户的项目明细抽佣记录和下级用户项目明细抽佣记录 -// saveBatchProjectCommissionAndSubUserProjectCommission(myUserInfo.getId(), parentUserInfo.getId()); + // 更新上级用户团队人数 + updateParentUserInfoTeamCount(parentUserInfo.getId()); + + // 批量保存当前用户的项目明细抽佣记录和下级用户项目明细抽佣记录 + saveBatchProjectCommissionAndSubUserProjectCommission(myUserInfo.getId(), parentUserInfo.getId()); // 修改晋升申请记录的审核状态,并绑定申请成功的用户id LambdaUpdateWrapper advancementApplyLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); @@ -513,7 +523,7 @@ public class UserInfoServiceImpl extends ServiceImpl @Override public LambdaQueryWrapper getMiniUserInfoQueryWrapper() { LambdaQueryWrapper userInfoLambdaQueryWrapper = new LambdaQueryWrapper<>(); - userInfoLambdaQueryWrapper.in(UserInfo::getUserRole, UserRoleEnum.USER, UserRoleEnum.MANAGER, UserRoleEnum.SUPERVISOR, UserRoleEnum.STAFF); + userInfoLambdaQueryWrapper.in(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, UserConstant.STAFF_ROLE, UserConstant.SUPERVISOR_ROLE, UserConstant.MANAGER_ROLE); return userInfoLambdaQueryWrapper; } @@ -533,16 +543,13 @@ public class UserInfoServiceImpl extends ServiceImpl /** * 批量更新父级用户团队人数 */ - private UserMainInfo updateParentUserInfoTeamCount(Long userId) { - UserMainInfo userMainInfo = new UserMainInfo(); - userMainInfo.setUserId(userId); + private void updateParentUserInfoTeamCount(Long userId) { List pathToRoot = this.findPathToRoot(userId); List userMainInfoList = commonService.findByFieldInTargetField(pathToRoot, userMainInfoService, id -> id, UserMainInfo::getUserId); for (UserMainInfo mainInfo : userMainInfoList) { mainInfo.setTeamSize(mainInfo.getTeamSize() + 1); } userMainInfoService.updateBatchById(userMainInfoList); - return userMainInfo; } diff --git a/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java index 8e714d1..8d9406d 100644 --- a/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatGetQrcodeServiceImpl.java @@ -121,7 +121,8 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService { param.put("page", "pages/loginModule/register/register"); param.put("scene", inviteCode + "=" + userRoleEnum.getValue()); param.put("width", 430); - param.put("env_version", "release"); + param.put("check_path", false); + param.put("env_version", "develop"); String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken; String jsonParams = JSONUtil.toJsonStr(param); byte[] responseBytes = HttpUtil.createPost(url) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a17ec4c..65cfe0a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,4 @@ spring: profiles: - active: test + active: graduation