Commit 5c35c16b by zhangxingmin

Merge remote-tracking branch 'origin/test' into test

# Conflicts:
#	yd-csf-service/src/main/java/com/yd/csf/service/service/impl/FortuneAccountServiceImpl.java
parents 4efcf911 9c9a984c
......@@ -197,9 +197,6 @@ public class ApiFortuneController {
if (CollectionUtils.isEmpty(fortuneDownloadRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "请选择要出账的发佣数据");
}
if (StringUtils.isBlank(fortuneDownloadRequest.getActualPayoutDate())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "请输入出账年月(实)");
}
fortuneService.downloadAccount(fortuneDownloadRequest, response);
......@@ -449,6 +446,25 @@ public class ApiFortuneController {
return Result.success(fortuneService.editActualPayoutDate(editActualPayoutDateRequest));
}
/**
* 批量设置出账年月(实)),已设置的跳过
*
* @param editBatchActualPayoutDateRequest
* @return
*/
@PostMapping("/edit/actual_payout_date/batch")
@Operation(summary = "批量设置出账年月(实),已设置的跳过")
public Result<String> batchEditActualPayoutDate(@RequestBody BatchEditActualPayoutDateRequest editBatchActualPayoutDateRequest) {
if (editBatchActualPayoutDateRequest == null || CollectionUtils.isEmpty(editBatchActualPayoutDateRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneBizIdList 不能为空");
}
if (StringUtils.isBlank(editBatchActualPayoutDateRequest.getActualPayoutDate())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "actualPayoutDate 不能为空");
}
return Result.success(fortuneService.batchEditActualPayoutDate(editBatchActualPayoutDateRequest));
}
/**
* 修改结算汇率,设置完成后,更新到应付款管理明细中
*
......
package com.yd.csf.api.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -33,7 +33,6 @@ import com.yd.csf.service.dto.QueryPolicyBrokerDto;
import com.yd.csf.service.dto.UserGradeDto;
import com.yd.csf.service.enums.CurrencyEnum;
import com.yd.csf.service.enums.FortuneStatusEnum;
import com.yd.csf.service.enums.FortuneTypeEnum;
import com.yd.csf.service.helper.FeignResultHelper;
import com.yd.csf.service.model.*;
import com.yd.csf.service.service.*;
......@@ -71,8 +70,8 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.ibm.icu.impl.ValidIdentifiers.Datatype.currency;
@Slf4j
......@@ -1017,8 +1016,12 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
if (CollectionUtils.isEmpty(fortuneAddRequestList)) {
return true;
}
// 校验参数
validateAdd(fortuneAddRequestList);
// 根据保单号、期数、项目类型查询已存在的记录
validIsExist(fortuneAddRequestList);
// 查询保单信息
Set<String> policyNoSet = fortuneAddRequestList.stream()
.map(ExpectedFortuneAddRequest::getPolicyNo)
......@@ -1100,6 +1103,39 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
return true;
}
private void validIsExist(List<ExpectedFortuneAddRequest> fortuneAddRequestList) {
Set<String> policyNoSet = new HashSet<>();
Set<Integer> fortunePeriodSet = new HashSet<>();
Set<String> fortuneBizTypeSet = new HashSet<>();
for (ExpectedFortuneAddRequest request : fortuneAddRequestList) {
policyNoSet.add(request.getPolicyNo());
fortunePeriodSet.add(request.getFortunePeriod());
fortuneBizTypeSet.add(request.getFortuneBizType());
}
List<ExpectedFortune> existingRecords = iExpectedFortuneService.lambdaQuery()
.in(ExpectedFortune::getPolicyNo, policyNoSet)
.in(ExpectedFortune::getFortunePeriod, fortunePeriodSet)
.in(ExpectedFortune::getFortuneBizType, fortuneBizTypeSet)
.list();
// 转换为 Map
Map<String, ExpectedFortune> existingRecordsMap = new HashMap<>();
for (ExpectedFortune item : existingRecords) {
String key = String.format("%s_%s_%s", item.getPolicyNo(), item.getFortunePeriod(), item.getFortuneBizType());
existingRecordsMap.put(key, item);
}
// 校验是否存在
for (ExpectedFortuneAddRequest request : fortuneAddRequestList) {
String key = String.format("%s_%s_%s", request.getPolicyNo(), request.getFortunePeriod(), request.getFortuneBizType());
if (existingRecordsMap.containsKey(key)) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "当前期数已存在: " + request.getFortuneName());
}
}
}
private String queryByDict(String fortuneType) {
Result<List<GetDictItemListByDictTypeResponse>> result = apiSysDictFeignClient.getDictItemListByDictType("csf_fortune_type");
if (ObjectUtils.isNotEmpty(result.getData())) {
......@@ -1383,12 +1419,6 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
throw new BusinessException(ResultCode.FAIL.getCode(), "当前应付款已有出账金额,不能修改");
}
// 查询保单数据
Policy policy = null;
if (StringUtils.isNotBlank(request.getPolicyNo())) {
policy = policyService.getOne(new QueryWrapper<Policy>().eq("policy_no", request.getPolicyNo()));
}
// 根据保单号、期数查询关联 fortune 数据,重新计算:已出帐金额、待出帐金额、已出帐比例、待出帐比例
List<Fortune> fortuneList = fortuneService.lambdaQuery()
.eq(Fortune::getPolicyNo, request.getPolicyNo())
......@@ -1420,12 +1450,19 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
updateExpectedFortune.setId(expectedFortune.getId());
// 设置 policy 关联字段
if (!expectedFortune.getPolicyNo().equals(updateExpectedFortune.getPolicyNo())) {
// 查询保单数据
Policy policy = null;
if (StringUtils.isNotBlank(request.getPolicyNo())) {
policy = policyService.getOne(new QueryWrapper<Policy>().eq("policy_no", request.getPolicyNo()));
}
if (policy != null) {
updateExpectedFortune.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
updateExpectedFortune.setProductLaunchBizId(policy.getProductLaunchBizId());
updateExpectedFortune.setPremium(policy.getPaymentPremium());
updateExpectedFortune.setPolicyCurrency(policy.getCurrency());
}
}
// 处理出账年月字段
if (StringUtils.isNotBlank(request.getPayoutDate())) {
......
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class BatchEditActualPayoutDateRequest {
@Schema(description = "出账业务ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<String> fortuneBizIdList;
@Schema(description = "实际出账年月(实)", requiredMode = Schema.RequiredMode.REQUIRED)
private String actualPayoutDate;
}
......@@ -11,6 +11,4 @@ public class FortuneDownloadRequest {
@Schema(description = "发佣数据业务Id列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<String> fortuneBizIdList;
@Schema(description = "出账年月(实),格式:yyyy-MM,例如:2026-04", requiredMode = Schema.RequiredMode.REQUIRED)
private String actualPayoutDate;
}
......@@ -22,7 +22,7 @@ public interface FortuneAccountService extends IService<FortuneAccount> {
Page<FortuneAccountVO> getFortuneAccountVOPage(Page<FortuneAccount> fortunePage);
void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList, LocalDate actualPayoutDate);
void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList);
FortuneAccount getByFortuneAccountBizId(String fortuneAccountBizId);
......
......@@ -47,4 +47,5 @@ public interface FortuneService extends IService<Fortune> {
Boolean editExchangeRate(EditExchangeRateRequest editExchangeRateRequest);
String batchEditActualPayoutDate(BatchEditActualPayoutDateRequest editBatchActualPayoutDateRequest);
}
......@@ -109,7 +109,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
@Override
@Transactional(rollbackFor = BusinessException.class)
public void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList, LocalDate actualPayoutDate) {
public void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList) {
if (CollectionUtils.isEmpty(accountExportDTOList)) {
return;
}
......@@ -145,7 +145,8 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
fortuneAccount.setTeamBizId(accountExportDTO.getTeamBizId());
fortuneAccount.setCurrency(accountExportDTO.getCurrency());
fortuneAccount.setHkdAmount(accountExportDTO.getAmount());
fortuneAccount.setFortuneAccountDate(this.getActualPayoutDate(actualPayoutDate));
fortuneAccount.setFortuneAccountDate(this.getActualPayoutDate(accountExportDTO.getActualPayoutDate()));
// 出账状态默认待出账
fortuneAccount.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
// 转换为List<Map<String, Object>>
......@@ -189,7 +190,6 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
.divide(item.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)));
}
updateFortune.setReconciliationOperator(currentLoginUser.getUsername());
updateFortune.setActualPayoutDate(actualPayoutDate);
updateFortuneList.add(updateFortune);
// 处理关联预计发佣记录
expectedFortuneBizIdList.add(item.getExpectedFortuneBizId());
......@@ -213,7 +213,6 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
ExpectedFortune updateExpectedFortune = new ExpectedFortune();
updateExpectedFortune.setId(expectedFortune.getId());
updateExpectedFortune.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
updateExpectedFortune.setActualPayoutDate(actualPayoutDate);
updateExpectedFortuneList.add(updateExpectedFortune);
}
expectedFortuneService.updateBatchById(updateExpectedFortuneList);
......
......@@ -393,26 +393,33 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.SENT.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("已完成出账,不能生成出账记录; ");
}
if (fortune.getActualPayoutDate() == null) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("未设置出账年月(实),不能生成出账记录; ");
}
if (ObjectUtils.isEmpty(fortune.getPayoutCurrency())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("未设置发放币种,不能生成出账记录; ");
}
if (ObjectUtils.isEmpty(fortune.getPayoutAmount())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("未设置发放币种金额,不能生成出账记录; ");
}
}
if (StringUtils.isNotBlank(validateMsg.toString())) {
throw new BusinessException(ResultCode.FAIL.getCode(), validateMsg.toString());
}
if (CollUtil.isNotEmpty(fortuneList)) {
// 按人和发放币种分组
Map<String, List<Fortune>> fortuneMap = fortuneList.stream().collect(Collectors.groupingBy(fortune -> fortune.getBroker() + "_" + fortune.getPayoutCurrency()));
// 按人和实际出账年月(实)和发放币种分组
Map<String, List<Fortune>> fortuneMap = fortuneList.stream()
.collect(Collectors.groupingBy(fortune -> fortune.getBroker() + "_" + fortune.getActualPayoutDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "_" + fortune.getPayoutCurrency()));
// 创建按人分组的导出DTO列表
List<FortuneAccountExportDTO> accountExportDTOList = new ArrayList<>();
// 设置出账年月(实)
LocalDate actualPayoutDate = LocalDate.parse(fortuneDownloadRequest.getActualPayoutDate() + "-01");
fortuneList.forEach(fortune -> fortune.setActualPayoutDate(actualPayoutDate));
// 处理每个分组的数据
for (Map.Entry<String, List<Fortune>> entry : fortuneMap.entrySet()) {
String broker = entry.getKey().split("_")[0];
String currency = entry.getKey().split("_")[1];
String actualPayoutDate = entry.getKey().split("_")[1];
String currency = entry.getKey().split("_")[2];
List<Fortune> brokerFortunes = entry.getValue();
FortuneAccountExportDTO accountDTO = new FortuneAccountExportDTO();
......@@ -425,7 +432,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
accountDTO.setTeam(brokerFortunes.get(0).getTeam());
accountDTO.setTeamBizId(brokerFortunes.get(0).getTeamBizId());
accountDTO.setCurrency(currency);
accountDTO.setActualPayoutDate(brokerFortunes.get(0).getActualPayoutDate());
accountDTO.setActualPayoutDate(LocalDate.parse(actualPayoutDate));
}
// 计算出账总额
......@@ -480,7 +487,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// }
// 写入数据库
fortuneAccountService.saveFortuneAccount(accountExportDTOList, actualPayoutDate);
fortuneAccountService.saveFortuneAccount(accountExportDTOList);
// // 使用try-with-resources确保流正确关闭
// try (ServletOutputStream outputStream = response.getOutputStream()) {
......@@ -807,6 +814,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
throw new BusinessException(ResultCode.FAIL.getCode(), fortuneAddRequest.getFortuneName() + " 已存在应付记录,请在应付款管理页面修改金额");
}
fortune.setPayableNo(expectedFortune.getPayableNo());
fortune.setExpectedFortuneBizId(expectedFortune.getExpectedFortuneBizId());
fortune.setPolicyCurrency(expectedFortune.getPolicyCurrency());
fortune.setCurrentPaymentRatio(BigDecimal.valueOf(100));
......@@ -1161,6 +1169,38 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public String batchEditActualPayoutDate(BatchEditActualPayoutDateRequest editBatchActualPayoutDateRequest) {
List<Fortune> fortuneList = this.lambdaQuery()
.in(Fortune::getFortuneBizId, editBatchActualPayoutDateRequest.getFortuneBizIdList())
.list();
if (CollectionUtils.isEmpty(fortuneList)) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账记录不存在");
}
// 处理实际出账年月(实)
LocalDate actualPayoutDate = LocalDate.parse(editBatchActualPayoutDateRequest.getActualPayoutDate() + "-01");
// 更新 fortune 的字段, 已设置的不更新,记录更新成功及跳过的条数
int updateCount = 0;
int skipCount = 0;
for (Fortune fortune : fortuneList) {
if (ObjectUtils.isEmpty(fortune.getActualPayoutDate())) {
updateCount++;
} else {
skipCount++;
continue;
}
this.lambdaUpdate()
.set(Fortune::getActualPayoutDate, actualPayoutDate)
.eq(Fortune::getId, fortune.getId())
.update();
}
return String.format("设置成功。已更新 %d 条数据,跳过 %d 条(已有实际出账年月)", updateCount, skipCount);
}
private void validEditExchangeRate(EditExchangeRateRequest editExchangeRateRequest) {
if (ObjectUtils.isEmpty(editExchangeRateRequest.getOriginalCurrency())) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "原币种不能为空");
......
......@@ -79,24 +79,11 @@
then round(100 - (ifnull(sum(ef.paid_amount), 0) / ifnull(sum(ef.hkd_amount), 0) * 100), 2)
else 100
end as unpaidRatio,
MAX(first_broker.broker_name) as broker,
MAX(first_broker.broker_biz_id) as brokerBizId,
MAX(ef.broker) as broker,
MAX(ef.broker_biz_id) as brokerBizId,
DATE_ADD(DATE_ADD(MAX(p.effective_date), INTERVAL 2 MONTH), INTERVAL (ef.fortune_period - 1) YEAR) as payoutDate
from expected_fortune ef
left join policy p on ef.policy_no = p.policy_no
left join (
SELECT pb1.policy_no, pb1.broker_name,pb1.broker_biz_id
FROM policy_broker pb1
WHERE pb1.id = (
SELECT pb2.id
FROM policy_broker pb2
WHERE pb2.policy_no = pb1.policy_no
AND pb2.is_deleted = 0
ORDER BY pb2.id ASC
LIMIT 1
)
AND pb1.is_deleted = 0
) first_broker on ef.policy_no = first_broker.policy_no
<where>
ef.fortune_biz_type = 'R'
<if test="expectedFortuneIds != null and expectedFortuneIds.size > 0">
......
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