添加的新功能

1.小程序用户修改项目的抽佣比例
2.小程序用户修改下级用户的项目明细抽佣比例
3.小程序用户一键设置项目的的抽佣比例
This commit is contained in:
2025-06-15 17:35:42 +08:00
parent 2827ef39c5
commit d18d87f81d
10 changed files with 615 additions and 73 deletions

View File

@ -37,10 +37,8 @@ import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -140,6 +138,39 @@ public class ProjectCommissionController {
return ResultUtils.success(projectCommissionVOList);
}
//
// /**
// * 小程序用户修改项目的抽佣比例
// * @param projectCommissionUpdateRequest 项目明细抽佣更新请求体
// * @return 是否添加成功
// */
// @PostMapping("update/rate")
// @Operation(summary = "小程序用户修改项目的抽佣比例", description = "参数项目明细抽佣更新请求体权限管理员方法名updateProjectCommissionRate")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
//// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改项目的抽佣比例")
// public BaseResponse<Boolean> updateProjectCommissionRate(@Valid @RequestBody ProjectCommissionUpdateRequest projectCommissionUpdateRequest, HttpServletRequest request) {
// Long id = projectCommissionUpdateRequest.getId();
// BigDecimal currentCommissionRate = projectCommissionUpdateRequest.getCurrentCommissionRate();
// // 校验当前抽佣比例不能大于最大抽佣比例
// ProjectCommission projectCommission = projectCommissionService.getById(id);
// Long projectDetailId = projectCommission.getProjectDetailId();
// ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
// BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
// ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
// projectCommission.setCurrentCommissionRate(currentCommissionRate);
// projectCommissionService.updateById(projectCommission);
//
// // 批量更新下级用户的项目明细抽佣比例
// Long userId = (Long) request.getAttribute("userId");
// Map<SFunction<SubUserProjectCommission, ?>, Object> fieldConditions = Map.of(SubUserProjectCommission::getProjectDetailId, projectDetailId, SubUserProjectCommission::getUserId, userId);
// List<SubUserProjectCommission> subUserProjectCommissionList = commonService.findByFieldEqTargetFields(fieldConditions, subUserProjectCommissionService);
// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
// subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
// }
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
// return ResultUtils.success(true);
// }
/**
* 小程序用户修改项目的抽佣比例
@ -151,30 +182,11 @@ public class ProjectCommissionController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改项目的抽佣比例")
public BaseResponse<Boolean> updateProjectCommissionRate(@Valid @RequestBody ProjectCommissionUpdateRequest projectCommissionUpdateRequest, HttpServletRequest request) {
Long id = projectCommissionUpdateRequest.getId();
BigDecimal currentCommissionRate = projectCommissionUpdateRequest.getCurrentCommissionRate();
// 校验当前抽佣比例不能大于最大抽佣比例
ProjectCommission projectCommission = projectCommissionService.getById(id);
Long projectDetailId = projectCommission.getProjectDetailId();
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
projectCommission.setCurrentCommissionRate(currentCommissionRate);
projectCommissionService.updateById(projectCommission);
// 批量更新下级用户的项目明细抽佣比例
Long userId = (Long) request.getAttribute("userId");
Map<SFunction<SubUserProjectCommission, ?>, Object> fieldConditions = Map.of(SubUserProjectCommission::getProjectDetailId, projectDetailId, SubUserProjectCommission::getUserId, userId);
List<SubUserProjectCommission> subUserProjectCommissionList = commonService.findByFieldEqTargetFields(fieldConditions, subUserProjectCommissionService);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
}
subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
projectCommissionService.updateProjectCommissionRate(projectCommissionUpdateRequest);
return ResultUtils.success(true);
}
/**
* 小程序用户查看下级用户的项目明细抽佣情况
* @param commonRequest 项目id
@ -249,6 +261,30 @@ public class ProjectCommissionController {
}
// /**
// * 小程序用户修改下级用户的项目明细抽佣比例
// * @param subUserProjectCommissionUpdateRequest 下级用户项目明细抽佣更新请求体
// * @return 是否添加成功
// */
// @PostMapping("update/sub/rate")
// @Operation(summary = "小程序用户修改下级用户的项目明细抽佣比例", description = "参数下级用户项目明细抽佣更新请求体权限管理员方法名updateSubUserProjectCommissionRate")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
//// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改下级用户的项目明细抽佣比例")
// public BaseResponse<Boolean> updateSubUserProjectCommissionRate(@Valid @RequestBody SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest) {
// Long id = subUserProjectCommissionUpdateRequest.getId();
// BigDecimal currentCommissionRate = subUserProjectCommissionUpdateRequest.getCurrentCommissionRate();
// // 校验当前抽佣比例不能大于最大抽佣比例
// SubUserProjectCommission subUserProjectCommission = subUserProjectCommissionService.getById(id);
// Long projectDetailId = subUserProjectCommission.getProjectDetailId();
// ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
// BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
// ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
// subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
// subUserProjectCommissionService.updateById(subUserProjectCommission);
// return ResultUtils.success(true);
// }
/**
* 小程序用户修改下级用户的项目明细抽佣比例
* @param subUserProjectCommissionUpdateRequest 下级用户项目明细抽佣更新请求体
@ -259,20 +295,63 @@ public class ProjectCommissionController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "项目明细抽佣管理", content = "小程序用户修改下级用户的项目明细抽佣比例")
public BaseResponse<Boolean> updateSubUserProjectCommissionRate(@Valid @RequestBody SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest) {
Long id = subUserProjectCommissionUpdateRequest.getId();
BigDecimal currentCommissionRate = subUserProjectCommissionUpdateRequest.getCurrentCommissionRate();
// 校验当前抽佣比例不能大于最大抽佣比例
SubUserProjectCommission subUserProjectCommission = subUserProjectCommissionService.getById(id);
Long projectDetailId = subUserProjectCommission.getProjectDetailId();
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
subUserProjectCommission.setCurrentCommissionRate(currentCommissionRate);
subUserProjectCommissionService.updateById(subUserProjectCommission);
projectCommissionService.updateSubUserProjectCommissionRate(subUserProjectCommissionUpdateRequest);
return ResultUtils.success(true);
}
// /**
// * 小程序用户一键设置项目的的抽佣比例
// * @param projectCommissionUniteUpdateRequest 统一抽佣比例
// * @return 是否添加成功
// */
// @PostMapping("update/unite/rate")
// @Operation(summary = "小程序用户一键设置项目的的抽佣比例", description = "参数统一抽佣比例权限管理员方法名uniteProjectCommissionRate")
// @RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
//// @SysLog(title = "项目明细抽佣管理", content = "小程序用户一键设置项目的的抽佣比例")
// public BaseResponse<Boolean> uniteProjectCommissionRate(@Valid @RequestBody ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request) {
// Long userId = (Long) request.getAttribute("userId");
// BigDecimal uniteCommissionRate = projectCommissionUniteUpdateRequest.getUniteCommissionRate();
//
// // 修改项目的统一抽佣比例
// LambdaUpdateWrapper<UserMainInfo> userMainInfoLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
// userMainInfoLambdaUpdateWrapper.eq(UserMainInfo::getUserId, userId).set(UserMainInfo::getUniteRate, uniteCommissionRate);
// userMainInfoService.update(userMainInfoLambdaUpdateWrapper);
//
// LambdaQueryWrapper<ProjectCommission> projectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
// projectCommissionLambdaQueryWrapper.eq(ProjectCommission::getUserId, userId);
// List<ProjectCommission> projectCommissionList = projectCommissionService.list(projectCommissionLambdaQueryWrapper);
//
// List<ProjectDetail> projectDetailList = commonService.findByFieldInTargetField(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId);
// // 封装map集合项目明细id, 值:项目明细最大抽佣比例)
// Map<Long, BigDecimal> map = new HashMap<>();
// for (ProjectDetail projectDetail : projectDetailList) {
// map.put(projectDetail.getId(), projectDetail.getMaxCommissionRate());
// }
// for (ProjectCommission projectCommission : projectCommissionList) {
// Long projectDetailId = projectCommission.getProjectDetailId();
// BigDecimal maxCommissionRate = map.get(projectDetailId);
// BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
// projectCommission.setCurrentCommissionRate(setCommissionRate);
// }
// projectCommissionService.updateBatchById(projectCommissionList);
//
// // 修改下级用户的项目明细抽佣比例
// LambdaQueryWrapper<SubUserProjectCommission> subUserProjectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
// subUserProjectCommissionLambdaQueryWrapper.eq(SubUserProjectCommission::getUserId, userId);
// List<SubUserProjectCommission> subUserProjectCommissionList = subUserProjectCommissionService.list(subUserProjectCommissionLambdaQueryWrapper);
// for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
// Long projectDetailId = subUserProjectCommission.getProjectDetailId();
// BigDecimal maxCommissionRate = map.get(projectDetailId);
// BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
// subUserProjectCommission.setCurrentCommissionRate(setCommissionRate);
// }
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
// return ResultUtils.success(true);
// }
/**
* 小程序用户一键设置项目的的抽佣比例
* @param projectCommissionUniteUpdateRequest 统一抽佣比例
@ -283,43 +362,7 @@ public class ProjectCommissionController {
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
// @SysLog(title = "项目明细抽佣管理", content = "小程序用户一键设置项目的的抽佣比例")
public BaseResponse<Boolean> uniteProjectCommissionRate(@Valid @RequestBody ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request) {
Long userId = (Long) request.getAttribute("userId");
BigDecimal uniteCommissionRate = projectCommissionUniteUpdateRequest.getUniteCommissionRate();
// 修改项目的统一抽佣比例
LambdaUpdateWrapper<UserMainInfo> userMainInfoLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userMainInfoLambdaUpdateWrapper.eq(UserMainInfo::getUserId, userId).set(UserMainInfo::getUniteRate, uniteCommissionRate);
userMainInfoService.update(userMainInfoLambdaUpdateWrapper);
LambdaQueryWrapper<ProjectCommission> projectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
projectCommissionLambdaQueryWrapper.eq(ProjectCommission::getUserId, userId);
List<ProjectCommission> projectCommissionList = projectCommissionService.list(projectCommissionLambdaQueryWrapper);
List<ProjectDetail> projectDetailList = commonService.findByFieldInTargetField(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId);
// 封装map集合项目明细id, 值:项目明细最大抽佣比例)
Map<Long, BigDecimal> map = new HashMap<>();
for (ProjectDetail projectDetail : projectDetailList) {
map.put(projectDetail.getId(), projectDetail.getMaxCommissionRate());
}
for (ProjectCommission projectCommission : projectCommissionList) {
Long projectDetailId = projectCommission.getProjectDetailId();
BigDecimal maxCommissionRate = map.get(projectDetailId);
BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
projectCommission.setCurrentCommissionRate(setCommissionRate);
}
projectCommissionService.updateBatchById(projectCommissionList);
// 修改下级用户的项目明细抽佣比例
LambdaQueryWrapper<SubUserProjectCommission> subUserProjectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
subUserProjectCommissionLambdaQueryWrapper.eq(SubUserProjectCommission::getUserId, userId);
List<SubUserProjectCommission> subUserProjectCommissionList = subUserProjectCommissionService.list(subUserProjectCommissionLambdaQueryWrapper);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
Long projectDetailId = subUserProjectCommission.getProjectDetailId();
BigDecimal maxCommissionRate = map.get(projectDetailId);
BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
subUserProjectCommission.setCurrentCommissionRate(setCommissionRate);
}
subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
projectCommissionService.uniteProjectCommissionRate(projectCommissionUniteUpdateRequest, request);
return ResultUtils.success(true);
}

View File

@ -2,6 +2,8 @@ package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
/**
* @author 35880
@ -11,6 +13,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface ProjectCommissionMapper extends BaseMapper<ProjectCommission> {
@Update("${sql}")
void executeUpdate(@Param("sql") String sql);
}

View File

@ -2,6 +2,8 @@ package com.greenorange.promotion.mapper;
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
/**
* @author 35880
@ -11,6 +13,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface SubUserProjectCommissionMapper extends BaseMapper<SubUserProjectCommission> {
@Update("${sql}")
void executeUpdate(@Param("sql") String sql);
}

View File

@ -69,4 +69,5 @@ public class SubUserProjectCommission implements Serializable {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -1,7 +1,11 @@
package com.greenorange.promotion.service.project;
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUniteUpdateRequest;
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUpdateRequest;
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;
/**
* @author 35880
@ -10,4 +14,21 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ProjectCommissionService extends IService<ProjectCommission> {
/**
* 修改项目的抽佣比例
*/
void updateProjectCommissionRate(ProjectCommissionUpdateRequest projectCommissionUpdateRequest);
/**
* 修改下级用户的项目明细抽佣比例
*/
void updateSubUserProjectCommissionRate(SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest);
/**
* 小程序用户一键设置项目的的抽佣比例
*/
void uniteProjectCommissionRate(ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request);
}

