Compare commits

...

6 Commits

15 changed files with 142 additions and 35 deletions

View File

@ -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.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog;
@ -24,16 +25,15 @@ 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;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
@ -70,6 +70,12 @@ public class ProjectCommissionController {
@Resource
private UserInfoService userInfoService;
@Resource
private UserMainInfoService userMainInfoService;
/**
* 小程序用户查看查询项目的抽佣情况
@ -279,6 +285,12 @@ public class ProjectCommissionController {
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);

View File

@ -28,6 +28,7 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@ -38,6 +39,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
@ -114,6 +116,7 @@ public class ProjectSettlementController {
* @return 是否添加成功
*/
@PostMapping("add")
@Transactional(rollbackFor = Exception.class)
@Operation(summary = "web端管理员添加项目结算记录", description = "参数项目结算记录添加请求体权限管理员方法名addProjectSettlement")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "项目结算记录管理", content = "web端管理员添加项目结算记录")
@ -123,7 +126,9 @@ public class ProjectSettlementController {
projectSettlementService.save(projectSettlement);
Long userId = projectSettlement.getUserId();
UserMainInfo userMainInfo = userMainInfoService.getById(userId);
LambdaQueryWrapper<UserMainInfo> userMainInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
userMainInfoLambdaQueryWrapper.eq(UserMainInfo::getUserId, userId);
UserMainInfo userMainInfo = userMainInfoService.getOne(userMainInfoLambdaQueryWrapper);
BigDecimal currentBalance = userMainInfo.getCurrentBalance();
// 获取项目结算记录的参数
BigDecimal settlementRevenue = projectSettlement.getSettlementRevenue();
@ -141,7 +146,7 @@ public class ProjectSettlementController {
Long subUid = subUserProjectCommission.getSubUserId();
BigDecimal myUnitPrice = subUserProjectCommission.getMyUnitPrice();
BigDecimal currentCommissionRate = subUserProjectCommission.getCurrentCommissionRate();
BigDecimal agentUnitPrice = myUnitPrice.multiply(BigDecimal.ONE.subtract(currentCommissionRate));
BigDecimal agentUnitPrice = myUnitPrice.multiply(BigDecimal.ONE.subtract(currentCommissionRate.divide(BigDecimal.valueOf(100))));
if (agentUnitPrice.compareTo(projectMinSettlementPrice) <= 0) agentUnitPrice = projectMinSettlementPrice;
subUserProjectCommissionMap.put(uid + "-" + subUid, myUnitPrice.subtract(agentUnitPrice));
}
@ -172,13 +177,25 @@ public class ProjectSettlementController {
.build();
fundsChangeService.save(fundsChange);
// 获取用户主要信息
List<UserMainInfo> userMainInfoList = commonService.findByFieldInTargetField(pathToRoot, userMainInfoService, Function.identity(), UserMainInfo::getUserId);
// 封装Map集合用户id用户余额
Map<Long, BigDecimal> userMainInfoMap = new HashMap<>();
for (UserMainInfo mainInfo : userMainInfoList) {
userMainInfoMap.put(mainInfo.getUserId(), mainInfo.getCurrentBalance());
}
// 批量添加上级用户的项目结算记录
List<FundsChange> fundsChangeList = new ArrayList<>();
for (ProjectSettlement projectSettle : projectSettlementList) {
// 取出当前用户的余额
Long uid = projectSettle.getUserId();
BigDecimal currentAmount = userMainInfoMap.get(uid);
FundsChange funds = FundsChange.builder()
.projectName(projectSettle.getProjectDetailName())
.changeAmount(projectSettle.getSettlementRevenue())
.userId(projectSettle.getUserId())
.currentAmount(currentAmount.add(projectSettle.getSettlementRevenue()))
.userId(uid)
.projectSettlementId(projectSettle.getId())
.build();
fundsChangeList.add(funds);

View File

@ -1,5 +1,6 @@
package com.greenorange.promotion.model.dto.projectSettlement;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Min;

View File

@ -21,6 +21,7 @@ import java.math.BigDecimal;
"withdrawalAmount",
"withdrawnAmount",
"totalIncome",
"uniteRate",
"userId",
"inviteQrCode",
})
@ -68,6 +69,12 @@ public class UserMainInfoAddRequest implements Serializable {
@Schema(description = "累计收入", example = "70.00")
private BigDecimal totalIncome;
/**
* 统一抽佣比例
*/
@Schema(description = "统一抽佣比例", example = "5")
private BigDecimal uniteRate;
/**
* 用户id
*/

View File

@ -67,6 +67,12 @@ public class UserMainInfoQueryRequest extends PageRequest implements Serializabl
@Schema(description = "累计收入", example = "70.00")
private BigDecimal totalIncome;
/**
* 统一抽佣比例
*/
@Schema(description = "统一抽佣比例", example = "5")
private BigDecimal uniteRate;
/**
* 用户id
*/

View File

@ -22,6 +22,7 @@ import java.math.BigDecimal;
"withdrawalAmount",
"withdrawnAmount",
"totalIncome",
"uniteRate",
"userId",
"inviteQrCode",
})
@ -76,6 +77,12 @@ public class UserMainInfoUpdateRequest implements Serializable {
@Schema(description = "累计收入", example = "70.00")
private BigDecimal totalIncome;
/**
* 统一抽佣比例
*/
@Schema(description = "统一抽佣比例", example = "5")
private BigDecimal uniteRate;
/**
* 用户id
*/

View File

@ -52,6 +52,11 @@ public class UserMainInfo implements Serializable {
*/
private BigDecimal totalIncome;
/**
* 统一抽佣比例
*/
private BigDecimal uniteRate;
/**
* 用户id
*/

View File

@ -62,6 +62,12 @@ public class UserMainInfoVO implements Serializable {
@Schema(description = "累计收入", example = "100.00")
private BigDecimal totalIncome;
/**
* 统一抽佣比例
*/
@Schema(description = "统一抽佣比例", example = "5")
private BigDecimal uniteRate;
/**
* 用户id
*/

View File

@ -18,6 +18,7 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@ -38,8 +39,9 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
// 上传文件的服务器存储目录
private static final String UPLOAD_DIR = "/www/wwwroot/fileUpload_qc/";
// 文件上传的存储目录
@Value("${file.upload-dir}")
private String uploadDir;
// 优化设置一个合理的缓冲区大小
@ -101,7 +103,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
.build();
this.save(fileInfo);
// 创建上传目录如果不存在
File file = new File(UPLOAD_DIR + fileName);
File file = new File(uploadDir + fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();// 如果路径不存在则创建
}
@ -132,7 +134,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
FileInfo fileInfo = this.getOne(lambdaQueryWrapper);
ThrowUtils.throwIf(fileInfo == null, ErrorCode.NOT_FOUND_ERROR, "文件不存在");
File file = new File(UPLOAD_DIR + fileInfo.getName());
File file = new File(uploadDir + fileInfo.getName());
// // 设置response的Header
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileInfo.getName(), StandardCharsets.UTF_8));

View File

@ -14,13 +14,11 @@ import com.greenorange.promotion.exception.ThrowUtils;
import com.greenorange.promotion.mapper.UserInfoMapper;
import com.greenorange.promotion.model.dto.projectCommission.ProjectCommissionAddRequest;
import com.greenorange.promotion.model.dto.userInfo.*;
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.model.entity.UserMainInfo;
import com.greenorange.promotion.model.entity.*;
import com.greenorange.promotion.model.enums.UserRoleEnum;
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.UserInfoService;
import com.greenorange.promotion.service.userInfo.UserMainInfoService;
@ -34,14 +32,17 @@ import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
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.concurrent.TimeUnit;
import java.util.function.Function;
/**
* @author 35880
@ -71,16 +72,25 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
@Resource
private WechatGetQrcodeService wechatGetQrcodeService;
@Resource
private ProjectCommissionService projectCommissionService;
@Resource
private SubUserProjectCommissionService subUserProjectCommissionService;
@Resource
private UserInfoMapper userInfoMapper;
@Resource
private ProjectDetailService projectDetailService;
/**
* 获取查询条件
*/
@ -125,6 +135,7 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
* 小程序用户注册
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void userInfoMiniRegister(UserInfoRegisterRequest userInfoRegisterRequest) {
String phoneNumber = userInfoRegisterRequest.getPhoneNumber();
ThrowUtils.throwIf(RegexUtils.isPhoneInvalid(phoneNumber), ErrorCode.PARAMS_ERROR, "手机号格式无效");
@ -178,21 +189,30 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
// 查询上级用户的项目抽佣记录
List<ProjectCommission> projectCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getUserId, parentUserInfo.getId(), projectCommissionService);
// 封装Map集合项目明细id, 项目最小价格
Map<Long, BigDecimal> projectDetailMinPriceMap = new HashMap<>();
List<ProjectDetail> projectDetailList = commonService.findByFieldInTargetField(projectCommissionList, projectDetailService, ProjectCommission::getProjectDetailId, ProjectDetail::getId);
for (ProjectDetail projectDetail : projectDetailList) {
projectDetailMinPriceMap.put(projectDetail.getId(), projectDetail.getProjectMinSettlementPrice());
}
// 插入当前用户的项目抽佣记录
List<ProjectCommission> projectCommissions = new ArrayList<>();
for (ProjectCommission projectCommission : projectCommissionList) {
ProjectCommissionAddRequest projectCommissionAddRequest = commonService.copyProperties(projectCommission, ProjectCommissionAddRequest.class);
ProjectCommission proCommission = commonService.copyProperties(projectCommissionAddRequest, ProjectCommission.class);
proCommission.setMyUnitPrice(projectCommission.getMyUnitPrice().multiply(BigDecimal.ONE.subtract(projectCommission.getCurrentCommissionRate())));
// 获取当前项目明细的最小结算价格
BigDecimal projectMinSettlementPrice = projectDetailMinPriceMap.get(projectCommission.getProjectDetailId());
BigDecimal currentSettlementPrice = projectCommission.getMyUnitPrice().multiply(BigDecimal.ONE.subtract(projectCommission.getCurrentCommissionRate().divide(BigDecimal.valueOf(100))));
// 比较当前结算价格和项目明细最小结算价格取出最大值
proCommission.setMyUnitPrice(projectMinSettlementPrice.max(currentSettlementPrice));
proCommission.setCurrentCommissionRate(BigDecimal.ZERO);
proCommission.setUserId(myUserInfo.getId());
projectCommissions.add(proCommission);
}
projectCommissionService.saveBatch(projectCommissions);
// 插入下级用户的项目明细抽佣记录
List<ProjectCommission> proCommissionList = commonService.findByFieldEqTargetField(ProjectCommission::getUserId, parentUserInfo.getId(), projectCommissionService);
List<SubUserProjectCommission> subUserProjectCommissionList = new ArrayList<>();
for (ProjectCommission projectCommission : proCommissionList) {
for (ProjectCommission projectCommission : projectCommissionList) {
ProjectCommissionAddRequest projectCommissionAddRequest = commonService.copyProperties(projectCommission, ProjectCommissionAddRequest.class);
SubUserProjectCommission subUserProjectCommission = commonService.copyProperties(projectCommissionAddRequest, SubUserProjectCommission.class);
subUserProjectCommission.setSubUserId(myUserInfo.getId());

View File

@ -19,9 +19,11 @@ import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.annotation.Resource;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
@ -36,8 +38,9 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService {
// 上传文件的服务器存储目录
private static final String UPLOAD_DIR = "D:/qingcheng/image/";
// 文件上传的存储目录
@Value("${file.upload-dir}")
private String uploadDir;
private final static String ACCESS_TOKEN_KEY = "accessToken";
@ -99,15 +102,16 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService {
* 获取微信小程序二维码
*/
@Override
@Transactional(rollbackFor = Exception.class)
public String getWxQrCode(String inviteCode) throws IOException {
String accessToken = (String) redisTemplate.opsForValue().get(ACCESS_TOKEN_KEY);
if (accessToken == null) {
accessToken = this.getAccessToken().getAccess_token();
}
Map<String, Object> param = new HashMap<>();
param.put("page", "pages/login/login");
param.put("page", "pages/loginModule/register/register");
param.put("scene", "invitationCode=" + inviteCode);
param.put("width", 430); // 宽度
param.put("width", 430);
param.put("check_path", false);
param.put("env_version", "develop");
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
@ -140,14 +144,12 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService {
byte[] resultBytes = resultStream.readAllBytes();
// 创建上传目录如果不存在
String biz = "default";
String fileName = "qrcode.png";
String fileName = RandomStringUtils.random(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + "." + "png";
// 获取文件类型
String fileType = FileUtil.getSuffix(fileName);
// 获取文件路径
String filePath = String.format("%s-%s", biz, fileName);
// 获取view值
String view = RandomStringUtils.random(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
File file = new File(UPLOAD_DIR + filePath);
File file = new File(uploadDir + fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();// 如果路径不存在则创建
}
@ -181,6 +183,6 @@ public class WechatGetQrcodeServiceImpl implements WechatGetQrcodeService {
.hashValue(hashValue)
.build();
fileInfoService.save(fileInfo);
return view;
return biz + "-" + view;
}
}

View File

@ -21,13 +21,18 @@ spring:
multipart:
max-file-size: 20MB
max-request-size: 20MB
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#文件上传和下载地址
file:
# upload-dir: /www/wwwroot/fileUpload_qc/
upload-dir: D:/qingcheng/image/
springdoc:
default-flat-param-object: true

View File

@ -22,13 +22,18 @@ spring:
multipart:
max-file-size: 20MB
max-request-size: 20MB
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#文件上传和下载地址
file:
# upload-dir: /www/wwwroot/fileUpload_qc/
upload-dir: D:/qingcheng/image/
springdoc:
default-flat-param-object: true

View File

@ -22,13 +22,19 @@ spring:
multipart:
max-file-size: 20MB
max-request-size: 20MB
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#文件上传和下载地址
file:
# upload-dir: /www/wwwroot/fileUpload_qc/
upload-dir: D:/qingcheng/image/
springdoc:
default-flat-param-object: true

View File

@ -22,12 +22,18 @@ spring:
multipart:
max-file-size: 20MB
max-request-size: 20MB
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
# 文件上传和下载地址
file:
# upload-dir: /www/wwwroot/fileUpload_qc/
upload-dir: D:/qingcheng/image/
springdoc:
default-flat-param-object: true