Commit d5b28c66 by zhangxingmin

Merge remote-tracking branch 'origin/dev' into prod

# Conflicts:
#	yd-csf-service/src/main/java/com/yd/csf/service/service/impl/CommissionServiceImpl.java
parents cb742840 3cffef0e
......@@ -349,12 +349,8 @@ public class ApiCommissionController {
// if (!oldCommission.getUserId().equals(loginUserId) && !userService.isAdmin(request)) {
// throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
// }
// 操作数据库
boolean result = commissionService.removeById(oldCommission.getId());
if (!result) {
return Result.fail(ErrorCode.OPERATION_ERROR.getCode(), ErrorCode.OPERATION_ERROR.getMessage());
}
return Result.success(result);
return Result.success(commissionService.deleteCommission(oldCommission));
}
/**
......
......@@ -54,6 +54,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -63,6 +64,7 @@ import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;
......
package com.yd.csf.api.controller;
import com.yd.common.result.Result;
import com.yd.csf.api.dto.ApiSalarySplitSummaryPageDTO;
import com.yd.csf.api.service.ApiSalarySplitService;
import com.yd.csf.feign.client.salarysplit.ApiSalarySplitFeignClient;
import com.yd.csf.feign.request.salarysplit.*;
import com.yd.csf.api.dto.ApiSalarySplitPageListDTO;
import com.yd.csf.feign.response.salarysplit.ApiCalculateToAmountResponse;
import com.yd.csf.feign.response.salarysplit.ApiQueryRemainingResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitExportSummaryListResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitQueryRateResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 薪资拆分应发信息
*
* @author zxm
* @since 2026-03-11
*/
@RestController
@RequestMapping("/salarySplit")
@Validated
public class ApiSalarySplitController implements ApiSalarySplitFeignClient {
@Autowired
private ApiSalarySplitService apiSalarySplitService;
/**
* 分页查询-薪资拆分应发信息汇总列表
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitSummaryPageDTO> summaryPage(ApiSalarySplitSummaryPageRequest request) {
return apiSalarySplitService.summaryPage(request);
}
/**
* 分页查询-薪资拆分应发信息列表
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitPageListDTO> page(ApiSalarySplitPageRequest request) {
return apiSalarySplitService.page(request);
}
/**
* 批量保存-薪资拆分应发信息列表
* @param request
* @return
*/
@Override
public Result batchSave(ApiSalarySplitBatchSaveRequest request) {
return apiSalarySplitService.batchSave(request);
}
/**
* 查询-原币种剩余总金额和原币种
* @param request
* @return
*/
@Override
public Result<ApiQueryRemainingResponse> queryRemaining(ApiQueryRemainingRequest request) {
return apiSalarySplitService.queryRemaining(request);
}
/**
* 查询-原币种和原币种金额——>目标币种即时汇率和目标币种金额
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitQueryRateResponse> queryRate(ApiSalarySplitQueryRateRequest request) {
return apiSalarySplitService.queryRate(request);
}
/**
* 计算-目标金额
* @param request
* @return
*/
@Override
public Result<ApiCalculateToAmountResponse> calculateToAmount(ApiCalculateToAmountRequest request) {
return apiSalarySplitService.calculateToAmount(request);
}
/**
* 导出-薪资拆分应发信息汇总列表
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitExportSummaryListResponse> export(ApiSalarySplitExportSummaryListRequest request) {
return apiSalarySplitService.export(request);
}
}
package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitPageDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitStatisticsDto;
import lombok.Data;
@Data
public class ApiSalarySplitPageListDTO {
/**
* 薪资拆分统计信息
*/
private ApiSalarySplitStatisticsDto statisticsDto;
/**
* 薪资拆分分页信息
*/
private IPage<ApiSalarySplitPageDto> page;
}
package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryPageDto;
import lombok.Data;
import java.util.List;
@Data
public class ApiSalarySplitSummaryPageDTO {
/**
* 薪资拆分应发表唯一业务ID列表
*/
private List<String> salarySplitBizIdList;
/**
* 统计信息
*/
private ApiSalarySplitSummaryDto statisticsDto;
/**
* 分页信息
*/
private IPage<ApiSalarySplitSummaryPageDto> page;
}
package com.yd.csf.api.service;
import com.yd.common.result.Result;
import com.yd.csf.api.dto.ApiSalarySplitSummaryPageDTO;
import com.yd.csf.feign.request.salarysplit.*;
import com.yd.csf.api.dto.ApiSalarySplitPageListDTO;
import com.yd.csf.feign.response.salarysplit.ApiCalculateToAmountResponse;
import com.yd.csf.feign.response.salarysplit.ApiQueryRemainingResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitExportSummaryListResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitQueryRateResponse;
public interface ApiSalarySplitService {
Result<ApiSalarySplitSummaryPageDTO> summaryPage(ApiSalarySplitSummaryPageRequest request);
Result<ApiSalarySplitPageListDTO> page(ApiSalarySplitPageRequest request);
Result batchSave(ApiSalarySplitBatchSaveRequest request);
Result<ApiQueryRemainingResponse> queryRemaining(ApiQueryRemainingRequest request);
Result<ApiSalarySplitQueryRateResponse> queryRate(ApiSalarySplitQueryRateRequest request);
Result<ApiCalculateToAmountResponse> calculateToAmount(ApiCalculateToAmountRequest request);
Result<ApiSalarySplitExportSummaryListResponse> export(ApiSalarySplitExportSummaryListRequest request);
}
......@@ -242,11 +242,12 @@ public class ApiCsfCommonServiceImpl implements ApiCsfCommonService {
public static void main(String[] args) {
ApiCsfCommonServiceImpl commonService = new ApiCsfCommonServiceImpl();
ApiCsfCalculateRequest request = new ApiCsfCalculateRequest();
request.setRequestValue("310111202603191111");
request.setCalculateType(6);
Result<List<ApiCsfCalculateResponse>> result = commonService.calculate(request);
System.out.println(result);
System.out.println(commonService.convertChineseToPinyin("吕姐"));
// ApiCsfCalculateRequest request = new ApiCsfCalculateRequest();
// request.setRequestValue("310111202603191111");
// request.setCalculateType(6);
// Result<List<ApiCsfCalculateResponse>> result = commonService.calculate(request);
// System.out.println(result);
}
/**
......@@ -282,6 +283,47 @@ public class ApiCsfCommonServiceImpl implements ApiCsfCommonService {
}
}
// /**
// * 中文转拼音辅助方法
// * @param chinese
// * @return
// */
// private String convertChineseToPinyin(String chinese) {
// HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
// format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
// format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
//
// StringBuilder pinyin = new StringBuilder();
// boolean lastIsChinese = false; // 标记上一个字符是否为汉字,用于控制空格添加
//
// for (char c : chinese.toCharArray()) {
// if (Character.toString(c).matches("[\\u4E00-\\u9FA5]")) {
// try {
// String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
// if (pinyinArray != null && pinyinArray.length > 0) {
// // 如果上一个字符是汉字且当前也是汉字,则先加空格(避免开头空格)
// if (lastIsChinese) {
// pinyin.append(' ');
// }
// pinyin.append(pinyinArray[0]);
// lastIsChinese = true;
// } else {
// // 如果没有拼音,原样追加
// pinyin.append(c);
// lastIsChinese = false;
// }
// } catch (BadHanyuPinyinOutputFormatCombination e) {
// pinyin.append(c);
// lastIsChinese = false;
// }
// } else {
// pinyin.append(c);
// lastIsChinese = false;
// }
// }
// return pinyin.toString();
// }
/**
* 中文转拼音辅助方法
* @param chinese
......@@ -293,21 +335,27 @@ public class ApiCsfCommonServiceImpl implements ApiCsfCommonService {
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
StringBuilder pinyin = new StringBuilder();
boolean lastIsChinese = false; // 标记上一个字符是否为汉字,用于控制空格添加
boolean lastIsChinese = false;
for (char c : chinese.toCharArray()) {
if (Character.toString(c).matches("[\\u4E00-\\u9FA5]")) {
try {
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (pinyinArray != null && pinyinArray.length > 0) {
// 如果上一个字符是汉字且当前也是汉字,则先加空格(避免开头空格)
String py = pinyinArray[0];
// 将 ü / Ü 替换为 v / V
py = py.replace("U:","V").replace("u:","v").replace("ü", "v").replace("Ü", "V");
// 移除所有非字母字符(如冒号)
py = py.replaceAll("[^A-Z]", "");
if (StringUtils.isBlank(py)) {
py = String.valueOf(c);
}
if (lastIsChinese) {
pinyin.append(' ');
}
pinyin.append(pinyinArray[0]);
pinyin.append(py);
lastIsChinese = true;
} else {
// 如果没有拼音,原样追加
pinyin.append(c);
lastIsChinese = false;
}
......@@ -323,5 +371,4 @@ public class ApiCsfCommonServiceImpl implements ApiCsfCommonService {
return pinyin.toString();
}
}
......@@ -460,7 +460,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
}
@Transactional(rollbackFor = Exception.class)
private void updateHkdAmountBatch(List<ExpectedFortune> expectedFortuneList, String policyCurrency, List<ApiAnnouncementCommissionRatioListResponse> announcementRatioList) {
public void updateHkdAmountBatch(List<ExpectedFortune> expectedFortuneList, String policyCurrency, List<ApiAnnouncementCommissionRatioListResponse> announcementRatioList) {
log.info("------------------------开始计算默认结算汇率、港币金额----------------------");
......@@ -1244,18 +1244,22 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
if (expectedFortune.getPaidAmount().compareTo(BigDecimal.ZERO) > 0) {
throw new BusinessException(ResultCode.FAIL.getCode(), "当前应付款已有出账金额,不能修改");
}
CurrencyEnum currencyEnum;
try {
currencyEnum = CurrencyEnum.valueOf(request.getCurrency());
} catch (IllegalArgumentException e) {
throw new BusinessException(ResultCode.FAIL.getCode(), "币种错误:" + request.getCurrency());
}
ExpectedFortune updateExpectedFortune = new ExpectedFortune();
BeanUtils.copyProperties(request, updateExpectedFortune);
updateExpectedFortune.setId(expectedFortune.getId());
// 默认结算汇率
if (updateExpectedFortune.getDefaultExchangeRate() == null) {
updateExpectedFortune.setDefaultExchangeRate(
queryExchangeRateByFeign(
updateExpectedFortune.getPolicyCurrency(),
expectedFortune.getPolicyCurrency(),
updateExpectedFortune.getCurrency()
));
}
// 计算港币金额
updateExpectedFortune.setHkdAmount(updateExpectedFortune.getAmount().multiply(updateExpectedFortune.getDefaultExchangeRate()));
......
package com.yd.csf.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.base.feign.client.exchangerate.ApiExchangeRateFeignClient;
import com.yd.base.feign.request.exchangerate.ApiExchangeRateConvertRequest;
import com.yd.base.feign.response.exchangerate.ApiExchangeRateConvertResponse;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.CodeGenerator;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.dto.ApiSalarySplitSummaryPageDTO;
import com.yd.csf.api.service.ApiSalarySplitService;
import com.yd.csf.api.utils.ExchangeUtils;
import com.yd.csf.feign.dto.excel.ApiSalarySplitSummaryExcelDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitBatchSaveDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitPageDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitStatisticsDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryPageDto;
import com.yd.csf.feign.request.salarysplit.*;
import com.yd.csf.api.dto.ApiSalarySplitPageListDTO;
import com.yd.csf.feign.response.salarysplit.ApiCalculateToAmountResponse;
import com.yd.csf.feign.response.salarysplit.ApiQueryRemainingResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitExportSummaryListResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitQueryRateResponse;
import com.yd.csf.service.model.FortuneAccount;
import com.yd.csf.service.model.SalarySplit;
import com.yd.csf.service.service.FortuneAccountService;
import com.yd.csf.service.service.ISalarySplitService;
import com.yd.oss.feign.client.ApiExcelFeignClient;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.request.ApiExportRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
@Autowired
private FortuneAccountService fortuneAccountService;
@Autowired
private ISalarySplitService iSalarySplitService;
@Autowired
private ApiExchangeRateFeignClient apiExchangeRateFeignClient;
@Autowired
private ApiExcelFeignClient apiExcelFeignClient;
/**
* 分页查询-薪资拆分应发信息汇总列表
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitSummaryPageDTO> summaryPage(ApiSalarySplitSummaryPageRequest request) {
ApiSalarySplitSummaryPageDTO response = new ApiSalarySplitSummaryPageDTO();
// 查询分页信息
Page<ApiSalarySplitSummaryPageDto> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiSalarySplitSummaryPageDto> iPage = iSalarySplitService.summaryPage(page, request);
response.setPage(iPage);
//查询薪资拆分业务ID列表
List<String> salarySplitBizIdList = iSalarySplitService.queryList(request);
response.setSalarySplitBizIdList(salarySplitBizIdList);
return Result.success(response);
}
/**
* 分页查询-薪资拆分应发信息列表
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitPageListDTO> page(ApiSalarySplitPageRequest request) {
ApiSalarySplitPageListDTO response = new ApiSalarySplitPageListDTO();
// 查询分页信息
Page<ApiSalarySplitPageDto> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiSalarySplitPageDto> iPage = iSalarySplitService.page(page, request);
response.setPage(iPage);
// 查询统计信息
ApiSalarySplitStatisticsDto statisticsDto = new ApiSalarySplitStatisticsDto();
FortuneAccount fortuneAccount = fortuneAccountService.queryOne(request.getFortuneAccountBizId());
// 出账币种
statisticsDto.setBeSplitCurrency(fortuneAccount != null ? fortuneAccount.getCurrency() : "");
BigDecimal beSplitAmount = BigDecimal.ZERO;
if (fortuneAccount != null) {
// 查询所有拆分记录,计算已拆分总金额
List<SalarySplit> salarySplits = iSalarySplitService.lambdaQuery()
.eq(SalarySplit::getFortuneAccountBizId, request.getFortuneAccountBizId())
.list();
BigDecimal splitTotal = salarySplits.stream()
.map(SalarySplit::getFromAmount)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal fortuneAmount = fortuneAccount.getHkdAmount() != null ? fortuneAccount.getHkdAmount() : BigDecimal.ZERO;
beSplitAmount = fortuneAmount.subtract(splitTotal);
if (beSplitAmount.compareTo(BigDecimal.ZERO) < 0) {
beSplitAmount = BigDecimal.ZERO; // 防止负数
}
}
statisticsDto.setBeSplitAmount(beSplitAmount);
response.setStatisticsDto(statisticsDto);
return Result.success(response);
}
/**
* 批量保存
* @param request
* @return
*/
@Override
public Result batchSave(ApiSalarySplitBatchSaveRequest request) {
//查询出账记录是否存在
FortuneAccount fortuneAccount = fortuneAccountService.queryOne(request.getFortuneAccountBizId());
if (fortuneAccount == null) {
throw new BusinessException("出账记录不存在");
}
//薪资拆分应发记录-先删除后新增
iSalarySplitService.deleteByFortuneAccountBizId(request.getFortuneAccountBizId());
//批量新增
if (CollectionUtils.isEmpty(request.getApiSalarySplitBatchSaveDtoList())) {
return Result.success();
}
List<SalarySplit> salarySplitList = new ArrayList<>();
for (ApiSalarySplitBatchSaveDto dto : request.getApiSalarySplitBatchSaveDtoList()) {
SalarySplit salarySplit = new SalarySplit();
BeanUtils.copyProperties(dto,salarySplit);
//薪资拆分应发表唯一业务ID
salarySplit.setSalarySplitBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_SALARY_SPLIT.getCode()));
//发放编号
salarySplit.setSalarySplitNo(CodeGenerator.generate10Code("SP"));
//出账记录业务id
salarySplit.setFortuneAccountBizId(request.getFortuneAccountBizId());
salarySplitList.add(salarySplit);
}
iSalarySplitService.saveOrUpdateBatch(salarySplitList);
return Result.success();
}
/**
* 查询-原币种剩余总金额和原币种
* @param request
* @return
*/
@Override
public Result<ApiQueryRemainingResponse> queryRemaining(ApiQueryRemainingRequest request) {
// 1. 校验出账记录是否存在
FortuneAccount fortuneAccount = fortuneAccountService.queryOne(request.getFortuneAccountBizId());
if (fortuneAccount == null) {
throw new BusinessException("出账记录不存在");
}
// 2. 计算本次拟拆分金额总和(使用请求中的 fromAmountList)
BigDecimal splitTotal = BigDecimal.ZERO;
if (CollectionUtils.isNotEmpty(request.getFromAmountList())) {
splitTotal = request.getFromAmountList().stream()
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
// 3. 计算剩余可拆金额(账户总额 - 本次拟拆分总额)
BigDecimal fortuneAmount = fortuneAccount.getHkdAmount() != null ? fortuneAccount.getHkdAmount() : BigDecimal.ZERO;
BigDecimal beSplitAmount = fortuneAmount.subtract(splitTotal);
if (beSplitAmount.compareTo(BigDecimal.ZERO) < 0) {
beSplitAmount = BigDecimal.ZERO; // 防止负数
}
// 4. 封装响应
ApiQueryRemainingResponse response = new ApiQueryRemainingResponse();
response.setCurrency(fortuneAccount.getCurrency());
response.setFromAmount(beSplitAmount);
return Result.success(response);
}
/**
* 查询-原币种和原币种金额——>目标币种即时汇率和目标币种金额
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitQueryRateResponse> queryRate(ApiSalarySplitQueryRateRequest request) {
//查询出账记录是否存在
FortuneAccount fortuneAccount = fortuneAccountService.queryOne(request.getFortuneAccountBizId());
if (fortuneAccount == null) {
throw new BusinessException("出账记录不存在");
}
ApiExchangeRateConvertRequest convertRequest = new ApiExchangeRateConvertRequest();
//原币种金额
convertRequest.setAmount(request.getFromAmount());
//原币种
convertRequest.setFromCurrency(fortuneAccount.getCurrency());
//目标币种
convertRequest.setToCurrency(request.getToCurrency());
//调用远程转换接口
Result<ApiExchangeRateConvertResponse> result = apiExchangeRateFeignClient.convert(convertRequest);
if (result != null && result.getData() != null) {
ApiSalarySplitQueryRateResponse response = new ApiSalarySplitQueryRateResponse();
BeanUtils.copyProperties(result.getData(),response);
return Result.success(response);
}
return Result.success();
}
/**
* 计算-目标金额
* @param request
* @return
*/
@Override
public Result<ApiCalculateToAmountResponse> calculateToAmount(ApiCalculateToAmountRequest request) {
BigDecimal toAmount = ExchangeUtils.calculateTargetAmount(request.getFromAmount(),request.getExchangeRate());
ApiCalculateToAmountResponse response = new ApiCalculateToAmountResponse();
response.setToAmount(toAmount);
return Result.success(response);
}
/**
* 导出-薪资拆分应发信息汇总列表
* @param request
* @return
*/
@Override
public Result<ApiSalarySplitExportSummaryListResponse> export(ApiSalarySplitExportSummaryListRequest request) {
// 查询数据
List<ApiSalarySplitSummaryPageDto> dataList = iSalarySplitService.summaryList(request);
log.info("导出-薪资拆分应发信息汇总列表:dataList,{}", JSON.toJSONString(dataList));
List<ApiSalarySplitSummaryExcelDto> excelDtoList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(dataList)) {
excelDtoList = dataList.stream().map(dto -> {
ApiSalarySplitSummaryExcelDto excelDto = new ApiSalarySplitSummaryExcelDto();
BeanUtils.copyProperties(dto,excelDto);
return excelDto;
}).collect(Collectors.toList());
}
log.info("导出-薪资拆分应发信息汇总列表:excelDtoList,{}", JSON.toJSONString(excelDtoList));
// 构建导出参数
ExportParam exportParam = new ExportParam();
// 指定需要导出的字段(字段名必须与 DTO 中的属性名一致)
exportParam.setFieldNames(Arrays.asList(
"salarySplitNo","brokerName","team","fromAmount",
"currency","exchangeRate","toAmount","toCurrency",
"fortuneAccountMonth","billOrg","hkdAmount","fortuneAccountBizId"
));
exportParam.setFileName("薪资拆分应发信息汇总");
exportParam.setUploadToOss(true);
exportParam.setOssPath("exports/salary_split/");
// 构建请求对象
ApiExportRequest exportRequest = new ApiExportRequest();
exportRequest.setDataList(excelDtoList);
exportRequest.setEntityClass(ApiSalarySplitSummaryExcelDto.class);
exportRequest.setExportParam(exportParam);
log.info("导出-薪资拆分应发信息汇总列表:exportRequest,{}", JSON.toJSONString(exportRequest));
// 远程调用导出接口
Result<ExportResult> result = apiExcelFeignClient.export(exportRequest);
if (result.getCode() != 200 || result.getData() == null) {
throw new BusinessException("导出失败:" + result.getMsg());
}
ExportResult exportResult = result.getData();
if (!exportResult.getSuccess()) {
throw new BusinessException("导出失败:" + exportResult.getErrorMsg());
}
log.info("导出-薪资拆分应发信息汇总列表:exportResult,{}", JSON.toJSONString(exportResult));
// 封装响应
ApiSalarySplitExportSummaryListResponse response = new ApiSalarySplitExportSummaryListResponse();
response.setUrl(exportResult.getOssUrl());
// response.setFileSize(exportResult.getFileSize());
// response.setTotalCount(dataList.size());
return Result.success(response);
}
}
package com.yd.csf.api.utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class ExchangeUtils {
private static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
private static final int SCALE = 4;
private static final int DIVISION_SCALE = 10;
/**
* 计算目标金额
* @param fromAmount 原币种金额(不能为 null)
* @param percent 汇率百分比,例如 20.15 表示 20.15%(不能为 null,通常 >0)
* @return 目标金额,保留四位小数,四舍五入
*/
public static BigDecimal calculateTargetAmount(BigDecimal fromAmount, BigDecimal percent) {
if (fromAmount == null || percent == null) {
throw new IllegalArgumentException("fromAmount and percent must not be null");
}
// BigDecimal rate = percent.divide(ONE_HUNDRED, DIVISION_SCALE, RoundingMode.HALF_UP);
BigDecimal target = fromAmount.multiply(percent);
return target.setScale(SCALE, RoundingMode.HALF_UP);
}
public static void main(String[] args) {
System.out.println(calculateTargetAmount(new BigDecimal(20102.8921), new BigDecimal(0.12800000)));
}
}
\ No newline at end of file
package com.yd.csf.feign.client.salarysplit;
import com.yd.common.result.Result;
import com.yd.csf.feign.fallback.salarysplit.ApiSalarySplitFeignFallbackFactory;
import com.yd.csf.feign.request.salarysplit.*;
import com.yd.csf.feign.response.salarysplit.ApiCalculateToAmountResponse;
import com.yd.csf.feign.response.salarysplit.ApiQueryRemainingResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitExportSummaryListResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitQueryRateResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 香港保险服务-薪资拆分应发信息Feign客户端
*/
@FeignClient(name = "yd-csf-api", fallbackFactory = ApiSalarySplitFeignFallbackFactory.class)
public interface ApiSalarySplitFeignClient {
/**
* 分页查询-薪资拆分应发信息汇总列表
* @param request
* @return
*/
@PostMapping("/summary/page")
Result summaryPage(@Validated @RequestBody ApiSalarySplitSummaryPageRequest request);
/**
* 分页查询-薪资拆分应发信息列表
* @param request
* @return
*/
@PostMapping("/page")
Result page(@Validated @RequestBody ApiSalarySplitPageRequest request);
/**
* 批量保存-薪资拆分应发信息列表
* @param request
* @return
*/
@PostMapping("/batch/save")
Result batchSave(@Validated @RequestBody ApiSalarySplitBatchSaveRequest request);
/**
* 查询-原币种剩余总金额和原币种
* @param request
* @return
*/
@PostMapping("/query/remaining")
Result<ApiQueryRemainingResponse> queryRemaining(@Validated @RequestBody ApiQueryRemainingRequest request);
/**
* 查询-原币种和原币种金额——>目标币种即时汇率和目标币种金额
* @param request
* @return
*/
@PostMapping("/query/rate")
Result<ApiSalarySplitQueryRateResponse> queryRate(@Validated @RequestBody ApiSalarySplitQueryRateRequest request);
/**
* 计算-目标金额
* @param request
* @return
*/
@PostMapping("/calculate/toAmount")
Result<ApiCalculateToAmountResponse> calculateToAmount(@Validated @RequestBody ApiCalculateToAmountRequest request);
/**
* 导出-薪资拆分应发信息汇总列表
* @param request
* @return
*/
@PostMapping("/export/summary/list")
Result<ApiSalarySplitExportSummaryListResponse> export(@Validated @RequestBody ApiSalarySplitExportSummaryListRequest request);
}
package com.yd.csf.feign.dto.excel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiSalarySplitSummaryExcelDto {
@Excel(name = "发放编号", orderNum = "1")
private String salarySplitNo;
@Excel(name = "转介人", orderNum = "2")
private String brokerName;
@Excel(name = "内部编号", orderNum = "3")
private String internalNumber;
@Excel(name = "所属团队", orderNum = "4")
private String team;
@Excel(name = "原币种金额", orderNum = "5")
private BigDecimal fromAmount;
@Excel(name = "原币种", orderNum = "6")
private String currency;
@Excel(name = "汇率(原币种->目标币种)", orderNum = "7")
private BigDecimal exchangeRate;
@Excel(name = "目标金额", orderNum = "8")
private BigDecimal toAmount;
@Excel(name = "目标币种", orderNum = "9")
private String toCurrency;
@Excel(name = "出账月(实)", orderNum = "10")
private String fortuneAccountMonth;
@Excel(name = "出账机构", orderNum = "11")
private String billOrg;
@Excel(name = "本期总出账金额(原币种)", orderNum = "12")
private BigDecimal hkdAmount;
@Excel(name = "出账记录业务id", orderNum = "13")
private String fortuneAccountBizId;
}
package com.yd.csf.feign.dto.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiSalarySplitBatchSaveDto {
/**
* 转介人业务id
*/
private String brokerBizId;
/**
* 转介人名称
*/
private String brokerName;
/**
* 转介人内部编号
*/
private String internalNumber;
/**
* 出账机构
*/
private String billOrg;
/**
* 原币种金额
*/
private BigDecimal fromAmount;
/**
* 目标币种
*/
private String toCurrency;
/**
* 即时汇率(原币种->目标币种)(查询原出账币种兑目标币种汇率,可修改)
*/
private BigDecimal exchangeRate;
/**
* 目标金额
*/
private BigDecimal toAmount;
/**
* 通用备注
*/
private String remark;
}
package com.yd.csf.feign.dto.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ApiSalarySplitPageDto {
/**
* 主键ID
*/
private Long id;
/**
* 薪资拆分应发表唯一业务ID
*/
private String salarySplitBizId;
/**
* 发放编号
*/
private String salarySplitNo;
/**
* 出账记录业务id(关联出账记录表)
*/
private String fortuneAccountBizId;
/**
* 转介人名称
*/
private String brokerName;
/**
* 转介人业务id
*/
private String brokerBizId;
/**
* 转介人内部编号
*/
private String internalNumber;
/**
* 出账机构
*/
private String billOrg;
/**
* 原币种金额
*/
private BigDecimal fromAmount;
/**
* 目标币种
*/
private String toCurrency;
/**
* 即时汇率(原币种->目标币种)(查询原出账币种兑目标币种汇率,可修改)
*/
private BigDecimal exchangeRate;
/**
* 目标金额
*/
private BigDecimal toAmount;
/**
* 通用备注
*/
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
private Integer isDeleted;
/**
* 创建人ID
*/
private String creatorId;
/**
* 更新人ID
*/
private String updaterId;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
}
package com.yd.csf.feign.dto.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiSalarySplitStatisticsDto {
/**
* 待拆分币种(原币种)(当前出账记录的总计剩余待拆分币种)
*/
private String beSplitCurrency;
/**
* 待拆分币种金额(当前出账记录的总计剩余待拆分币种金额)
*/
private BigDecimal beSplitAmount;
}
package com.yd.csf.feign.dto.salarysplit;
import lombok.Data;
@Data
public class ApiSalarySplitSummaryDto {
}
package com.yd.csf.feign.dto.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ApiSalarySplitSummaryPageDto {
/**
* 薪资拆分应发表唯一业务ID
*/
private String salarySplitBizId;
/**
* 发放编号
*/
private String salarySplitNo;
/**
* 出账记录业务id(关联出账记录表)(关联发放编号)
*/
private String fortuneAccountBizId;
/**
* 转介人名称
*/
private String brokerName;
/**
* 转介人业务id
*/
private String brokerBizId;
/**
* 转介人内部编号
*/
private String internalNumber;
/**
* 所属团队
*/
private String team;
/**
* 原币种金额
*/
private BigDecimal fromAmount;
/**
* 目标币种
*/
private String toCurrency;
// /**
// * 即时汇率(原币种->目标币种)(查询原出账币种兑目标币种汇率,可修改)
// */
// private BigDecimal exchangeRate;
/**
* 即时汇率(原币种->目标币种)(查询原出账币种兑目标币种汇率,可修改)字符串 例:100%
*/
private BigDecimal exchangeRate;
/**
* 目标金额
*/
private BigDecimal toAmount;
/**
* 出账日期
*/
private Date fortuneAccountDate;
/**
* 出账月(出账日期格式化:2026-03-30 变成 202603)
*/
private String fortuneAccountMonth;
/**
* 出账机构
*/
private String billOrg;
/**
* 出账状态 可出账、待出账、已出账
*/
private String status;
/**
* 出账总额
*/
private BigDecimal amount;
/**
* 港币出账金额
*/
private BigDecimal hkdAmount;
/**
* 出账币种(原币种)
*/
private String currency;
}
\ No newline at end of file
package com.yd.csf.feign.fallback.salarysplit;
import com.yd.common.result.Result;
import com.yd.csf.feign.client.salarysplit.ApiSalarySplitFeignClient;
import com.yd.csf.feign.request.salarysplit.*;
import com.yd.csf.feign.response.salarysplit.ApiCalculateToAmountResponse;
import com.yd.csf.feign.response.salarysplit.ApiQueryRemainingResponse;
import com.yd.csf.feign.response.salarysplit.ApiSalarySplitQueryRateResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
* 香港保险服务-薪资拆分应发信息Feign降级处理
*/
@Slf4j
@Component
public class ApiSalarySplitFeignFallbackFactory implements FallbackFactory<ApiSalarySplitFeignClient> {
@Override
public ApiSalarySplitFeignClient create(Throwable cause) {
return new ApiSalarySplitFeignClient() {
@Override
public Result summaryPage(ApiSalarySplitSummaryPageRequest request) {
return null;
}
@Override
public Result page(ApiSalarySplitPageRequest request) {
return null;
}
@Override
public Result batchSave(ApiSalarySplitBatchSaveRequest request) {
return null;
}
@Override
public Result<ApiQueryRemainingResponse> queryRemaining(ApiQueryRemainingRequest request) {
return null;
}
@Override
public Result<ApiSalarySplitQueryRateResponse> queryRate(ApiSalarySplitQueryRateRequest request) {
return null;
}
@Override
public Result<ApiCalculateToAmountResponse> calculateToAmount(ApiCalculateToAmountRequest request) {
return null;
}
@Override
public Result export(ApiSalarySplitExportSummaryListRequest request) {
return null;
}
};
}
}
package com.yd.csf.feign.request.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiCalculateToAmountRequest {
/**
* 原币种金额
*/
private BigDecimal fromAmount;
/**
* 汇率
*/
private BigDecimal exchangeRate;
}
package com.yd.csf.feign.request.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class ApiQueryRemainingRequest {
/**
* 出账记录业务id(关联出账记录表)
*/
private String fortuneAccountBizId;
/**
* 需要参与统计的原币种金额列表
*/
private List<BigDecimal> fromAmountList;
}
package com.yd.csf.feign.request.salarysplit;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitBatchSaveDto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
public class ApiSalarySplitBatchSaveRequest {
/**
* 出账记录业务id
*/
@NotBlank(message = "出账记录业务id不能为空")
private String fortuneAccountBizId;
/**
* 薪资拆分应发记录
*/
private List<ApiSalarySplitBatchSaveDto> apiSalarySplitBatchSaveDtoList;
}
package com.yd.csf.feign.request.salarysplit;
import lombok.Data;
import java.util.List;
@Data
public class ApiSalarySplitExportSummaryListRequest {
/**
* 转介人业务id列表
*/
private List<String> brokerBizIdList;
/**
* 出账开始年月(2026-07)
*/
private String startMonth;
/**
* 出账结束年月(2027-09)
*/
private String endMonth;
/**
* 出账机构
*/
private String billOrg;
/**
* 薪资拆分应发表唯一业务ID列表
*/
private List<String> salarySplitBizIdList;
}
package com.yd.csf.feign.request.salarysplit;
import com.yd.common.dto.PageDto;
import lombok.Data;
@Data
public class ApiSalarySplitPageRequest extends PageDto {
/**
* 出账记录业务id(关联出账记录表)
*/
private String fortuneAccountBizId;
}
package com.yd.csf.feign.request.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiSalarySplitQueryRateRequest {
/**
* 出账记录业务id(关联出账记录表)
*/
private String fortuneAccountBizId;
/**
* 原币种
*/
private String fromCurrency;
/**
* 原币种金额
*/
private BigDecimal fromAmount;
/**
* 目标币种
*/
private String toCurrency;
}
package com.yd.csf.feign.request.salarysplit;
import com.yd.common.dto.PageDto;
import lombok.Data;
import java.util.List;
@Data
public class ApiSalarySplitSummaryPageRequest extends PageDto {
// /**
// * 转介人名称
// */
// private String brokerName;
//
// /**
// * 出账状态 可出账、待出账、已出账
// */
// private String status;
/**
* 转介人业务id列表
*/
private List<String> brokerBizIdList;
// /**
// * 出账状态列表 可出账、待出账、已出账
// */
// private List<String> statusList;
/**
* 出账开始年月(2026-07)
*/
private String startMonth;
/**
* 出账结束年月(2027-09)
*/
private String endMonth;
/**
* 出账机构
*/
private String billOrg;
}
......@@ -144,6 +144,12 @@ public class ApiExpectedFortunePageResponse {
private String currency;
/**
* 出账币种名称
*/
@Schema(description = "出账币种名称")
private String currencyName;
/**
* 默认结算汇率
*/
@Schema(description = "默认结算汇率")
......
package com.yd.csf.feign.response.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiCalculateToAmountResponse {
/**
* 目标金额
*/
private BigDecimal toAmount;
}
package com.yd.csf.feign.response.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiQueryRemainingResponse {
/**
* 原币种剩余总金额
*/
private BigDecimal fromAmount;
/**
* 原币种(出账币种)
*/
private String currency;
}
package com.yd.csf.feign.response.salarysplit;
import lombok.Data;
@Data
public class ApiSalarySplitExportSummaryListResponse {
private String url;
}
package com.yd.csf.feign.response.salarysplit;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiSalarySplitQueryRateResponse {
/**
* 原始金额
*/
private BigDecimal originalAmount;
/**
* 原始币种代码
*/
private String originalCurrency;
/**
* 转换后金额
*/
private BigDecimal convertedAmount;
/**
* 目标币种代码
*/
private String targetCurrency;
/**
* 汇率(原始币种 -> 目标币种)
*/
private BigDecimal exchangeRate;
/**
* 反向汇率(目标币种 -> 原始币种)
*/
private BigDecimal reverseExchangeRate;
}
......@@ -2,6 +2,7 @@ package com.yd.csf.service.dao;
import com.yd.csf.service.model.CommissionCompareRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* @author Zhang Jianan
......@@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface CommissionCompareRecordMapper extends BaseMapper<CommissionCompareRecord> {
void removeByCommissionId(@Param("commissionId") String commissionId);
}
......
......@@ -22,6 +22,8 @@ public interface CommissionMapper extends BaseMapper<Commission> {
CommissionStatisticsVO getCommissionStatistics(@Param("commissionIdList") List<Long> commissionIdList);
int updateStatusBatchById(@Param("list") List<Commission> list);
int deleteByIdPhysical(Long id);
}
......
......@@ -37,4 +37,11 @@ public interface ExpectedFortuneMapper extends BaseMapper<ExpectedFortune> {
*/
IPage<PayableReportVO> payableReportPage(@Param("page") Page<PayableReportVO> page,
@Param("expectedFortuneIds") List<Long> expectedFortuneIds);
/**
* 更新预计发佣记录的出账状态
* @param expectedFortuneBizIdList 预计发佣记录ID列表
* @param status 出账状态
*/
void updateBatchByBizId(@Param("expectedFortuneBizIdList") List<String> expectedFortuneBizIdList, @Param("status") String status);
}
package com.yd.csf.service.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitPageDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryPageDto;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitExportSummaryListRequest;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitPageRequest;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitSummaryPageRequest;
import com.yd.csf.service.model.SalarySplit;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 薪资拆分应发表 Mapper 接口
* </p>
*
* @author zxm
* @since 2026-03-30
*/
public interface SalarySplitMapper extends BaseMapper<SalarySplit> {
IPage<ApiSalarySplitSummaryPageDto> summaryPage(@Param("page") Page<ApiSalarySplitSummaryPageDto> page,
@Param("request") ApiSalarySplitSummaryPageRequest request);
List<ApiSalarySplitSummaryPageDto> summaryList(@Param("request") ApiSalarySplitExportSummaryListRequest request);
IPage<ApiSalarySplitPageDto> page(@Param("page") Page<ApiSalarySplitPageDto> page,
@Param("request") ApiSalarySplitPageRequest request);
List<String> queryList(@Param("request") ApiSalarySplitSummaryPageRequest request);
}
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 薪资拆分应发表
* </p>
*
* @author zxm
* @since 2026-03-30
*/
@Getter
@Setter
@TableName("salary_split")
public class SalarySplit implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 薪资拆分应发表唯一业务ID
*/
@TableField("salary_split_biz_id")
private String salarySplitBizId;
/**
* 发放编号
*/
@TableField("salary_split_no")
private String salarySplitNo;
/**
* 出账记录业务id(关联出账记录表)
*/
@TableField("fortune_account_biz_id")
private String fortuneAccountBizId;
/**
* 转介人名称
*/
@TableField("broker_name")
private String brokerName;
/**
* 转介人业务id
*/
@TableField("broker_biz_id")
private String brokerBizId;
/**
* 转介人内部编号
*/
@TableField("internal_number")
private String internalNumber;
/**
* 出账机构
*/
@TableField("bill_org")
private String billOrg;
/**
* 原币种金额
*/
@TableField("from_amount")
private BigDecimal fromAmount;
/**
* 目标币种
*/
@TableField("to_currency")
private String toCurrency;
/**
* 即时汇率(原币种->目标币种)(查询原出账币种兑目标币种汇率,可修改)
*/
@TableField("exchange_rate")
private BigDecimal exchangeRate;
/**
* 目标金额
*/
@TableField("to_amount")
private BigDecimal toAmount;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
......@@ -13,4 +13,5 @@ import java.util.List;
*/
public interface CommissionCompareRecordService extends IService<CommissionCompareRecord> {
void removeByCommissionId(String commissionId);
}
......@@ -55,4 +55,8 @@ public interface CommissionService extends IService<Commission> {
Boolean addToExpected(AddToExpectedCommissionRequest addToExpectedCommissionRequest);
int updateStatusBatchById(List<Commission> existingCommissions);
boolean deleteByIdPhysical(Long id);
Boolean deleteCommission(Commission oldCommission);
}
......@@ -38,4 +38,6 @@ public interface FortuneAccountService extends IService<FortuneAccount> {
* @return
*/
FortuneAccountStatisticsVO getFortuneAccountStatistics(List<Long> fortuneAccountIdList);
FortuneAccount queryOne(String fortuneAccountBizId);
}
......@@ -43,4 +43,6 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
* @return 应付款报表VO分页列表
*/
IPage<PayableReportVO> payableReportPage(Page<PayableReportVO> page, List<Long> expectedFortuneIds);
void updateBatchByBizId(List<String> expectedFortuneBizIdList, String status);
}
package com.yd.csf.service.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitPageDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryPageDto;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitExportSummaryListRequest;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitPageRequest;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitSummaryPageRequest;
import com.yd.csf.service.model.SalarySplit;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 薪资拆分应发表 服务类
* </p>
*
* @author zxm
* @since 2026-03-30
*/
public interface ISalarySplitService extends IService<SalarySplit> {
IPage<ApiSalarySplitSummaryPageDto> summaryPage(Page<ApiSalarySplitSummaryPageDto> page,
ApiSalarySplitSummaryPageRequest request);
List<ApiSalarySplitSummaryPageDto> summaryList(ApiSalarySplitExportSummaryListRequest request);
IPage<ApiSalarySplitPageDto> page(Page<ApiSalarySplitPageDto> page, ApiSalarySplitPageRequest request);
List<String> queryList(ApiSalarySplitSummaryPageRequest request);
Boolean deleteByFortuneAccountBizId(String fortuneAccountBizId);
}
......@@ -15,6 +15,10 @@ import org.springframework.stereotype.Service;
public class CommissionCompareRecordServiceImpl extends ServiceImpl<CommissionCompareRecordMapper, CommissionCompareRecord>
implements CommissionCompareRecordService{
@Override
public void removeByCommissionId(String commissionId) {
this.baseMapper.removeByCommissionId(commissionId);
}
}
......
......@@ -651,13 +651,17 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
throw new BusinessException(ResultCode.FAIL.getCode(), errorMsg);
}
List<ApiExpectedSpeciesListResponse> matchedList = matchResult.getMatchedList();
// 计算佣金总期数 list 中 endPeriod最大值
Integer maxEndPeriod = matchResult.getMatchedList().stream()
Integer maxEndPeriod = matchedList.stream()
.map(item -> Convert.toInt(item.getEndPeriod()))
.max(Integer::compareTo)
.orElse(0);
for (ApiExpectedSpeciesListResponse item : matchResult.getMatchedList()) {
int size = matchedList.size();
for (int i = 0; i < size; i++) {
ApiExpectedSpeciesListResponse item = matchedList.get(i);
CommissionExpected commissionExpected = new CommissionExpected();
commissionExpected.setCommissionExpectedBizId(RandomStringGenerator.generateBizId16("commission_expected"));
commissionExpected.setReceivableNo(receivableService.generateReceivableNo("R", reconciliationCompanyCode, reconciliationCompany));
......@@ -678,7 +682,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
commissionExpected.setCommissionRatio(item.getCommissionRate());
commissionExpected.setAmount(null);
commissionExpected.setCurrency(item.getCurrency());
commissionExpected.setCommissionDate(calculateCommissionDate(item.getEndPeriod(), coolingOffEndDate));
commissionExpected.setCommissionDate(calculateCommissionDate(i, coolingOffEndDate));
commissionExpected.setStatus(CommissionExpectedStatusEnum.PENDING.getItemValue());
commissionExpected.setStatusDesc(null);
commissionExpected.setDefaultExchangeRate(queryExchangeRateByFeign(policy.getCurrency(), item.getCurrency()));
......@@ -973,12 +977,12 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
/**
* 根据保单生效日和佣金期数计算预计来佣日期,首期为生效日的1个月,后续期数为首期的次年
*
* @param endPeriod 佣金期数
* @param currentPeriod 佣金期数
* @param effectiveDate 保单生效日
* @return 预计来佣日期
*/
private Date calculateCommissionDate(String endPeriod, Date effectiveDate) {
if (effectiveDate == null || StringUtils.isBlank(endPeriod)) {
private Date calculateCommissionDate(Integer currentPeriod, Date effectiveDate) {
if (effectiveDate == null || currentPeriod == null) {
return null;
}
......@@ -987,14 +991,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
// 首期:保单生效日的1个月
cal.add(Calendar.MONTH, 1);
Integer period = Convert.toInt(endPeriod);
if (period == null || period <= 0) {
return cal.getTime();
}
// 后续期数:在首期基础上增加 (period - 1) 年
// 例如:第2期为首期次年,第3期为首期+2年
cal.add(Calendar.YEAR, period - 1);
// 后续期数
cal.add(Calendar.YEAR, currentPeriod);
return cal.getTime();
}
......
......@@ -17,6 +17,7 @@ import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.service.common.ErrorCode;
import com.yd.common.utils.RedisUtil;
import com.yd.csf.service.component.CommissionAsyncService;
import com.yd.csf.service.component.ReceivableService;
......@@ -383,7 +384,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到该来佣记录");
}
Policy policy = null;
if (StringUtils.isNotBlank(commission.getPolicyNo())) {
if (StringUtils.isNotBlank(commissionUpdateRequest.getPolicyNo())) {
policy = policyService.lambdaQuery().eq(Policy::getPolicyNo, commission.getPolicyNo()).one();
if (policy == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "保单不存在:" + commission.getPolicyNo());
......@@ -1051,6 +1052,70 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return this.baseMapper.updateStatusBatchById(existingCommissions);
}
@Override
public boolean deleteByIdPhysical(Long id) {
return baseMapper.deleteByIdPhysical(id) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteCommission(Commission oldCommission) {
// 操作数据库
boolean result = this.deleteByIdPhysical(oldCommission.getId());
if (!result) {
throw new BusinessException(ErrorCode.OPERATION_ERROR.getCode(), ErrorCode.OPERATION_ERROR.getMessage());
}
String commissionBizId = oldCommission.getCommissionBizId();
// 删除关联来佣比对记录
commissionCompareRecordService.removeByCommissionId(commissionBizId);
// 更新预计来佣记录
String commissionExpectedBizId = oldCommission.getCommissionExpectedBizId();
if (StringUtils.isNotBlank(commissionExpectedBizId)) {
// 查询该预计来佣下的所有剩余来佣记录
List<Commission> remainingCommissions = this.lambdaQuery()
.eq(Commission::getCommissionExpectedBizId, commissionExpectedBizId)
.list();
// 计算新的 paidAmount 和 paidRatio
BigDecimal paidRatio = BigDecimal.ZERO;
BigDecimal paidAmount = BigDecimal.ZERO;
for (Commission item : remainingCommissions) {
paidRatio = paidRatio.add(item.getCurrentCommissionRatio());
paidAmount = paidAmount.add(item.getHkdAmount());
}
// 获取预计来佣记录
CommissionExpected commissionExpected = commissionExpectedService.lambdaQuery()
.eq(CommissionExpected::getCommissionExpectedBizId, commissionExpectedBizId)
.one();
if (commissionExpected != null) {
// 根据 paidRatio 与 commissionRatio 比较确定状态
String newStatus;
if (CollectionUtils.isEmpty(remainingCommissions)) {
// 没有剩余来佣时,恢复到初始状态
newStatus = CommissionExpectedStatusEnum.PENDING.getItemValue();
} else if (paidRatio.compareTo(commissionExpected.getCommissionRatio()) == 0) {
newStatus = CommissionExpectedStatusEnum.COMPARED.getItemValue();
} else {
newStatus = CommissionExpectedStatusEnum.PARTIAL.getItemValue();
}
// 更新预计来佣记录
commissionExpectedService.lambdaUpdate()
.set(CommissionExpected::getPaidAmount, paidAmount.setScale(4, RoundingMode.HALF_UP))
.set(CommissionExpected::getPaidRatio, paidRatio)
.set(CommissionExpected::getStatus, newStatus)
.eq(CommissionExpected::getCommissionExpectedBizId, commissionExpectedBizId)
.update();
}
}
return true;
}
/**
* 查询列表
*
......
......@@ -134,7 +134,7 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
ApiExpectedFortunePageResponse vo = new ApiExpectedFortunePageResponse();
BeanUtils.copyProperties(ef, vo);
vo.setCurrency(CurrencyEnum.toLabel(ef.getCurrency()));
vo.setCurrencyName(CurrencyEnum.toLabel(ef.getCurrency()));
String ratio = finalBrokerRatioMap.get(ef.getBrokerBizId());
vo.setCommissionRatio(ratio);
......@@ -159,4 +159,9 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
public IPage<PayableReportVO> payableReportPage(Page<PayableReportVO> page, List<Long> expectedFortuneIds) {
return baseMapper.payableReportPage(page, expectedFortuneIds);
}
@Override
public void updateBatchByBizId(List<String> expectedFortuneBizIdList, String status) {
baseMapper.updateBatchByBizId(expectedFortuneBizIdList, status);
}
}
......@@ -4,6 +4,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
......@@ -154,6 +155,8 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
// 处理关联发佣记录
List<Fortune> updateFortuneList = new ArrayList<>();
// 处理关联预计发佣记录
List<String> expectedFortuneBizIdList = new ArrayList<>();
for (FortuneAccount fortuneAccount : fortuneAccountList) {
String fortuneAccountBizId = fortuneAccount.getFortuneAccountBizId();
List<Fortune> fortuneList = fortuneAccount.getFortuneList();
......@@ -164,11 +167,15 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
updateFortune.setFortuneAccountBizId(fortuneAccountBizId);
updateFortune.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
// 处理金额字段
if (BigDecimal.ZERO.compareTo(item.getHkdAmount()) != 0) {
updateFortune.setCurrentPaymentHkdAmount(item.getCurrentPaymentHkdAmount());
updateFortune.setCurrentPaymentRatio(item.getCurrentPaymentHkdAmount()
.divide(item.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)));
}
updateFortune.setReconciliationOperator(currentLoginUser.getUsername());
updateFortuneList.add(updateFortune);
// 处理关联预计发佣记录
expectedFortuneBizIdList.add(item.getExpectedFortuneBizId());
}
}
}
......@@ -177,6 +184,10 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
if (CollectionUtils.isNotEmpty(updateFortuneList)) {
fortuneService.updateBatchById(updateFortuneList);
}
// 更新预计发佣记录的出账状态
if (CollectionUtils.isNotEmpty(expectedFortuneBizIdList)) {
expectedFortuneService.updateBatchByBizId(expectedFortuneBizIdList, FortuneStatusEnum.CHECKED.getItemValue());
}
}
......@@ -384,6 +395,19 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
vo.setBrokerCount(brokerCount);
return vo;
}
/**
* 查询单个对象
* @param fortuneAccountBizId
* @return
*/
@Override
public FortuneAccount queryOne(String fortuneAccountBizId) {
return this.baseMapper.selectOne(new LambdaQueryWrapper<FortuneAccount>()
.eq(FortuneAccount::getFortuneAccountBizId,fortuneAccountBizId)
.last(" limit 1 ")
);
}
}
......
......@@ -204,6 +204,13 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// 如果未传入金额,全额发放,出账状态为已出帐
totalFortune(fortune, expectedFortune, loginUserId, fortuneUpdateRequest);
}
// 更新 expected_fortune 出账状态
expectedFortuneService.lambdaUpdate()
.set(ExpectedFortune::getStatus, fortuneUpdateRequest.getStatus())
.eq(ExpectedFortune::getId, expectedFortune.getId())
.update();
return true;
}
......@@ -224,17 +231,6 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
fortune.setActualPayoutDate(actualPayoutDate);
this.updateById(fortune);
// 2. 更新expected_fortune记录为已全额发放状态
// 统一使用港币金额
// expectedFortune.setPaidAmount(expectedFortune.getHkdAmount());
// expectedFortune.setUnpaidAmount(BigDecimal.ZERO);
// expectedFortune.setPaidRatio(BigDecimal.valueOf(100));
// expectedFortune.setUnpaidRatio(BigDecimal.ZERO);
// expectedFortune.setStatus("6"); // 全额发放完成状态
// expectedFortune.setActualPayoutDate(LocalDate.now());
//
// expectedFortuneService.updateById(expectedFortune);
}
/**
......@@ -301,23 +297,18 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
part.setCreateTime(new Date());
this.save(part);
}
}
// 3. 同步 expected_fortune
// 统一使用港币金额
// BigDecimal newPaid = expectedFortune.getPaidAmount() == null ? BigDecimal.ZERO : expectedFortune.getPaidAmount().add(currentPaymentHkdAmount);
// BigDecimal newUnpaid = expectedFortune.getHkdAmount().subtract(newPaid);
// String newStatus = newUnpaid.compareTo(BigDecimal.ZERO) == 0 ? "6" : "3";
//
// expectedFortuneService.lambdaUpdate()
// .set(ExpectedFortune::getPaidAmount, newPaid)
// .set(ExpectedFortune::getUnpaidAmount, newUnpaid)
// .set(ExpectedFortune::getPaidRatio,
// newPaid.divide(expectedFortune.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)))
// .set(ExpectedFortune::getUnpaidRatio,
// newUnpaid.divide(expectedFortune.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)))
// .set(ExpectedFortune::getStatus, newStatus)
// .eq(ExpectedFortune::getId, expectedFortune.getId())
// .update();
private BigDecimal calculateExpectedFortunePaidAmount(ExpectedFortune expectedFortune) {
// 查询所有已出账的记录
List<Fortune> paidList = this.list(new QueryWrapper<Fortune>()
.eq("expected_fortune_biz_id", expectedFortune.getExpectedFortuneBizId())
.eq("fortune_period", expectedFortune.getFortunePeriod())
.eq("status", FortuneStatusEnum.CHECKED.getItemValue()));
// 计算已出账金额
return paidList.stream()
.map(Fortune::getCurrentPaymentHkdAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
@Override
......@@ -358,8 +349,8 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// 校验发佣记录状态
StringBuilder validateMsg = new StringBuilder();
for (Fortune fortune : fortuneList) {
if (!StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.CHECKED.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("当前状态不是'可出账, 已检核',不能生成出账记录; ");
if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.WAIT.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("待出账状态不能直接改为'可出账, 检核完成',不能生成出账记录; ");
}
if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.SENT.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("已完成出账,不能生成出账记录; ");
......@@ -717,12 +708,17 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
List<Fortune> fortuneList = new ArrayList<>();
List<ExpectedFortune> expectedFortuneUpdateList = new ArrayList<>();
for (FortuneAddRequest fortuneAddRequest : fortuneAddRequestList) {
// 校验参数
valiAddFortune(fortuneAddRequest);
Fortune fortune = new Fortune();
BeanUtil.copyProperties(fortuneAddRequest, fortune);
// 计算港币金额
fortune.setExchangeRate(queryExchangeRateByFeign(fortuneAddRequest.getCurrency(), "HKD"));
fortune.setHkdAmount(fortuneAddRequest.getAmount().multiply(fortune.getExchangeRate()));
fortune.setCurrentPaymentHkdAmount(fortune.getHkdAmount());
if ("R".equals(fortuneAddRequest.getFortuneBizType())) {
ExpectedFortune expectedFortune = expectedFortuneMap.get(fortuneAddRequest.getPolicyNo() + "_" + fortuneAddRequest.getFortunePeriod() + "_" + fortuneAddRequest.getFortuneType());
......@@ -731,9 +727,6 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
}
fortune.setExpectedFortuneBizId(expectedFortune.getExpectedFortuneBizId());
fortune.setPolicyCurrency(expectedFortune.getPolicyCurrency());
fortune.setExchangeRate(expectedFortune.getDefaultExchangeRate());
fortune.setHkdAmount(fortuneAddRequest.getAmount().multiply(expectedFortune.getDefaultExchangeRate()));
fortune.setCurrentPaymentHkdAmount(fortune.getHkdAmount());
fortune.setCurrentPaymentRatio(BigDecimal.valueOf(100));
fortune.setPayoutDate(expectedFortune.getPayoutDate());
......@@ -747,10 +740,8 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
fortune.setStatus(FortuneStatusEnum.MATCH_FAIL.getItemValue());
fortune.setRemark("未找到当前预计发佣对应的来佣");
}
} else {
fortune.setExchangeRate(BigDecimal.ONE);
fortune.setHkdAmount(fortuneAddRequest.getAmount());
fortune.setCurrentPaymentHkdAmount(fortune.getHkdAmount());
// 更新预计出账的数据
processExpectedFortune(expectedFortune, fortune, expectedFortuneUpdateList);
}
// 生成发佣业务ID
......@@ -759,10 +750,37 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
fortune.setFortuneName(queryByDict(fortuneAddRequest.getFortuneType()));
fortune.setActualPayoutDate(fortuneAddRequest.getPayoutDate());
fortune.setIsPart(0);
fortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
fortuneList.add(fortune);
}
return this.saveBatch(fortuneList);
this.saveBatch(fortuneList);
if (CollectionUtils.isNotEmpty(expectedFortuneUpdateList)) {
expectedFortuneService.updateBatchById(expectedFortuneUpdateList);
}
return true;
}
private void processExpectedFortune(ExpectedFortune expectedFortune, Fortune fortune, List<ExpectedFortune> expectedFortuneUpdateList) {
// 出账币种
String currency = fortune.getCurrency();
// 港币出账金额
BigDecimal hkdAmount = fortune.getHkdAmount();
ExpectedFortune updateObj = new ExpectedFortune();
updateObj.setId(expectedFortune.getId());
updateObj.setHkdAmount(expectedFortune.getHkdAmount().add(hkdAmount));
updateObj.setUnpaidAmount(hkdAmount.add(expectedFortune.getUnpaidAmount()));
updateObj.setUnpaidRatio(updateObj.getUnpaidAmount().divide(updateObj.getHkdAmount(), 4, RoundingMode.HALF_UP));
// 根据预计出账币种计算 expectedFortune.getAmount() 字段
BigDecimal originalAmount = fortune.getAmount(); // 原始币种金额
BigDecimal exchangeRate = queryExchangeRateByFeign(currency, expectedFortune.getCurrency());
BigDecimal amount = originalAmount.multiply(exchangeRate);// 本次新增出账金额
updateObj.setAmount(amount.add(expectedFortune.getAmount()));
expectedFortuneUpdateList.add(updateObj);
}
}
......
......@@ -40,6 +40,7 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -194,12 +195,12 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
public Boolean updatePolicyFollowDto(PolicyFollowDto policyFollowDto) {
// 校验参数
if (StringUtils.isBlank(policyFollowDto.getPolicyBizId())) {
throw new BusinessException(ErrorCode.PARAMS_ERROR.getCode(), "policyBizId不能为空");
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "policyBizId不能为空");
}
String policyBizId = policyFollowDto.getPolicyBizId();
PolicyFollow policyFollow = getByPolicyBizId(policyBizId);
if (policyFollow == null) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR.getCode(), "新单跟进记录不存在");
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "新单跟进记录不存在");
}
// 复制属性,排除系统字段
......@@ -224,17 +225,31 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
policyFollow.setUpdaterId(loginUserId);
policyFollow.setUpdateTime(new Date());
try {
boolean result = updateById(policyFollow);
} catch (DataIntegrityViolationException e) {
log.info("修改跟进信息失败:{}", e.getMessage());
// 判断是否为唯一索引冲突
String message = e.getMessage();
if (StringUtils.isNotBlank(message) && message.contains("idx_policy_no")) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单号已存在,请勿重复添加");
} else {
throw new BusinessException(ResultCode.FAIL.getCode(), "修改跟进信息失败");
}
} catch (Exception e) {
log.info("修改跟进信息失败:{}", e.getMessage());
throw new BusinessException(ResultCode.FAIL.getCode(), "修改跟进信息失败");
}
// 如果保单号从空变为有值,更新关联的FNA状态为"签单完成"
if (isPolicyNoUpdated && result) {
if (isPolicyNoUpdated) {
fnaService.lambdaUpdate()
.eq(Fna::getFnaBizId, policyFollow.getFnaBizId())
.set(Fna::getStatus, FnaStatusEnum.SIGNED_COMPLETED.getItemValue())
.update();
}
return result;
return true;
}
private void setPolicyMailing(PolicyFollow policyFollow, PolicyMailing policyMailing) {
......
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitPageDto;
import com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryPageDto;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitExportSummaryListRequest;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitPageRequest;
import com.yd.csf.feign.request.salarysplit.ApiSalarySplitSummaryPageRequest;
import com.yd.csf.service.model.SalarySplit;
import com.yd.csf.service.dao.SalarySplitMapper;
import com.yd.csf.service.service.ISalarySplitService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 薪资拆分应发表 服务实现类
* </p>
*
* @author zxm
* @since 2026-03-30
*/
@Service
public class SalarySplitServiceImpl extends ServiceImpl<SalarySplitMapper, SalarySplit> implements ISalarySplitService {
@Override
public IPage<ApiSalarySplitSummaryPageDto> summaryPage(Page<ApiSalarySplitSummaryPageDto> page,
ApiSalarySplitSummaryPageRequest request) {
return this.baseMapper.summaryPage(page,request);
}
@Override
public List<ApiSalarySplitSummaryPageDto> summaryList(ApiSalarySplitExportSummaryListRequest request) {
return this.baseMapper.summaryList(request);
}
@Override
public IPage<ApiSalarySplitPageDto> page(Page<ApiSalarySplitPageDto> page,
ApiSalarySplitPageRequest request) {
return this.baseMapper.page(page,request);
}
@Override
public List<String> queryList(ApiSalarySplitSummaryPageRequest request){
return this.baseMapper.queryList(request);
}
/**
* 根据出账记录删除对应薪资拆分记录信息
* @param fortuneAccountBizId
* @return
*/
@Override
public Boolean deleteByFortuneAccountBizId(String fortuneAccountBizId) {
return this.remove(new LambdaQueryWrapper<SalarySplit>()
.eq(SalarySplit::getFortuneAccountBizId,fortuneAccountBizId));
}
}
......@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator {
})
.strategyConfig(builder -> {
builder.addInclude(
"premium_reconciliation","premium_remittance","premium_remittance_file"
"salary_split"
)
.entityBuilder()
......
......@@ -32,6 +32,12 @@ public class FortuneAccountVO {
private String broker;
/**
* 转介人业务id
*/
@Schema(description = "转介人业务id")
private String brokerBizId;
/**
* 所属团队
*/
@Schema(description = "所属团队")
......
......@@ -26,4 +26,8 @@
currency,create_time,exchange_rate,amount,current_commission_ratio,operator_name,remark,
is_deleted
</sql>
<delete id="removeByCommissionId">
delete from commission_compare_record where commission_biz_id = #{commissionId}
</delete>
</mapper>
......@@ -65,6 +65,10 @@
</foreach>
</update>
<delete id="deleteByIdPhysical">
DELETE FROM commission WHERE id = #{id}
</delete>
<select id="queryCommissionBindPolicyBrokerList"
resultType="com.yd.csf.service.dto.CommissionBindPolicyBrokerDto">
select c.*,p.*,pb.*
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.csf.service.dao.ExpectedFortuneMapper">
<update id="updateBatchByBizId">
update expected_fortune ef
set ef.status = #{status}
where ef.expected_fortune_biz_id in
<foreach collection="expectedFortuneBizIdList" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</update>
<select id="page" resultType="com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse">
select * from expected_fortune ef
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.csf.service.dao.SalarySplitMapper">
<select id="page" resultType="com.yd.csf.feign.dto.salarysplit.ApiSalarySplitPageDto">
select ss.* from salary_split ss
<where>
and ss.fortune_account_biz_id = #{request.fortuneAccountBizId}
and ss.is_deleted = 0
</where>
</select>
<select id="summaryPage" resultType="com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryPageDto">
select
ss.salary_split_biz_id,
ss.salary_split_no,
ss.fortune_account_biz_id,
ss.broker_name,
ss.broker_biz_id,
ss.internal_number,
fa.team,
ss.from_amount,
ss.to_currency,
ss.exchange_rate,
ss.to_amount,
fa.fortune_account_date,
ss.bill_org,
fa.status,
fa.amount,
fa.hkd_amount,
fa.currency,
DATE_FORMAT(fa.fortune_account_date, '%Y%m') as fortune_account_month
from salary_split ss
inner join fortune_account fa
on ss.fortune_account_biz_id = fa.fortune_account_biz_id
and fa.is_deleted = 0
<where>
<if test="request.brokerBizIdList != null and request.brokerBizIdList.size > 0">
and ss.broker_biz_id in
<foreach collection="request.brokerBizIdList" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<!-- 开始月份:大于等于该月第一天(包含整个月开始) -->
<if test="request.startMonth != null and request.startMonth != ''">
and fa.fortune_account_date >= DATE(CONCAT(#{request.startMonth}, '-01'))
</if>
<!-- 结束月份:小于下月第一天(包含整个月结束) -->
<if test="request.endMonth != null and request.endMonth != ''">
and fa.fortune_account_date &lt; DATE_ADD(DATE(CONCAT(#{request.endMonth}, '-01')), INTERVAL 1 MONTH)
</if>
<if test="request.billOrg != null and request.billOrg != ''">
and ss.bill_org like concat('%', #{request.billOrg}, '%')
</if>
and ss.is_deleted = 0
</where>
</select>
<select id="queryList" resultType="java.lang.String">
select ss.salary_split_biz_id
from salary_split ss
inner join fortune_account fa
on ss.fortune_account_biz_id = fa.fortune_account_biz_id
and fa.is_deleted = 0
<where>
<if test="request.brokerBizIdList != null and request.brokerBizIdList.size > 0">
and ss.broker_biz_id in
<foreach collection="request.brokerBizIdList" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<!-- 开始月份:大于等于该月第一天(包含整个月开始) -->
<if test="request.startMonth != null and request.startMonth != ''">
and fa.fortune_account_date >= DATE(CONCAT(#{request.startMonth}, '-01'))
</if>
<!-- 结束月份:小于下月第一天(包含整个月结束) -->
<if test="request.endMonth != null and request.endMonth != ''">
and fa.fortune_account_date &lt; DATE_ADD(DATE(CONCAT(#{request.endMonth}, '-01')), INTERVAL 1 MONTH)
</if>
<if test="request.billOrg != null and request.billOrg != ''">
and ss.bill_org like concat('%', #{request.billOrg}, '%')
</if>
and ss.is_deleted = 0
</where>
</select>
<select id="summaryList" resultType="com.yd.csf.feign.dto.salarysplit.ApiSalarySplitSummaryPageDto">
select
ss.salary_split_biz_id,
ss.salary_split_no,
ss.fortune_account_biz_id,
ss.broker_name,
ss.broker_biz_id,
ss.internal_number,
fa.team,
ss.from_amount,
ss.to_currency,
ss.exchange_rate,
ss.to_amount,
fa.fortune_account_date,
ss.bill_org,
fa.status,
fa.amount,
fa.hkd_amount,
fa.currency,
DATE_FORMAT(fa.fortune_account_date, '%Y%m') as fortune_account_month
from salary_split ss
inner join fortune_account fa
on ss.fortune_account_biz_id = fa.fortune_account_biz_id
and fa.is_deleted = 0
<where>
<if test="request.salarySplitBizIdList != null and request.salarySplitBizIdList.size > 0">
and ss.salary_split_biz_id in
<foreach collection="request.salarySplitBizIdList" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="request.brokerBizIdList != null and request.brokerBizIdList.size > 0">
and ss.broker_biz_id in
<foreach collection="request.brokerBizIdList" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<!-- 开始月份:大于等于该月第一天(包含整个月开始) -->
<if test="request.startMonth != null and request.startMonth != ''">
and fa.fortune_account_date >= DATE(CONCAT(#{request.startMonth}, '-01'))
</if>
<!-- 结束月份:小于下月第一天(包含整个月结束) -->
<if test="request.endMonth != null and request.endMonth != ''">
and fa.fortune_account_date &lt; DATE_ADD(DATE(CONCAT(#{request.endMonth}, '-01')), INTERVAL 1 MONTH)
</if>
<if test="request.billOrg != null and request.billOrg != ''">
and ss.bill_org like concat('%', #{request.billOrg}, '%')
</if>
and ss.is_deleted = 0
</where>
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment