修复了bug

This commit is contained in:
2025-07-14 22:04:46 +08:00
parent acddaf8dbc
commit 3a27a4d091
6 changed files with 192 additions and 55 deletions

View File

@ -20,6 +20,8 @@ import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -75,15 +77,31 @@ public class PermissionCheck {
if (userRole == null) userRole = userInfo.getUserRole(); if (userRole == null) userRole = userInfo.getUserRole();
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole); UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
// 接口权限只能是 USERADMINBOSS用户权限是 ADMINBOSSUSERBANMANAGERSUPERVISORSTAFF
// 校验角色 // 校验角色
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.BAN.equals(userRoleEnum), ErrorCode.PARAMS_ERROR, "用户已被封禁");
ThrowUtils.throwIf((UserRoleEnum.USER.equals(userRoleEnum) Map<UserRoleEnum, Integer> userRoleMap = new HashMap<>();
|| UserRoleEnum.STAFF.equals(userRoleEnum) userRoleMap.put(UserRoleEnum.USER, 1);
|| UserRoleEnum.SUPERVISOR.equals(userRoleEnum) userRoleMap.put(UserRoleEnum.STAFF, 2);
|| UserRoleEnum.MANAGER.equals(userRoleEnum)) && !UserRoleEnum.USER.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); 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(); return joinPoint.proceed();
} }

View File

