Commit bdfc676e by zhangxingmin

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

parents 4779ebb8 d0523a47
......@@ -2,7 +2,6 @@
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-csf-api/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-csf-api/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-csf-feign/src/main/java" charset="UTF-8" />
......
......@@ -14,6 +14,7 @@ import com.yd.csf.api.dto.QueryCommissionExpectedByPageNewResponse;
import com.yd.csf.api.dto.QueryCommissionExpectedByPageResponse;
import com.yd.csf.api.dto.ReceivableReportResponse;
import com.yd.csf.api.service.ApiCommissionExpectedService;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.model.CommissionExpected;
......@@ -34,6 +35,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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
......@@ -253,6 +255,16 @@ public class ApiCommissionExpectedController {
}
/**
* 修改入账状态
* @param request
* @return
*/
@PutMapping("/edit/status")
public Result editStatus(@Validated @RequestBody CommissionExpectedEditStatusRequest request) {
return apiCommissionExpectedService.editStatus(request);
}
/**
* 应收款导出(旧)
*
* @param commissionExpectedQueryRequest
......@@ -343,12 +355,24 @@ public class ApiCommissionExpectedController {
@Operation(summary = "应收款报表")
public Result<ReceivableReportResponse> receivableReport(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest) {
//保單持有人(中/英、繁简/大小写)、签单人、转介人名称(主)、受保人(中/英、繁简/大小写)、查询保单号列表
List<String> queryPolicyNoList = policyFollowService.queryPolicyNoList(commissionExpectedQueryRequest.getPolicyHolder(),
commissionExpectedQueryRequest.getSigner(),
commissionExpectedQueryRequest.getBrokerName(),
commissionExpectedQueryRequest.getInsured());
List<String> queryPolicyNoList = new ArrayList<>();
Boolean queryFlag = false;
if (StringUtils.isNotBlank(commissionExpectedQueryRequest.getPolicyHolder())
|| StringUtils.isNotBlank(commissionExpectedQueryRequest.getSigner())
|| StringUtils.isNotBlank(commissionExpectedQueryRequest.getBrokerName())
|| StringUtils.isNotBlank(commissionExpectedQueryRequest.getInsured())
){
queryPolicyNoList = policyFollowService.queryPolicyNoList(
commissionExpectedQueryRequest.getPolicyHolder(),
commissionExpectedQueryRequest.getSigner(),
commissionExpectedQueryRequest.getBrokerName(),
commissionExpectedQueryRequest.getInsured());
queryFlag = true;
}
log.info("应收款报表=>receivableReport=>queryPolicyNoList:{}",JSON.toJSONString(queryPolicyNoList));
// 构建查询条件
commissionExpectedQueryRequest.setPolicyNoList(queryPolicyNoList);
commissionExpectedQueryRequest.setQueryFlag(queryFlag);
QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService.getQueryWrapper(commissionExpectedQueryRequest);
// 先查询所有符合条件的记录ID(用于统计)
......
......@@ -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));
}
/**
* 修改结算汇率,设置完成后,更新到应付款管理明细中
*
......
......@@ -18,7 +18,9 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
......@@ -128,6 +130,8 @@ public class EvaluateRankJobHandler {
log.setFycLogBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_AGENT_ACCUMULATED_FYC_LOG.getCode()));
//操作来源
log.setSourceType(OprSourceEnum.CALM_TASK_EVALUATE_RANK.getItemValue());
log.setCreateTime(LocalDateTime.now());
log.setUpdateTime(LocalDateTime.now());
return log;
}).collect(Collectors.toList());
iAgentAccumulatedFycLogService.saveOrUpdateBatch(addLogList);
......
package com.yd.csf.api.service;
import com.yd.common.result.Result;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import javax.servlet.http.HttpServletResponse;
......@@ -7,4 +9,6 @@ import java.io.UnsupportedEncodingException;
public interface ApiCommissionExpectedService {
void exportCommissionExpectedNew(CommissionExpectedQueryRequest commissionExpectedQueryRequest, HttpServletResponse response) throws UnsupportedEncodingException;
Result editStatus(CommissionExpectedEditStatusRequest request);
}
......@@ -685,8 +685,9 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
// 保單持有人
if (apiPolicyholderInfoDto != null) {
follow.setPolicyHolder(StringUtils.isNotBlank(apiPolicyholderInfoDto.getNameCn()) ? apiPolicyholderInfoDto.getNameCn() : apiPolicyholderInfoDto.getNamePyEn());
follow.setPolicyHolderEn(apiPolicyholderInfoDto.getNamePyEn());
}
// 受保人信息
if (!Objects.isNull(apiInsurantInfoDto)) {
// 受保人
......@@ -709,6 +710,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
&& !response.getApiAppointmentInfoDto().getUserSignDtoList().isEmpty()) {
ApiAppointmentUserSignDto firstSigner = response.getApiAppointmentInfoDto().getUserSignDtoList().get(0);
follow.setSigner(firstSigner.getName());
follow.setSignerSc(ChineseTextConverter.traditionalToSimplified(firstSigner.getName()));
follow.setSignerBizId(firstSigner.getAppointmentUserSignBizId());
follow.setPracticeCode(firstSigner.getPracticeCode());
}
......
......@@ -7,7 +7,9 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.csf.api.service.ApiCommissionExpectedService;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionExpectedService;
......@@ -84,4 +86,21 @@ public class ApiCommissionExpectedServiceImpl implements ApiCommissionExpectedSe
}
}
/**
* 修改入账状态
* @param request
* @return
*/
@Override
public Result editStatus(CommissionExpectedEditStatusRequest request) {
CommissionExpected commissionExpected = commissionExpectedService.queryOne(request.getCommissionExpectedBizId());
if (commissionExpected == null) {
throw new BusinessException("预计来佣数据不存在");
}
commissionExpected.setStatus(request.getStatus());
commissionExpected.setStatusDesc(request.getStatusDesc());
commissionExpectedService.saveOrUpdate(commissionExpected);
return Result.success();
}
}
package com.yd.csf.api.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
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;
......@@ -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
......@@ -634,8 +633,8 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
.build());
//异步处理-构建冷静期定时任务
log.info("异步处理-构建冷静期定时任务=>请求前入参:{}",JSON.toJSONString(collectResDtos));
apiExpectedFortuneAsyncService.buildCalmDateTask(collectResDtos,policyNo,exchangeRate);
// log.info("异步处理-构建冷静期定时任务=>请求前入参:{}",JSON.toJSONString(collectResDtos));
// apiExpectedFortuneAsyncService.buildCalmDateTask(collectResDtos,policyNo,exchangeRate);
return Result.success();
} catch (Exception e) {
......@@ -672,28 +671,12 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
@Transactional(rollbackFor = Exception.class)
private List<ExpectedFortune> updatePayableNoBatch(String policyNo) {
// 查询最新一条有 payableNo 记录
ExpectedFortune latest = iExpectedFortuneService.getOne(
new QueryWrapper<ExpectedFortune>()
.isNotNull("payable_no")
.eq("is_part", 0)
.orderByDesc("id")
.last("LIMIT 1"),
true
);
//查询当前保单号的所有预计发佣记录
List<ExpectedFortune> expectedFortuneList = iExpectedFortuneService.queryList(policyNo);
//查询redis缓存的字典列表信息
List<GetDictItemListByDictTypeResponse> dictTypeResponses = redisUtil.getCacheObject(RedisConstants.DICT_LIST);
//获取当前序号作为起点
int currentSeq = 0;
if (!Objects.isNull(latest)) {
String payableNo = latest.getPayableNo();
currentSeq = Integer.parseInt(payableNo.substring(payableNo.length() - 6));
}
//批量更新应付款编号,每个item递增
ExpectedFortune expectedFortune;
List<ExpectedFortune> updateList = new ArrayList<>();
......@@ -702,9 +685,9 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
ExpectedFortune updateObj = new ExpectedFortune();
updateObj.setId(expectedFortune.getId());
updateObj.setPayableNo(this.createPayableNo("R", currentSeq + i + 1));
updateObj.setFortuneType(GetDictItemListByDictTypeResponse.getItemValue(dictTypeResponses,
"csf_fortune_type", expectedFortune.getFortuneName()));
updateObj.setPayableNo(iExpectedFortuneService.getPayableNo(updateObj.getFortuneType(), policyNo, expectedFortune.getId()));
updateList.add(updateObj);
}
......@@ -1012,7 +995,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
// 5. 组装返回结果
ApiExpectedFortunePageResponseVO response = new ApiExpectedFortunePageResponseVO();
response.setStatisticsVO(statisticsVO);
response.setPage(iExpectedFortuneService.getVOPage(iPage)); // 恢复分页数据
response.setPage(iExpectedFortuneService.getVOPage(iPage)); // 字段填充、调整数据顺序
log.info("查询应付款管理列表完成, 耗时: {}ms, 页码: {}, 页大小: {}, 总记录数: {}",
System.currentTimeMillis() - startTime,
......@@ -1033,27 +1016,41 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
if (CollectionUtils.isEmpty(fortuneAddRequestList)) {
return true;
}
// 校验参数
validateAdd(fortuneAddRequestList);
// 根据保单号、期数、项目类型查询已存在的记录
validIsExist(fortuneAddRequestList);
// 查询保单信息
Set<String> policyNoSet = fortuneAddRequestList.stream()
.map(ExpectedFortuneAddRequest::getPolicyNo)
.filter(StringUtils::isNotBlank).collect(Collectors.toSet());
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
Map<String, Policy> policyMap = new HashMap<>();
if (CollUtil.isNotEmpty(policyNoSet)) {
List<Policy> policyList = policyService.lambdaQuery().in(Policy::getPolicyNo, policyNoSet).list();
// 保单映射
policyMap = policyList.stream().collect(Collectors.toMap(Policy::getPolicyNo, Function.identity()));
}
Map<String, Policy> policyMap = policyService.queryPolicyMap(policyNoSet);
// 当前登录用户
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
// 当前时间
LocalDateTime now = LocalDateTime.now();
// 查询最新一条有 payableNo 记录
int currentSeq = iExpectedFortuneService.getPayableNoCurrentSeq();
// int currentSeq = iExpectedFortuneService.getPayableNoCurrentSeq();
List<ExpectedFortune> fortuneList = new ArrayList<>();
for (ExpectedFortuneAddRequest expectedFortuneDto : fortuneAddRequestList) {
ExpectedFortune expectedFortune = new ExpectedFortune();
BeanUtil.copyProperties(expectedFortuneDto, expectedFortune);
BeanUtil.copyProperties(expectedFortuneDto, expectedFortune, "payoutDate", "actualPayoutDate");
// 设置创建人、更新人
expectedFortune.setCreatorId(authUserDto.getUserBizId());
expectedFortune.setCreatorName(authUserDto.getRealName());
expectedFortune.setUpdaterId(authUserDto.getUserBizId());
expectedFortune.setCreateTime(now);
expectedFortune.setUpdateTime(now);
// 是否拆分
expectedFortune.setIsPart(0);
if ("R".equals(expectedFortuneDto.getFortuneBizType())) {
Policy policy = policyMap.get(expectedFortuneDto.getPolicyNo());
......@@ -1072,31 +1069,76 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
expectedFortune.setExpectedFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_EXPECTED_FORTUNE.getCode()));
// 预计发佣类型名称
expectedFortune.setFortuneName(queryByDict(expectedFortuneDto.getFortuneType()));
// 应付款编号(序号递增)
expectedFortune.setPayableNo(this.createPayableNo(expectedFortune.getFortuneBizType(), ++currentSeq));
// 预计出账年月
if (StringUtils.isNotBlank(expectedFortuneDto.getPayoutDate())) {
expectedFortune.setPayoutDate(LocalDate.parse(expectedFortuneDto.getPayoutDate() + "-01"));
}
// 实际出账年月
if (StringUtils.isNotBlank(expectedFortuneDto.getActualPayoutDate())) {
expectedFortune.setActualPayoutDate(LocalDate.parse(expectedFortuneDto.getActualPayoutDate() + "-01"));
}
// 转介人比例默认100%
expectedFortune.setBrokerRatio("100");
// 已出帐金额、待出帐金额、已出帐比例、待出帐比例
expectedFortune.setPaidAmount(BigDecimal.ZERO);
// 转介人比例默认100%
expectedFortune.setBrokerRatio("100");
expectedFortune.setUnpaidAmount(expectedFortune.getHkdAmount());
expectedFortune.setPaidRatio(BigDecimal.ZERO);
expectedFortune.setUnpaidRatio(BigDecimal.valueOf(100));
fortuneList.add(expectedFortune);
}
iExpectedFortuneService.saveOrUpdateBatch(fortuneList);
// 更新应付款编号
List<ExpectedFortune> updateList = new ArrayList<>();
for (ExpectedFortune expected : fortuneList) {
// 生成应付款编号
String payableNo = iExpectedFortuneService.getPayableNo(expected.getFortuneType(), expected.getPolicyNo(), expected.getId());
ExpectedFortune updateExpected = new ExpectedFortune();
updateExpected.setId(expected.getId());
updateExpected.setPayableNo(payableNo);
updateList.add(updateExpected);
}
iExpectedFortuneService.updateBatchById(updateList);
return true;
}
private String queryByDict(String fortuneType) {
//查询redis缓存的字典列表信息
List<GetDictItemListByDictTypeResponse> dictTypeResponses = redisUtil.getCacheObject(RedisConstants.DICT_LIST);
String fortuneName = GetDictItemListByDictTypeResponse.getItemLabel(dictTypeResponses,
"csf_fortune_type", fortuneType);
if (ObjectUtils.isNotEmpty(fortuneName)) {
return fortuneName;
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())) {
for (GetDictItemListByDictTypeResponse dictItem : result.getData()) {
......@@ -1132,15 +1174,29 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
private void validateAdd(List<ExpectedFortuneAddRequest> fortuneAddRequestList) {
for (ExpectedFortuneAddRequest expectedFortuneDto : fortuneAddRequestList) {
if (Objects.isNull(expectedFortuneDto.getHkdAmount())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计出账金额不能为空");
if (Objects.isNull(expectedFortuneDto.getOriginalAmount())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "原币种金额不能为空");
}
if (Objects.isNull(expectedFortuneDto.getCurrency())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计出账币种不能为空");
if (Objects.isNull(expectedFortuneDto.getOriginalCurrency())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "币种不能为空");
}
if (Objects.isNull(expectedFortuneDto.getExchangeRate())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "结算汇率不能为空");
if (Objects.isNull(expectedFortuneDto.getOriginalToHkdRate())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "原币种→港币汇率不能为空");
}
if (Objects.isNull(expectedFortuneDto.getRuleAmount())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单币种金额不能为空");
}
if (Objects.isNull(expectedFortuneDto.getRuleCurrency())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单币种不能为空");
}
if (Objects.isNull(expectedFortuneDto.getDefaultExchangeRate())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计出账汇率不能为空");
}
if (Objects.isNull(expectedFortuneDto.getHkdAmount())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计出账金额不能为空");
}
}
}
......@@ -1199,25 +1255,14 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
public IPage<PayableReportVO> convertPayableReportVO(IPage<PayableReportVO> payableReportPage) {
if (!CollectionUtils.isEmpty(payableReportPage.getRecords())) {
// 查询转介人等级
List<String> brokerBizIdList = payableReportPage.getRecords().stream().map(PayableReportVO::getBrokerBizId).collect(Collectors.toList());
List<UserGradeDto> userGradeDtoList = new ArrayList<>();
if (!CollectionUtils.isEmpty(brokerBizIdList)) {
userGradeDtoList = iAgentAccumulatedFycService.queryUserGradeList(brokerBizIdList);
}
Map<String, UserGradeDto> userGradeMap = userGradeDtoList.stream()
.collect(Collectors.toMap(UserGradeDto::getClientUserBizId, Function.identity()));
Map<String, UserGradeDto> userGradeMap = iAgentAccumulatedFycService.queryUserGradeMap(brokerBizIdList);
// 查询新单跟进
List<String> policyNoList = payableReportPage.getRecords().stream().map(PayableReportVO::getPolicyNo).collect(Collectors.toList());
Map<String, PolicyFollow> policyFollowMap = policyFollowService.queryPolicyFollowMap(policyNoList);
List<PolicyFollow> policyFollowList = new ArrayList<>();
if (!CollectionUtils.isEmpty(policyNoList)) {
policyFollowList = policyFollowService.lambdaQuery()
.in(PolicyFollow::getPolicyNo, policyNoList)
.list();
}
Map<String, PolicyFollow> policyFollowMap = policyFollowList.stream()
.collect(Collectors.toMap(PolicyFollow::getPolicyNo, Function.identity()));
List<PayableReportVO> voList = payableReportPage.getRecords().stream().map(vo -> {
PolicyFollow policyFollow= policyFollowMap.get(vo.getPolicyNo());
UserGradeDto userGradeDto= userGradeMap.get(vo.getBrokerBizId());
......@@ -1229,6 +1274,8 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
if (policyFollow != null) {
vo.setProductName(policyFollow.getProductName());
vo.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
vo.setPolicyHolder(policyFollow.getPolicyHolder());
vo.setPolicyHolderEn(policyFollow.getPolicyHolderEn());
}
return vo;
}).collect(Collectors.toList());
......@@ -1238,20 +1285,6 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
}
/**
* 创建应付款编号 应付款类型-CSF-年份后两位-6位数字(不重复)
*
* @param fortuneBizType 预计发佣业务类型
* @param seq 序号
* @return
*/
private String createPayableNo(String fortuneBizType, int seq) {
return String.format("%s%s%s",
fortuneBizType + "-CSF",
LocalDate.now().getYear() % 100,
String.format("%06d", seq));
}
/**
* 分页查询 - 预计发佣
*
* @param request
......@@ -1387,27 +1420,68 @@ 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());
// 根据保单号、期数查询关联 fortune 数据,重新计算:已出帐金额、待出帐金额、已出帐比例、待出帐比例
List<Fortune> fortuneList = fortuneService.lambdaQuery()
.eq(Fortune::getPolicyNo, request.getPolicyNo())
.eq(Fortune::getFortunePeriod, request.getFortunePeriod())
.list();
BigDecimal paidAmount = BigDecimal.ZERO;
BigDecimal unpaidAmount = request.getHkdAmount();
BigDecimal paidRatio = BigDecimal.ZERO;
BigDecimal unpaidRatio = BigDecimal.valueOf(100);
if (!CollectionUtils.isEmpty(fortuneList)) {
// 计算已出账金额
for (Fortune fortune : fortuneList) {
if (FortuneStatusEnum.SENT.getItemValue().equals(fortune.getStatus())) {
paidAmount = paidAmount.add(fortune.getCurrentPaymentHkdAmount());
}
}
// 计算待出账金额
unpaidAmount = request.getHkdAmount().subtract(paidAmount);
// 计算已出账比例(已出账金额/预计发佣金额)
paidRatio = paidAmount.divide(request.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
// 计算待出账比例(待出账金额/预计发佣金额)
unpaidRatio = unpaidAmount.divide(request.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
}
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
ExpectedFortune updateExpectedFortune = new ExpectedFortune();
BeanUtils.copyProperties(request, updateExpectedFortune);
BeanUtils.copyProperties(request, updateExpectedFortune, "payoutDate", "actualPayoutDate");
updateExpectedFortune.setId(expectedFortune.getId());
// 如果金额变更,则需要重新计算港币金额和待出账金额
if (ObjectUtils.notEqual(expectedFortune.getHkdAmount(), request.getHkdAmount())) {
// 计算港币金额
updateExpectedFortune.setHkdAmount(request.getHkdAmount());
// 更新待出账金额
updateExpectedFortune.setUnpaidAmount(request.getHkdAmount());
// 设置 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());
}
}
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
// 处理出账年月字段
if (StringUtils.isNotBlank(request.getPayoutDate())) {
updateExpectedFortune.setPayoutDate(LocalDate.parse(request.getPayoutDate() + "-01"));
}
// 处理实际出账年月字段
if (StringUtils.isNotBlank(request.getActualPayoutDate())) {
updateExpectedFortune.setActualPayoutDate(LocalDate.parse(request.getActualPayoutDate() + "-01"));
}
// 已出帐金额、待出帐金额、已出帐比例、待出帐比例
updateExpectedFortune.setPaidAmount(paidAmount);
updateExpectedFortune.setUnpaidAmount(unpaidAmount);
updateExpectedFortune.setPaidRatio(paidRatio);
updateExpectedFortune.setUnpaidRatio(unpaidRatio);
updateExpectedFortune.setUpdaterId(loginUserId);
updateExpectedFortune.setUpdateTime(LocalDateTime.now());
......
......@@ -13,8 +13,10 @@ import com.yd.csf.feign.request.policyreceipt.ApiPolicyReceiptPageRequest;
import com.yd.csf.feign.response.policyreceipt.ApiPolicyReceiptDetailResponse;
import com.yd.csf.feign.response.policyreceipt.ApiPolicyReceiptPageResponse;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.model.PolicyReceipt;
import com.yd.csf.service.service.IPolicyReceiptService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -24,8 +26,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Objects;
@Slf4j
......@@ -38,6 +42,9 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
@Autowired
private PolicyService policyService;
@Autowired
private PolicyFollowService policyFollowService;
/**
* 分页列表查询-保单回执信息
* @param request
......@@ -94,6 +101,10 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
policyReceipt.setReceiptStatus(request.getReceiptStatus());
policyReceipt.setPolicyHolderSignature(!CollectionUtils.isEmpty(request.getPolicyHolderSignatureList()) ? String.join(";", request.getPolicyHolderSignatureList()) : "");
iPolicyReceiptService.saveOrUpdate(policyReceipt);
//更新新单跟进回执信息
updateReceiptToPolicyFollow(policyReceipt);
return Result.success();
}
......@@ -120,6 +131,10 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
policyReceipt.setReceiptStatus(request.getReceiptStatus());
policyReceipt.setPolicyHolderSignature(!CollectionUtils.isEmpty(request.getPolicyHolderSignatureList()) ? String.join(";", request.getPolicyHolderSignatureList()) : "");
iPolicyReceiptService.saveOrUpdate(policyReceipt);
//更新新单跟进回执信息
updateReceiptToPolicyFollow(policyReceipt);
return Result.success();
}
......@@ -141,4 +156,27 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
return Result.success();
}
/**
* 更新新单跟进信息的回执信息
* @param policyReceipt
* @return
*/
public Result updateReceiptToPolicyFollow(PolicyReceipt policyReceipt) {
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyReceipt.getPolicyNo());
if (policyFollow == null) {
throw new BusinessException("新单跟进信息不存在");
}
if ("CONFIRMED".equals(policyReceipt.getReceiptStatus())) {
//回执状态为已确认时,更新新单跟进信息的回执状态和回执日期
policyFollow.setReceiptStatus(policyReceipt.getReceiptStatus());
policyFollow.setReceiptDate(policyReceipt.getReceiptDate() != null ? Date.from(policyReceipt.getReceiptDate().atZone(ZoneId.systemDefault()).toInstant()) : null);
}else if ("UNCONFIRMED".equals(policyReceipt.getReceiptStatus())) {
//回执状态为未确认时,更新新单跟进信息的回执状态
policyFollow.setReceiptStatus(policyReceipt.getReceiptStatus());
policyFollow.setReceiptDate(null);
}
policyFollowService.saveOrUpdate(policyFollow);
return Result.success();
}
}
......@@ -134,11 +134,11 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
// 投保人-中文转简体
String policyHolderNameSc = ChineseTextConverter.traditionalToSimplified(request.getPolicyHolder());
// 投保人-英文转小写
String policyHolderNameEnLc = EnglishTextUtil.toLowerCase(request.getPolicyHolder());
String policyHolderNameEnLc = EnglishTextUtil.toLowerCaseSafe(request.getPolicyHolder());
// 受保人-中文转简体
String insuredNameSc = ChineseTextConverter.traditionalToSimplified(request.getPolicyHolder());
// 受保人-英文转小写
String insuredNameEnLc = EnglishTextUtil.toLowerCase(request.getPolicyHolder());
String insuredNameEnLc = EnglishTextUtil.toLowerCaseSafe(request.getPolicyHolder());
request.setPolicyHolderNameSc(policyHolderNameSc);
request.setPolicyHolderNameEnLc(policyHolderNameEnLc);
request.setInsuredNameSc(insuredNameSc);
......
......@@ -33,16 +33,17 @@ 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 com.yd.user.feign.client.sysdict.ApiSysDictFeignClient;
import com.yd.user.feign.request.sysdict.GetDictTypeListRequest;
import com.yd.user.feign.response.sysdict.GetDictItemListByDictTypeResponse;
import com.yd.user.feign.response.sysdict.GetDictTypeListResponse;
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.*;
import java.util.stream.Collectors;
@Slf4j
......@@ -61,6 +62,9 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
@Autowired
private ApiExcelFeignClient apiExcelFeignClient;
@Autowired
private ApiSysDictFeignClient apiSysDictFeignClient;
/**
* 分页查询-薪资拆分应发信息汇总列表
* @param request
......@@ -72,6 +76,13 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
// 查询分页信息
Page<ApiSalarySplitSummaryPageDto> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiSalarySplitSummaryPageDto> iPage = iSalarySplitService.summaryPage(page, request);
if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
Map<String, String> map = getBillOrgDict();
iPage.getRecords().stream().map(dto -> {
dto.setBillOrg(map != null ? map.get(dto.getBillOrg()) : "");
return dto;
}).collect(Collectors.toList());
}
response.setPage(iPage);
//查询薪资拆分业务ID列表
List<String> salarySplitBizIdList = iSalarySplitService.queryList(request);
......@@ -80,6 +91,33 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
}
/**
* 获取出账机构字典数据
*/
private Map<String, String> getBillOrgDict() {
Map<String, String> dictMap = new HashMap<>();
try {
GetDictTypeListRequest dictRequest = new GetDictTypeListRequest();
dictRequest.setTypeList(Collections.singletonList("csf_bill_org"));
List<GetDictTypeListResponse> dictTypeResponses = apiSysDictFeignClient.getByDictTypeList(dictRequest).getData();
if (dictTypeResponses != null && !dictTypeResponses.isEmpty()) {
for (GetDictTypeListResponse dictTypeResponse : dictTypeResponses) {
if ("csf_bill_org".equals(dictTypeResponse.getDictType())
&& dictTypeResponse.getDictItemList() != null) {
for (GetDictItemListByDictTypeResponse dictItem : dictTypeResponse.getDictItemList()) {
dictMap.put(dictItem.getItemValue(), dictItem.getItemLabel());
}
break;
}
}
}
} catch (Exception e) {
log.error("获取出账机构字典数据失败", e);
}
return dictMap;
}
/**
* 分页查询-薪资拆分应发信息列表
* @param request
* @return
......@@ -271,9 +309,9 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
ExportParam exportParam = new ExportParam();
// 指定需要导出的字段(字段名必须与 DTO 中的属性名一致)
exportParam.setFieldNames(Arrays.asList(
"salarySplitNo","brokerName","team","fromAmount",
"salarySplitNo","businessNo","brokerName","team","fromAmount",
"currency","exchangeRate","toAmount","toCurrency",
"fortuneAccountMonth","billOrg","hkdAmount","fortuneAccountBizId"
"fortuneAccountMonth","billOrg","hkdAmount"
));
exportParam.setFileName("薪资拆分应发信息汇总");
exportParam.setUploadToOss(true);
......
......@@ -10,6 +10,9 @@ public class ApiSalarySplitSummaryExcelDto {
@Excel(name = "发放编号", orderNum = "1")
private String salarySplitNo;
@Excel(name = "业务编号", orderNum = "1")
private String businessNo;
@Excel(name = "转介人", orderNum = "2")
private String brokerName;
......@@ -43,7 +46,4 @@ public class ApiSalarySplitSummaryExcelDto {
@Excel(name = "本期总出账金额(原币种)", orderNum = "12")
private BigDecimal hkdAmount;
@Excel(name = "出账业务编号", orderNum = "13")
private String businessNo;
}
......@@ -60,9 +60,7 @@ public class ApiExpectedFortunePageRequest extends PageDto {
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
private String fortuneBizType;
/**
* 保單持有人(中/英)
*/
@Schema(description = "保單持有人(中/英)")
private String policyHolder;
private List<String> PolicyNoList;
......
......@@ -5,117 +5,84 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ExpectedFortuneAddRequest {
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneBizType;
/**
* 关联保单号
*/
@Schema(description = "出账年月 (估)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String payoutDate;
@Schema(description = "出账年月 (实)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String actualPayoutDate;
@Schema(description = "关联保单号")
private String policyNo;
/**
* 产品计划 ID
*/
@Schema(description = "产品计划 ID")
private String productLaunchBizId;
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
private String status;
@Schema(description = "出账状态-修改理由")
private String statusDesc;
/**
* 佣金期数
*/
@Schema(description = "佣金期数")
@Schema(description = "出账项目", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneName;
@Schema(description = "出账项目类型 字典值:csf_fortune_type", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneType;
@Schema(description = "出账期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortunePeriod;
/**
* 总期数
*/
@Schema(description = "总期数")
@Schema(description = "出账总期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortuneTotalPeriod;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
@Schema(description = "转介人名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String broker;
/**
* 转介人业务ID
*/
@Schema(description = "broker biz id")
@Schema(description = "broker biz id", requiredMode = Schema.RequiredMode.REQUIRED)
private String brokerBizId;
/**
* 团队名称
*/
@Schema(description = "团队名称")
@Schema(description = "所属团队")
private String team;
/**
* 所属团队业务ID
*/
@Schema(description = "所属团队 biz id")
@Schema(description = "所属团队业务ID")
private String teamBizId;
/**
* 出账项目
*/
@Schema(description = "出账项目")
private String fortuneName;
@Schema(description = "保单币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal ruleAmount;
/**
* 出账项目类型
*/
@Schema(description = "出账项目类型 字典值:csf_fortune_type")
private String fortuneType;
@Schema(description = "保单币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String ruleCurrency;
/**
* 结算汇率
*/
@Schema(description = "结算汇率")
private BigDecimal exchangeRate;
@Schema(description = "保单币种→港币汇率(默认保单币种汇率)", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal defaultExchangeRate;
/**
* 出账金额 单位:港币
*/
@Schema(description = "出账金额 单位:港币")
private BigDecimal hkdAmount;
@Schema(description = "原币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String originalCurrency;
/**
* 出账币种
*/
@Schema(description = "出账币种")
private String currency;
/**
* 出账日 (估)
*/
@Schema(description = "出账日 (估)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date payoutDate;
/**
* 出账日 (实)
*/
@Schema(description = "出账日 (实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date actualPayoutDate;
/**
* 出账状态
*/
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
private String status;
@Schema(description = "原币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalAmount;
@Schema(description = "原币种→港币汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalToHkdRate;
@Schema(description = "发放币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String payoutCurrency;
@Schema(description = "发放币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal payoutAmount;
@Schema(description = "港币→发放币种汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdToPayoutRate;
@Schema(description = "港币金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdAmount;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
}
......@@ -5,99 +5,94 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
public class ExpectedFortuneUpdateRequest {
/**
* 预计发佣业务id
*/
@Schema(description = "预计发佣业务id")
@Schema(description = "预计发佣业务id", requiredMode = Schema.RequiredMode.REQUIRED)
private String expectedFortuneBizId;
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneBizType;
/**
* 出账日 (估)
*/
@Schema(description = "出账日 (估)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate payoutDate;
@Schema(description = "出账年月 (估)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String payoutDate;
/**
* 出账日 (实)
*/
@Schema(description = "出账日 (实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate actualPayoutDate;
@Schema(description = "出账年月 (实)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String actualPayoutDate;
/**
* 港币出账金额
*/
@Schema(description = "港币出账金额")
private BigDecimal hkdAmount;
@Schema(description = "关联保单号")
private String policyNo;
/**
* 出账状态
*/
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
private String status;
// @Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
// private String status;
/**
* 出账状态-修改理由
*/
@Schema(description = "出账状态-修改理由")
private String statusDesc;
// @Schema(description = "出账状态-修改理由")
// private String statusDesc;
/**
* 出账项目
*/
@Schema(description = "出账项目")
@Schema(description = "出账项目", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneName;
/**
* 出账项目类型
*/
@Schema(description = "出账项目类型 字典值:csf_fortune_type")
@Schema(description = "出账项目类型 字典值:csf_fortune_type", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneType;
/**
* 出账期数
*/
@Schema(description = "出账期数")
@Schema(description = "出账期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortunePeriod;
/**
* 出账总期数
*/
@Schema(description = "出账总期数")
@Schema(description = "出账总期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortuneTotalPeriod;
/**
* 币种
*/
@Schema(description = "币种")
private String currency;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
@Schema(description = "转介人名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String broker;
/**
* 转介人业务ID
*/
@Schema(description = "broker biz id")
@Schema(description = "broker biz id", requiredMode = Schema.RequiredMode.REQUIRED)
private String brokerBizId;
/**
* 备注
*/
@Schema(description = "所属团队")
private String team;
@Schema(description = "所属团队业务ID")
private String teamBizId;
@Schema(description = "保单币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal ruleAmount;
@Schema(description = "保单币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String ruleCurrency;
@Schema(description = "保单币种→港币汇率(默认保单币种汇率)", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal defaultExchangeRate;
@Schema(description = "原币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String originalCurrency;
@Schema(description = "原币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalAmount;
@Schema(description = "原币种→港币汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalToHkdRate;
@Schema(description = "发放币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String payoutCurrency;
@Schema(description = "发放币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal payoutAmount;
@Schema(description = "港币→发放币种汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdToPayoutRate;
@Schema(description = "港币金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdAmount;
@Schema(description = "备注")
private String remark;
}
......@@ -42,4 +42,9 @@ public class ApiSalarySplitSummaryPageRequest extends PageDto {
* 出账机构
*/
private String billOrg;
/**
* 出账业务编号
*/
private String businessNo;
}
......@@ -132,9 +132,9 @@ public class ApiExpectedFortunePageResponse {
private String fortuneType;
/**
* 转介人介绍费占比
* 持有比例
*/
@Schema(description = "转介人介绍费占比")
@Schema(description = "持有比例")
private String brokerRatio;
......@@ -152,22 +152,55 @@ public class ApiExpectedFortunePageResponse {
private String ruleCurrency;
/**
* 出账币种名称
* 预计出账-默认保单币种汇率(保单币种 -> 港币汇率)
*/
@Schema(description = "出账币种名称")
private String currencyName;
@Schema(description = "预计出账-默认保单币种汇率(保单币种 -> 港币汇率)")
private BigDecimal defaultExchangeRate;
/**
* 预计出账-HKD应出账金额
*/
@Schema(description = "预计出账-HKD应出账金额")
private BigDecimal hkdAmount;
// ========== 原币种及金额 ==========
@Schema(description = "原币种")
private String originalCurrency;
@Schema(description = "原币种金额")
private BigDecimal originalAmount;
@Schema(description = "原币→港币汇率")
private BigDecimal originalToHkdRate;
// ========== 发放币种及金额 ==========
@Schema(description = "发放币种")
private String payoutCurrency;
@Schema(description = "发放币种金额")
private BigDecimal payoutAmount;
@Schema(description = "港币→发放币汇率")
private BigDecimal hkdToPayoutRate;
/**
* 实际出账-本次出账金额(HKD)
*/
@Schema(description = "实际出账-本次出账金额(HKD)")
private BigDecimal currentPaymentHkdAmount;
/**
* 保单币种 -> 港币汇率
* 实际出账-本期结算汇率
*/
@Schema(description = "保单币种 -> 港币汇率")
@Schema(description = "实际出账-本期结算汇率")
private BigDecimal exchangeRate;
/**
* HKD应出账金额
* 出账币种名称
*/
@Schema(description = "HKD应出账金额")
private BigDecimal hkdAmount;
@Schema(description = "出账币种名称")
private String currencyName;
/**
* 出账状态
......@@ -196,51 +229,47 @@ public class ApiExpectedFortunePageResponse {
private LocalDate actualPayoutDate;
/**
* 已出账金额(HKD)
* 预计出账-已出账金额(HKD)
*/
@Schema(description = "已出账金额(HKD)")
@Schema(description = "预计出账-已出账金额(HKD)")
private BigDecimal paidAmount;
/**
* 待出账金额
* 预计出账-待出账金额
*/
@Schema(description = "待出账金额")
@Schema(description = "预计出账-待出账金额")
private BigDecimal unpaidAmount;
/**
* 已出账比例 已出账金额/应出账金额
* 预计出账-已出账金额比例 已出账金额/应出账金额
*/
@Schema(description = "已出账比例 已出账金额/应出账金额")
@Schema(description = "预计出账-已出账金额比例 已出账金额/应出账金额")
private BigDecimal paidRatio;
/**
* 待出账比例 待出账金额/应出账金额
* 预计出账-待出账比例 待出账金额/应出账金额
*/
@Schema(description = "待出账比例 待出账金额/应出账金额")
@Schema(description = "预计出账-待出账比例 待出账金额/应出账金额")
private BigDecimal unpaidRatio;
/**
* 基本法项目配置表唯一业务ID
*/
@Schema(description = "rule item biz id")
private String ruleItemBizId;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
/**
* 创建时间
* 创建
*/
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "创建")
private String creatorName;
/**
* 创建人名称
* 创建时间
*/
private String creatorName;
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
/**
* 更新时间(操作时间)
......
......@@ -247,8 +247,9 @@ public class PolicyReportPdfService {
// 第五行:年繳金額 | 金額值 | 保費徵費 | 費用值
addTableHeaderCellNoBorder(table, "年繳金額");
addTableCellNoBorder(table, formatAmount(data.getAnnualAmount()));
//保单征费
addTableHeaderCellNoBorder(table, "保費徵費");
addTableCellNoBorder(table, formatAmount(data.getPremiumFee()));
addTableCellNoBorder(table, formatAmount(data.getPolicyLevy()));
// 第六行:首期合計金額 | 金額值 | (空) | (空)
addTableHeaderCellNoBorder(table, "首期合計金額");
......
package com.yd.csf.service.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
@ConditionalOnClass(XxlJobSpringExecutor.class)
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses:http://139.224.145.34:8686/xxl-job-admin}")
private String adminAddresses;
@Value("${xxl.job.executor.appname:csf-executor}")
private String appname;
@Value("${xxl.job.executor.port:9999}")
private int port;
@Value("${xxl.job.accessToken:default_token}")
private String accessToken;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init. appname: {}, port: {}, accessToken: {}",
appname, port, StringUtils.isNotBlank(accessToken) ? "已配置" : "未配置");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port);
// 设置accessToken
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogRetentionDays(30);
return xxlJobSpringExecutor;
}
}
\ No newline at end of file
//package com.yd.csf.service.config;
//
//import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//@Slf4j
//@Configuration
//@ConditionalOnClass(XxlJobSpringExecutor.class)
//public class XxlJobConfig {
//
// @Value("${xxl.job.admin.addresses:http://139.224.145.34:8686/xxl-job-admin}")
// private String adminAddresses;
//
// @Value("${xxl.job.executor.appname:csf-executor}")
// private String appname;
//
// @Value("${xxl.job.executor.port:9999}")
// private int port;
//
// @Value("${xxl.job.accessToken:default_token}")
// private String accessToken;
//
// @Bean
// public XxlJobSpringExecutor xxlJobExecutor() {
// log.info(">>>>>>>>>>> xxl-job config init. appname: {}, port: {}, accessToken: {}",
// appname, port, StringUtils.isNotBlank(accessToken) ? "已配置" : "未配置");
//
// XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
// xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
// xxlJobSpringExecutor.setAppname(appname);
// xxlJobSpringExecutor.setPort(port);
// // 设置accessToken
// xxlJobSpringExecutor.setAccessToken(accessToken);
// xxlJobSpringExecutor.setLogRetentionDays(30);
//
// return xxlJobSpringExecutor;
// }
//}
\ No newline at end of file
......@@ -20,7 +20,7 @@ public interface PolicyFollowMapper extends BaseMapper<PolicyFollow> {
List<String> queryPolicyNoList(
@Param("policyHolderSc") String policyHolderSc,
@Param("policyHolderEnLc") String policyHolderEnLc,
@Param("signer") String signer,
@Param("signerSc") String signerSc,
@Param("brokerName") String brokerName,
@Param("insuredSc") String insuredSc,
@Param("insuredEnLc") String insuredEnLc
......
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;
}
......@@ -81,11 +81,10 @@ public class CommissionAddRequest implements Serializable {
private BigDecimal exchangeRate;
/**
* 入账(实)
* 入账年月(实)
*/
@Schema(description = "入账日(实)", requiredMode = Schema.RequiredMode.REQUIRED, format = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDate;
@Schema(description = "入账年月(实)", requiredMode = Schema.RequiredMode.REQUIRED, format = "yyyy-MM")
private String commissionDate;
/**
* 备注
......@@ -93,5 +92,10 @@ public class CommissionAddRequest implements Serializable {
@Schema(description = "备注")
private String remark;
/**
* 人工备注
*/
private String manualRemark;
private static final long serialVersionUID = 1L;
}
......@@ -102,16 +102,16 @@ public class CommissionExpectedAddDto {
/**
* 入账日 (估)
*/
@Schema(description = "入账日 (估) format:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Schema(description = "入账日 (估) format:yyyy-MM")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private Date commissionDate;
/**
* 入账日 (实)
*/
@Schema(description = "入账日 (实) format:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date actualCommissionDate;
// /**
// * 入账日 (实)
// */
// @Schema(description = "入账日 (实) format:yyyy-MM-dd")
// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
// private Date actualCommissionDate;
/**
* 入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效
......@@ -120,8 +120,8 @@ public class CommissionExpectedAddDto {
private String status;
/**
* 备注
* 人工备注
*/
@Schema(description = "备注")
private String remark;
@Schema(description = "人工备注")
private String manualRemark;
}
......@@ -105,4 +105,6 @@ public class CommissionExpectedQueryRequest extends PageDto {
private List<String> policyNoList;
private Boolean queryFlag;
}
package com.yd.csf.service.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
......@@ -112,13 +113,13 @@ public class CommissionExpectedUpdateRequest implements Serializable {
* 入账日期
*/
@Schema(description = "入账日期 format:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private Date commissionDate;
/**
* 备注
* 人工备注
*/
@Schema(description = "备注")
private String remark;
private String manualRemark;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -92,11 +92,10 @@ public class CommissionUpdateRequest implements Serializable {
private BigDecimal exchangeRate;
/**
* 入账日期
* 入账年月 yyyy-MM
*/
@Schema(description = "入账日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDate;
@Schema(description = "入账年月 yyyy-MM")
private String commissionDate;
/**
* 备注
......@@ -104,5 +103,10 @@ public class CommissionUpdateRequest implements Serializable {
@Schema(description = "备注")
private String remark;
/**
* 人工备注
*/
private String manualRemark;
private static final long serialVersionUID = 1L;
}
package com.yd.csf.service.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
......@@ -143,10 +144,16 @@ public class FortuneAddRequest implements Serializable {
private BigDecimal hkdAmount;
/**
* 出账日期
* 出账年月(估)
*/
@Schema(description = "出账日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate payoutDate;
@Schema(description = "出账年月(估)", requiredMode = Schema.RequiredMode.REQUIRED)
private String payoutDate;
/**
* 出账年月(实)
*/
@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;
}
......@@ -60,18 +60,16 @@ public class FortuneQueryRequest extends PageDto implements Serializable {
private List<String> productLaunchBizIdList;
/**
* 出账(估)开始
* 出账年月(估)开始
*/
@Schema(description = "出账日(估)开始 格式:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate payoutDateStart;
@Schema(description = "出账年月(估)开始 格式:yyyy-MM")
private String payoutDateStart;
/**
* 出账(估)结束
* 出账年月(估)结束
*/
@Schema(description = "出账日(估)结束 格式:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate payoutDateEnd;
@Schema(description = "出账年月(估)结束 格式:yyyy-MM")
private String payoutDateEnd;
/**
* 检核年月
......
package com.yd.csf.service.enums;
import org.apache.commons.lang3.StringUtils;
/**
* 项目类型码枚举
* XS("销售佣金", "1")
* M1("一级管理奖", "2")
* M2("二级管理奖", "3")
* TJ("终身推荐奖", "4")
* FD("辅导奖", "5")
* OT("其他加扣款", "6")
* PA("协议约定金额", "7")
*/
public enum FortuneTypeEnum {
//项目类型枚举
XS("XS", "1"),
M1("M1", "2"),
M2("M2", "3"),
TJ("TJ", "4"),
FD("FD", "5"),
OT("OT", "6"),
PA("PA", "7"),
;
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
FortuneTypeEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
/**
* 根据业务值(itemValue)获取枚举实例
*
* @param itemValue 业务值,如 "2"
* @return 对应的枚举实例
*/
public static FortuneTypeEnum getByItemValue(String itemValue) {
if (StringUtils.isBlank(itemValue)) {
throw new IllegalArgumentException("itemValue is blank");
}
for (FortuneTypeEnum type : FortuneTypeEnum.values()) {
if (type.itemValue.equals(itemValue)) {
return type;
}
}
throw new IllegalArgumentException("No enum constant for itemValue: " + itemValue);
}
}
......@@ -147,6 +147,11 @@ public class Commission implements Serializable {
private String commissionExpectedBizId;
/**
* 人工备注
*/
private String manualRemark;
/**
* 通用备注
*/
private String remark;
......@@ -160,11 +165,19 @@ public class Commission implements Serializable {
/**
* 创建人ID
*/
@TableField(value = "creator_id", fill = FieldFill.INSERT)
private String creatorId;
/**
* 创建人名称
*/
@TableField(value = "creator_name", fill = FieldFill.INSERT)
private String creatorName;
/**
* 更新人ID
*/
@TableField(value = "updater_id", fill = FieldFill.INSERT_UPDATE)
private String updaterId;
/**
......
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 com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
......@@ -161,6 +158,11 @@ public class CommissionExpected implements Serializable {
private BigDecimal pendingRatio;
/**
* 人工备注
*/
private String manualRemark;
/**
* 通用备注
*/
private String remark;
......@@ -173,14 +175,28 @@ public class CommissionExpected implements Serializable {
/**
* 创建人ID
*/
@TableField(value = "creator_id", fill = FieldFill.INSERT)
private String creatorId;
/**
* 创建人名称
*/
@TableField(value = "creator_name", fill = FieldFill.INSERT)
private String creatorName;
/**
* 更新人ID
*/
@TableField(value = "updater_id", fill = FieldFill.INSERT_UPDATE)
private String updaterId;
/**
* 更新人名称
*/
@TableField(value = "updater_name", fill = FieldFill.INSERT_UPDATE)
private String updaterName;
/**
* 创建时间
*/
private Date createTime;
......
......@@ -75,6 +75,11 @@ public class PolicyFollow implements Serializable {
private String signer;
/**
* 签单人(简体)
*/
private String signerSc;
/**
* 签单人业务id
*/
private String signerBizId;
......@@ -265,6 +270,11 @@ public class PolicyFollow implements Serializable {
private String policyHolder;
/**
* 保單持有人(英文)
*/
private String policyHolderEn;
/**
* 受保人
*/
private String insured;
......
......@@ -7,6 +7,7 @@ import com.yd.csf.service.dto.CommissionExpectedAddRequest;
import com.yd.csf.service.dto.CommissionExpectedChangeStatusRequest;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import com.yd.csf.service.dto.CommissionExpectedUpdateRequest;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.model.Policy;
......@@ -88,4 +89,6 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
Boolean changeStatus(CommissionExpectedChangeStatusRequest commissionExpectedChangeStatusRequest);
CommissionExpected queryOne(String commissionExpectedBizId);
CommissionExpected queryOne(String policyNo, Integer commissionPeriod, String commissionType);
}
......@@ -69,4 +69,6 @@ public interface CommissionService extends IService<Commission> {
* @return 结算汇率
*/
BigDecimal queryCommissionExchangeRate(String policyNo, Integer commissionPeriod);
}
......@@ -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);
}
......@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.PayableReportVO;
import java.time.LocalDate;
import java.util.List;
/**
......@@ -39,7 +40,8 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
/**
* 应付款报表 - 按保单号和期数维度统计(分页)
* @param page 分页参数
*
* @param page 分页参数
* @param expectedFortuneIds 预计发佣ID列表
* @return 应付款报表VO分页列表
*/
......@@ -52,16 +54,20 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
Integer getPayableNoCurrentSeq();
/**
* 生成应付款编号(序号递增) 格式:发佣类型-CSF+年份+序号
* @param fortuneType 发佣类型
* 生成应付款编号 格式:发佣类型-保单号后6位-流水号
*
* @param fortuneType 应付款类型
* @param policyNo 保单号
* @param expectedFortuneId 预计发佣ID
* @return 应付款编号
*/
String getPayableNo(String fortuneType);
String getPayableNo(String fortuneType, String policyNo, long expectedFortuneId);
/**
* 查询预计发佣和实际发佣的分页列表(手动分页)
* @param pageNo 页码(从 1 开始)
* @param pageSize 每页大小
*
* @param pageNo 页码(从 1 开始)
* @param pageSize 每页大小
* @param queryWrapper 查询条件
* @return 分页结果
*/
......@@ -69,6 +75,7 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
/**
* 查询预计发佣和实际发佣的统计数据(使用 SQL 聚合)
*
* @param queryWrapper 查询条件
* @return 统计信息
*/
......
......@@ -4,8 +4,10 @@ import com.yd.csf.service.dto.QueryPolicyBrokerDto;
import com.yd.csf.service.model.PolicyBroker;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Zhang Jianan
......@@ -22,6 +24,7 @@ public interface PolicyBrokerService extends IService<PolicyBroker> {
List<String> selectRelatedBrokerBizIds(String clientUserId);
Map<String, PolicyBroker> queryPolicyBrokerMap(Collection<String> policyNoSet);
Map<String, String> queryInternalCodeMap(List<String> brokerBizIdList);
}
......@@ -12,6 +12,7 @@ import com.yd.csf.service.vo.PolicyFollowDetailVO;
import com.yd.csf.service.vo.PolicyFollowVO;
import com.yd.csf.service.vo.PolicyNumberResponseVO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
......@@ -182,6 +183,8 @@ public interface PolicyFollowService extends IService<PolicyFollow> {
*/
Boolean updatePolicySecondHolder(PolicySecondHolderUpdateRequest policySecondHolderUpdateRequest);
Map<String, PolicyFollow> queryPolicyFollowMap(Collection<?> policyNoSet);
Result<ApiPolicyFollowDetailResponse> detail(String policyNo);
List<String> queryPolicyNoList(String policyHolder,String signer,String brokerName,String insured);
......
......@@ -4,6 +4,9 @@ import com.yd.csf.service.dto.PolicyPolicyholderUpdateRequest;
import com.yd.csf.service.model.PolicyPolicyholder;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.Map;
import java.util.List;
/**
......@@ -22,6 +25,8 @@ public interface PolicyPolicyholderService extends IService<PolicyPolicyholder>
PolicyPolicyholder queryOne(String policyBizId);
Map<String, PolicyPolicyholder> queryPolicyholderMap(Collection<?> policyNoList);
List<PolicyPolicyholder> queryList(String policyHolder);
boolean updateName(String policyBizId,String name);
......
......@@ -10,6 +10,7 @@ import com.yd.csf.service.vo.PolicyVO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Zhang Jianan
......@@ -33,4 +34,6 @@ public interface PolicyService extends IService<Policy> {
List<PolicyProductInfo> getPolicyProductInfo(List<String> productLaunchBizIdList);
Map<String, PolicyProductInfo> getPolicyProductInfoMap(Collection<String> productLaunchBizIdList);
Map<String, Policy> queryPolicyMap(Collection<String> policyNoList);
}
......@@ -92,6 +92,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
private ApiInsuranceReconciliationCompanyFeignClient companyFeignClient;
@Resource
private CustomerService customerService;
@Resource
private CommissionExpectedService commissionExpectedService;
// 用于对象转换的ObjectMapper
private static final ObjectMapper objectMapper = new ObjectMapper();
......@@ -255,6 +257,16 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
vo.setCommissionDate(null);
//本次入账比例
vo.setRevenueRatio(null);
vo.setRemark(expected.getRemark());
vo.setManualRemark(expected.getManualRemark());
vo.setStatusDesc(expected.getStatusDesc());
vo.setCommissionExpectedBizId(expected.getCommissionExpectedBizId());
vo.setCommissionExpectedDate(expected.getCommissionDate());
vo.setCurrency(expected.getCurrency());
vo.setCommissionType(expected.getCommissionType());
vo.setAmount(expected.getAmount());
vo.setRealUpdaterName(expected.getUpdaterName());
vo.setRealUpdateTime(expected.getUpdateTime());
// 填充保单信息
Policy policy = policyMap.get(expected.getPolicyNo());
......@@ -268,6 +280,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (policyFollow != null) {
vo.setProductName(policyFollow.getProductName());
// vo.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
vo.setIssueNumber(policyFollow.getIssueNumber() != null ? Integer.parseInt(policyFollow.getIssueNumber().toString()) : null);
}
// 累积数据
......@@ -277,7 +290,6 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
// vo.setPaidAmount(paidAmount);
vo.setRealAmount(paidAmount); // 实收金额(累积)
vo.setExpectedAmount(expected.getExpectedAmount());
vo.setIssueNumber(policyFollow.getIssueNumber() != null ? Integer.parseInt(policyFollow.getIssueNumber().toString()) : null);
// 产品来佣率
BigDecimal commissionRatio = expected.getCommissionRatio();
......@@ -304,17 +316,19 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
} else {
vo.setRealRate(BigDecimal.ZERO);
vo.setGapRate(BigDecimal.ZERO);
// 当产品来佣率为零或 null 时,总入账比例无意义,设置为 0
vo.setTotalRevenueRatio(BigDecimal.ZERO);
if ("U".equals(expected.getCommissionBizType())) {
//应收款类型 R=关联保单应收单 totalRevenueRatio取值paidRatio
vo.setTotalRevenueRatio(new BigDecimal("100.00"));
}else {
vo.setTotalRevenueRatio(BigDecimal.ZERO);
}
}
// 待入账金额
// 待入账金额归零 = 已入账来佣比例(实佣率)>= 产品来佣率
if (commissionRatio != null && paidRatio.compareTo(commissionRatio) >= 0) {
vo.setPendingAmount(BigDecimal.ZERO);
// vo.setPendingRatio(BigDecimal.ZERO);
} else if (commissionRatio != null) {
// vo.setPendingRatio(commissionRatio.subtract(paidRatio));
if (expected.getExpectedAmount() != null) {
//待入账金额 = 预计来佣金额 - 已入账来佣金额
vo.setPendingAmount(expected.getExpectedAmount().subtract(paidAmount));
......@@ -350,12 +364,17 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
commission.getReconciliationYearMonth().replace("-", "") : "");
// vo.setRealCommissionDate(commission.getCommissionDate());
vo.setRealExchangeRate(commission.getExchangeRate());
vo.setRealAmount(commission.getAmount());
vo.setRealAmount(commission.getHkdAmount());
vo.setRealCurrentCommissionRatio(commission.getCurrentCommissionRatio());
vo.setRealUpdateTime(commission.getUpdateTime());
vo.setRealUpdaterName(commission.getUpdaterName());
vo.setRealRemark(commission.getRemark());
vo.setCommissionDate(commission.getCommissionDate());
vo.setCommissionBizId(commission.getCommissionBizId());
vo.setRemark(commission.getRemark());
vo.setManualRemark(commission.getManualRemark());
vo.setStatusDesc(commission.getStatusDesc());
vo.setRealUpdateTime(commission.getUpdateTime());
vo.setRealUpdaterName(commission.getUpdaterName());
// 覆盖公共业务字段
// vo.setAmount(commission.getAmount());
......@@ -402,7 +421,11 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
: gap.multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
vo.setGapRate(gapRate);
} else {
vo.setRevenueRatio(BigDecimal.ZERO);
if ("U".equals(commission.getCommissionBizType())) {
vo.setRevenueRatio(new BigDecimal("100.00"));
}else {
vo.setRevenueRatio(BigDecimal.ZERO);
}
vo.setGapRate(BigDecimal.ZERO);
}
......@@ -629,7 +652,15 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
queryWrapper.eq(ObjectUtils.isNotEmpty(productLaunchBizId), "product_launch_biz_id", productLaunchBizId);
queryWrapper.eq(ObjectUtils.isNotEmpty(commissionBizType), "commission_biz_type", commissionBizType);
queryWrapper.in(ObjectUtils.isNotEmpty(statusList), "status", statusList);
queryWrapper.in(CollectionUtils.isNotEmpty(commissionExpectedQueryRequest.getPolicyNoList()),"policy_no",commissionExpectedQueryRequest.getPolicyNoList());
if (CollectionUtils.isNotEmpty(commissionExpectedQueryRequest.getPolicyNoList())) {
queryWrapper.in(CollectionUtils.isNotEmpty(commissionExpectedQueryRequest.getPolicyNoList()),"policy_no",commissionExpectedQueryRequest.getPolicyNoList());
}else {
if (commissionExpectedQueryRequest.getQueryFlag() != null && commissionExpectedQueryRequest.getQueryFlag()) {
//查询不到数据
queryWrapper.apply("1=0");
}
}
// 范围查询
queryWrapper.ge(ObjectUtils.isNotEmpty(commissionDateStart), "commission_date", commissionDateStart);
queryWrapper.le(ObjectUtils.isNotEmpty(commissionDateEnd), "commission_date", commissionDateEnd);
......@@ -638,6 +669,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
queryWrapper.apply("EXISTS (SELECT 1 FROM policy_broker pb WHERE pb.policy_no = commission_expected.policy_no AND pb.team_biz_id = {0})",
teamBizId);
}
// 默认排序规则
queryWrapper.orderByDesc("commission_date");
// 排序字段
......@@ -707,6 +739,12 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
// 预计总金额
if ("R".equals(addDto.getCommissionBizType())) {
//校验同一个保单且同一个期数且同一个项目的数据是否存在,如果存在不允许添加
CommissionExpected expected = commissionExpectedService.queryOne(addDto.getPolicyNo(),addDto.getCommissionPeriod(),addDto.getCommissionType());
if (expected != null) {
throw new BusinessException("同一个保单且同一个期数且同一个项目的预计来佣数据已存在,不能重复新增");
}
Policy policy = policyMap.get(addDto.getPolicyNo());
if (ObjectUtils.isEmpty(policy)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单号为" + addDto.getPolicyNo() + "的保单不存在");
......@@ -730,9 +768,9 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
commissionExpected.setProductLaunchBizId(policy.getProductLaunchBizId());
commissionExpected.setPremium(policy.getPaymentPremium());
} else {
BigDecimal expectedAmount = addDto.getAmount()
.multiply(addDto.getExchangeRate());
commissionExpected.setExpectedAmount(expectedAmount);
// BigDecimal expectedAmount = addDto.getAmount()
// .multiply(addDto.getExchangeRate());
commissionExpected.setExpectedAmount(addDto.getAmount());
}
if (StringUtils.isBlank(addDto.getCommissionExpectedBizId())) {
......@@ -782,9 +820,9 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (StringUtils.isBlank(request.getCurrency())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "入账币种不能为空");
}
if (request.getExchangeRate() == null) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "结算汇率不能为空");
}
// if (request.getExchangeRate() == null) {
// throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "结算汇率不能为空");
// }
if ("R".equals(request.getCommissionBizType())) {
if (request.getCommissionRatio() == null) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "关联保单应收单,佣金比例不能为空");
......@@ -839,6 +877,18 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP)
);
commissionExpected.setPremium(policy.getPaymentPremium());
//已入账比例
BigDecimal paidRatio = ObjectUtils.defaultIfNull(commissionExpected.getPaidRatio(), BigDecimal.ZERO);
//预计入账比例(保单产品来佣金率)
BigDecimal commissionRatio = ObjectUtils.defaultIfNull(commissionExpected.getCommissionRatio(), BigDecimal.ZERO);
//已入账比例 >= 预计入账比例 -> 入账状态置为完成入账。否则部分入账
if (paidRatio.compareTo(commissionRatio) >= 0) {
//完成入账
commissionExpected.setStatus("1");
}else {
//部分入账
commissionExpected.setStatus("2");
}
} else {
commissionExpected.setExpectedAmount(
commissionExpectedUpdateRequest.getAmount()
......@@ -1495,6 +1545,19 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
);
}
@Override
public CommissionExpected queryOne(String policyNo,
Integer commissionPeriod,
String commissionType) {
return this.baseMapper.selectOne(new LambdaQueryWrapper<CommissionExpected>()
.eq(CommissionExpected::getPolicyNo,policyNo)
.eq(CommissionExpected::getCommissionPeriod,commissionPeriod)
.eq(CommissionExpected::getCommissionType,commissionType)
.last(" limit 1 ")
);
}
private Policy convertPolicy(PolicyFollow policyFollow,String effectiveDate,String coolingOffEndDate) {
Policy policy = new Policy();
BeanUtil.copyProperties(policyFollow, policy);
......
......@@ -31,7 +31,6 @@ import com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsu
import com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
......@@ -84,6 +83,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
private ApiExchangeRateFeignClient apiExchangeRateFeignClient;
@Resource
private ApiInsuranceReconciliationCompanyFeignClient apiInsuranceReconciliationCompanyFeignClient;
@Resource
private PolicyPolicyholderService policyPolicyholderService;
@Override
......@@ -155,6 +156,12 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
.list();
Map<String, CommissionExpected> commissionExpectedMap = commissionExpectedList.stream().collect(Collectors.toMap(CommissionExpected::getCommissionExpectedBizId, a -> a, (oldValue, newValue) -> newValue));
// 3.关联查询投保人名称
Map<String, PolicyFollow> policyFollowMap = policyFollowService.queryPolicyFollowMap(policyNoSet);
// 4.关联查询转介人
Map<String, PolicyBroker> policyBrokerMap = policyBrokerService.queryPolicyBrokerMap(policyNoSet);
// 填充信息
List<CommissionVO> commissionVOList = commissionList.stream().map(commission -> {
CommissionVO commissionVO = CommissionVO.objToVo(commission);
......@@ -168,12 +175,24 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
CommissionExpected commissionExpected = commissionExpectedMap.get(commission.getCommissionExpectedBizId());
if (commissionExpected != null) {
// 填充应收账款编号、预计入账状态
// 填充应收账款编号、预计入账状态、保单本期来佣率
commissionVO.setReceivableNo(commissionExpected.getReceivableNo());
commissionVO.setPaidRatio(commissionExpected.getPaidRatio());
commissionVO.setPendingRatio(commissionExpected.getPendingRatio());
commissionVO.setStatusDesc(commissionExpected.getStatusDesc());
commissionVO.setCommissionExpectedStatus(commissionExpected.getStatus());
commissionVO.setCommissionRatio(commissionExpected.getCommissionRatio());
}
PolicyFollow policyFollow = policyFollowMap.get(commission.getPolicyNo());
if (policyFollow != null) {
// 填充投保人名称
commissionVO.setPolicyHolder(policyFollow.getPolicyHolder());
commissionVO.setPolicyHolderEn(policyFollow.getPolicyHolderEn());
}
PolicyBroker policyBroker = policyBrokerMap.get(commission.getPolicyNo());
if (policyBroker != null) {
// 填充转介人名称
commissionVO.setBroker(policyBroker.getBrokerName());
}
return commissionVO;
}).collect(Collectors.toList());
......@@ -386,6 +405,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (!Objects.equals(commission.getPolicyNo(), commissionUpdateRequest.getPolicyNo())) {
throw new BusinessException("当前保单号不匹配");
}
String remark = commission.getRemark();
Policy policy = null;
if (StringUtils.isNotBlank(commissionUpdateRequest.getPolicyNo())) {
policy = policyService.lambdaQuery().eq(Policy::getPolicyNo, commission.getPolicyNo()).one();
......@@ -413,6 +433,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
// 计算来佣金额(港币)
commission.setHkdAmount(calculateHKDAmount(requestAmount, commissionUpdateRequest.getCurrency()));
commission.setManualRemark(commissionUpdateRequest.getManualRemark());
commission.setRemark(remark);
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
......@@ -422,6 +445,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
// 更新属性
BeanUtils.copyProperties(commissionUpdateRequest, commission, "commissionBizId");
// 入账年月
commission.setCommissionDate(DateUtil.parse(commissionUpdateRequest.getCommissionDate() + "-01"));
if ("U".equals(commissionUpdateRequest.getCommissionBizType())) {
commission.setPolicyNo(null);
}
......@@ -505,9 +530,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (ObjectUtils.isEmpty(commissionUpdateRequest.getCurrency())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "入账币种不能为空");
}
if (ObjectUtils.isEmpty(commissionUpdateRequest.getExchangeRate())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "结算汇率不能为空");
}
// if (ObjectUtils.isEmpty(commissionUpdateRequest.getExchangeRate())) {
// throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "结算汇率不能为空");
// }
}
......@@ -548,10 +573,10 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
CommissionEditRecord commissionRecord = getCommissionEditRecord("结算汇率", commission.getExchangeRate(), commissionUpdateRequest.getExchangeRate(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
String commissionDate = DateUtil.formatDate(commission.getCommissionDate());
String requestCommissionDate = DateUtil.formatDate(commissionUpdateRequest.getCommissionDate());
String commissionDate = DateUtil.format(commission.getCommissionDate(), "yyyy-MM");
String requestCommissionDate = commissionUpdateRequest.getCommissionDate();
if (!Objects.equals(commissionDate, requestCommissionDate)) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("来佣日期", commissionDate, requestCommissionDate, commission.getCommissionBizId(), currentLoginUser);
CommissionEditRecord commissionRecord = getCommissionEditRecord("来佣年月", commissionDate, requestCommissionDate, commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getRemark(), commissionUpdateRequest.getRemark())) {
......@@ -647,8 +672,11 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
}
// 3. 构建实际的初始发佣记录
List<Fortune> newFortuneList = buildNewFortunes(filteredExpectedFortuneList2, commissions);
// 2.4 根据保单号、期数查询入账检核汇率
Map<String, BigDecimal> exchangeRateMap = this.queryCommissionExchangeRateMap(policyNoSet, commissionPeriodSet);
// 3. 构建实际的初始发佣记录(使用入账检核汇率)
List<Fortune> newFortuneList = buildNewFortunes(filteredExpectedFortuneList2, commissions, exchangeRateMap);
// 4. 保存发佣记录
saveNewFortunes(newFortuneList);
......@@ -656,6 +684,42 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return true;
}
private Map<String, BigDecimal> queryCommissionExchangeRateMap(Set<String> policyNoSet, Set<Integer> commissionPeriodSet) {
if (CollectionUtils.isEmpty(policyNoSet) || CollectionUtils.isEmpty(commissionPeriodSet)) {
return new HashMap<>();
}
// 1. 查询所有符合条件的记录,按入账日期降序排序
List<Commission> commissionExchangeRateList = this.lambdaQuery()
.in(Commission::getPolicyNo, policyNoSet)
.in(Commission::getCommissionPeriod, commissionPeriodSet)
.select(Commission::getPolicyNo, Commission::getCommissionPeriod, Commission::getExchangeRate, Commission::getCommissionDate)
.orderByDesc(Commission::getCommissionDate)
.list();
// 2. 按 policyNo + commissionPeriod 分组,取每组的第一条(最新的)
Map<String, BigDecimal> exchangeRateMap = commissionExchangeRateList.stream()
.collect(Collectors.groupingBy(
commission -> buildPolicyPeriodKey(commission.getPolicyNo(), commission.getCommissionPeriod())
))
.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().get(0).getExchangeRate()
));
// 3. 确保所有 policyNo + commissionPeriod 组合都在 Map 中,没有记录的设为 null
Map<String, BigDecimal> result = new HashMap<>();
for (String policyNo : policyNoSet) {
for (Integer commissionPeriod : commissionPeriodSet) {
String key = buildPolicyPeriodKey(policyNo, commissionPeriod);
result.put(key, exchangeRateMap.getOrDefault(key, null));
}
}
return result;
}
/**
* 保存新的发佣记录
*/
......@@ -674,7 +738,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
* 构建新的发佣记录
*/
private List<Fortune> buildNewFortunes(List<ExpectedFortune> expectedFortuneList,
List<Commission> commissionList) {
List<Commission> commissionList,
Map<String, BigDecimal> exchangeRateMap) {
if (CollectionUtils.isEmpty(expectedFortuneList)) {
return new ArrayList<>();
}
......@@ -686,40 +751,90 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
(oldValue, newValue) -> newValue // 遇到重复时使用新值
));
// 当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
Date now = new Date();
return expectedFortuneList.stream()
.map(expectedFortune -> {
Fortune fortune = new Fortune();
BeanUtils.copyProperties(expectedFortune, fortune);
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setId(null);
fortune.setFortuneBizType("R");
fortune.setExchangeRate(expectedFortune.getDefaultExchangeRate());
fortune.setCurrentPaymentAmount(expectedFortune.getOriginalAmount());
fortune.setCurrentPaymentHkdAmount(expectedFortune.getHkdAmount());
fortune.setExpectedFortuneBizId(expectedFortune.getExpectedFortuneBizId());
fortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
fortune.setIsPart(0);
// 关联来佣业务ID
String key = buildPolicyPeriodKey(expectedFortune.getPolicyNo(), expectedFortune.getFortunePeriod());
Commission matchedCommission = commissionByPolicyPeriod.get(key);
if (matchedCommission != null) {
fortune.setCommissionBizId(matchedCommission.getCommissionBizId());
fortune.setCommissionExpectedBizId(matchedCommission.getCommissionExpectedBizId());
} else {
fortune.setStatus(FortuneStatusEnum.MATCH_FAIL.getItemValue());
fortune.setRemark("未找到当前预计发佣对应的来佣");
}
fortune.setCreateTime(now);
fortune.setUpdateTime(now);
// 创建新的发佣记录
List<Fortune> newFortuneList = new ArrayList<>();
// 更新预计发佣记录的港币金额
List<ExpectedFortune> updatedExpectedFortuneList = new ArrayList<>();
for (ExpectedFortune expectedFortune : expectedFortuneList) {
Fortune fortune = new Fortune();
BeanUtils.copyProperties(expectedFortune, fortune);
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setId(null);
fortune.setFortuneBizType("R");
// 优先使用入账检核汇率,如果没有则使用默认汇率
String key = buildPolicyPeriodKey(expectedFortune.getPolicyNo(), expectedFortune.getFortunePeriod());
BigDecimal exchangeRate = exchangeRateMap.get(key);
if (exchangeRate != null) {
fortune.setExchangeRate(exchangeRate);
fortune.setOriginalToHkdRate(exchangeRate);
// 重新计算港币金额
BigDecimal hkdAmount = fortune.getRuleAmount().multiply(exchangeRate);
fortune.setHkdAmount(hkdAmount);
fortune.setCurrentPaymentAmount(hkdAmount);
fortune.setCurrentPaymentHkdAmount(hkdAmount);
// 默认发放币种、汇率、发放币种金额
fortune.setPayoutCurrency("HKD");
fortune.setHkdToPayoutRate(BigDecimal.ONE);
fortune.setPayoutAmount(hkdAmount);
// 更新预计发佣记录的港币金额
ExpectedFortune update = new ExpectedFortune();
update.setId(expectedFortune.getId());
update.setDefaultExchangeRate(exchangeRate);
update.setOriginalToHkdRate(exchangeRate);
update.setHkdAmount(hkdAmount);
update.setUnpaidAmount(hkdAmount);
update.setPayoutCurrency("HKD");
update.setHkdToPayoutRate(BigDecimal.ONE);
update.setPayoutAmount(hkdAmount);
updatedExpectedFortuneList.add(update);
} else {
fortune.setExchangeRate(expectedFortune.getDefaultExchangeRate());
fortune.setCurrentPaymentAmount(expectedFortune.getOriginalAmount());
fortune.setCurrentPaymentHkdAmount(expectedFortune.getHkdAmount());
}
fortune.setExpectedFortuneBizId(expectedFortune.getExpectedFortuneBizId());
fortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
fortune.setIsPart(0);
return fortune;
})
.collect(Collectors.toList());
// 关联来佣业务ID
Commission matchedCommission = commissionByPolicyPeriod.get(key);
if (matchedCommission != null) {
fortune.setCommissionBizId(matchedCommission.getCommissionBizId());
fortune.setCommissionExpectedBizId(matchedCommission.getCommissionExpectedBizId());
} else {
fortune.setStatus(FortuneStatusEnum.MATCH_FAIL.getItemValue());
fortune.setRemark("未找到当前预计发佣对应的来佣");
}
fortune.setCreateTime(now);
fortune.setUpdateTime(now);
fortune.setReconciliationOperator("系统生成");
fortune.setCreatorId(loginUserId);
fortune.setUpdaterId(loginUserId);
newFortuneList.add(fortune);
}
// 更新预计发佣记录
if (CollectionUtils.isNotEmpty(updatedExpectedFortuneList)) {
boolean updateSuccess = iExpectedFortuneService.updateBatchById(updatedExpectedFortuneList);
if (!updateSuccess) {
throw new BusinessException(ResultCode.FAIL.getCode(), "更新预计发佣记录港币金额失败");
}
}
return newFortuneList;
}
/**
......@@ -742,7 +857,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
/**
* 构建保单号+期的唯一键
* 构建保单号+期的唯一键
*/
@Override
public String buildPolicyPeriodKey(String policyNo, Object period) {
......@@ -839,7 +954,10 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
for (CommissionAddRequest request : customerAddRequestList) {
Commission commission = new Commission();
BeanUtils.copyProperties(request, commission);
commission.setManualRemark(request.getManualRemark());
// 入账年月
commission.setCommissionDate(DateUtil.parse(request.getCommissionDate() + "-01"));
// 计算来佣金额(港币)
commission.setHkdAmount(calculateHKDAmount(request.getAmount(), request.getCurrency()));
// 入账业务id
......@@ -964,9 +1082,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (ObjectUtils.isEmpty(request.getAmount())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "入账金额不能为空");
}
if (ObjectUtils.isEmpty(request.getExchangeRate())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "结算汇率不能为空");
}
// if (ObjectUtils.isEmpty(request.getExchangeRate())) {
// throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "结算汇率不能为空");
// }
if ("R".equals(request.getCommissionBizType())) {
// 校验保单号是否存在
if (ObjectUtils.isEmpty(request.getExchangeRate())) {
......@@ -986,7 +1104,12 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (commission == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "来佣记录不存在");
}
if (StringUtils.isNotBlank(commission.getCommissionExpectedBizId())) {
CommissionExpected commissionExpected = commissionExpectedService.queryOne(commission.getCommissionExpectedBizId());
if (commissionExpected != null) {
throw new BusinessException("已经同步过了,无需再次同步");
}
}
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
......@@ -994,7 +1117,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
CommissionExpected expected = new CommissionExpected();
BeanUtils.copyProperties(commission, expected, "id", "remark");
expected.setCommissionExpectedBizId(RandomStringGenerator.generateBizId16("commission_expected"));
expected.setPremium(new BigDecimal(commission.getPremium()));
expected.setPremium(commission.getPremium() != null ? new BigDecimal(commission.getPremium()) : BigDecimal.ZERO);
// 生成应收单编号
expected.setReceivableNo(receivableService.generateReceivableNo(
......@@ -1010,7 +1133,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
expected.setCommissionDate(commission.getCommissionDate());
expected.setStatus(CommissionExpectedStatusEnum.COMPARED.getItemValue());
expected.setStatusDesc("比对成功,通过手动同步预计来佣"); // 设置状态描述为比对成功
expected.setRemark(null);
expected.setRemark(expected.getStatusDesc());
expected.setCreatorId(loginUserId);
expected.setCreateTime(new Date());
......@@ -1124,6 +1247,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return commissionRecord.getExchangeRate();
}
/**
* 查询列表
*
......
......@@ -74,7 +74,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(name);
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(name);
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(name);
queryWrapper.like(StringUtils.isNotBlank(nameSc), "name_sc", nameSc)
.or().like(StringUtils.isNotBlank(nameEnLc), "name_en_lc", nameEnLc);
......@@ -150,7 +150,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(customerAddRequest.getNameCn());
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(customerAddRequest.getNamePyEn());
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(customerAddRequest.getNamePyEn());
customer.setNameSc(nameSc);
customer.setNameEnLc(nameEnLc);
......@@ -263,7 +263,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(customerUpdateRequest.getNameCn());
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(customerUpdateRequest.getNamePyEn());
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(customerUpdateRequest.getNamePyEn());
oldCustomer.setNameSc(nameSc);
oldCustomer.setNameEnLc(nameEnLc);
boolean result = customerService.updateById(oldCustomer);
......
......@@ -9,6 +9,7 @@ import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.service.dto.UserGradeDto;
import com.yd.csf.service.enums.CurrencyEnum;
import com.yd.csf.service.enums.FortuneTypeEnum;
import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.dao.ExpectedFortuneMapper;
import com.yd.csf.service.model.Policy;
......@@ -17,6 +18,7 @@ import com.yd.csf.service.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.PayableReportVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -36,6 +38,7 @@ import java.util.stream.Collectors;
* @since 2025-11-17
*/
@Service
@Slf4j
public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMapper, ExpectedFortune> implements IExpectedFortuneService {
@Resource
......@@ -90,38 +93,105 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
return expectedFortuneVOPage;
}
// 调整数据顺序、格式
processData(expectedFortuneList);
// 1. 转介人职级信息
List<String> brokerBizIds = expectedFortuneList.stream().map(ApiExpectedFortunePageResponse::getBrokerBizId).collect(Collectors.toList());
Map<String, UserGradeDto> userGradeMap = iAgentAccumulatedFycService.queryUserGradeMap(brokerBizIds);
// 2. 关联查询保单信息
// 2. 关联查询新单跟进信息
Set<String> policyNoList = expectedFortuneList.stream().map(ApiExpectedFortunePageResponse::getPolicyNo).collect(Collectors.toSet());
Map<String, PolicyFollow> policyFollowMap = policyFollowService.queryPolicyFollowMap(policyNoList);
for (ApiExpectedFortunePageResponse vo : expectedFortuneList) {
// 出账币种名称
vo.setCurrencyName("港币");
// String ratio = finalBrokerRatioMap.get(ef.getBrokerBizId());
// vo.setCommissionRatio(ratio);
// Policy policy = policyMap.get(vo.getPolicyNo());
// PolicyFollow follow = policyFollowMap.get(vo.getPolicyNo());
UserGradeDto userGradeDto = userGradeMap.get(vo.getBrokerBizId());
if (userGradeDto != null) {
vo.setBrokerGradeName(userGradeDto.getGradeName());
}
// if (policy != null) {
// vo.setInsuranceCompany(policy.getInsuranceCompany());
// }
// if (follow != null) {
// vo.setProductName(follow.getProductName());
// vo.setProductLaunchBizId(follow.getProductLaunchBizId());
// }
PolicyFollow policyFollow = policyFollowMap.get(vo.getPolicyNo());
if (policyFollow != null) {
vo.setInsuranceCompany(policyFollow.getInsuranceCompany());
vo.setProductName(policyFollow.getProductName());
}
}
// expectedFortuneVOPage.setRecords(voList);
expectedFortuneVOPage.setRecords(expectedFortuneList);
return expectedFortuneVOPage;
}
/**
* 调整数据顺序 预计在前,实际在后,按预计发佣月排序
*
* @param expectedFortuneList 预计发佣列表
*/
private void processData(List<ApiExpectedFortunePageResponse> expectedFortuneList) {
if (CollUtil.isEmpty(expectedFortuneList)) {
return;
}
log.info("顺序调整前: {}", expectedFortuneList.size());
// 1. 分组
Map<Integer, List<ApiExpectedFortunePageResponse>> groupMap = expectedFortuneList.stream()
.collect(Collectors.groupingBy(ApiExpectedFortunePageResponse::getType));
// 2. 获取预计发佣(type=1)和实际发佣(type=2)列表
List<ApiExpectedFortunePageResponse> expectedList = groupMap.getOrDefault(1, new ArrayList<>());
List<ApiExpectedFortunePageResponse> actualList = groupMap.getOrDefault(2, new ArrayList<>());
// 3. 将 actualList 转换为 Map
Map<String, List<ApiExpectedFortunePageResponse>> actualMap = actualList.stream()
.filter(item -> "R".equals(item.getFortuneBizType()))
.collect(Collectors.groupingBy(ApiExpectedFortunePageResponse::getExpectedFortuneBizId));
// 4. 调整数据顺序
List<ApiExpectedFortunePageResponse> sortedList = new ArrayList<>();
Set<String> matchedActualPayableNos = new HashSet<>();
for (ApiExpectedFortunePageResponse expected : expectedList) {
sortedList.add(expected);
// 查找对应的实际发佣
List<ApiExpectedFortunePageResponse> matchedList = actualMap.get(expected.getExpectedFortuneBizId());
if (CollUtil.isNotEmpty(matchedList)) {
// 设置实际出账记录的字段:待出账金额(估)、已出账比例、未出账比例、已出账金额
matchedList.forEach(actual -> {
actual.setUnpaidAmount(expected.getHkdAmount());
actual.setPaidRatio(expected.getPaidRatio());
actual.setUnpaidRatio(expected.getUnpaidRatio());
actual.setPaidAmount(expected.getPaidAmount());
});
sortedList.addAll(matchedList);
matchedActualPayableNos.add(expected.getExpectedFortuneBizId());
}
}
// 5. 添加未匹配的实际发佣记录
for (ApiExpectedFortunePageResponse actual : actualList) {
if (!matchedActualPayableNos.contains(actual.getExpectedFortuneBizId())) {
sortedList.add(actual);
}
}
// 6.设置实际出账记录的字段:待出账金额(估)
for (ApiExpectedFortunePageResponse item : sortedList) {
if (item.getType() == 2) {
item.setCurrentPaymentHkdAmount(item.getHkdAmount());
}
}
// 7. 将排序后的结果写回原列表
expectedFortuneList.clear();
expectedFortuneList.addAll(sortedList);
log.info("顺序调整后: {}", sortedList.size());
}
@Override
public List<ApiExpectedFortunePageResponse> toVOList(List<ExpectedFortune> expectedFortuneList) {
if (CollUtil.isEmpty(expectedFortuneList)) {
......@@ -232,12 +302,27 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
}
@Override
public String getPayableNo(String fortuneType) {
Integer currentSeq = getPayableNoCurrentSeq();
return String.format("%s%s%s",
fortuneType + "-CSF",
LocalDate.now().getYear() % 100,
currentSeq + 1);
public String getPayableNo(String fortuneType, String policyNo, long expectedFortuneId) {
// 1. 安全获取保单号后6位
String last6Chars = "";
if (policyNo != null && !policyNo.isEmpty()) {
int startIdx = Math.max(0, policyNo.length() - 6);
last6Chars = policyNo.substring(startIdx);
}
// 2. 字符串左补0至6位
// %6s 表示最小宽度为6,不足部分默认用空格填充在左侧
// replace(' ', '0') 将填充的空格替换为0,实现左补0效果
String formattedPolicySuffix = String.format("%6s", last6Chars).replace(' ', '0');
// 3. 项目类型枚举转换为字符串
String fortuneTypeCode = FortuneTypeEnum.getByItemValue(fortuneType).getItemLabel();
// 4. 组装最终字符串
return String.format("%s-%s-%d",
fortuneTypeCode,
formattedPolicySuffix,
expectedFortuneId);
}
@Override
......
......@@ -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;
}
......@@ -122,19 +122,22 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
Map<String, String> map = policyBrokerService.queryInternalCodeMap(brokerBizIdList);
List<FortuneAccount> fortuneAccountList = new ArrayList<>();
Date currentDate = new Date();
String billingYearMonth = actualPayoutDate != null
? actualPayoutDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyyMM"))
: "";
Map<String, Integer> prefixSerialCache = new HashMap<>();
for (FortuneAccountExportDTO accountExportDTO : accountExportDTOList) {
FortuneAccount fortuneAccount = new FortuneAccount();
fortuneAccount.setFortuneAccountBizId(RandomStringGenerator.generateBizId16("fortune_account"));
String internalCode = map.get(accountExportDTO.getBrokerBizId());
// LocalDate payoutDate = accountExportDTO.getActualPayoutDate();
// String billingYearMonth = payoutDate != null
// ? actualPayoutDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyyMM"))
// : "";
String businessNo = BusinessNoUtils.generate(billingYearMonth, internalCode);
//出账业务编号(出账年月 + 转介人内部编号(后6位)(如无,用0补齐)+流水号(6位))
String billingYearMonth = accountExportDTO.getActualPayoutDate() != null
? accountExportDTO.getActualPayoutDate().format(java.time.format.DateTimeFormatter.ofPattern("yyyyMM"))
: "";
String prefix = BusinessNoUtils.getPrefix(billingYearMonth, internalCode);
// 业务编号生成
String businessNo = generateBusinessNoWithCache(prefix, billingYearMonth, internalCode, prefixSerialCache);
fortuneAccount.setBusinessNo(businessNo);
fortuneAccount.setBroker(accountExportDTO.getBroker());
fortuneAccount.setBrokerBizId(accountExportDTO.getBrokerBizId());
......@@ -142,7 +145,7 @@ 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());
......@@ -186,7 +189,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
updateFortune.setCurrentPaymentRatio(item.getCurrentPaymentHkdAmount()
.divide(item.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)));
}
updateFortune.setReconciliationOperator(currentLoginUser.getUsername());
updateFortune.setReconciliationOperator(currentLoginUser.getRealName());
updateFortuneList.add(updateFortune);
// 处理关联预计发佣记录
expectedFortuneBizIdList.add(item.getExpectedFortuneBizId());
......@@ -210,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);
......@@ -218,6 +220,50 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
}
/**
* 带本地缓存的业务编号生成(解决同一批次内相同 prefix 的流水号重复问题)
* @param prefix 业务编号前缀(出账年月 + 转介人内部编号后6位)
* @param billingYearMonth 出账年月
* @param internalCode 转介人内部编号
* @param prefixSerialCache 本地缓存(Map<prefix, 当前已使用的最大流水号数值>)
* @return 完整的业务编号
*/
private String generateBusinessNoWithCache(String prefix, String billingYearMonth,
String internalCode, Map<String, Integer> prefixSerialCache) {
// 从缓存中获取当前 prefix 已分配的最大流水号,若不存在则查询数据库
Integer currentMaxSerial = prefixSerialCache.get(prefix);
if (currentMaxSerial == null) {
String maxSerialFromDb = getMaxSerialNoByPrefix(prefix); // 返回如 "000000"
currentMaxSerial = Integer.parseInt(maxSerialFromDb);
}
int nextSerial = currentMaxSerial + 1;
String serialPart = String.format("%06d", nextSerial);
String businessNo = BusinessNoUtils.generate(billingYearMonth, internalCode, serialPart);
// 更新缓存
prefixSerialCache.put(prefix, nextSerial);
return businessNo;
}
/**
* 根据前缀查询当前最大流水号(后6位)
* @param prefix 业务编号前缀(出账年月+转介人内部编号后6位,共12位)
* @return 最大流水号(6位字符串),如果没有记录则返回 "000000"
*/
private String getMaxSerialNoByPrefix(String prefix) {
// 查询 business_no 以指定前缀开头的记录,按业务编号降序取第一条
LambdaQueryWrapper<FortuneAccount> wrapper = new LambdaQueryWrapper<>();
wrapper.likeRight(FortuneAccount::getBusinessNo, prefix)
.orderByDesc(FortuneAccount::getBusinessNo)
.last("limit 1");
FortuneAccount account = this.getOne(wrapper, false);
if (account == null) {
return "000000";
}
String businessNo = account.getBusinessNo();
// 取最后6位作为流水号
return businessNo.substring(businessNo.length() - 6);
}
private Date getActualPayoutDate(LocalDate actualPayoutDate) {
if (actualPayoutDate == null) {
return null;
......
......@@ -18,7 +18,6 @@ import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.common.utils.RedisUtil;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.FortuneStatusEnum;
import com.yd.csf.service.model.*;
......@@ -43,6 +42,8 @@ import java.math.RoundingMode;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -91,8 +92,19 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
String policyNo = fortuneQueryRequest.getPolicyNo();
List<String> insuranceCompanyBizIdList = fortuneQueryRequest.getInsuranceCompanyBizIdList();
List<String> productLaunchBizIdList = fortuneQueryRequest.getProductLaunchBizIdList();
LocalDate payoutDateStart = fortuneQueryRequest.getPayoutDateStart();
LocalDate payoutDateEnd = fortuneQueryRequest.getPayoutDateEnd();
// 出账年月(估)开始
LocalDate payoutDateStart = null;
if (StringUtils.isNotBlank(fortuneQueryRequest.getPayoutDateStart())) {
payoutDateStart = LocalDate.parse(fortuneQueryRequest.getPayoutDateStart() + "-01");
}
// 出账年月(估)结束 月最后一天
LocalDate payoutDateEnd = null;
if (StringUtils.isNotBlank(fortuneQueryRequest.getPayoutDateEnd())) {
// 1. 先解析为 YearMonth (专门处理年月)
YearMonth yearMonth = YearMonth.parse(fortuneQueryRequest.getPayoutDateEnd(), DateTimeFormatter.ofPattern("yyyy-MM"));
// 2. 获取该月的最后一天
payoutDateEnd = yearMonth.atEndOfMonth();
}
String brokerName = fortuneQueryRequest.getBrokerName();
// 入账状态
......@@ -221,7 +233,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
String loginUserId = currentLoginUser.getId().toString();
// 检核人
fortune.setReconciliationOperator(currentLoginUser.getUsername());
fortune.setReconciliationOperator(currentLoginUser.getRealName());
// 如果传入了金额
if (currentPaymentHkdAmount != null && currentPaymentHkdAmount.compareTo(BigDecimal.ZERO) != 0) {
......@@ -248,7 +260,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
fortune.setCurrentPaymentHkdAmount(fortune.getHkdAmount());
fortune.setCurrentPaymentRatio(BigDecimal.valueOf(100));
fortune.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
fortune.setReconciliationOperator(currentLoginUser.getUsername());
fortune.setReconciliationOperator(currentLoginUser.getRealName());
fortune.setUpdaterId(loginUserId);
fortune.setUpdateTime(new Date());
......@@ -257,8 +269,9 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
/**
* 保单币种对预计来佣的结算币种的默认汇率
*
* @param policyCurrency 保单币种
* @param currency 预计来佣的结算币种
* @param currency 预计来佣的结算币种
* @return 汇率
*/
private BigDecimal queryExchangeRateByFeign(String policyCurrency, String currency) {
......@@ -295,7 +308,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
main.setCurrentPaymentRatio(currentPaymentHkdAmount
.divide(expectedFortune.getHkdAmount(), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)));
main.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
main.setReconciliationOperator(currentLoginUser.getUsername());
main.setReconciliationOperator(currentLoginUser.getRealName());
main.setUpdaterId(loginUserId);
main.setUpdateTime(new Date());
......@@ -314,7 +327,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
part.setStatus(FortuneStatusEnum.RESERVED.getItemValue());
part.setIsPart(1);
part.setPayoutDate(LocalDate.now().plusMonths(1)); // 次月
part.setReconciliationOperator(currentLoginUser.getUsername());
part.setReconciliationOperator(currentLoginUser.getRealName());
part.setCreatorId(loginUserId);
part.setCreateTime(new Date());
this.save(part);
......@@ -372,13 +385,34 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
StringBuilder validateMsg = new StringBuilder();
for (Fortune fortune : fortuneList) {
if (StringUtils.isNotBlank(fortune.getFortuneAccountBizId())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("已发薪资,不能重复生成薪资记录; ");
validateMsg.append("保单").append(fortune.getPolicyNo()).append("-").append(fortune.getBroker())
.append(":已发薪资,不能重复生成");
break;
}
if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.WAIT.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("待出账状态不能直接改为'可出账, 检核完成',不能生成出账记录; ");
validateMsg.append("保单").append(fortune.getPolicyNo()).append("-").append(fortune.getBroker())
.append(":待出账状态不能直接改为'可出账, 检核完成'");
break;
}
if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.SENT.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("已完成出账,不能生成出账记录; ");
validateMsg.append("保单").append(fortune.getPolicyNo()).append("-").append(fortune.getBroker())
.append(":已完成出账");
break;
}
if (fortune.getActualPayoutDate() == null) {
validateMsg.append("保单").append(fortune.getPolicyNo()).append("-").append(fortune.getBroker())
.append(":未设置出账年月(实)");
break;
}
if (ObjectUtils.isEmpty(fortune.getPayoutCurrency())) {
validateMsg.append("保单").append(fortune.getPolicyNo()).append("-").append(fortune.getBroker())
.append(":未设置发放币种");
break;
}
if (ObjectUtils.isEmpty(fortune.getPayoutAmount())) {
validateMsg.append("保单").append(fortune.getPolicyNo()).append("-").append(fortune.getBroker())
.append(":未设置发放币种金额");
break;
}
}
if (StringUtils.isNotBlank(validateMsg.toString())) {
......@@ -386,20 +420,18 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
}
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();
......@@ -412,7 +444,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));
}
// 计算出账总额
......@@ -467,7 +499,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// }
// 写入数据库
fortuneAccountService.saveFortuneAccount(accountExportDTOList, actualPayoutDate);
fortuneAccountService.saveFortuneAccount(accountExportDTOList);
// // 使用try-with-resources确保流正确关闭
// try (ServletOutputStream outputStream = response.getOutputStream()) {
......@@ -557,7 +589,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setCurrentPaymentAmount(fortuneAddRequest.getPayoutAmount());
fortune.setFortuneName(queryByDict(fortuneAddRequest.getFortuneType()));
fortune.setActualPayoutDate(fortuneAddRequest.getPayoutDate());
fortune.setActualPayoutDate(LocalDate.parse(fortuneAddRequest.getPayoutDate() + "-01"));
fortune.setIsPart(0);
fortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
......@@ -568,6 +600,12 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
if (ObjectUtils.isEmpty(fortuneAddRequest.getFortuneBizType())) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账类型不能为空");
}
if (ObjectUtils.isEmpty(fortuneAddRequest.getPayoutDate())) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账年月(估)不能为空");
}
if (ObjectUtils.isEmpty(fortuneAddRequest.getActualPayoutDate())) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账年月(实)不能为空");
}
if (ObjectUtils.isEmpty(fortuneAddRequest.getOriginalCurrency())) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "原币种不能为空");
......@@ -724,9 +762,8 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// 查询入账记录
Map<String, Commission> commissionByPolicyPeriod = new HashMap<>();
if (CollectionUtils.isNotEmpty(policyNoSet)) {
// 查询保单号
List<Policy> policyList = policyService.lambdaQuery().in(Policy::getPolicyNo, policyNoSet).list();
policyMap = policyList.stream().collect(Collectors.toMap(Policy::getPolicyNo, Function.identity(), (oldValue, newValue) -> newValue));
// 查询保单信息
policyMap = policyService.queryPolicyMap(policyNoSet);
// 查询预计出账
expectedFortuneMap = expectedFortuneService.lambdaQuery()
......@@ -751,6 +788,11 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
}
}
// 当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
String realName = currentLoginUser.getRealName();
List<Fortune> fortuneList = new ArrayList<>();
List<ExpectedFortune> expectedFortuneUpdateList = new ArrayList<>();
for (FortuneAddRequest fortuneAddRequest : fortuneAddRequestList) {
......@@ -758,7 +800,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
valiAddFortune(fortuneAddRequest);
Fortune fortune = new Fortune();
BeanUtil.copyProperties(fortuneAddRequest, fortune);
BeanUtil.copyProperties(fortuneAddRequest, fortune, "payoutDate", "actualPayoutDate");
fortune.setCurrentPaymentHkdAmount(fortune.getHkdAmount());
// 查询发佣类型名称
......@@ -777,7 +819,22 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
expectedFortune = createExpectedFortune(fortuneAddRequest, policy, fortuneName);
// 保存
expectedFortuneService.save(expectedFortune);
// 更新应付款编号
String payableNo = expectedFortuneService.getPayableNo(fortuneAddRequest.getFortuneType(), policy.getPolicyNo(), expectedFortune.getId());
expectedFortuneService.lambdaUpdate()
.set(ExpectedFortune::getPayableNo, payableNo)
.set(ExpectedFortune::getCreatorId, loginUserId)
.set(ExpectedFortune::getCreatorName, realName)
.set(ExpectedFortune::getUpdaterId, loginUserId)
.eq(ExpectedFortune::getId, expectedFortune.getId())
.update();
// 关联应付款编号
fortune.setPayableNo(payableNo);
} else {
// 如果有预计出账记录,提示去应付款管理页面修改金额,而不是在出账页面新增
throw new BusinessException(ResultCode.FAIL.getCode(), fortuneAddRequest.getFortuneName() + " 已存在应付记录,请在应付款管理页面修改金额");
}
fortune.setExpectedFortuneBizId(expectedFortune.getExpectedFortuneBizId());
fortune.setPolicyCurrency(expectedFortune.getPolicyCurrency());
fortune.setCurrentPaymentRatio(BigDecimal.valueOf(100));
......@@ -799,8 +856,19 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// 生成发佣业务ID
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setCurrentPaymentAmount(fortuneAddRequest.getPayoutAmount());
fortune.setActualPayoutDate(fortuneAddRequest.getPayoutDate());
fortune.setPayoutDate(LocalDate.parse(fortuneAddRequest.getPayoutDate() + "-01"));
fortune.setActualPayoutDate(LocalDate.parse(fortuneAddRequest.getActualPayoutDate() + "-01"));
fortune.setIsPart(0);
// 创建时间、更新时间
Date now = new Date();
fortune.setCreateTime(now);
fortune.setUpdateTime(now);
// 创建人、更新人
fortune.setCreatorId(loginUserId);
fortune.setReconciliationOperator(realName);
fortune.setUpdaterId(loginUserId);
fortuneList.add(fortune);
}
this.saveBatch(fortuneList);
......@@ -813,13 +881,9 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
}
private ExpectedFortune createExpectedFortune(FortuneAddRequest fortuneAddRequest, Policy policy, String fortuneName) {
// 应付款编号(序号递增)
String payableNo = expectedFortuneService.getPayableNo(fortuneAddRequest.getFortuneType());
// 创建 expectedFortune
ExpectedFortune expectedFortune = new ExpectedFortune();
BeanUtil.copyProperties(fortuneAddRequest, expectedFortune);
BeanUtil.copyProperties(fortuneAddRequest, expectedFortune, "payoutDate", "actualPayoutDate");
// 设置 policy 关联字段
expectedFortune.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
......@@ -832,7 +896,15 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// 预计发佣类型名称
expectedFortune.setFortuneName(fortuneName);
// 应付款编号
expectedFortune.setPayableNo(payableNo);
expectedFortune.setPayableNo(null);
// 是否拆分
expectedFortune.setIsPart(0);
// 默认保单币种汇率
expectedFortune.setDefaultExchangeRate(fortuneAddRequest.getExchangeRate());
// 预计出账年月
expectedFortune.setPayoutDate(LocalDate.parse(fortuneAddRequest.getPayoutDate() + "-01"));
// 实际出账年月
expectedFortune.setActualPayoutDate(LocalDate.parse(fortuneAddRequest.getActualPayoutDate() + "-01"));
// 已出帐金额、待出帐金额、已出帐比例、待出帐比例
expectedFortune.setPaidAmount(BigDecimal.ZERO);
......@@ -842,6 +914,11 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
expectedFortune.setPaidRatio(BigDecimal.ZERO);
expectedFortune.setUnpaidRatio(BigDecimal.valueOf(100));
// 创建时间、更新时间
LocalDateTime now = LocalDateTime.now();
expectedFortune.setCreateTime(now);
expectedFortune.setUpdateTime(now);
return expectedFortune;
}
......@@ -877,26 +954,26 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
List<FortuneSplitDto> splitList = fortuneSplitRequest.getFortuneSplitDtoList();
// 3. 金额验证
BigDecimal totalSplitOriginalAmount = splitList.stream()
.map(FortuneSplitDto::getOriginalAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
.map(FortuneSplitDto::getOriginalAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalSplitRatio = splitList.stream()
.map(FortuneSplitDto::getSplitRatio)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
.map(FortuneSplitDto::getSplitRatio)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal tolerance = new BigDecimal("0.01");
BigDecimal originalDifference = originalFortune.getOriginalAmount().subtract(totalSplitOriginalAmount).abs();
if (originalDifference.compareTo(tolerance) > 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(),
String.format("分期原始金额总和(%s)与原记录原始金额(%s)不匹配", totalSplitOriginalAmount, originalFortune.getOriginalAmount()));
String.format("分期原始金额总和(%s)与原记录原始金额(%s)不匹配", totalSplitOriginalAmount, originalFortune.getOriginalAmount()));
}
if (totalSplitRatio.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal ratioDifference = new BigDecimal("100").subtract(totalSplitRatio).abs();
if (ratioDifference.compareTo(new BigDecimal("0.1")) > 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(),
String.format("分期比例总和(%s%%)应为100%%", totalSplitRatio));
String.format("分期比例总和(%s%%)应为100%%", totalSplitRatio));
}
}
......@@ -909,7 +986,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
String username = currentLoginUser.getUsername();
String realName = currentLoginUser.getRealName();
for (int i = 0; i < splitList.size(); i++) {
FortuneSplitDto splitDto = splitList.get(i);
......@@ -918,9 +995,9 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
ExpectedFortune newExpectedFortune = new ExpectedFortune();
BeanUtils.copyProperties(originalExpectedFortune, newExpectedFortune,
"id", "expectedFortuneBizId", "amount", "hkdAmount",
"paidAmount", "unpaidAmount", "paidRatio", "unpaidRatio",
"status", "payoutDate", "actualPayoutDate", "remark");
"id", "expectedFortuneBizId", "amount", "hkdAmount",
"paidAmount", "unpaidAmount", "paidRatio", "unpaidRatio",
"status", "payoutDate", "actualPayoutDate", "remark");
String newExpectedFortuneBizId = RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_EXPECTED_FORTUNE.getCode());
newExpectedFortune.setExpectedFortuneBizId(newExpectedFortuneBizId);
......@@ -940,7 +1017,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
newExpectedFortune.setPaidRatio(BigDecimal.ZERO);
newExpectedFortune.setUnpaidRatio(BigDecimal.valueOf(100));
newExpectedFortune.setStatus("0");
newExpectedFortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
newExpectedFortune.setPayoutDate(LocalDate.parse(splitDto.getPayoutYearMonth() + "-01"));
......@@ -953,7 +1030,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
newExpectedFortune.setRemark(expectedRemark);
newExpectedFortune.setCreatorId(loginUserId);
newExpectedFortune.setCreatorName(username);
newExpectedFortune.setCreatorName(realName);
newExpectedFortune.setCreateTime(localDateTime);
newExpectedFortune.setUpdaterId(loginUserId);
newExpectedFortune.setUpdateTime(localDateTime);
......@@ -964,10 +1041,10 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
Fortune newFortune = new Fortune();
BeanUtils.copyProperties(originalFortune, newFortune,
"id", "fortuneBizId", "expectedFortuneBizId",
"amount", "hkdAmount", "currentPaymentAmount", "currentPaymentHkdAmount",
"currentPaymentRatio", "status", "isPart",
"payoutDate", "actualPayoutDate", "remark");
"id", "fortuneBizId", "expectedFortuneBizId",
"amount", "hkdAmount", "currentPaymentAmount", "currentPaymentHkdAmount",
"currentPaymentRatio", "status", "isPart",
"payoutDate", "actualPayoutDate", "remark");
newFortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
......@@ -988,12 +1065,12 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
String fortuneRemark = StringUtils.isBlank(splitDto.getRemark()) ? "" : splitDto.getRemark();
if (StringUtils.isNotBlank(originalFortune.getRemark())) {
fortuneRemark = StringUtils.isBlank(fortuneRemark) ?
originalFortune.getRemark() :
originalFortune.getRemark() + "; " + fortuneRemark;
originalFortune.getRemark() :
originalFortune.getRemark() + "; " + fortuneRemark;
}
newFortune.setRemark(fortuneRemark);
newFortune.setReconciliationOperator(username);
newFortune.setReconciliationOperator(realName);
newFortune.setCreatorId(loginUserId);
newFortune.setCreateTime(now);
newFortune.setUpdaterId(loginUserId);
......@@ -1127,6 +1204,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(), "原币种不能为空");
......@@ -1176,15 +1285,15 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
FortuneSplitDto dto = splitList.get(i);
if (dto.getHkdAmount() == null || dto.getHkdAmount().compareTo(BigDecimal.ZERO) <= 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(),
"第" + (i + 1) + "期:港币金额必须大于0");
"第" + (i + 1) + "期:港币金额必须大于0");
}
if (dto.getExchangeRate() == null || dto.getExchangeRate().compareTo(BigDecimal.ZERO) <= 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(),
"第" + (i + 1) + "期:汇率必须大于0");
"第" + (i + 1) + "期:汇率必须大于0");
}
if (StringUtils.isBlank(dto.getPayoutYearMonth())) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(),
"第" + (i + 1) + "期:出账年月不能为空");
"第" + (i + 1) + "期:出账年月不能为空");
}
}
}
......
......@@ -11,9 +11,8 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
......@@ -61,6 +60,15 @@ public class PolicyBrokerServiceImpl extends ServiceImpl<PolicyBrokerMapper, Pol
}
@Override
public Map<String, PolicyBroker> queryPolicyBrokerMap(Collection<String> policyNoSet) {
if (CollectionUtils.isEmpty(policyNoSet)) {
return Collections.emptyMap();
}
List<PolicyBroker> list = this.lambdaQuery().in(PolicyBroker::getPolicyNo, policyNoSet).list();
return list.stream().collect(Collectors.toMap(PolicyBroker::getPolicyNo, Function.identity(), (oldValue, newValue) -> newValue));
}
@Override
public Map<String, String> queryInternalCodeMap(List<String> brokerBizIdList) {
if (CollectionUtils.isEmpty(brokerBizIdList)) {
return Collections.emptyMap();
......
......@@ -52,6 +52,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
......@@ -168,7 +169,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
}
if (StringUtils.isNotEmpty(policyFollowQueryRequest.getInsured())) queryWrapper.like("insured", policyFollowQueryRequest.getInsured());
//签单人
if (StringUtils.isNotEmpty(policyFollowQueryRequest.getSigner())) queryWrapper.like("signer", policyFollowQueryRequest.getSigner());
if (StringUtils.isNotEmpty(policyFollowQueryRequest.getSigner())) queryWrapper.like("signer_sc", ChineseTextConverter.traditionalToSimplified(policyFollowQueryRequest.getSigner()));
//转介人(保单转介人表)
if (StringUtils.isNotEmpty(policyFollowQueryRequest.getBrokerName())) {
List<PolicyBroker> policyBrokerList = policyBrokerService.queryList(QueryPolicyBrokerDto.builder().brokerName(policyFollowQueryRequest.getBrokerName()).build());
......@@ -378,6 +379,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
String loginUserId = currentLoginUser.getId().toString();
policyFollow.setUpdaterId(loginUserId);
policyFollow.setUpdateTime(new Date());
policyFollow.setSignerSc(ChineseTextConverter.traditionalToSimplified(policyFollowDto.getSigner()));
try {
boolean result = updateById(policyFollow);
......@@ -1298,6 +1300,15 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
return policySecondHolderService.updatePolicySecondHolder(policySecondHolderUpdateRequest);
}
@Override
public Map<String, PolicyFollow> queryPolicyFollowMap(Collection<?> policyNoSet) {
if (CollectionUtils.isEmpty(policyNoSet)) {
return Collections.emptyMap();
}
List<PolicyFollow> policyFollowList = this.list(new QueryWrapper<PolicyFollow>().in("policy_no", policyNoSet));
return policyFollowList.stream().collect(Collectors.toMap(PolicyFollow::getPolicyNo, Function.identity(), (oldValue, newValue) -> newValue));
}
/**
* 根据保单号查询新单跟进详情
* @param policyNo
......@@ -1321,15 +1332,18 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
public List<String> queryPolicyNoList(String policyHolder, String signer, String brokerName, String insured) {
// 投保人转换:中文转简体、英文转小写
String policyHolderSc = ChineseTextConverter.traditionalToSimplified(policyHolder);
String policyHolderEnLc = EnglishTextUtil.toLowerCase(policyHolder);
String policyHolderEnLc = EnglishTextUtil.toLowerCaseSafe(policyHolder);
// 受保人转换:中文转简体、英文转小写
String insuredSc = ChineseTextConverter.traditionalToSimplified(insured);
String insuredEnLc = EnglishTextUtil.toLowerCase(insured);
String insuredEnLc = EnglishTextUtil.toLowerCaseSafe(insured);
//签单员繁转简体
String signerSc = ChineseTextConverter.traditionalToSimplified(signer);
return this.baseMapper.queryPolicyNoList(
policyHolderSc, policyHolderEnLc,
signer,
signerSc,
brokerName,
insuredSc, insuredEnLc
);
......@@ -1352,6 +1366,9 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
// 3. 更新客户表
updateCustomerNameFields(pageSize);
// 4. 更新新单跟进表
updateSignerScFields(pageSize);
log.info("投保人/受保人名字冗余字段更新完成");
return Result.success("更新成功");
}
......@@ -1376,23 +1393,23 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
// 繁体 → 简体
if (StringUtils.isNotBlank(entity.getName())) {
String nameSc = ChineseTextConverter.traditionalToSimplified(entity.getName());
if (!nameSc.equals(entity.getNameSc())) {
// if (!nameSc.equals(entity.getNameSc())) {
entity.setNameSc(nameSc);
changed = true;
}
// }
}
// 英文 → 小写
if (StringUtils.isNotBlank(entity.getNameEn())) {
String nameEnLc = EnglishTextUtil.toLowerCase(entity.getNameEn());
if (!nameEnLc.equals(entity.getNameEnLc())) {
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(entity.getNameEn());
// if (!nameEnLc.equals(entity.getNameEnLc())) {
entity.setNameEnLc(nameEnLc);
changed = true;
}
// }
}
if (changed) {
entity.setUpdateTime(new Date()); // 可选,记录更新时间
// entity.setUpdateTime(new Date()); // 可选,记录更新时间
toUpdate.add(entity);
}
}
......@@ -1423,22 +1440,22 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
if (StringUtils.isNotBlank(entity.getName())) {
String nameSc = ChineseTextConverter.traditionalToSimplified(entity.getName());
if (!nameSc.equals(entity.getNameSc())) {
// if (!nameSc.equals(entity.getNameSc())) {
entity.setNameSc(nameSc);
changed = true;
}
// }
}
if (StringUtils.isNotBlank(entity.getNameEn())) {
String nameEnLc = EnglishTextUtil.toLowerCase(entity.getNameEn());
if (!nameEnLc.equals(entity.getNameEnLc())) {
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(entity.getNameEn());
// if (!nameEnLc.equals(entity.getNameEnLc())) {
entity.setNameEnLc(nameEnLc);
changed = true;
}
// }
}
if (changed) {
entity.setUpdateTime(new Date());
// entity.setUpdateTime(new Date());
toUpdate.add(entity);
}
}
......@@ -1469,22 +1486,22 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
if (StringUtils.isNotBlank(entity.getNameCn())) {
String nameSc = ChineseTextConverter.traditionalToSimplified(entity.getNameCn());
if (!nameSc.equals(entity.getNameSc())) {
// if (!nameSc.equals(entity.getNameSc())) {
entity.setNameSc(nameSc);
changed = true;
}
// }
}
if (StringUtils.isNotBlank(entity.getNamePyEn())) {
String nameEnLc = EnglishTextUtil.toLowerCase(entity.getNamePyEn());
if (!nameEnLc.equals(entity.getNameEnLc())) {
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(entity.getNamePyEn());
// if (!nameEnLc.equals(entity.getNameEnLc())) {
entity.setNameEnLc(nameEnLc);
changed = true;
}
// }
}
if (changed) {
entity.setUpdateTime(new Date());
// entity.setUpdateTime(new Date());
toUpdate.add(entity);
}
}
......@@ -1495,5 +1512,41 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
pageNo++;
}
}
/**
* 批量处理 PolicyFollow 的 signerSc
*/
private void updateSignerScFields(int pageSize) {
int pageNo = 1;
while (true) {
Page<PolicyFollow> page = new Page<>(pageNo, pageSize);
Page<PolicyFollow> resultPage = policyFollowService.page(page);
List<PolicyFollow> records = resultPage.getRecords();
if (CollUtil.isEmpty(records)) {
break;
}
List<PolicyFollow> toUpdate = new ArrayList<>();
for (PolicyFollow entity : records) {
boolean changed = false;
if (StringUtils.isNotBlank(entity.getSigner())) {
String nameSc = ChineseTextConverter.traditionalToSimplified(entity.getSigner());
entity.setSignerSc(nameSc);
changed = true;
}
if (changed) {
// entity.setUpdateTime(new Date());
toUpdate.add(entity);
}
}
if (!toUpdate.isEmpty()) {
policyFollowService.updateBatchById(toUpdate);
}
pageNo++;
}
}
}
......@@ -60,7 +60,7 @@ public class PolicyInsurantServiceImpl extends ServiceImpl<PolicyInsurantMapper,
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(insured);
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(insured);
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(insured);
return this.baseMapper.selectList(new LambdaQueryWrapper<PolicyInsurant>()
.and(wrapper -> wrapper
......
......@@ -9,8 +9,6 @@ import com.yd.common.exception.BusinessException;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.EnglishTextUtil;
import com.yd.csf.service.dto.PolicyPolicyholderUpdateRequest;
import com.yd.csf.service.enums.FnaStatusEnum;
import com.yd.csf.service.model.Fna;
import com.yd.csf.service.model.PolicyPolicyholder;
import com.yd.csf.service.service.PolicyPolicyholderService;
import com.yd.csf.service.dao.PolicyPolicyholderMapper;
......@@ -20,9 +18,8 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Zhang Jianan
......@@ -58,6 +55,19 @@ public class PolicyPolicyholderServiceImpl extends ServiceImpl<PolicyPolicyholde
}
@Override
public Map<String, PolicyPolicyholder> queryPolicyholderMap(Collection<?> policyNoList) {
if (CollectionUtils.isEmpty(policyNoList)) {
return Collections.emptyMap();
}
List<PolicyPolicyholder> policyholderList = this.lambdaQuery()
.in(PolicyPolicyholder::getPolicyNo, policyNoList)
.list();
return policyholderList.stream().collect(Collectors.toMap(PolicyPolicyholder::getPolicyNo, a -> a, (oldValue, newValue) -> newValue));
}
@Override
public List<PolicyPolicyholder> queryList(String policyHolder) {
// 输入为空时直接返回空列表,避免无意义的全表查询
if (StringUtils.isBlank(policyHolder)) {
......@@ -67,7 +77,7 @@ public class PolicyPolicyholderServiceImpl extends ServiceImpl<PolicyPolicyholde
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(policyHolder);
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(policyHolder);
String nameEnLc = EnglishTextUtil.toLowerCaseSafe(policyHolder);
return this.baseMapper.selectList(new LambdaQueryWrapper<PolicyPolicyholder>()
.and(wrapper -> wrapper
......
......@@ -388,6 +388,17 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
.collect(Collectors.toMap(PolicyProductInfo::getProductLaunchBizId, Function.identity(), (oldValue, newValue) -> newValue));
}
@Override
public Map<String, Policy> queryPolicyMap(Collection<String> policyNoList) {
// 校验参数
if (CollectionUtils.isEmpty(policyNoList)) {
return Collections.emptyMap();
}
return this.lambdaQuery().in(Policy::getPolicyNo, policyNoList).list()
.stream().collect(Collectors.toMap(Policy::getPolicyNo, Function.identity()));
}
/**
* 从JSON数组中解析自定义属性
*/
......
package com.yd.csf.service.utils;
import java.util.concurrent.ThreadLocalRandom;
/**
* 业务编号生成工具类
* <p>格式:出账年月 + 转介人内部编号后6位(无则补0) + 6位随机数字</p>
* 格式:出账年月(6) + 转介人内部编号后6位 + 6位流水号(从000001开始递增)
*/
public class BusinessNoUtils {
/**
* 生成业务编号
*
* 生成业务编号(流水号由调用方传入)
* @param billingYearMonth 出账年月,如 "202604"
* @param referrerInnerNo 转介人内部编号,可为 null 或空字符串
* @return 完整的业务编号字符串
* @param referrerInnerNo 转介人内部编号,可为null或空
* @param serialPart 6位流水号(如 "000001")
* @return 完整业务编号
*/
public static String generate(String billingYearMonth, String referrerInnerNo) {
public static String generate(String billingYearMonth, String referrerInnerNo, String serialPart) {
String referrerPart = formatReferrerInnerNo(referrerInnerNo);
String serialPart = generateRandomSerial();
return billingYearMonth + referrerPart + serialPart;
}
......@@ -33,9 +30,13 @@ public class BusinessNoUtils {
return String.format("%6s", no).replace(' ', '0');
}
// 生成6位随机数字(000000~999999)
private static String generateRandomSerial() {
int random = ThreadLocalRandom.current().nextInt(1000000);
return String.format("%06d", random);
/**
* 获取业务编号中的前缀部分(用于数据库查询)
* @param billingYearMonth 出账年月
* @param referrerInnerNo 转介人内部编号
* @return 前缀字符串(12位)
*/
public static String getPrefix(String billingYearMonth, String referrerInnerNo) {
return billingYearMonth + formatReferrerInnerNo(referrerInnerNo);
}
}
\ No newline at end of file
......@@ -186,11 +186,23 @@ public class CommissionExpectedExportNewDTO {
@ExcelProperty("期交保费")
private String premium;
// /**
// * 入账检核记录-通用备注
// */
// @ExcelProperty("备注")
// private String realRemark;
/**
* 人工备注
*/
@ExcelProperty("人工备注")
private String manualRemark;
/**
* 入账检核记录-通用备注
* 系统备注
*/
@ExcelProperty("备注")
private String realRemark;
private String remark;
/**
* 入账检核记录-更新人名称
......
......@@ -16,6 +16,18 @@ import java.util.List;
@Data
@Schema(description = "预计来佣响应")
public class CommissionExpectedNewVO implements Serializable {
/**
* 预计来佣业务id
*/
private String commissionExpectedBizId;
/**
* 保单来佣业务id
*/
private String commissionBizId;
//===========公共字段=============
/**
* 是否实收:1-预计(预计来佣记录) 2-实收(保单来佣表记录)*
......@@ -72,6 +84,11 @@ public class CommissionExpectedNewVO implements Serializable {
private Integer totalPeriod;
/**
* 预计来佣-入账项目类型(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
private String commissionType;
/**
* 预计来佣-来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
// @Schema(description = "来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)")
......@@ -81,13 +98,18 @@ public class CommissionExpectedNewVO implements Serializable {
* 预计来佣-入账年月(估) * (预计来佣日期)
*/
// @Schema(description = "入账年月(估)")
@JsonFormat(pattern = "yyyyMM", timezone = "GMT+8")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private Date commissionDateMonth;
/**
* 预计来佣-入账日(同预计来佣表commissionDate)
*/
private Date commissionExpectedDate;
/**
* 入账检核记录-入账年月实(来佣日期 yyyyMM)
*/
@JsonFormat(pattern = "yyyyMM", timezone = "GMT+8")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private Date commissionDate;
/**
......@@ -151,6 +173,11 @@ public class CommissionExpectedNewVO implements Serializable {
private BigDecimal expectedAmount;
/**
* 预计来佣-入账金额
*/
private BigDecimal amount;
/**
* 预计来佣-结算汇率(估)
*/
// @Schema(description = "结算汇率(估)")
......@@ -180,16 +207,15 @@ public class CommissionExpectedNewVO implements Serializable {
private String policyCurrency;
/**
* 预计来佣-期交保费
* 预计来佣-入账币种
*/
// @Schema(description = "期交保费")
private Object premium;
private String currency;
/**
* 入账检核记录-通用备注
* 预计来佣-期交保费
*/
// @Schema(description = "备注")
private String realRemark;
// @Schema(description = "期交保费")
private Object premium;
/**
* 入账检核记录-更新人名称
......@@ -203,9 +229,20 @@ public class CommissionExpectedNewVO implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date realUpdateTime;
/**
* 修改理由
*/
private String statusDesc;
/**
* 人工备注
*/
private String manualRemark;
/**
* 通用备注
*/
private String remark;
......
......@@ -171,10 +171,10 @@ public class CommissionVO implements Serializable {
private String currency;
/**
* 来佣日期
* 来佣年月 yyyy-MM
*/
@Schema(description = "来佣日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Schema(description = "来佣年月 yyyy-MM")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private Date commissionDate;
/**
......@@ -268,6 +268,11 @@ public class CommissionVO implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 人工备注
*/
private String manualRemark;
private static final long serialVersionUID = 1L;
/**
......
......@@ -282,17 +282,17 @@ public class FortuneVO implements Serializable {
private String status;
/**
* 出账(估) / 预计发佣月
* 出账年月(估) / 预计发佣月
*/
@Schema(description = "出账(估) / 预计发佣月")
@Schema(description = "出账年月(估) / 预计发佣月")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private LocalDate payoutDate;
/**
* 出账(实)
* 出账年月(实)
*/
@Schema(description = "出账(实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Schema(description = "出账年月(实)")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private LocalDate actualPayoutDate;
/**
......
......@@ -3,6 +3,7 @@ package com.yd.csf.service.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
......@@ -21,6 +22,18 @@ public class PayableReportVO {
private String policyNo;
/**
* 投保人
*/
@Schema(description = "投保人")
private String policyHolder;
/**
* 投保人英文
*/
@Schema(description = "投保人英文")
private String policyHolderEn;
/**
* 转介人
*/
@Schema(description = "转介人(保单的第一位转介人)")
......@@ -135,13 +148,13 @@ public class PayableReportVO {
@Schema(description = "产品计划")
private String productName;
/**
* 保單持有人(投保人,保单表)(中文名)
*/
private String policyHolder;
/**
* 保單持有人(投保人,保单表)(英文名)
*/
private String policyHolderEn;
// /**
// * 保單持有人(投保人,保单表)(中文名)
// */
// private String policyHolder;
//
// /**
// * 保單持有人(投保人,保单表)(英文名)
// */
// private String policyHolderEn;
}
......@@ -141,10 +141,10 @@ public class ReceivableReportVO {
private String policyCurrency;
/**
* 备注
* 人工备注
*/
@Schema(description = "备注")
private String remark;
@Schema(description = "人工备注")
private String manualRemark;
/**
* 保單持有人(投保人,保单表)(中文名)
......
......@@ -76,7 +76,7 @@
(select pp.name_en from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolderEn,
(select pi.name from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insured,
(select pi.name_en from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insuredEn,
ce.remark,
ce.manual_remark as manualRemark,
MAX(ce.reconciliation_company) as reconciliationCompany,
MAX(ce.reconciliation_company_biz_id) as reconciliationCompanyBizId,
ce.commission_period as commissionPeriod,
......@@ -122,7 +122,7 @@
(select pp.name_en from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolderEn,
(select pi.name from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insured,
(select pi.name_en from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insuredEn,
ce.remark,
ce.manual_remark as manualRemark,
ce.reconciliation_company as reconciliationCompany,
ce.reconciliation_company_biz_id as reconciliationCompanyBizId,
ce.commission_period as commissionPeriod,
......
......@@ -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">
......@@ -182,7 +169,7 @@
ef.status_desc,
ef.payout_date,
ef.actual_payout_date,
ef.default_exchange_rate,
ef.default_exchange_rate as exchangeRate,
ef.original_currency,
ef.original_amount,
ef.original_to_hkd_rate,
......@@ -190,6 +177,8 @@
ef.payout_amount,
ef.hkd_to_payout_rate,
ef.hkd_amount,
ef.hkd_amount as current_payment_hkd_amount,
ef.default_exchange_rate as exchange_rate,
ef.paid_amount,
ef.unpaid_amount,
ef.paid_ratio,
......@@ -242,7 +231,7 @@
NULL as status_desc,
f.payout_date,
f.actual_payout_date,
f.exchange_rate as default_exchange_rate,
NUll as default_exchange_rate,
f.original_currency,
f.original_amount,
f.original_to_hkd_rate,
......@@ -250,17 +239,19 @@
f.payout_amount,
f.hkd_to_payout_rate,
f.hkd_amount,
f.current_payment_amount as paid_amount,
0 as unpaid_amount,
f.current_payment_ratio as paid_ratio,
0 as unpaid_ratio,
NULL as current_payment_hkd_amount,
f.exchange_rate,
NULL as paid_amount,
NULL as unpaid_amount,
NULL as paid_ratio,
NULL as unpaid_ratio,
f.is_tax,
f.tax_amount,
f.net_amount,
NULL as rule_item_biz_id,
f.remark,
f.create_time,
NULL as creator_name,
f.reconciliation_operator as creator_name,
f.update_time,
2 as type
FROM fortune f
......@@ -291,10 +282,9 @@
ef.paid_amount,
ef.unpaid_amount,
ef.policy_no,
(SELECT SUM(p.total_payment_premium) * MAX(ef.default_exchange_rate)
(SELECT p.total_payment_premium * ef.default_exchange_rate
FROM policy p
WHERE p.policy_no = ef.policy_no
LIMIT 1
) AS totalPremiumAmount
FROM expected_fortune ef
WHERE ef.is_deleted = 0
......
......@@ -25,8 +25,8 @@
<result property="shareRate" column="share_rate" />
<result property="fortuneName" column="fortune_name" />
<result property="fortuneType" column="fortune_type" />
<result property="amount" column="amount" />
<result property="currency" column="currency" />
<result property="ruleAmount" column="rule_amount" />
<result property="ruleCurrency" column="rule_currency" />
<result property="exchangeRate" column="exchange_rate" />
<result property="hkdAmount" column="hkd_amount" />
<result property="currentPaymentAmount" column="current_payment_amount" />
......@@ -55,7 +55,7 @@
id,fortune_biz_id,expected_fortune_biz_id,payable_no,reconciliation_year_month,fortune_biz_type,batch_biz_id,
commission_biz_id,commission_expected_biz_id,policy_no,policy_currency,fortune_period,fortune_total_period,broker_biz_id,
team_biz_id,grade_commission_rate,share_rate,fortune_name,fortune_type,is_part,
amount,currency,exchange_rate,hkd_amount,current_payment_amount,current_payment_hkd_amount,current_payment_ratio,status,payout_date,actual_payout_date,is_tax,
rule_amount,rule_currency,exchange_rate,hkd_amount,current_payment_amount,current_payment_hkd_amount,current_payment_ratio,status,payout_date,actual_payout_date,is_tax,
tax_amount,net_amount,salary_biz_id,base_rule_biz_id,settlement_biz_id,reconciliation_operator,
calculation_formula,remark,is_deleted,creator_id,updater_id,
create_time,update_time
......@@ -71,7 +71,17 @@
from expected_fortune where status = '0' and policy_no = f.policy_no
),0) AS pendingOutAmount,
IFNULL(SUM(CASE WHEN f.status in ('6','1') THEN f.current_payment_hkd_amount ELSE 0 END),0) AS availableOutAmount,
COUNT(DISTINCT f.policy_no) AS totalPolicyCount
(SELECT COUNT(DISTINCT f2.policy_no)
FROM fortune f2
WHERE 1 = 1
<if test="fortuneIdList != null and fortuneIdList.size() > 0">
AND f2.id IN
<foreach collection="fortuneIdList" item="fortuneId" open="(" close=")" separator=",">
#{fortuneId}
</foreach>
</if>
AND f2.is_part in (0,1)
) AS totalPolicyCount
FROM fortune f
WHERE 1 = 1
<if test="fortuneIdList != null and fortuneIdList.size() > 0">
......
......@@ -53,6 +53,7 @@
<result property="status" column="status" />
<result property="nextStatusList" column="next_status_list" />
<result property="policyHolder" column="policy_holder" />
<result property="policyHolderEn" column="policy_holder_en" />
<result property="insured" column="insured" />
<result property="insuredBizId" column="insured_biz_id" />
<result property="insuredAge" column="insured_age" />
......@@ -95,7 +96,7 @@
each_issue_premium,is_prepay,is_traceable,retroactive_date,prepaid_term,
prepaid_amount,prepaid_amount_after_discount,policy_expiration_date,payment_number,product_launch_biz_id,
product_name,product_cate,category_code,insurance_company,insurance_company_biz_id,reconciliation_company,insurance_category_biz_id,
reconciliation_company_biz_id,status,next_status_list,policy_holder,insured,insured_biz_id,
reconciliation_company_biz_id,status,next_status_list,policy_holder,policy_holder_en,insured,insured_biz_id,
insured_age,grace_period,is_join,policy_currency,initial_payment_method,
initial_premium,initial_premium_total,initial_payment_status,initial_premium_discount,
mailing_method,renewal_payment_method,dividend_distribution_method,delivery_no,
......@@ -181,8 +182,8 @@
</if>
)
</if>
<if test="signer != null and signer != ''">
and pf.signer like concat('%', #{signer}, '%')
<if test="signerSc != null and signerSc != ''">
and pf.signer_sc like concat('%', #{signerSc}, '%')
</if>
<if test="brokerName != null and brokerName != ''">
and first_broker.broker_name like concat('%', #{brokerName}, '%')
......
......@@ -54,6 +54,9 @@
<if test="request.billOrg != null and request.billOrg != ''">
and ss.bill_org like concat('%', #{request.billOrg}, '%')
</if>
<if test="request.businessNo != null and request.businessNo != ''">
and fa.business_no like concat('%', #{request.businessNo}, '%')
</if>
and ss.is_deleted = 0
</where>
</select>
......@@ -83,6 +86,9 @@
<if test="request.billOrg != null and request.billOrg != ''">
and ss.bill_org like concat('%', #{request.billOrg}, '%')
</if>
<if test="request.businessNo != null and request.businessNo != ''">
and fa.business_no like concat('%', #{request.businessNo}, '%')
</if>
and ss.is_deleted = 0
</where>
</select>
......
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