From 460dced91202ca1a25313ece18b7aa7b70b73c5d Mon Sep 17 00:00:00 2001 From: chen-xin-zhi <3588068430@qq.com> Date: Mon, 16 Jun 2025 10:25:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=9A=84=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=201.web=E7=AB=AF=E7=AE=A1=E7=90=86=E5=91=98=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=98=8E=E7=BB=86=E5=90=8E=EF=BC=8C=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=98=8E=E7=BB=86=E4=BB=B7=E6=A0=BC=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=94=A8=E6=88=B7=E7=9A=84=E6=8A=BD?= =?UTF-8?q?=E4=BD=A3=E6=AF=94=E4=BE=8B=E8=87=AA=E5=8A=A8=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/ProjectDetailController.java | 190 +++++++++++------- .../userInfo/UserInfoController.java | 20 ++ .../model/vo/userInfo/SuperUserInfoVO.java | 30 +++ .../project/ProjectCommissionService.java | 35 ++++ .../impl/ProjectCommissionServiceImpl.java | 15 +- 5 files changed, 218 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/greenorange/promotion/model/vo/userInfo/SuperUserInfoVO.java 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 d0b1047..5ed5964 100644 --- a/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java +++ b/src/main/java/com/greenorange/promotion/controller/project/ProjectDetailController.java @@ -22,6 +22,7 @@ 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 com.greenorange.promotion.service.userInfo.UserMainInfoService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -65,6 +66,9 @@ public class ProjectDetailController { @Resource private ProjectService projectService; + @Resource + private UserMainInfoService userMainInfoService; + /** * web端管理员添加项目明细 * @param projectDetailAddRequest 项目明细添加请求体 @@ -89,6 +93,13 @@ public class ProjectDetailController { // 获取所有的小程序用户 List userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, userInfoService); + List userMainInfoList = commonService.findByFieldInTargetField(userInfoList, userMainInfoService, UserInfo::getId, UserMainInfo::getUserId); + // 封装Map(键:用户id, 值:抽佣比例) + Map userCommissionRateMap = new HashMap<>(); + for (UserMainInfo userMainInfo : userMainInfoList) { + userCommissionRateMap.put(userMainInfo.getUserId(), userMainInfo.getUniteRate()); + } + // 获取参数信息 List projectCommissionAddRequestList = new ArrayList<>(); Long projectDetailId = projectDetail.getId(); @@ -106,7 +117,11 @@ public class ProjectDetailController { projectCommissionAddRequestList.add(projectCommissionAddRequest); } List projectCommissions = commonService.convertList(projectCommissionAddRequestList, ProjectCommission.class); - projectCommissionService.saveBatch(projectCommissions); + List userProjectCommissions = commonService.convertList(projectCommissions, SubUserProjectCommission.class); + for (SubUserProjectCommission userProjectCommission : userProjectCommissions) { + userProjectCommission.setSubUserId(-1L); + } +// projectCommissionService.saveBatch(projectCommissions); // 给所有用户添加一条下级项目明细抽佣表 List subUserProjectCommissionAddRequestList = new ArrayList<>(); @@ -122,80 +137,119 @@ public class ProjectDetailController { subUserProjectCommissionAddRequestList.add(subUserProjectCommissionAddRequest); } List subUserProjectCommissions = commonService.convertList(subUserProjectCommissionAddRequestList, SubUserProjectCommission.class); - subUserProjectCommissionService.saveBatch(subUserProjectCommissions); - - return ResultUtils.success(true); - } - - /** - * web端管理员根据id修改项目明细信息 - * @param projectDetailUpdateRequest 项目明细更新请求体 - * @return 是否更新成功 - */ - @PostMapping("update") - @Operation(summary = "web端管理员更新项目明细", description = "参数:项目明细更新请求体,权限:管理员,方法名:updateProjectDetail") - @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) - @SysLog(title = "项目明细管理", content = "web端管理员根据id修改项目明细信息") - public BaseResponse updateProjectDetail(@Valid @RequestBody ProjectDetailUpdateRequest projectDetailUpdateRequest) { - - // 更新项目明细的结算价格 - Long projectDetailId = projectDetailUpdateRequest.getId(); - ProjectDetail sourceProjectDetail = projectDetailService.getById(projectDetailId); - ProjectDetail projectDetail = commonService.copyProperties(projectDetailUpdateRequest, ProjectDetail.class); - // 1.更新项目明细的结算价格 - projectDetailService.updateById(projectDetail); - // 更新项目的价格 - Long projectId = projectDetail.getProjectId(); - Project project = projectService.getById(projectId); - project.setProjectPrice(project.getProjectPrice().subtract(sourceProjectDetail.getProjectSettlementPrice()).add(projectDetail.getProjectSettlementPrice())); - projectService.updateById(project); - // 2.更新抽佣比例(如果抽佣比例比原来小) - List subUserProjectCommissionList = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetail.getId(), subUserProjectCommissionService); - for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) { - BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate(); - BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate(); - if (currentCommissionRate.compareTo(maxCommissionRate) > 0) subUserProjectCommission.setCurrentCommissionRate(maxCommissionRate); - } - // 将下级用户项目明细抽佣列表根据父级用户id进行排序(升序) - subUserProjectCommissionList.sort(Comparator.comparing(SubUserProjectCommission::getUserId)); - // 更新下级用户项目明细抽佣表记录 - BigDecimal projectSettlementPrice = projectDetail.getProjectSettlementPrice(); - BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice(); +// subUserProjectCommissionService.saveBatch(subUserProjectCommissions); + subUserProjectCommissions.addAll(userProjectCommissions); + // 对抽佣记录进行排序 + projectCommissionService.sortSubProjectCommissions(subUserProjectCommissions); + // 设置抽佣比例和单价 // 封装Map集合(键:下级用户id,值:下级用户单价) - Map subUserUnitPriceMap = new HashMap<>(); - // 获取小程序用户的根用户 - List userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, userInfoService); - UserInfo rootUserInfo = userInfoList.get(0); - // 存储根用户的单价 - subUserUnitPriceMap.put(rootUserInfo.getId(), projectSettlementPrice); - for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) { - // 记录上级用户的对下级用户的抽佣比例 - BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate(); + Map subUserProjectCommissionMap = new HashMap<>(); + for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissions) { Long userId = subUserProjectCommission.getUserId(); Long subUserId = subUserProjectCommission.getSubUserId(); - // 获取当前用户的单价,并将当前记录修改为当前用户的单价 - BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId); - subUserProjectCommission.setMyUnitPrice(userUnitPrice); - // 计算下级用户的单价 - BigDecimal subUserUnitPrice = userUnitPrice.multiply(BigDecimal.ONE.subtract(currentCommissionRate)); - // 如果下级用户的单价小于项目明细最小结算价格,则设置下级用户的单价为项目明细最小结算价格 - if (subUserUnitPrice.compareTo(projectMinSettlementPrice) < 0) subUserUnitPrice = projectMinSettlementPrice; - // 存储下级用户的单价 - subUserUnitPriceMap.put(subUserId, subUserUnitPrice); + // 设置抽佣比例 + BigDecimal uniteRate = userCommissionRateMap.get(userId); + subUserProjectCommission.setCurrentCommissionRate(uniteRate); + // 设置单价 + BigDecimal myUnitPrice = subUserProjectCommissionMap.get(userId); + if (myUnitPrice == null) myUnitPrice = subUserProjectCommission.getMyUnitPrice(); + subUserProjectCommission.setMyUnitPrice(myUnitPrice); + BigDecimal subUserUnitPrice = projectCommissionService.calculateFinalPrice(myUnitPrice, uniteRate); + if (subUserId != -1L) subUserProjectCommissionMap.put(subUserId, subUserUnitPrice); } - // 更新下级用户项目明细抽佣表记录 - subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList); - // 更新用户项目明细抽佣表记录 - List projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetail.getId(), projectCommissionService); - for (ProjectCommission projectCommission : projectCommissionList) { - Long userId = projectCommission.getUserId(); - BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId); - projectCommission.setMyUnitPrice(userUnitPrice); - } - projectCommissionService.updateBatchById(projectCommissionList); + + long startTime = System.currentTimeMillis(); + + // 批量更新下级用户项目明细抽佣记录 + List subProjectCommissions = subUserProjectCommissions.stream() + .filter(subUserProjectCommission -> subUserProjectCommission.getSubUserId() != -1L).toList(); + subUserProjectCommissionService.saveBatch(subProjectCommissions); + // 批量更新用户项目明细抽佣记录 + + List projectCommissionList = subUserProjectCommissions.stream() + .filter(subUserProjectCommission -> subUserProjectCommission.getSubUserId() == -1L).toList(); + List commissionList = commonService.convertList(projectCommissionList, ProjectCommission.class); + projectCommissionService.saveBatch(commissionList); + + // 获取结束时间戳 + long endTime = System.currentTimeMillis(); + // 计算执行时间 + long executionTime = endTime - startTime; + System.out.println("程序执行时间: " + executionTime + " 毫秒"); + return ResultUtils.success(true); } +// +// /** +// * web端管理员根据id修改项目明细信息 +// * @param projectDetailUpdateRequest 项目明细更新请求体 +// * @return 是否更新成功 +// */ +// @PostMapping("update") +// @Operation(summary = "web端管理员更新项目明细", description = "参数:项目明细更新请求体,权限:管理员,方法名:updateProjectDetail") +// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) +// @SysLog(title = "项目明细管理", content = "web端管理员根据id修改项目明细信息") +// public BaseResponse updateProjectDetail(@Valid @RequestBody ProjectDetailUpdateRequest projectDetailUpdateRequest) { +// +// // 更新项目明细的结算价格 +// Long projectDetailId = projectDetailUpdateRequest.getId(); +// ProjectDetail sourceProjectDetail = projectDetailService.getById(projectDetailId); +// ProjectDetail projectDetail = commonService.copyProperties(projectDetailUpdateRequest, ProjectDetail.class); +// // 1.更新项目明细的结算价格 +// projectDetailService.updateById(projectDetail); +// // 更新项目的价格 +// Long projectId = projectDetail.getProjectId(); +// Project project = projectService.getById(projectId); +// project.setProjectPrice(project.getProjectPrice().subtract(sourceProjectDetail.getProjectSettlementPrice()).add(projectDetail.getProjectSettlementPrice())); +// projectService.updateById(project); +// // 2.更新抽佣比例(如果抽佣比例比原来小) +// List subUserProjectCommissionList = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetail.getId(), subUserProjectCommissionService); +// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) { +// BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate(); +// BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate(); +// if (currentCommissionRate.compareTo(maxCommissionRate) > 0) subUserProjectCommission.setCurrentCommissionRate(maxCommissionRate); +// } +// // 将下级用户项目明细抽佣列表根据父级用户id进行排序(升序) +// subUserProjectCommissionList.sort(Comparator.comparing(SubUserProjectCommission::getUserId)); +// // 更新下级用户项目明细抽佣表记录 +// BigDecimal projectSettlementPrice = projectDetail.getProjectSettlementPrice(); +// BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice(); +// // 封装Map集合(键:下级用户id,值:下级用户单价) +// Map subUserUnitPriceMap = new HashMap<>(); +// // 获取小程序用户的根用户 +// List userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.DEFAULT_ROLE, userInfoService); +// UserInfo rootUserInfo = userInfoList.get(0); +// // 存储根用户的单价 +// subUserUnitPriceMap.put(rootUserInfo.getId(), projectSettlementPrice); +// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) { +// // 记录上级用户的对下级用户的抽佣比例 +// BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate(); +// Long userId = subUserProjectCommission.getUserId(); +// Long subUserId = subUserProjectCommission.getSubUserId(); +// // 获取当前用户的单价,并将当前记录修改为当前用户的单价 +// BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId); +// subUserProjectCommission.setMyUnitPrice(userUnitPrice); +// // 计算下级用户的单价 +// BigDecimal subUserUnitPrice = userUnitPrice.multiply(BigDecimal.ONE.subtract(currentCommissionRate)); +// // 如果下级用户的单价小于项目明细最小结算价格,则设置下级用户的单价为项目明细最小结算价格 +// if (subUserUnitPrice.compareTo(projectMinSettlementPrice) < 0) subUserUnitPrice = projectMinSettlementPrice; +// // 存储下级用户的单价 +// subUserUnitPriceMap.put(subUserId, subUserUnitPrice); +// } +// // 更新下级用户项目明细抽佣表记录 +// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList); +// // 更新用户项目明细抽佣表记录 +// List projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetail.getId(), projectCommissionService); +// for (ProjectCommission projectCommission : projectCommissionList) { +// Long userId = projectCommission.getUserId(); +// BigDecimal userUnitPrice = subUserUnitPriceMap.get(userId); +// projectCommission.setMyUnitPrice(userUnitPrice); +// } +// projectCommissionService.updateBatchById(projectCommissionList); +// +// return ResultUtils.success(true); +// } /** * web端管理员根据id删除项目明细 diff --git a/src/main/java/com/greenorange/promotion/controller/userInfo/UserInfoController.java b/src/main/java/com/greenorange/promotion/controller/userInfo/UserInfoController.java index 572d6d5..0a6b0d4 100644 --- a/src/main/java/com/greenorange/promotion/controller/userInfo/UserInfoController.java +++ b/src/main/java/com/greenorange/promotion/controller/userInfo/UserInfoController.java @@ -17,6 +17,7 @@ import com.greenorange.promotion.model.dto.CommonStringRequest; import com.greenorange.promotion.model.dto.userInfo.*; import com.greenorange.promotion.model.entity.UserInfo; import com.greenorange.promotion.model.entity.UserMainInfo; +import com.greenorange.promotion.model.vo.userInfo.SuperUserInfoVO; import com.greenorange.promotion.model.vo.userInfo.UserInfoVO; import com.greenorange.promotion.model.vo.userMainInfo.UserMainInfoVO; import com.greenorange.promotion.service.common.CommonService; @@ -406,6 +407,8 @@ public class UserInfoController { } + + // /** // * (小程序端)查询当前用户到根节点的userId路径 // * @param commonRequest 用户id @@ -423,6 +426,23 @@ public class UserInfoController { + /** + * 小程序端用户获取上级用户信息 + * @return 上级用户信息 + */ + @PostMapping("getSuper") + @Operation(summary = "小程序端用户获取上级用户信息", description = "参数:用户表查询请求体,权限:管理员(boss, admin),方法名:queryUserInfoById") + @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE) + public BaseResponse getSuperUserInfo(HttpServletRequest request) { + Long userId = (Long) request.getAttribute("userId"); + UserInfo userInfo = userInfoService.getById(userId); + Long parentUserId = userInfo.getParentUserId(); + if (parentUserId != 0) { + userInfo = userInfoService.getById(parentUserId); + } + SuperUserInfoVO superUserInfoVO = commonService.copyProperties(userInfo, SuperUserInfoVO.class); + return ResultUtils.success(superUserInfoVO); + } diff --git a/src/main/java/com/greenorange/promotion/model/vo/userInfo/SuperUserInfoVO.java b/src/main/java/com/greenorange/promotion/model/vo/userInfo/SuperUserInfoVO.java new file mode 100644 index 0000000..553f1c6 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/model/vo/userInfo/SuperUserInfoVO.java @@ -0,0 +1,30 @@ +package com.greenorange.promotion.model.vo.userInfo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 上级用户信息 视图对象 + */ +@Data +@Schema(description = "上级用户信息 视图对象") +public class SuperUserInfoVO implements Serializable { + + /** + * 用户昵称 + */ + @Schema(description = "用户昵称", example = "chenxinzhi") + private String nickName; + + /** + * 手机号 + */ + @Schema(description = "手机号", example = "15888610253") + private String phoneNumber; + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/src/main/java/com/greenorange/promotion/service/project/ProjectCommissionService.java b/src/main/java/com/greenorange/promotion/service/project/ProjectCommissionService.java index 317c290..27442db 100644 --- a/src/main/java/com/greenorange/promotion/service/project/ProjectCommissionService.java +++ b/src/main/java/com/greenorange/promotion/service/project/ProjectCommissionService.java @@ -5,8 +5,12 @@ import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUp import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest; import com.greenorange.promotion.model.entity.ProjectCommission; import com.baomidou.mybatisplus.extension.service.IService; +import com.greenorange.promotion.model.entity.SubUserProjectCommission; import jakarta.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.List; + /** * @author 35880 * @description 针对表【project_commission(项目明细抽佣表)】的数据库操作Service @@ -31,4 +35,35 @@ public interface ProjectCommissionService extends IService { * 小程序用户一键设置项目的的抽佣比例 */ void uniteProjectCommissionRate(ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request); + + + /** + * 批量修改下级用户的单价 + */ + void batchUpdateSubUserMyUnitPrice(List subCommissionList); + + + /** + * 批量修改用户的单价 + */ + void batchUpdateMyUnitPrice(List projectCommissionList); + + + /** + * 对项目抽佣记录进行排序(根据userId, subUserId进行排序) + */ + void sortSubProjectCommissions(List subProjectCommissions); + + + /** + * 对项目抽佣记录进行排序(根据projectDetailId, userId, subUserId进行排序) + */ + void sortProjectDetailAndSubProjectCommissions(List subProjectCommissions); + + + /** + * 根据价格和抽佣比例计算最终价格 + */ + BigDecimal calculateFinalPrice(BigDecimal price, BigDecimal commissionRate); + } 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 7535a83..b622a9c 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 @@ -373,7 +373,8 @@ public class ProjectCommissionServiceImpl extends ServiceImpl subCommissionList) { StringBuilder sql = new StringBuilder("UPDATE sub_user_project_commission SET myUnitPrice = CASE id "); @@ -400,6 +401,8 @@ public class ProjectCommissionServiceImpl extends ServiceImpl projectCommissionList) { StringBuilder sql = new StringBuilder("UPDATE project_commission SET myUnitPrice = CASE id "); @@ -425,23 +428,27 @@ public class ProjectCommissionServiceImpl extends ServiceImpl subProjectCommissions) { + public void sortSubProjectCommissions(List subProjectCommissions) { // 先根据userId升序排序 // 如果userId相同,再根据subUserId升序排序 Collections.sort(subProjectCommissions, Comparator.comparingLong(SubUserProjectCommission::getUserId).thenComparingLong(SubUserProjectCommission::getSubUserId)); } + @Override // 封装排序方法 - private void sortProjectDetailAndSubProjectCommissions(List subProjectCommissions) { + public void sortProjectDetailAndSubProjectCommissions(List subProjectCommissions) { // 先根据userId升序排序 // 如果userId相同,再根据subUserId升序排序 Collections.sort(subProjectCommissions, Comparator.comparingLong(SubUserProjectCommission::getProjectDetailId).thenComparingLong(SubUserProjectCommission::getUserId).thenComparingLong(SubUserProjectCommission::getSubUserId)); } + @Override // 封装方法:根据价格和抽佣比例计算最终价格 - private BigDecimal calculateFinalPrice(BigDecimal price, BigDecimal commissionRate) { + public BigDecimal calculateFinalPrice(BigDecimal price, BigDecimal commissionRate) { // 计算抽佣比例对应的系数 BigDecimal commissionFactor = BigDecimal.ONE.subtract(commissionRate.divide(BigDecimal.valueOf(100)));