@ -3,10 +3,12 @@ package com.greenorange.promotion.controller.userInfo;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; 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.query.QueryWrapper;
import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.common.BaseResponse; import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ResultUtils; import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.CommonConstant;
import com.greenorange.promotion.constant.OrderStatusConstant; import com.greenorange.promotion.constant.OrderStatusConstant;
import com.greenorange.promotion.constant.SystemConstant; import com.greenorange.promotion.constant.SystemConstant;
import com.greenorange.promotion.constant.UserConstant; 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.EmployeePromotionRecordsService;
import com.greenorange.promotion.service.userInfo.UserInfoService; import com.greenorange.promotion.service.userInfo.UserInfoService;
import com.greenorange.promotion.service.userInfo.UserPerformanceSummaryService; 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.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -253,6 +256,8 @@ public class UserPerformanceSummaryController {
public BaseResponse<Page<SupervisorPerformanceSummaryVO>> listSupervisorPerformanceSummaryRankingsByPage(@Valid @RequestBody UserPerformanceSummaryRankQueryRequest userPerformanceSummaryRankQueryRequest) { public BaseResponse<Page<SupervisorPerformanceSummaryVO>> listSupervisorPerformanceSummaryRankingsByPage(@Valid @RequestBody UserPerformanceSummaryRankQueryRequest userPerformanceSummaryRankQueryRequest) {
String startTimeStr = userPerformanceSummaryRankQueryRequest.getStartDate(); String startTimeStr = userPerformanceSummaryRankQueryRequest.getStartDate();
String endTimeStr = userPerformanceSummaryRankQueryRequest.getEndDate(); String endTimeStr = userPerformanceSummaryRankQueryRequest.getEndDate();
String nickName = userPerformanceSummaryRankQueryRequest.getNickName();
String phoneNumber = userPerformanceSummaryRankQueryRequest.getPhoneNumber();
DateTime startDate = null; DateTime startDate = null;
DateTime endDate = null; DateTime endDate = null;
boolean isAddDate = true; boolean isAddDate = true;
@ -300,7 +305,11 @@ public class UserPerformanceSummaryController {
} }
supervisorNetSalesAmountMap.merge(firstUserId, totalAmount, BigDecimal::add); supervisorNetSalesAmountMap.merge(firstUserId, totalAmount, BigDecimal::add);
} }
List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE, userInfoService); LambdaQueryWrapper<UserInfo> 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<UserInfo> userInfoList = userInfoService.list(userInfoQueryWrapper);
List<UserPerformanceSummary> userPerformanceSummaryList = commonService.findByFieldInTargetField(userInfoList, userPerformanceSummaryService, UserInfo::getId, UserPerformanceSummary::getUserId); List<UserPerformanceSummary> userPerformanceSummaryList = commonService.findByFieldInTargetField(userInfoList, userPerformanceSummaryService, UserInfo::getId, UserPerformanceSummary::getUserId);
// 封装Map集合主管id, 用户信息) // 封装Map集合主管id, 用户信息)
@ -656,15 +665,18 @@ public class UserPerformanceSummaryController {
/** /**
* 小程序端经理查询主管绩效排名 * 小程序端经理查询主管绩效排名
* @param userPerformanceSummaryRankQueryRequest 绩效排名查询请求体 * @param miniUserPerformanceSummaryRankQueryRequest 小程序端绩效排名查询请求体
* @return 用户绩效汇总列表 * @return 用户绩效汇总列表
*/ */
@PostMapping("rank/supervisor") @PostMapping("rank/supervisor")
@Operation(summary = "小程序端经理查询主管绩效排名", description = "参数绩效排名查询请求体权限管理员方法名miniListSupervisorPerformanceSummaryRankingsByPage") @Operation(summary = "小程序端经理查询主管绩效排名", description = "参数:小程序端绩效排名查询请求体权限管理员方法名miniListSupervisorPerformanceSummaryRankingsByPage")
@RequiresPermission(mustRole = UserConstant.MANAGER_ROLE) @RequiresPermission(mustRole = UserConstant.MANAGER_ROLE)
public BaseResponse<List<SupervisorPerformanceSummaryVO>> miniListSupervisorPerformanceSummaryRankingsByPage(@Valid @RequestBody UserPerformanceSummaryRankQueryRequest userPerformanceSummaryRankQueryRequest) { public BaseResponse<List<SupervisorPerformanceSummaryVO>> miniListSupervisorPerformanceSummaryRankingsByPage(@Valid @RequestBody MiniUserPerformanceSummaryRankQueryRequest miniUserPerformanceSummaryRankQueryRequest) {
String startTimeStr = userPerformanceSummaryRankQueryRequest.getStartDate(); String startTimeStr = miniUserPerformanceSummaryRankQueryRequest.getStartDate();
String endTimeStr = userPerformanceSummaryRankQueryRequest.getEndDate(); String endTimeStr = miniUserPerformanceSummaryRankQueryRequest.getEndDate();
String nickName = miniUserPerformanceSummaryRankQueryRequest.getNickName();
String phoneNumber = miniUserPerformanceSummaryRankQueryRequest.getPhoneNumber();
DateTime startDate = null; DateTime startDate = null;
DateTime endDate = null; DateTime endDate = null;
boolean isAddDate = true; boolean isAddDate = true;
@ -712,7 +724,11 @@ public class UserPerformanceSummaryController {
} }
supervisorNetSalesAmountMap.merge(firstUserId, totalAmount, BigDecimal::add); supervisorNetSalesAmountMap.merge(firstUserId, totalAmount, BigDecimal::add);
} }
List<UserInfo> userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE, userInfoService); LambdaQueryWrapper<UserInfo> 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<UserInfo> userInfoList = userInfoService.list(userInfoLambdaQueryWrapper);
List<UserPerformanceSummary> userPerformanceSummaryList = commonService.findByFieldInTargetField(userInfoList, userPerformanceSummaryService, UserInfo::getId, UserPerformanceSummary::getUserId); List<UserPerformanceSummary> userPerformanceSummaryList = commonService.findByFieldInTargetField(userInfoList, userPerformanceSummaryService, UserInfo::getId, UserPerformanceSummary::getUserId);
// 封装Map集合主管id, 用户信息) // 封装Map集合主管id, 用户信息)
@ -737,6 +753,8 @@ public class UserPerformanceSummaryController {
.build(); .build();
supervisorPerformanceSummaryVOS.add(supervisorPerformanceSummaryVO); supervisorPerformanceSummaryVOS.add(supervisorPerformanceSummaryVO);
} }
userPerformanceSummaryService.sortPerformanceRankingList(supervisorPerformanceSummaryVOS, miniUserPerformanceSummaryRankQueryRequest);
return ResultUtils.success(supervisorPerformanceSummaryVOS); return ResultUtils.success(supervisorPerformanceSummaryVOS);
} }
@ -835,7 +853,7 @@ public class UserPerformanceSummaryController {
*/ */
@PostMapping("mini/query/dashboard") @PostMapping("mini/query/dashboard")
@Operation(summary = "小程序端仪表盘", description = "参数权限管理员方法名miniQueryDashboard") @Operation(summary = "小程序端仪表盘", description = "参数权限管理员方法名miniQueryDashboard")
@RequiresPermission(mustRole = UserConstant.MANAGER_ROLE) @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<WebQueryDashboardVO> miniQueryDashboard(HttpServletRequest request) { public BaseResponse<WebQueryDashboardVO> miniQueryDashboard(HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId"); Long userId = (Long) request.getAttribute("userId");
UserInfo userInfo = userInfoService.getById(userId); UserInfo userInfo = userInfoService.getById(userId);

View File

@ -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;
}

View File

@ -13,6 +13,12 @@ import java.io.Serializable;
@Schema(description = "晋升申请审核结果 视图对象") @Schema(description = "晋升申请审核结果 视图对象")
public class AdvancementApplyApproveVO implements Serializable { public class AdvancementApplyApproveVO implements Serializable {
/**
* 晋升id
*/
@Schema(description = "晋升id", example = "1")
private Long id;
/** /**
* 申请人姓名 * 申请人姓名
*/ */

View File

@ -77,4 +77,10 @@ public interface UserPerformanceSummaryService extends IService<UserPerformanceS
*/ */
WebQueryDashboardVO querySupervisorOrStaffDashboard(UserRoleEnum userRoleEnum, Long userId); WebQueryDashboardVO querySupervisorOrStaffDashboard(UserRoleEnum userRoleEnum, Long userId);
/**
* 对List集合进行排序
*/
void sortPerformanceRankingList(List<SupervisorPerformanceSummaryVO> supervisorPerformanceSummaryVOS, MiniUserPerformanceSummaryRankQueryRequest request);
} }

View File

@ -94,6 +94,8 @@ public class UserPerformanceSummaryServiceImpl extends ServiceImpl<UserPerforman
public QueryWrapper<CourseOrder> getCourseOrderQueryWrapper(UserCourseOrderQueryRequest userCourseOrderQueryRequest) { public QueryWrapper<CourseOrder> getCourseOrderQueryWrapper(UserCourseOrderQueryRequest userCourseOrderQueryRequest) {
String orderNumber = userCourseOrderQueryRequest.getOrderNumber(); String orderNumber = userCourseOrderQueryRequest.getOrderNumber();
String startTimeStr = userCourseOrderQueryRequest.getStartDate(); String startTimeStr = userCourseOrderQueryRequest.getStartDate();
String sortField = userCourseOrderQueryRequest.getSortField();
String sortOrder = userCourseOrderQueryRequest.getSortOrder();
String endTimeStr = userCourseOrderQueryRequest.getEndDate(); String endTimeStr = userCourseOrderQueryRequest.getEndDate();
DateTime startDate = null; DateTime startDate = null;
DateTime endDate = null; DateTime endDate = null;
@ -110,6 +112,7 @@ public class UserPerformanceSummaryServiceImpl extends ServiceImpl<UserPerforman
queryWrapper.ge(StringUtils.isNotBlank(startTimeStr), "createTime", startDate); queryWrapper.ge(StringUtils.isNotBlank(startTimeStr), "createTime", startDate);
queryWrapper.le(StringUtils.isNotBlank(endTimeStr), "createTime", endDate); queryWrapper.le(StringUtils.isNotBlank(endTimeStr), "createTime", endDate);
} }
queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField);
return queryWrapper; return queryWrapper;
} }
@ -155,51 +158,21 @@ public class UserPerformanceSummaryServiceImpl extends ServiceImpl<UserPerforman
* 在内存 List 上模拟 MyBatis-Plus 的分页 * 在内存 List 上模拟 MyBatis-Plus 的分页
*/ */
public Page<SupervisorPerformanceSummaryVO> queryPage(UserPerformanceSummaryRankQueryRequest req, List<SupervisorPerformanceSummaryVO> allVos) { public Page<SupervisorPerformanceSummaryVO> queryPage(UserPerformanceSummaryRankQueryRequest req, List<SupervisorPerformanceSummaryVO> allVos) {
// 根据字段排序
MiniUserPerformanceSummaryRankQueryRequest miniUserPerformanceSummaryRankQueryRequest = MiniUserPerformanceSummaryRankQueryRequest.builder()
.sortField(req.getSortField())
.sortOrder(req.getSortOrder())
.build();
sortPerformanceRankingList(allVos, miniUserPerformanceSummaryRankQueryRequest);
// 计算分页
long current = req.getCurrent(); // 页码 long current = req.getCurrent(); // 页码
long pageSize = req.getPageSize(); // 每页大小 long pageSize = req.getPageSize(); // 每页大小
long total = allVos.size();
// 1. 过滤
List<SupervisorPerformanceSummaryVO> 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<SupervisorPerformanceSummaryVO> 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 offset = (current - 1) * pageSize; long offset = (current - 1) * pageSize;
int start = (int)Math.min(offset, total); int start = (int)Math.min(offset, total);
int end = (int)Math.min(offset + pageSize, total); int end = (int)Math.min(offset + pageSize, total);
List<SupervisorPerformanceSummaryVO> pageList = filtered.subList(start, end); List<SupervisorPerformanceSummaryVO> pageList = allVos.subList(start, end);
// 4. 封装到 MyBatis-Plus 的 Page 对象 // 4. 封装到 MyBatis-Plus 的 Page 对象
Page<SupervisorPerformanceSummaryVO> page = new Page<>(current, pageSize); Page<SupervisorPerformanceSummaryVO> page = new Page<>(current, pageSize);
@ -210,6 +183,59 @@ public class UserPerformanceSummaryServiceImpl extends ServiceImpl<UserPerforman
} }
public void sortPerformanceRankingList(List<SupervisorPerformanceSummaryVO> 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<SupervisorPerformanceSummaryVO> comparator = getComparatorForSortField(sortField);
if (comparator == null) {
return; // 如果没有匹配的字段,跳过排序
}
// 判断排序方向
if (CommonConstant.SORT_ORDER_DESC.equalsIgnoreCase(sortOrder)) {
comparator = comparator.reversed(); // 降序
}
// 执行排序
supervisorPerformanceSummaryVOS.sort(comparator);
}
/**
* 根据 sortField 获取对应的 Comparator
*/
private Comparator<SupervisorPerformanceSummaryVO> getComparatorForSortField(String sortField) {
// 定义一个Map将字段名与其对应的比较器关联起来
Map<String, Comparator<SupervisorPerformanceSummaryVO>> 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);
}
/** /**
* 查看某个时间段的绩效 * 查看某个时间段的绩效
*/ */