View File

@ -1,7 +1,9 @@
package com.greenorange.promotion.service.project;
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Update;
/**
* @author 35880
@ -10,4 +12,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface SubUserProjectCommissionService extends IService<SubUserProjectCommission> {
}

View File

@ -1,10 +1,34 @@
package com.greenorange.promotion.service.project.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.greenorange.promotion.service.project.ProjectCommissionService;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.mapper.ProjectCommissionMapper;
import com.greenorange.promotion.mapper.SubUserProjectCommissionMapper;
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUniteUpdateRequest;
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionUpdateRequest;
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.greenorange.promotion.model.entity.ProjectDetail;
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
import com.greenorange.promotion.model.entity.UserMainInfo;
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.SubUserProjectCommissionService;
import com.greenorange.promotion.service.userInfo.UserMainInfoService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author 35880
@ -15,6 +39,418 @@ import org.springframework.stereotype.Service;
public class ProjectCommissionServiceImpl extends ServiceImpl<ProjectCommissionMapper, ProjectCommission>
implements ProjectCommissionService{
@Resource
private SubUserProjectCommissionService subUserProjectCommissionService;
@Resource
private ProjectDetailService projectDetailService;
@Resource
private CommonService commonService;
@Resource
private UserMainInfoService userMainInfoService;
@Resource
private SubUserProjectCommissionMapper subUserProjectCommissionMapper;
/**
* 修改项目的抽佣比例
*/
@Override
@Transactional
public void updateProjectCommissionRate(ProjectCommissionUpdateRequest projectCommissionUpdateRequest) {
Long id = projectCommissionUpdateRequest.getId();
BigDecimal currentCommissionRate = projectCommissionUpdateRequest.getCurrentCommissionRate();
// 获取当前项目明细信息
ProjectCommission projectCommission = this.getById(id);
ThrowUtils.throwIf(projectCommission == null, ErrorCode.OPERATION_ERROR, "项目明细抽佣信息不存在");
Long projectDetailId = projectCommission.getProjectDetailId();
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice();
// 查询项目明细列表
List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetailId, this);
List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(projectCommissionList, SubUserProjectCommission.class);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissions) {
subUserProjectCommission.setSubUserId(-1L);
}
List<SubUserProjectCommission> subProjectCommissions = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetailId, subUserProjectCommissionService);
subProjectCommissions.addAll(subUserProjectCommissions);
sortSubProjectCommissions(subProjectCommissions);
Iterator<SubUserProjectCommission> iterator = subProjectCommissions.iterator();
Long initSubUserId = projectCommission.getUserId();
// 1.封装一个Map集合下级用户id当前用户的单价
Map<Long, BigDecimal> subUserUnitPriceMap = new HashMap<>();
while (iterator.hasNext()) {
SubUserProjectCommission commission = iterator.next();
if (!Objects.equals(commission.getUserId(), initSubUserId)) {
if (commission.getSubUserId() != -1L) subUserUnitPriceMap.put(commission.getSubUserId(), calculateFinalPrice(commission.getMyUnitPrice(), commission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
iterator.remove(); // 使用迭代器的 remove() 方法移除
} else {
break;
}
}
// 开始更新集合
for (SubUserProjectCommission subProjectCommission : subProjectCommissions) {
Long userId = subProjectCommission.getUserId();
Long subUserId = subProjectCommission.getSubUserId();
// 初始化map
if (userId.equals(initSubUserId)) {
subProjectCommission.setCurrentCommissionRate(currentCommissionRate);
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(subProjectCommission.getMyUnitPrice(), subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
} else {
BigDecimal unitPrice = subUserUnitPriceMap.get(userId);
subProjectCommission.setMyUnitPrice(unitPrice);
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(unitPrice, subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
}
}
long startTime = System.currentTimeMillis();
// 更新当前用户的项目明细抽佣表和下级用户项目明细抽佣表
List<SubUserProjectCommission> subUserProCommissions = subProjectCommissions.stream()
.filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L && subProjectCommission.getUserId().equals(initSubUserId)).toList();
subUserProjectCommissionService.updateBatchById(subUserProCommissions);
List<SubUserProjectCommission> projectCommissions = subProjectCommissions.stream()
.filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L && subProjectCommission.getUserId().equals(initSubUserId)).toList();
List<ProjectCommission> projectCommissionsList = commonService.convertList(projectCommissions, ProjectCommission.class);
this.updateBatchById(projectCommissionsList);
// 获取结束时间戳
long endTime = System.currentTimeMillis();
// 计算执行时间
long executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
startTime = System.currentTimeMillis();
// 更新下级用户项目明细记录
List<SubUserProjectCommission> subUserProjectCommissionList = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L).toList();
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
batchUpdateSubUserMyUnitPrice(subUserProjectCommissionList);
// 更新用户项目明细抽佣记录
List<SubUserProjectCommission> restProjectCommissions = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L).toList();
List<ProjectCommission> proCommissions = commonService.convertList(restProjectCommissions, ProjectCommission.class);
// this.updateBatchById(proCommissions);
batchUpdateMyUnitPrice(proCommissions);
// 获取结束时间戳
endTime = System.currentTimeMillis();
// 计算执行时间
executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
}
/**
* 修改下级用户的项目明细抽佣比例
*/
@Override
@Transactional
public void updateSubUserProjectCommissionRate(SubUserProjectCommissionUpdateRequest subUserProjectCommissionUpdateRequest) {
Long id = subUserProjectCommissionUpdateRequest.getId();
BigDecimal currentCommissionRate = subUserProjectCommissionUpdateRequest.getCurrentCommissionRate();
// 获取当前项目明细信息
SubUserProjectCommission subUserProjectCommission = subUserProjectCommissionService.getById(id);
ThrowUtils.throwIf(subUserProjectCommission == null, ErrorCode.OPERATION_ERROR, "下级用户项目明细抽佣信息不存在");
Long projectDetailId = subUserProjectCommission.getProjectDetailId();
ProjectDetail projectDetail = projectDetailService.getById(projectDetailId);
BigDecimal maxCommissionRate = projectDetail.getMaxCommissionRate();
ThrowUtils.throwIf(currentCommissionRate.compareTo(maxCommissionRate) > 0, ErrorCode.OPERATION_ERROR, "当前抽佣比例不能大于最大抽佣比例");
BigDecimal projectMinSettlementPrice = projectDetail.getProjectMinSettlementPrice();
// 查询项目明细列表
List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getProjectDetailId, projectDetailId, this);
List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(projectCommissionList, SubUserProjectCommission.class);
for (SubUserProjectCommission subProjectCommission : subUserProjectCommissions) {
subProjectCommission.setSubUserId(-1L);
}
List<SubUserProjectCommission> subProjectCommissions = commonService.findByFieldEqTargetField(SubUserProjectCommission::getProjectDetailId, projectDetailId, subUserProjectCommissionService);
subProjectCommissions.addAll(subUserProjectCommissions);
sortSubProjectCommissions(subProjectCommissions);
Iterator<SubUserProjectCommission> iterator = subProjectCommissions.iterator();
Long initSubUserId = subUserProjectCommission.getUserId();
// 1.封装一个Map集合下级用户id当前用户的单价
Map<Long, BigDecimal> subUserUnitPriceMap = new HashMap<>();
while (iterator.hasNext()) {
SubUserProjectCommission commission = iterator.next();
if (!Objects.equals(commission.getUserId(), initSubUserId)) {
if (commission.getSubUserId() != -1L) subUserUnitPriceMap.put(commission.getSubUserId(), calculateFinalPrice(commission.getMyUnitPrice(), commission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
iterator.remove(); // 使用迭代器的 remove() 方法移除
} else {
break;
}
}
// 开始更新集合
for (SubUserProjectCommission subProjectCommission : subProjectCommissions) {
Long userId = subProjectCommission.getUserId();
Long subUserId = subProjectCommission.getSubUserId();
// 初始化map
if (userId.equals(initSubUserId)) {
// 仅设置单条抽佣比例
if (subProjectCommission.getId().equals(id)) subProjectCommission.setCurrentCommissionRate(currentCommissionRate);
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(subProjectCommission.getMyUnitPrice(), subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
} else {
BigDecimal unitPrice = subUserUnitPriceMap.get(userId);
subProjectCommission.setMyUnitPrice(unitPrice);
if (subUserId != -1L) subUserUnitPriceMap.put(subUserId, calculateFinalPrice(unitPrice, subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
}
}
long startTime = System.currentTimeMillis();
// 更新当前用户的下级用户项目明细抽佣表
List<SubUserProjectCommission> subUserProCommissions = subProjectCommissions.stream()
.filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L && subProjectCommission.getUserId().equals(initSubUserId)).toList();
subUserProjectCommissionService.updateBatchById(subUserProCommissions);
// 获取结束时间戳
long endTime = System.currentTimeMillis();
// 计算执行时间
long executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
startTime = System.currentTimeMillis();
// 更新下级用户项目明细记录
List<SubUserProjectCommission> subUserProjectCommissionList = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L).toList();
// subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
batchUpdateSubUserMyUnitPrice(subUserProjectCommissionList);
// 更新用户项目明细抽佣记录
List<SubUserProjectCommission> projectCommissions = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L).toList();
List<ProjectCommission> proCommissions = commonService.convertList(projectCommissions, ProjectCommission.class);
// this.updateBatchById(proCommissions);
batchUpdateMyUnitPrice(proCommissions);
endTime = System.currentTimeMillis();
// 计算执行时间
executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
}
/**
* 小程序用户一键设置项目的的抽佣比例
*/
@Override
@Transactional
public void uniteProjectCommissionRate(ProjectCommissionUniteUpdateRequest projectCommissionUniteUpdateRequest, HttpServletRequest request) {
long startTime = System.currentTimeMillis();
Long userId = (Long) request.getAttribute("userId");
BigDecimal uniteCommissionRate = projectCommissionUniteUpdateRequest.getUniteCommissionRate();
ThrowUtils.throwIf(uniteCommissionRate.compareTo(BigDecimal.valueOf(10)) > 0, ErrorCode.OPERATION_ERROR, "抽佣比例不能大于10%");
// 修改项目的统一抽佣比例
LambdaUpdateWrapper<UserMainInfo> userMainInfoLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userMainInfoLambdaUpdateWrapper.eq(UserMainInfo::getUserId, userId).set(UserMainInfo::getUniteRate, uniteCommissionRate);
userMainInfoService.update(userMainInfoLambdaUpdateWrapper);
LambdaQueryWrapper<ProjectCommission> projectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
projectCommissionLambdaQueryWrapper.eq(ProjectCommission::getUserId, userId);
List<ProjectCommission> projectCommissionList = this.list(projectCommissionLambdaQueryWrapper);
List<ProjectDetail> projectDetailList = commonService.findByFieldInTargetField(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId);
// 封装map集合项目明细id, 值:项目明细最大抽佣比例)
Map<Long, BigDecimal> map = new HashMap<>();
Map<Long, BigDecimal> minPriceMap = new HashMap<>();
for (ProjectDetail projectDetail : projectDetailList) {
map.put(projectDetail.getId(), projectDetail.getMaxCommissionRate());
minPriceMap.put(projectDetail.getId(), projectDetail.getProjectMinSettlementPrice());
}
for (ProjectCommission projectCommission : projectCommissionList) {
Long projectDetailId = projectCommission.getProjectDetailId();
BigDecimal maxCommissionRate = map.get(projectDetailId);
BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
projectCommission.setCurrentCommissionRate(setCommissionRate);
}
this.updateBatchById(projectCommissionList);
// 获取结束时间戳
long endTime = System.currentTimeMillis();
// 计算执行时间
long executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
startTime = System.currentTimeMillis();
// 修改下级用户的项目明细抽佣比例
LambdaQueryWrapper<SubUserProjectCommission> subUserProjectCommissionLambdaQueryWrapper = new LambdaQueryWrapper<>();
subUserProjectCommissionLambdaQueryWrapper.eq(SubUserProjectCommission::getUserId, userId);
List<SubUserProjectCommission> subUserProjectCommissionList = subUserProjectCommissionService.list(subUserProjectCommissionLambdaQueryWrapper);
for (SubUserProjectCommission subUserProjectCommission : subUserProjectCommissionList) {
Long projectDetailId = subUserProjectCommission.getProjectDetailId();
BigDecimal maxCommissionRate = map.get(projectDetailId);
BigDecimal setCommissionRate = uniteCommissionRate.compareTo(maxCommissionRate) > 0 ? maxCommissionRate : uniteCommissionRate;
subUserProjectCommission.setCurrentCommissionRate(setCommissionRate);
}
subUserProjectCommissionService.updateBatchById(subUserProjectCommissionList);
// 更新项目明细抽佣表和下级项目明细抽佣表的单价
List<ProjectCommission> projectCommissions = this.list();
List<SubUserProjectCommission> subUserProjectCommissions = commonService.convertList(projectCommissions, SubUserProjectCommission.class);
for (SubUserProjectCommission subProjectCommission : subUserProjectCommissions) {
subProjectCommission.setSubUserId(-1L);
}
List<SubUserProjectCommission> subProjectCommissions = subUserProjectCommissionService.list();
// 获取结束时间戳
endTime = System.currentTimeMillis();
// 计算执行时间
executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
subProjectCommissions.addAll(subUserProjectCommissions);
sortProjectDetailAndSubProjectCommissions(subProjectCommissions);
// 1.封装一个Map集合项目明细-下级用户id当前用户的单价
Iterator<SubUserProjectCommission> iterator = subProjectCommissions.iterator();
Map<String, BigDecimal> subUserUnitPriceMap = new HashMap<>();
while (iterator.hasNext()) {
SubUserProjectCommission commission = iterator.next();
Long projectDetailId = commission.getProjectDetailId();
BigDecimal projectMinSettlementPrice = minPriceMap.get(projectDetailId);
if (commission.getUserId() < userId) {
if (commission.getSubUserId() != -1L) subUserUnitPriceMap.put(projectDetailId + "-" + commission.getSubUserId(), calculateFinalPrice(commission.getMyUnitPrice(), commission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
iterator.remove(); // 使用迭代器的 remove() 方法移除
}
}
for (SubUserProjectCommission subProjectCommission : subProjectCommissions) {
Long projectDetailId = subProjectCommission.getProjectDetailId();
BigDecimal projectMinSettlementPrice = minPriceMap.get(projectDetailId);
Long uid = subProjectCommission.getUserId();
Long subUserId = subProjectCommission.getSubUserId();
if (uid.equals(userId)) {
if (subUserId != -1L) subUserUnitPriceMap.put(projectDetailId + "-" + subUserId, calculateFinalPrice(subProjectCommission.getMyUnitPrice(), subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
} else {
BigDecimal unitPrice = subUserUnitPriceMap.get(projectDetailId + "-" + uid);
subProjectCommission.setMyUnitPrice(unitPrice);
if (subUserId != -1L) subUserUnitPriceMap.put(projectDetailId + "-" + subUserId, calculateFinalPrice(unitPrice, subProjectCommission.getCurrentCommissionRate()).max(projectMinSettlementPrice));
}
}
// 更新下级用户项目明细记录
List<SubUserProjectCommission> subCommissionList = subProjectCommissions.stream()
.filter(subProjectCommission -> subProjectCommission.getSubUserId() != -1L).toList();
// 获取开始时间戳
startTime = System.currentTimeMillis();
// subUserProjectCommissionService.updateBatchById(subCommissionList);
batchUpdateSubUserMyUnitPrice(subCommissionList);
// 获取结束时间戳
endTime = System.currentTimeMillis();
// 计算执行时间
executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
startTime = System.currentTimeMillis();
// 更新用户项目明细抽佣记录
List<SubUserProjectCommission> proCommissions = subProjectCommissions.stream().filter(subProjectCommission -> subProjectCommission.getSubUserId() == -1L).toList();
List<ProjectCommission> proCommissionList = commonService.convertList(proCommissions, ProjectCommission.class);
// this.updateBatchById(proCommissionList);
batchUpdateMyUnitPrice(proCommissionList);
// 获取结束时间戳
endTime = System.currentTimeMillis();
// 计算执行时间
executionTime = endTime - startTime;
System.out.println("程序执行时间: " + executionTime + " 毫秒");
}
public void batchUpdateSubUserMyUnitPrice(List<SubUserProjectCommission> subCommissionList) {
StringBuilder sql = new StringBuilder("UPDATE sub_user_project_commission SET myUnitPrice = CASE id ");
// 为每个记录构建 WHEN 条件
for (SubUserProjectCommission subUserProjectCommission : subCommissionList) {
sql.append("WHEN ").append(subUserProjectCommission.getId())
.append(" THEN ").append(subUserProjectCommission.getMyUnitPrice()).append(" ");
}
sql.append("END WHERE id IN (");
// 添加所有 ID 到 WHERE 条件
for (int i = 0; i < subCommissionList.size(); i++) {
sql.append(subCommissionList.get(i).getId());
if (i < subCommissionList.size() - 1) {
sql.append(",");
}
}
sql.append(");");
// 执行 SQL 语句
subUserProjectCommissionMapper.executeUpdate(sql.toString());
}
public void batchUpdateMyUnitPrice(List<ProjectCommission> projectCommissionList) {
StringBuilder sql = new StringBuilder("UPDATE project_commission SET myUnitPrice = CASE id ");
// 为每条记录构建 WHEN ... THEN ...
for (ProjectCommission pc : projectCommissionList) {
sql.append("WHEN ").append(pc.getId())
.append(" THEN ").append(pc.getMyUnitPrice()).append(" ");
}
sql.append("END WHERE id IN (");
// 拼接所有 id 到 IN 列表
for (int i = 0; i < projectCommissionList.size(); i++) {
sql.append(projectCommissionList.get(i).getId());
if (i < projectCommissionList.size() - 1) {
sql.append(",");
}
}
sql.append(")");
// 执行拼好的 SQL
this.baseMapper.executeUpdate(sql.toString());
}
// 封装排序方法
private void sortSubProjectCommissions(List<SubUserProjectCommission> subProjectCommissions) {
// 先根据userId升序排序
// 如果userId相同再根据subUserId升序排序
Collections.sort(subProjectCommissions, Comparator.comparingLong(SubUserProjectCommission::getUserId).thenComparingLong(SubUserProjectCommission::getSubUserId));
}
// 封装排序方法
private void sortProjectDetailAndSubProjectCommissions(List<SubUserProjectCommission> subProjectCommissions) {
// 先根据userId升序排序
// 如果userId相同再根据subUserId升序排序
Collections.sort(subProjectCommissions, Comparator.comparingLong(SubUserProjectCommission::getProjectDetailId).thenComparingLong(SubUserProjectCommission::getUserId).thenComparingLong(SubUserProjectCommission::getSubUserId));
}
// 封装方法:根据价格和抽佣比例计算最终价格
private BigDecimal calculateFinalPrice(BigDecimal price, BigDecimal commissionRate) {
// 计算抽佣比例对应的系数
BigDecimal commissionFactor = BigDecimal.ONE.subtract(commissionRate.divide(BigDecimal.valueOf(100)));
// 计算最终价格
return price.multiply(commissionFactor);
}
}

View File

@ -1,10 +1,25 @@
package com.greenorange.promotion.service.project.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.greenorange.promotion.common.ErrorCode;
import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.mapper.ProjectCommissionMapper;
import com.greenorange.promotion.mapper.UserInfoMapper;
import com.greenorange.promotion.model.dto.subUserProjectCommission.SubUserProjectCommissionUpdateRequest;
import com.greenorange.promotion.model.entity.ProjectCommission;
import com.greenorange.promotion.model.entity.SubUserProjectCommission;
import com.greenorange.promotion.model.entity.UserInfo;
import com.greenorange.promotion.service.project.ProjectCommissionService;
import com.greenorange.promotion.service.project.SubUserProjectCommissionService;
import com.greenorange.promotion.mapper.SubUserProjectCommissionMapper;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
/**
* @author 35880
@ -15,6 +30,7 @@ import org.springframework.stereotype.Service;
public class SubUserProjectCommissionServiceImpl extends ServiceImpl<SubUserProjectCommissionMapper, SubUserProjectCommission>
implements SubUserProjectCommissionService{
}

View File

@ -21,4 +21,10 @@
currentCommissionRate,projectId,userId,
isDelete,createTime,updateTime
</sql>
<!-- <update id="executeUpdate" parameterType="String">-->
<!-- ${sql}-->
<!-- </update>-->
</mapper>

View File

@ -23,4 +23,10 @@
userId,isDelete,createTime,
updateTime
</sql>
<!-- <update id="executeUpdate" parameterType="String">-->
<!-- ${sql}-->
<!-- </update>-->
</mapper>