From a2b2888e86e1958d80497d97ce555197129788e5 Mon Sep 17 00:00:00 2001 From: chen-xin-zhi <3588068430@qq.com> Date: Mon, 12 May 2025 21:05:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/aop/PermissionCheck.java | 62 +++++++-------- .../controller/project/ProjectController.java | 79 +++++++++++++++---- .../project/ProjectDetailController.java | 11 +++ .../dto/promoCode/PromoCodeAddRequest.java | 3 +- ...tDetailVO.java => ProjectAllDetailVO.java} | 13 ++- .../resources/templates/controller.java.vm | 2 +- 6 files changed, 118 insertions(+), 52 deletions(-) rename src/main/java/com/greenorange/promotion/model/vo/project/{ProjectDetailVO.java => ProjectAllDetailVO.java} (83%) diff --git a/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java b/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java index 69b5336..cb345ba 100644 --- a/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java +++ b/src/main/java/com/greenorange/promotion/aop/PermissionCheck.java @@ -46,37 +46,37 @@ public class PermissionCheck { **/ @Around("@annotation(requiresPermission)") public Object check(ProceedingJoinPoint joinPoint, RequiresPermission requiresPermission) throws Throwable { -// // 获取请求对象 -// HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); -// // 接口的权限 -// String mustRole = requiresPermission.mustRole(); -// // 获取接口权限的枚举类 -// UserRoleEnum interfaceRoleEnum = UserRoleEnum.getEnumByValue(mustRole); -// ThrowUtils.throwIf(interfaceRoleEnum == null, ErrorCode.NO_AUTH_ERROR); -// // 获取用户权限 -// String token = request.getHeader("Authorization"); -// ThrowUtils.throwIf(StringUtils.isBlank(token), ErrorCode.NO_AUTH_ERROR, "JWT为空"); -// // 解析token -// DecodedJWT decodedJWT = jwtUtils.verify(token); -// String userAccount = decodedJWT.getClaim("userAccount").asString(); -// String userPassword = decodedJWT.getClaim("userPassword").asString(); -// // 查询用户信息 -// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); -// lambdaQueryWrapper.eq(UserInfo::getUserAccount, userAccount).eq(UserInfo::getUserPassword, userPassword); -// UserInfo userInfo = userInfoService.getOne(lambdaQueryWrapper); -// ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "用户不存在"); -// // 将用户id存入request,用于记录日志 -// request.setAttribute("userId", userInfo.getId()); -// -// // 获取用户权限的枚举类 -// String userRole = userInfo.getUserRole(); -// UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole); -// -// // 接口权限只能是 USER,ADMIN,BOSS,用户权限是 ADMIN,BOSS,USER,BAN -// // 校验角色 -// ThrowUtils.throwIf(UserRoleEnum.USER.equals(userRoleEnum) && !UserRoleEnum.USER.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); -// ThrowUtils.throwIf(UserRoleEnum.BAN.equals(userRoleEnum), ErrorCode.NO_AUTH_ERROR, "用户已被封禁"); -// ThrowUtils.throwIf(UserRoleEnum.ADMIN.equals(userRoleEnum) && UserRoleEnum.BOSS.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); + // 获取请求对象 + HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + // 接口的权限 + String mustRole = requiresPermission.mustRole(); + // 获取接口权限的枚举类 + UserRoleEnum interfaceRoleEnum = UserRoleEnum.getEnumByValue(mustRole); + ThrowUtils.throwIf(interfaceRoleEnum == null, ErrorCode.NO_AUTH_ERROR); + // 获取用户权限 + String token = request.getHeader("Authorization"); + ThrowUtils.throwIf(StringUtils.isBlank(token), ErrorCode.NO_AUTH_ERROR, "JWT为空"); + // 解析token + DecodedJWT decodedJWT = jwtUtils.verify(token); + String userAccount = decodedJWT.getClaim("userAccount").asString(); + String userPassword = decodedJWT.getClaim("userPassword").asString(); + // 查询用户信息 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserInfo::getUserAccount, userAccount).eq(UserInfo::getUserPassword, userPassword); + UserInfo userInfo = userInfoService.getOne(lambdaQueryWrapper); + ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "用户不存在"); + // 将用户id存入request,用于记录日志 + request.setAttribute("userId", userInfo.getId()); + + // 获取用户权限的枚举类 + String userRole = userInfo.getUserRole(); + UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole); + + // 接口权限只能是 USER,ADMIN,BOSS,用户权限是 ADMIN,BOSS,USER,BAN + // 校验角色 + ThrowUtils.throwIf(UserRoleEnum.USER.equals(userRoleEnum) && !UserRoleEnum.USER.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); + ThrowUtils.throwIf(UserRoleEnum.BAN.equals(userRoleEnum), ErrorCode.NO_AUTH_ERROR, "用户已被封禁"); + ThrowUtils.throwIf(UserRoleEnum.ADMIN.equals(userRoleEnum) && UserRoleEnum.BOSS.equals(interfaceRoleEnum), ErrorCode.NO_AUTH_ERROR); return joinPoint.proceed(); } diff --git a/src/main/java/com/greenorange/promotion/controller/project/ProjectController.java b/src/main/java/com/greenorange/promotion/controller/project/ProjectController.java index e316905..63a8187 100644 --- a/src/main/java/com/greenorange/promotion/controller/project/ProjectController.java +++ b/src/main/java/com/greenorange/promotion/controller/project/ProjectController.java @@ -3,6 +3,7 @@ package com.greenorange.promotion.controller.project; 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.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.annotation.SysLog; @@ -15,13 +16,14 @@ import com.greenorange.promotion.model.dto.CommonRequest; import com.greenorange.promotion.model.dto.project.ProjectAddRequest; import com.greenorange.promotion.model.dto.project.ProjectQueryRequest; import com.greenorange.promotion.model.dto.project.ProjectUpdateRequest; -import com.greenorange.promotion.model.dto.promoCodeApply.PromoCodeApplyRequest; import com.greenorange.promotion.model.entity.*; import com.greenorange.promotion.model.vo.project.ProjectCardVO; -import com.greenorange.promotion.model.vo.project.ProjectDetailVO; +import com.greenorange.promotion.model.vo.project.ProjectAllDetailVO; import com.greenorange.promotion.model.vo.project.ProjectPageVO; import com.greenorange.promotion.model.vo.project.ProjectVO; +import com.greenorange.promotion.model.vo.projectDetail.ProjectDetailVO; import com.greenorange.promotion.model.vo.projectNotification.ProjectNotificationVO; +import com.greenorange.promotion.model.vo.promoCodeApply.PromoCodeApplyVO; import com.greenorange.promotion.model.vo.userProject.UserProjectVO; import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.project.*; @@ -36,7 +38,10 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -72,6 +77,9 @@ public class ProjectController { @Resource private UserProjectService userProjectService; + @Resource + private PromoCodeApplyService promoCodeApplyService; + /** @@ -82,8 +90,27 @@ public class ProjectController { @Operation(summary = "小程序用户查看项目列表", description = "参数:无,权限:管理员,方法名:queryProjectCardList") @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @SysLog(title = "项目管理", content = "小程序用户查看项目列表") - public BaseResponse> queryProjectCardList() { + public BaseResponse> queryProjectCardList(HttpServletRequest request) { + Long userId = (Long) request.getAttribute("userId"); + // 获取项目明细抽佣列表 + List projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getUserId, userId, projectCommissionService); + // 封装Map集合(键:项目id, 值:项目总价) + Map projectPriceMap = new HashMap<>(); + for (ProjectCommission projectCommission : projectCommissionList) { + Long projectId = projectCommission.getProjectId(); + BigDecimal projectPrice = projectPriceMap.get(projectId); + if (projectPrice == null) { + projectPrice = projectCommission.getMyUnitPrice(); + } else { + projectPrice = projectPrice.add(projectCommission.getMyUnitPrice()); + } + projectPriceMap.put(projectId, projectPrice); + } List projectList = projectService.list(); + for (Project project : projectList) { + BigDecimal projectPrice = projectPriceMap.get(project.getId()); + project.setProjectPrice(projectPrice); + } List projectCardVOS = commonService.convertList(projectList, ProjectCardVO.class); return ResultUtils.success(projectCardVOS); } @@ -97,26 +124,46 @@ public class ProjectController { @Operation(summary = "小程序用户根据id查询项目详情", description = "参数:无,权限:管理员,方法名:queryProjectDetailById") @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) @SysLog(title = "项目管理", content = "小程序用户根据id查询项目详情") - public BaseResponse queryProjectDetailById(@Valid @RequestBody CommonRequest commonRequest) { + public BaseResponse queryProjectDetailById(@Valid @RequestBody CommonRequest commonRequest, HttpServletRequest request) { + Long userId = (Long) request.getAttribute("userId"); Long id = commonRequest.getId(); Project project = projectService.getById(id); - ProjectDetailVO projectDetailVO = commonService.copyProperties(project, ProjectDetailVO.class); + ProjectAllDetailVO projectAllDetailVO = commonService.copyProperties(project, ProjectAllDetailVO.class); // 获取项目通知列表 - LambdaQueryWrapper notificationLambdaQueryWrapper = new LambdaQueryWrapper<>(); - notificationLambdaQueryWrapper.eq(ProjectNotification::getProjectId, id); - List projectNotificationList = projectNotificationService.list(notificationLambdaQueryWrapper); + List projectNotificationList = commonService.findByFieldEqTargetField(ProjectNotification::getProjectId, id, projectNotificationService); List projectNotificationVOS = commonService.convertList(projectNotificationList, ProjectNotificationVO.class); // 获取项目明细列表 - LambdaQueryWrapper projectDetailLambdaQueryWrapper = new LambdaQueryWrapper<>(); - projectDetailLambdaQueryWrapper.eq(ProjectDetail::getProjectId, id); - List projectDetailList = projectDetailService.list(projectDetailLambdaQueryWrapper); + List projectDetailList = commonService.findByFieldEqTargetField(ProjectDetail::getProjectId, id, projectDetailService); List projectDetailVOS = commonService.convertList(projectDetailList, ProjectDetailVO.class); + // 将项目明细的价格修改为当前用户的单价 + Map, Object> fieldConditions = Map.of(ProjectCommission::getUserId, userId, ProjectCommission::getProjectId, id); + List projectCommissionList = commonService.findByFieldEqTargetFields(fieldConditions, projectCommissionService); + // 封装Map集合(键:项目明细id, 值:项目结算价格) + Map projectCommissionMap = new HashMap<>(); + for (ProjectCommission projectCommission : projectCommissionList) { + Long projectDetailId = projectCommission.getProjectDetailId(); + BigDecimal projectSettlementPrice = projectCommission.getMyUnitPrice(); + projectCommissionMap.put(projectDetailId, projectSettlementPrice); + } + // 修改项目明细的结算价格 + BigDecimal projectPrice = BigDecimal.ZERO; + for (ProjectDetailVO projectDetailVO : projectDetailVOS) { + BigDecimal projectSettlementPrice = projectCommissionMap.get(projectDetailVO.getId()); + ThrowUtils.throwIf(projectSettlementPrice == null, ErrorCode.PARAMS_ERROR, "项目明细不存在"); + projectDetailVO.setProjectSettlementPrice(projectSettlementPrice); + projectPrice = projectPrice.add(projectSettlementPrice); + } + // 更新项目价格 + projectAllDetailVO.setProjectPrice(projectPrice); + // 获取用户申请的推广码列表 + List promoCodeApplyList = commonService.findByFieldEqTargetField(PromoCodeApply::getUserId, userId, promoCodeApplyService); + List promoCodeApplyVOList = commonService.convertList(promoCodeApplyList, PromoCodeApplyVO.class); + // 填充项目详情VO + projectAllDetailVO.setProjectNotificationVOList(projectNotificationVOS); + projectAllDetailVO.setProjectAllDetailVOList(projectDetailVOS); + projectAllDetailVO.setPromoCodeApplyVOList(promoCodeApplyVOList); - // 更新项目明细价格 - - projectDetailVO.setProjectNotificationVOList(projectNotificationVOS); - projectDetailVO.setProjectDetailVOList(projectDetailVOS); - return ResultUtils.success(projectDetailVO); + return ResultUtils.success(projectAllDetailVO); } 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 393da1c..ff3bff0 100644 --- a/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java +++ b/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java @@ -1,6 +1,7 @@ package com.greenorange.promotion.controller.project; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.greenorange.promotion.annotation.RequiresPermission; import com.greenorange.promotion.annotation.SysLog; import com.greenorange.promotion.common.BaseResponse; @@ -17,6 +18,7 @@ import com.greenorange.promotion.model.vo.projectDetail.ProjectDetailVO; import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.project.ProjectCommissionService; import com.greenorange.promotion.service.project.ProjectDetailService; +import com.greenorange.promotion.service.project.ProjectService; import com.greenorange.promotion.service.project.SubUserProjectCommissionService; import com.greenorange.promotion.service.userInfo.UserInfoService; import io.swagger.v3.oas.annotations.Operation; @@ -59,6 +61,9 @@ public class ProjectDetailController { @Resource private UserInfoService userInfoService; + @Resource + private ProjectService projectService; + /** * web端管理员添加项目明细 * @param projectDetailAddRequest 项目明细添加请求体 @@ -72,6 +77,12 @@ public class ProjectDetailController { ProjectDetail projectDetail = commonService.copyProperties(projectDetailAddRequest, ProjectDetail.class); projectDetailService.save(projectDetail); + // 修改项目价格 + Long pId = projectDetail.getProjectId(); + Project project = projectService.getById(pId); + project.setProjectPrice(project.getProjectPrice().add(projectDetail.getProjectSettlementPrice())); + projectService.updateById(project); + // 获取所有的小程序用户 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE); diff --git a/src/main/java/com/greenorange/promotion/model/dto/promoCode/PromoCodeAddRequest.java b/src/main/java/com/greenorange/promotion/model/dto/promoCode/PromoCodeAddRequest.java index c47b6ec..e1fa29f 100644 --- a/src/main/java/com/greenorange/promotion/model/dto/promoCode/PromoCodeAddRequest.java +++ b/src/main/java/com/greenorange/promotion/model/dto/promoCode/PromoCodeAddRequest.java @@ -1,6 +1,8 @@ package com.greenorange.promotion.model.dto.promoCode; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.AssertFalse; +import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Min; import lombok.Data; @@ -44,7 +46,6 @@ public class PromoCodeAddRequest implements Serializable { /** * 推广码状态(true:占用,false:空闲) */ - @NotBlank(message = "推广码状态不能为空") @Schema(description = "推广码状态(true:占用,false:空闲)", example = "false") private Boolean promoCodeStatus; diff --git a/src/main/java/com/greenorange/promotion/model/vo/project/ProjectDetailVO.java b/src/main/java/com/greenorange/promotion/model/vo/project/ProjectAllDetailVO.java similarity index 83% rename from src/main/java/com/greenorange/promotion/model/vo/project/ProjectDetailVO.java rename to src/main/java/com/greenorange/promotion/model/vo/project/ProjectAllDetailVO.java index 73c52fb..bd9ad2e 100644 --- a/src/main/java/com/greenorange/promotion/model/vo/project/ProjectDetailVO.java +++ b/src/main/java/com/greenorange/promotion/model/vo/project/ProjectAllDetailVO.java @@ -1,7 +1,8 @@ package com.greenorange.promotion.model.vo.project; -import com.greenorange.promotion.model.entity.ProjectNotification; +import com.greenorange.promotion.model.vo.projectDetail.ProjectDetailVO; import com.greenorange.promotion.model.vo.projectNotification.ProjectNotificationVO; +import com.greenorange.promotion.model.vo.promoCodeApply.PromoCodeApplyVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -11,7 +12,7 @@ import java.math.BigDecimal; import java.util.List; @Data -public class ProjectDetailVO implements Serializable { +public class ProjectAllDetailVO implements Serializable { /** * 项目 ID @@ -79,7 +80,13 @@ public class ProjectDetailVO implements Serializable { * 项目明细列表 */ @Schema(description = "项目明细列表") - private List projectDetailVOList; + private List projectAllDetailVOList; + + /** + * 申请的推广码列表 + */ + @Schema(description = "申请的推广码列表") + private List promoCodeApplyVOList; @Serial diff --git a/src/main/resources/templates/controller.java.vm b/src/main/resources/templates/controller.java.vm index b3ee9b0..56fba72 100644 --- a/src/main/resources/templates/controller.java.vm +++ b/src/main/resources/templates/controller.java.vm @@ -12,7 +12,7 @@ import jakarta.validation.Valid; @RestController @RequestMapping("${entityNameLower}") @Slf4j -@Tag(name = "${entityComment}管理") +@Tag(name = "${entityComment}模块") public class ${entityName}Controller { @Resource