From 3a27a4d091db8c3bb4339f8c931301f4990dde16 Mon Sep 17 00:00:00 2001 From: chen-xin-zhi <3588068430@qq.com> Date: Mon, 14 Jul 2025 22:04:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/aop/PermissionCheck.java | 32 ++++-- .../UserPerformanceSummaryController.java | 34 ++++-- ...serPerformanceSummaryRankQueryRequest.java | 63 +++++++++++ .../AdvancementApplyApproveVO.java | 6 + .../UserPerformanceSummaryService.java | 6 + .../UserPerformanceSummaryServiceImpl.java | 106 +++++++++++------- 6 files changed, 192 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/greenorange/promotion/model/dto/userPerformanceSummary/MiniUserPerformanceSummaryRankQueryRequest.java diff --git a/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java b/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java index b652c46..cb6f9a1 100644 --- a/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java +++ b/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java @@ -20,6 +20,8 @@ import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; @@ -75,15 +77,31 @@ public class PermissionCheck { if (userRole == null) userRole = userInfo.getUserRole(); UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole); - // 接口权限只能是 USER,ADMIN,BOSS,用户权限是 ADMIN,BOSS,USER,BAN,MANAGER,SUPERVISOR,STAFF // 校验角色 - ThrowUtils.throwIf(UserRoleEnum.BOSS.equals(userRoleEnum) && UserRoleEnum.USER.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); - ThrowUtils.throwIf(UserRoleEnum.ADMIN.equals(userRoleEnum) && !UserRoleEnum.ADMIN.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); ThrowUtils.throwIf(UserRoleEnum.BAN.equals(userRoleEnum), ErrorCode.PARAMS_ERROR, "用户已被封禁"); - ThrowUtils.throwIf((UserRoleEnum.USER.equals(userRoleEnum) - || UserRoleEnum.STAFF.equals(userRoleEnum) - || UserRoleEnum.SUPERVISOR.equals(userRoleEnum) - || UserRoleEnum.MANAGER.equals(userRoleEnum)) && !UserRoleEnum.USER.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); + Map userRoleMap = new HashMap<>(); + userRoleMap.put(UserRoleEnum.USER, 1); + userRoleMap.put(UserRoleEnum.STAFF, 2); + userRoleMap.put(UserRoleEnum.SUPERVISOR, 3); + userRoleMap.put(UserRoleEnum.MANAGER, 4); + userRoleMap.put(UserRoleEnum.ADMIN, 5); + userRoleMap.put(UserRoleEnum.BOSS, 6); + + Integer userRoleNumber = userRoleMap.get(userRoleEnum); + Integer interfaceRoleNumber = userRoleMap.get(interfaceRoleEnum); + if (userRoleNumber == 1) { + ThrowUtils.throwIf(interfaceRoleNumber > 1, ErrorCode.NO_AUTH_ERROR); + } else if (userRoleNumber == 2) { + ThrowUtils.throwIf(interfaceRoleNumber > 2, ErrorCode.NO_AUTH_ERROR); + } else if (userRoleNumber == 3) { + ThrowUtils.throwIf(interfaceRoleNumber > 3, ErrorCode.NO_AUTH_ERROR); + } else if (userRoleNumber == 4) { + ThrowUtils.throwIf(interfaceRoleNumber > 4, ErrorCode.NO_AUTH_ERROR); + } else if (userRoleNumber == 5) { + ThrowUtils.throwIf(interfaceRoleNumber != 5, ErrorCode.NO_AUTH_ERROR); + } else { + ThrowUtils.throwIf(interfaceRoleNumber < 5, ErrorCode.NO_AUTH_ERROR); + } return joinPoint.proceed(); } 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 91c3ef7..f014cac 100644 --- a/src/main/java/com/greenorange/promotion/controller/userInfo/UserPerformanceSummaryController.java +++ b/src/main/java/com/greenorange/promotion/controller/userInfo/UserPerformanceSummaryController.java @@ -3,10 +3,12 @@ package com.greenorange.promotion.controller.userInfo; import cn.hutool.core.date.DateTime; 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.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.common.BaseResponse; import com.greenorange.promotion.common.ResultUtils; +import com.greenorange.promotion.constant.CommonConstant; import com.greenorange.promotion.constant.OrderStatusConstant; import com.greenorange.promotion.constant.SystemConstant; import com.greenorange.promotion.constant.UserConstant; @@ -24,6 +26,7 @@ import com.greenorange.promotion.service.course.CoursePromotionCommissionPending import com.greenorange.promotion.service.userInfo.EmployeePromotionRecordsService; import com.greenorange.promotion.service.userInfo.UserInfoService; import com.greenorange.promotion.service.userInfo.UserPerformanceSummaryService; +import com.greenorange.promotion.utils.SqlUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -253,6 +256,8 @@ public class UserPerformanceSummaryController { public BaseResponse> listSupervisorPerformanceSummaryRankingsByPage(@Valid @RequestBody UserPerformanceSummaryRankQueryRequest userPerformanceSummaryRankQueryRequest) { String startTimeStr = userPerformanceSummaryRankQueryRequest.getStartDate(); String endTimeStr = userPerformanceSummaryRankQueryRequest.getEndDate(); + String nickName = userPerformanceSummaryRankQueryRequest.getNickName(); + String phoneNumber = userPerformanceSummaryRankQueryRequest.getPhoneNumber(); DateTime startDate = null; DateTime endDate = null; boolean isAddDate = true; @@ -300,7 +305,11 @@ public class UserPerformanceSummaryController { } supervisorNetSalesAmountMap.merge(firstUserId, totalAmount, BigDecimal::add); } - List userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE, userInfoService); + LambdaQueryWrapper userInfoQueryWrapper = new LambdaQueryWrapper<>(); + userInfoQueryWrapper.eq(StringUtils.isNotBlank(nickName), UserInfo::getNickName, nickName) + .eq(StringUtils.isNotBlank(phoneNumber), UserInfo::getPhoneNumber, phoneNumber) + .eq(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE); + List userInfoList = userInfoService.list(userInfoQueryWrapper); List userPerformanceSummaryList = commonService.findByFieldInTargetField(userInfoList, userPerformanceSummaryService, UserInfo::getId, UserPerformanceSummary::getUserId); // 封装Map集合(键:主管id, 用户信息) @@ -656,15 +665,18 @@ public class UserPerformanceSummaryController { /** * 小程序端经理查询主管绩效排名 - * @param userPerformanceSummaryRankQueryRequest 绩效排名查询请求体 + * @param miniUserPerformanceSummaryRankQueryRequest 小程序端绩效排名查询请求体 * @return 用户绩效汇总列表 */ @PostMapping("rank/supervisor") - @Operation(summary = "小程序端经理查询主管绩效排名", description = "参数:绩效排名查询请求体,权限:管理员,方法名:miniListSupervisorPerformanceSummaryRankingsByPage") + @Operation(summary = "小程序端经理查询主管绩效排名", description = "参数:小程序端绩效排名查询请求体,权限:管理员,方法名:miniListSupervisorPerformanceSummaryRankingsByPage") @RequiresPermission(mustRole = UserConstant.MANAGER_ROLE) - public BaseResponse> miniListSupervisorPerformanceSummaryRankingsByPage(@Valid @RequestBody UserPerformanceSummaryRankQueryRequest userPerformanceSummaryRankQueryRequest) { - String startTimeStr = userPerformanceSummaryRankQueryRequest.getStartDate(); - String endTimeStr = userPerformanceSummaryRankQueryRequest.getEndDate(); + public BaseResponse> miniListSupervisorPerformanceSummaryRankingsByPage(@Valid @RequestBody MiniUserPerformanceSummaryRankQueryRequest miniUserPerformanceSummaryRankQueryRequest) { + String startTimeStr = miniUserPerformanceSummaryRankQueryRequest.getStartDate(); + String endTimeStr = miniUserPerformanceSummaryRankQueryRequest.getEndDate(); + String nickName = miniUserPerformanceSummaryRankQueryRequest.getNickName(); + String phoneNumber = miniUserPerformanceSummaryRankQueryRequest.getPhoneNumber(); + DateTime startDate = null; DateTime endDate = null; boolean isAddDate = true; @@ -712,7 +724,11 @@ public class UserPerformanceSummaryController { } supervisorNetSalesAmountMap.merge(firstUserId, totalAmount, BigDecimal::add); } - List userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE, userInfoService); + LambdaQueryWrapper userInfoLambdaQueryWrapper = new LambdaQueryWrapper<>(); + userInfoLambdaQueryWrapper.eq(StringUtils.isNotBlank(nickName), UserInfo::getNickName, nickName) + .eq(StringUtils.isNotBlank(phoneNumber), UserInfo::getPhoneNumber, phoneNumber) + .eq(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE); + List userInfoList = userInfoService.list(userInfoLambdaQueryWrapper); List userPerformanceSummaryList = commonService.findByFieldInTargetField(userInfoList, userPerformanceSummaryService, UserInfo::getId, UserPerformanceSummary::getUserId); // 封装Map集合(键:主管id, 用户信息) @@ -737,6 +753,8 @@ public class UserPerformanceSummaryController { .build(); supervisorPerformanceSummaryVOS.add(supervisorPerformanceSummaryVO); } + userPerformanceSummaryService.sortPerformanceRankingList(supervisorPerformanceSummaryVOS, miniUserPerformanceSummaryRankQueryRequest); + return ResultUtils.success(supervisorPerformanceSummaryVOS); } @@ -835,7 +853,7 @@ public class UserPerformanceSummaryController { */ @PostMapping("mini/query/dashboard") @Operation(summary = "小程序端仪表盘", description = "参数:无,权限:管理员,方法名:miniQueryDashboard") - @RequiresPermission(mustRole = UserConstant.MANAGER_ROLE) + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) public BaseResponse miniQueryDashboard(HttpServletRequest request) { Long userId = (Long) request.getAttribute("userId"); UserInfo userInfo = userInfoService.getById(userId); diff --git a/src/main/java/com/greenorange/promotion/model/dto/userPerformanceSummary/MiniUserPerformanceSummaryRankQueryRequest.java b/src/main/java/com/greenorange/promotion/model/dto/userPerformanceSummary/MiniUserPerformanceSummaryRankQueryRequest.java new file mode 100644 index 0000000..9ec6df6 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/model/dto/userPerformanceSummary/MiniUserPerformanceSummaryRankQueryRequest.java @@ -0,0 +1,63 @@ +package com.greenorange.promotion.model.dto.userPerformanceSummary; + +import com.greenorange.promotion.common.PageRequest; +import com.greenorange.promotion.constant.CommonConstant; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 小程序端绩效排名查询请求体,继承自分页请求 PageRequest + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(description = "小程序端绩效排名查询请求体", requiredProperties = {"current", "pageSize"}) +public class MiniUserPerformanceSummaryRankQueryRequest implements Serializable { + + /** + * 姓名 + */ + @Schema(description = "姓名", example = "chenxinzhi") + private String nickName; + + /** + * 手机号 + */ + @Schema(description = "手机号", example = "15888610253") + private String phoneNumber; + + /** + * 起始日期 + */ + @Schema(description = "起始日期", example = "2025-02-29 10:00:00") + private String startDate; + + /** + * 结束日期 + */ + @Schema(description = "结束日期", example = "2025-02-29 10:00:00") + private String endDate; + + /** + * 排序字段 + */ + @Schema(description = "排序字段", example = "id") + private String sortField; + + /** + * 排序顺序(默认升序) + */ + @Schema(description = "排序顺序((升:ascend;降:descend", example = "ascend") + private String sortOrder = CommonConstant.SORT_ORDER_ASC; + + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/java/com/greenorange/promotion/model/vo/advancementApply/AdvancementApplyApproveVO.java b/src/main/java/com/greenorange/promotion/model/vo/advancementApply/AdvancementApplyApproveVO.java index 62a27f3..b5f6e65 100644 --- a/src/main/java/com/greenorange/promotion/model/vo/advancementApply/AdvancementApplyApproveVO.java +++ b/src/main/java/com/greenorange/promotion/model/vo/advancementApply/AdvancementApplyApproveVO.java @@ -13,6 +13,12 @@ import java.io.Serializable; @Schema(description = "晋升申请审核结果 视图对象") public class AdvancementApplyApproveVO implements Serializable { + /** + * 晋升id + */ + @Schema(description = "晋升id", example = "1") + private Long id; + /** * 申请人姓名 */ diff --git a/src/main/java/com/greenorange/promotion/service/userInfo/UserPerformanceSummaryService.java b/src/main/java/com/greenorange/promotion/service/userInfo/UserPerformanceSummaryService.java index 26994ae..7db4eb7 100644 --- a/src/main/java/com/greenorange/promotion/service/userInfo/UserPerformanceSummaryService.java +++ b/src/main/java/com/greenorange/promotion/service/userInfo/UserPerformanceSummaryService.java @@ -77,4 +77,10 @@ public interface UserPerformanceSummaryService extends IService supervisorPerformanceSummaryVOS, MiniUserPerformanceSummaryRankQueryRequest request); + } diff --git a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserPerformanceSummaryServiceImpl.java b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserPerformanceSummaryServiceImpl.java index 0cbf98e..80ea43d 100644 --- a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserPerformanceSummaryServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserPerformanceSummaryServiceImpl.java @@ -94,6 +94,8 @@ public class UserPerformanceSummaryServiceImpl extends ServiceImpl getCourseOrderQueryWrapper(UserCourseOrderQueryRequest userCourseOrderQueryRequest) { String orderNumber = userCourseOrderQueryRequest.getOrderNumber(); String startTimeStr = userCourseOrderQueryRequest.getStartDate(); + String sortField = userCourseOrderQueryRequest.getSortField(); + String sortOrder = userCourseOrderQueryRequest.getSortOrder(); String endTimeStr = userCourseOrderQueryRequest.getEndDate(); DateTime startDate = null; DateTime endDate = null; @@ -110,6 +112,7 @@ public class UserPerformanceSummaryServiceImpl extends ServiceImpl queryPage(UserPerformanceSummaryRankQueryRequest req, List allVos) { + // 根据字段排序 + MiniUserPerformanceSummaryRankQueryRequest miniUserPerformanceSummaryRankQueryRequest = MiniUserPerformanceSummaryRankQueryRequest.builder() + .sortField(req.getSortField()) + .sortOrder(req.getSortOrder()) + .build(); + sortPerformanceRankingList(allVos, miniUserPerformanceSummaryRankQueryRequest); + + // 计算分页 long current = req.getCurrent(); // 页码 long pageSize = req.getPageSize(); // 每页大小 - - // 1. 过滤 - List filtered = allVos.stream() - .filter(vo -> { - if (StringUtils.isNotBlank(req.getNickName())) { - return vo.getNickName() != null - && vo.getNickName().toLowerCase() - .contains(req.getNickName().toLowerCase()); - } - return true; - }) - .filter(vo -> { - if (StringUtils.isNotBlank(req.getPhoneNumber())) { - return vo.getPhoneNumber() != null - && vo.getPhoneNumber().contains(req.getPhoneNumber()); - } - return true; - }) - .collect(Collectors.toList()); - - // 2. 排序 - if (StringUtils.isNotBlank(req.getSortField())) { - Comparator cmp = Comparator.comparing(vo -> switch (req.getSortField()) { - case "totalAmount" -> vo.getTotalAmount(); - case "netAmount" -> vo.getNetAmount(); - case "promoCount" -> BigDecimal.valueOf(vo.getPromoCount()); - case "empCount" -> BigDecimal.valueOf(vo.getEmpCount()); - case "orderCount" -> BigDecimal.valueOf(vo.getOrderCount()); - default -> null; - }, Comparator.nullsLast(Comparator.naturalOrder())); - - if ("desc".equalsIgnoreCase(req.getSortOrder())) { - cmp = cmp.reversed(); - } - filtered.sort(cmp); - } - - // 3. 计算分页 - long total = filtered.size(); + long total = allVos.size(); long offset = (current - 1) * pageSize; int start = (int)Math.min(offset, total); int end = (int)Math.min(offset + pageSize, total); - List pageList = filtered.subList(start, end); + List pageList = allVos.subList(start, end); // 4. 封装到 MyBatis-Plus 的 Page 对象 Page page = new Page<>(current, pageSize); @@ -210,6 +183,59 @@ public class UserPerformanceSummaryServiceImpl extends ServiceImpl supervisorPerformanceSummaryVOS, MiniUserPerformanceSummaryRankQueryRequest request) { + if (supervisorPerformanceSummaryVOS == null || supervisorPerformanceSummaryVOS.isEmpty()) { + return; // 如果列表为空,不进行排序 + } + + String sortField = request.getSortField(); + String sortOrder = request.getSortOrder(); + + // 检查 sortField 是否有效,如果无效则不进行排序 + if (!SqlUtils.validSortField(sortField)) { + System.out.println("Invalid sort field: " + sortField); + return; // 如果 sortField 无效,不进行排序 + } + + Comparator comparator = getComparatorForSortField(sortField); + + if (comparator == null) { + return; // 如果没有匹配的字段,跳过排序 + } + + // 判断排序方向 + if (CommonConstant.SORT_ORDER_DESC.equalsIgnoreCase(sortOrder)) { + comparator = comparator.reversed(); // 降序 + } + + // 执行排序 + supervisorPerformanceSummaryVOS.sort(comparator); + } + + + /** + * 根据 sortField 获取对应的 Comparator + */ + private Comparator getComparatorForSortField(String sortField) { + // 定义一个Map,将字段名与其对应的比较器关联起来 + Map> comparatorMap = Map.of( + "empCount", Comparator.comparing(SupervisorPerformanceSummaryVO::getEmpCount, Comparator.nullsLast(Comparator.naturalOrder())), + "promoCount", Comparator.comparing(SupervisorPerformanceSummaryVO::getPromoCount, Comparator.nullsLast(Comparator.naturalOrder())), + "orderCount", Comparator.comparing(SupervisorPerformanceSummaryVO::getOrderCount, Comparator.nullsLast(Comparator.naturalOrder())), + "totalAmount", Comparator.comparing(SupervisorPerformanceSummaryVO::getTotalAmount, Comparator.nullsLast(Comparator.naturalOrder())), + "netAmount", Comparator.comparing(SupervisorPerformanceSummaryVO::getNetAmount, Comparator.nullsLast(Comparator.naturalOrder())) + ); + + // 返回对应字段的比较器,如果没有匹配的字段,则返回null + return comparatorMap.get(sortField); + } + + + + + /** * 查看某个时间段的绩效 */