Commit a574728d by zhangxingmin

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

parents 546708fa 489667cb
......@@ -39,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
......@@ -469,45 +470,6 @@ public class ApiCommissionController {
return Result.success(commissionService.getCommissionStatistics(commissionStatisticsRequest.getCommissionIds()));
}
/**
* 根据 commissionBizId 获取保单来佣(封装类)
*
* @param commissionBizId
* @return
*/
// @GetMapping("/get/vo")
// @Operation(summary = "根据 policyBizId 获取保单来佣详情")
// public Result<PolicyFollowVO> getPolicyFollowByPolicyBizId(@RequestParam("commissionBizId") String commissionBizId, HttpServletRequest request) {
// if (commissionBizId == null) {
// return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
// }
// // 查询数据库
// PolicyFollow policyFollow = policyFollowService.getByPolicyBizId(policyBizId);
// if (policyFollow == null) {
// return Result.fail(ErrorCode.NOT_FOUND_ERROR.getCode(), ErrorCode.NOT_FOUND_ERROR.getMessage());
// }
//
// // 获取封装类
// return Result.success(policyFollowService.getPolicyFollowVO(policyFollow));
// }
/**
* 分页获取保单来佣列表(仅管理员可用)
*
* @param fnaQueryRequest
* @return
*/
// @PostMapping("/list/page")
// public Result<Page<Customer>> listFnaByPage(@RequestBody FnaQueryRequest fnaQueryRequest) {
// long current = fnaQueryRequest.getPageNo();
// long size = fnaQueryRequest.getPageSize();
// // 查询数据库
// Page<Customer> fnaPage = policyFollowService.page(new Page<>(current, size),
// policyFollowService.getQueryWrapper(fnaQueryRequest));
// return Result.success(fnaPage);
// }
/**
* 来佣检核页面-分页获取保单来佣列表(VO)
*
......@@ -567,4 +529,27 @@ public class ApiCommissionController {
return Result.success(commissionService.getCommissionVOPage(commissionPage));
}
/**
* 查询入账结算汇率
*
* @param queryCommissionExchangeRateRequest
* @return
*/
@PostMapping("/commission_exchange_rate")
@Operation(summary = "查询入账结算汇率")
public Result<BigDecimal> commissionExchangeRate(@RequestBody QueryCommissionExchangeRateRequest queryCommissionExchangeRateRequest) {
if (queryCommissionExchangeRateRequest == null || StringUtils.isBlank(queryCommissionExchangeRateRequest.getPolicyNo())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "policyNo 不能为空");
}
if (queryCommissionExchangeRateRequest.getCommissionPeriod() == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "commissionPeriod 不能为空");
}
return Result.success(
commissionService.queryCommissionExchangeRate(
queryCommissionExchangeRateRequest.getPolicyNo(),
queryCommissionExchangeRateRequest.getCommissionPeriod()
)
);
}
}
......@@ -10,8 +10,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.common.enums.ResultCode;
import com.yd.common.result.Result;
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.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.model.CommissionExpected;
......@@ -28,7 +30,10 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
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.web.bind.annotation.*;
import javax.annotation.Resource;
......@@ -36,6 +41,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
......@@ -64,6 +70,8 @@ public class ApiCommissionExpectedController {
private PolicyFollowService policyFollowService;
@Resource
private ApiInsuranceReconciliationCompanyFeignClient companyFeignClient;
@Autowired
private ApiCommissionExpectedService apiCommissionExpectedService;
/**
* 批量新增预计入账
......@@ -184,13 +192,13 @@ public class ApiCommissionExpectedController {
}
/**
* 应收款管理列表查询
* 应收款管理列表查询(旧)
*
* @param commissionExpectedQueryRequest
* @return
*/
@PostMapping("/queryCommissionExpectedByPage")
@Operation(summary = "应收款管理列表查询")
@Operation(summary = "应收款管理列表查询(旧)")
public Result<QueryCommissionExpectedByPageResponse> queryCommissionExpectedByPage(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest) {
long current = commissionExpectedQueryRequest.getPageNo();
long size = commissionExpectedQueryRequest.getPageSize();
......@@ -213,12 +221,44 @@ public class ApiCommissionExpectedController {
}
/**
* 应收款导出
* 应收款管理列表查询(新)
*
* @param commissionExpectedQueryRequest
* @return
*/
@PostMapping("/export")
@PostMapping("/queryCommissionExpectedByPage/new")
@Operation(summary = "应收款管理列表查询(新)")
public Result<QueryCommissionExpectedByPageNewResponse> queryCommissionExpectedByPageNew(
@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest) {
// 统计信息仍基于所有符合条件的主记录
QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService
.getQueryWrapper(commissionExpectedQueryRequest);
List<CommissionExpected> allExpectedList = commissionExpectedService.list(queryWrapper);
List<Long> expectedIds = allExpectedList.stream()
.map(CommissionExpected::getId)
.collect(Collectors.toList());
CommissionExpectedStatisticsVO statisticsNewVO = commissionExpectedService
.getExpectedStatisticsNew(expectedIds);
// 获取混合分页结果
Page<CommissionExpectedNewVO> mixedPage = commissionExpectedService
.getCommissionExpectedVONewPage(commissionExpectedQueryRequest,allExpectedList);
// 组装返回
QueryCommissionExpectedByPageNewResponse response = new QueryCommissionExpectedByPageNewResponse();
response.setExpectedStatisticsVO(statisticsNewVO);
response.setPage(mixedPage);
return Result.success(response);
}
/**
* 应收款导出(旧)
*
* @param commissionExpectedQueryRequest
* @return
*/
@PostMapping("/export/old")
@Operation(summary = "应收款导出")
public void exportCommissionExpected(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest, HttpServletResponse response) throws UnsupportedEncodingException {
if (commissionExpectedQueryRequest == null) {
......@@ -251,6 +291,18 @@ public class ApiCommissionExpectedController {
}
/**
* 应收款导出(新)
*
* @param commissionExpectedQueryRequest
* @return
*/
@PostMapping("/export")
@Operation(summary = "应收款导出")
public void exportCommissionExpectedNew(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest, HttpServletResponse response) throws UnsupportedEncodingException {
apiCommissionExpectedService.exportCommissionExpectedNew(commissionExpectedQueryRequest,response);
}
/**
* 获取保单应收款
*/
@PostMapping("/getExpectedCommissionByProductlaunchId")
......@@ -290,7 +342,13 @@ public class ApiCommissionExpectedController {
@PostMapping("/receivable_report")
@Operation(summary = "应收款报表")
public Result<ReceivableReportResponse> receivableReport(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest) {
//保單持有人(中/英、繁简/大小写)、签单人、转介人名称(主)、受保人(中/英、繁简/大小写)、查询保单号列表
List<String> queryPolicyNoList = policyFollowService.queryPolicyNoList(commissionExpectedQueryRequest.getPolicyHolder(),
commissionExpectedQueryRequest.getSigner(),
commissionExpectedQueryRequest.getBrokerName(),
commissionExpectedQueryRequest.getInsured());
// 构建查询条件
commissionExpectedQueryRequest.setPolicyNoList(queryPolicyNoList);
QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService.getQueryWrapper(commissionExpectedQueryRequest);
// 先查询所有符合条件的记录ID(用于统计)
......@@ -298,7 +356,7 @@ public class ApiCommissionExpectedController {
List<Long> allExpectedIdList = allCommissionExpectedList.stream().map(CommissionExpected::getId).collect(Collectors.toList());
// 查询统计数据(基于所有符合条件的记录)
CommissionExpectedStatisticsVO statisticsVO = commissionExpectedService.getExpectedStatistics(allExpectedIdList);
CommissionExpectedStatisticsVO statisticsVO = commissionExpectedService.getExpectedStatisticsNew(allExpectedIdList);
// 应收款报表分页查询 - 按保单号和期数维度统计
Page<ReceivableReportVO> reportPage = new Page<>(commissionExpectedQueryRequest.getPageNo(), commissionExpectedQueryRequest.getPageSize());
......@@ -307,7 +365,7 @@ public class ApiCommissionExpectedController {
receivableReportPage = commissionExpectedService.receivableReportPage(reportPage, allExpectedIdList);
}
// enrichReceivableReportWithCompanyName(receivableReportPage);
receivableReportPage = convertProductName(receivableReportPage);
receivableReportPage = convertReceivableReport(receivableReportPage);
// 组装返回结果
ReceivableReportResponse response = new ReceivableReportResponse();
response.setStatisticsVO(statisticsVO);
......@@ -315,7 +373,8 @@ public class ApiCommissionExpectedController {
return Result.success(response);
}
public IPage<ReceivableReportVO> convertProductName(IPage<ReceivableReportVO> receivableReportPage) {
public IPage<ReceivableReportVO> convertReceivableReport(IPage<ReceivableReportVO> receivableReportPage) {
if (!org.springframework.util.CollectionUtils.isEmpty(receivableReportPage.getRecords())) {
List<String> policyNoList = receivableReportPage.getRecords().stream().map(ReceivableReportVO::getPolicyNo).collect(Collectors.toList());
List<PolicyFollow> policyFollowList = new ArrayList<>();
......@@ -332,6 +391,17 @@ public class ApiCommissionExpectedController {
vo.setProductName(policyFollow.getProductName());
vo.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
}
//已入账比例(%)>= 预计入账比例(%) 待入账比例和待入账金额归零
//已入账比例(%)
BigDecimal paidRatio = ObjectUtils.defaultIfNull(vo.getPaidRatio(), BigDecimal.ZERO);
//预计入账比例(%)
BigDecimal commissionRatio = ObjectUtils.defaultIfNull(vo.getCommissionRatio(), BigDecimal.ZERO);
if (paidRatio.compareTo(commissionRatio) >= 0) {
//待入账金额(港币)
vo.setUnpaidAmount(BigDecimal.ZERO);
//待入账比例(%)
vo.setUnpaidRatio(BigDecimal.ZERO);
}
return vo;
}).collect(Collectors.toList());
receivableReportPage.setRecords(voList);
......
......@@ -37,6 +37,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
......@@ -123,8 +124,8 @@ public class ApiFortuneController {
existingEntity.setFortunePeriod(updateEntity.getFortunePeriod());
existingEntity.setFortuneTotalPeriod(updateEntity.getFortuneTotalPeriod());
existingEntity.setFortuneName(updateEntity.getFortuneName());
existingEntity.setAmount(updateEntity.getAmount());
existingEntity.setCurrency(updateEntity.getCurrency());
existingEntity.setOriginalAmount(updateEntity.getOriginalAmount());
existingEntity.setOriginalCurrency(updateEntity.getOriginalCurrency());
existingEntity.setBroker(updateEntity.getBroker());
existingEntity.setTeam(updateEntity.getTeam());
existingEntity.setRemark(updateEntity.getRemark());
......@@ -194,7 +195,10 @@ public class ApiFortuneController {
@PostMapping("/download/account")
public Result<Boolean> downloadAccount(@RequestBody FortuneDownloadRequest fortuneDownloadRequest, HttpServletResponse response) throws IOException {
if (CollectionUtils.isEmpty(fortuneDownloadRequest.getFortuneBizIdList())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "请选择要出账的发佣数据");
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "请选择要出账的发佣数据");
}
if (StringUtils.isBlank(fortuneDownloadRequest.getActualPayoutDate())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "请输入出账年月(实)");
}
fortuneService.downloadAccount(fortuneDownloadRequest, response);
......@@ -412,58 +416,74 @@ public class ApiFortuneController {
}
/**
* 修改出账状态
* 分期出账
*
* @param fortuneStatusUpdateRequest
* @param fortuneSplitRequest 分期出账请求
* @return
*/
@PostMapping("/update/status")
@Operation(summary = "修改出账状态")
public Result<Boolean> updateFortuneStatus(@RequestBody FortuneStatusUpdateRequest fortuneStatusUpdateRequest) {
if (fortuneStatusUpdateRequest == null || CollectionUtils.isEmpty(fortuneStatusUpdateRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
@PostMapping("/split")
@Operation(summary = "分期出账")
public Result<Boolean> splitFortune(@RequestBody FortuneSplitRequest fortuneSplitRequest) {
if (fortuneSplitRequest == null || CollectionUtils.isEmpty(fortuneSplitRequest.getFortuneSplitDtoList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "分期出账请求不能为空");
}
return Result.success(fortuneService.updateFortuneStatus(fortuneStatusUpdateRequest));
// 操作数据库
return Result.success(fortuneService.splitFortune(fortuneSplitRequest));
}
/**
* 修改设置出账年月(实)),设置完成后,更新到应付款管理明细中
*
* @param editActualPayoutDateRequest
* @return
*/
@PostMapping("/edit/actual_payout_date")
@Operation(summary = "修改设置出账年月(实),设置完成后,更新到应付款管理明细中")
public Result<Boolean> editActualPayoutDate(@RequestBody EditActualPayoutDateRequest editActualPayoutDateRequest) {
if (editActualPayoutDateRequest == null || StringUtils.isBlank(editActualPayoutDateRequest.getFortuneBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneBizId 不能为空");
}
if (StringUtils.isBlank(editActualPayoutDateRequest.getActualPayoutDate())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "actualPayoutDate 不能为空");
}
return Result.success(fortuneService.editActualPayoutDate(editActualPayoutDateRequest));
}
/**
* 根据 fortuneBizId 获取保单发佣(封装类)
* 修改结算汇率,设置完成后,更新到应付款管理明细中
*
* @param fortuneBizId
* @param editExchangeRateRequest
* @return
*/
// @GetMapping("/get/vo")
// @Operation(summary = "根据 policyBizId 获取保单发佣详情")
// public Result<PolicyFollowVO> getPolicyFollowByPolicyBizId(@RequestParam("fortuneBizId") String fortuneBizId, HttpServletRequest request) {
// if (fortuneBizId == null) {
// return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
// }
// // 查询数据库
// PolicyFollow policyFollow = policyFollowService.getByPolicyBizId(policyBizId);
// if (policyFollow == null) {
// return Result.fail(ErrorCode.NOT_FOUND_ERROR.getCode(), ErrorCode.NOT_FOUND_ERROR.getMessage());
// }
//
// // 获取封装类
// return Result.success(policyFollowService.getPolicyFollowVO(policyFollow));
// }
@PostMapping("/edit/exchange_rate")
@Operation(summary = "修改结算汇率,设置完成后,更新到应付款管理明细中")
public Result<Boolean> editExchangeRate(@RequestBody EditExchangeRateRequest editExchangeRateRequest) {
if (editExchangeRateRequest == null || StringUtils.isBlank(editExchangeRateRequest.getFortuneBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneBizId 不能为空");
}
if (editExchangeRateRequest.getExchangeRate() == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "exchangeRate 不能为空");
}
if (editExchangeRateRequest.getHkdAmount() == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "hkdAmount 不能为空");
}
return Result.success(fortuneService.editExchangeRate(editExchangeRateRequest));
}
/**
* 分页获取保单发佣列表(仅管理员可用)
* 修改出账状态
*
* @param fnaQueryRequest
* @param fortuneStatusUpdateRequest
* @return
*/
// @PostMapping("/list/page")
// public Result<Page<Customer>> listFnaByPage(@RequestBody FnaQueryRequest fnaQueryRequest) {
// long current = fnaQueryRequest.getPageNo();
// long size = fnaQueryRequest.getPageSize();
// // 查询数据库
// Page<Customer> fnaPage = policyFollowService.page(new Page<>(current, size),
// policyFollowService.getQueryWrapper(fnaQueryRequest));
// return Result.success(fnaPage);
// }
@PostMapping("/update/status")
@Operation(summary = "修改出账状态")
public Result<Boolean> updateFortuneStatus(@RequestBody FortuneStatusUpdateRequest fortuneStatusUpdateRequest) {
if (fortuneStatusUpdateRequest == null || CollectionUtils.isEmpty(fortuneStatusUpdateRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
}
return Result.success(fortuneService.updateFortuneStatus(fortuneStatusUpdateRequest));
}
/**
* 出账检核页面-分页获取保单发佣列表(VO)
......
......@@ -27,7 +27,9 @@ import com.yd.csf.api.service.ApiCommissionConditionService;
import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.api.service.ApiPolicyFollowService;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.feign.response.appointment.ApiAppointmentDetailResponse;
import com.yd.csf.feign.response.expectedfortune.ApiGenerateExpectedFortuneResponse;
import com.yd.csf.feign.response.policyfollow.ApiPolicyFollowDetailResponse;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.component.PolicyReportPdfService;
import com.yd.csf.service.dto.*;
......@@ -56,6 +58,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -63,6 +66,7 @@ import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.ParseException;
......@@ -942,4 +946,25 @@ public class ApiPolicyFollowController {
}
return Result.success(policyFollowService.updatePolicySecondHolder(policySecondHolderUpdateRequest));
}
/**
* 根据保单号查询新单跟进详情
* @param policyNo
* @return
*/
@GetMapping("/detail")
public Result<ApiPolicyFollowDetailResponse> detail(@RequestParam(value = "policyNo") String policyNo){
return policyFollowService.detail(policyNo);
}
/**
* 更新-新单跟进投保人和受保人的名字冗余字段
* @return
*/
@PutMapping("/update")
public Result update(){
return policyFollowService.updateTs();
}
}
\ No newline at end of file
......@@ -11,6 +11,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@Builder
@NoArgsConstructor
......@@ -43,6 +45,11 @@ public class ExecuteBillingDto {
private Integer paymentTerm;
/**
* 介绍费占比
*/
private String brokerRatio;
/**
* 保单和转介人信息
*/
private QueryPolicyAndBrokerDto policyAndBrokerDto;
......
......@@ -55,8 +55,8 @@ public class FortuneImportDTO {
entity.setFortunePeriod(data.getFortunePeriod());
entity.setFortuneTotalPeriod(data.getFortuneTotalPeriod());
entity.setFortuneName(data.getFortuneName());
entity.setAmount(data.getAmount());
entity.setCurrency(data.getCurrency());
entity.setOriginalAmount(data.getAmount());
entity.setOriginalCurrency(data.getCurrency());
entity.setBroker(data.getBroker());
entity.setTeam(data.getTeam());
entity.setRemark(data.getRemark());
......
......@@ -116,6 +116,11 @@ public class GenerateExpectedFortuneDto {
private BigDecimal paymentPremium;
/**
* 介绍费占比
*/
private String brokerRatio;
/**
* 获得积分业务员绑定的基本法列表对应计算值
*/
private List<AlgorithmResDto> algorithmResDtoList;
......
package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.service.vo.CommissionExpectedNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import com.yd.csf.service.vo.CommissionExpectedVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "查询预计来佣分页响应")
public class QueryCommissionExpectedByPageNewResponse {
/**
* 预计来佣统计信息
*/
// @Schema(description = "预计来佣统计信息")
private CommissionExpectedStatisticsVO expectedStatisticsVO;
/**
* 预计来佣分页列表
*/
// @Schema(description = "预计来佣分页列表")
private Page<CommissionExpectedNewVO> page;
}
package com.yd.csf.api.service;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
public interface ApiCommissionExpectedService {
void exportCommissionExpectedNew(CommissionExpectedQueryRequest commissionExpectedQueryRequest, HttpServletResponse response) throws UnsupportedEncodingException;
}
......@@ -11,7 +11,9 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.CodeGenerator;
import com.yd.common.utils.EnglishTextUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.service.*;
import com.yd.csf.feign.dto.appointment.*;
......@@ -946,6 +948,9 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
policyInsurant.setPolicyBizId(policyBizId);
policyInsurant.setPolicyInsurantBizId(RandomStringGenerator.generateBizId16("policy_insurant"));
policyInsurant.setName(apiInsurantInfoDto.getNameCn());
policyInsurant.setNameEn(apiInsurantInfoDto.getNamePyEn());
policyInsurant.setNameSc(ChineseTextConverter.traditionalToSimplified(apiInsurantInfoDto.getNameCn()));
policyInsurant.setNameEnLc(EnglishTextUtil.toLowerCaseSafe(apiInsurantInfoDto.getNamePyEn()));
return policyInsurantService.saveOrUpdate(policyInsurant);
}
......@@ -963,6 +968,9 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
policyPolicyholder.setPolicyBizId(policyBizId);
policyPolicyholder.setPolicyPolicyholderBizId(RandomStringGenerator.generateBizId16("policy_policyholder"));
policyPolicyholder.setName(apiPolicyholderInfoDto.getNameCn());
policyPolicyholder.setNameEn(apiPolicyholderInfoDto.getNamePyEn());
policyPolicyholder.setNameSc(ChineseTextConverter.traditionalToSimplified(apiPolicyholderInfoDto.getNameCn()));
policyPolicyholder.setNameEnLc(EnglishTextUtil.toLowerCaseSafe(apiPolicyholderInfoDto.getNamePyEn()));
return policyPolicyholderService.saveOrUpdate(policyPolicyholder);
}
......
......@@ -317,8 +317,8 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
continue;
}
Fortune fortune = new Fortune();
//发佣金额 -> 计算值 - sqlAlgorithmResultDtoList集合里面的计算值和值
fortune.setAmount(algorithmResDto.getCalculatedValue());
//基本法发佣金额 -> 计算值 - sqlAlgorithmResultDtoList集合里面的计算值和值
fortune.setRuleAmount(algorithmResDto.getCalculatedValue());
//保单发佣批次ID
fortune.setBatchBizId(fortuneDto.getBatchBizId());
//转介人姓名 (获得积分的业务员)
......@@ -331,8 +331,8 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
//基本法项目配置表唯一业务ID
fortune.setRuleItemBizId(algorithmResDto.getRuleItemBizId());
//发佣币种
fortune.setCurrency(fortuneDto.getCurrency());
//基本法发佣币种
fortune.setRuleCurrency(fortuneDto.getCurrency());
//发佣期数
fortune.setFortunePeriod(fortuneDto.getFortunePeriod());
//发佣总期数
......
package com.yd.csf.api.service.impl;
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.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.common.exception.BusinessException;
import com.yd.csf.api.service.ApiCommissionExpectedService;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.vo.CommissionExpectedExportDTO;
import com.yd.csf.service.vo.CommissionExpectedExportNewDTO;
import com.yd.csf.service.vo.CommissionExpectedNewVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiCommissionExpectedServiceImpl implements ApiCommissionExpectedService {
@Resource
private PolicyFollowService policyFollowService;
@Resource
private CommissionExpectedService commissionExpectedService;
/**
* 应收款导出(新)
*
* @param commissionExpectedQueryRequest
* @return
*/
@Override
public void exportCommissionExpectedNew(CommissionExpectedQueryRequest commissionExpectedQueryRequest, HttpServletResponse response) throws UnsupportedEncodingException {
if (commissionExpectedQueryRequest == null) {
throw new RuntimeException("查询参数不能为空");
}
// 设置响应头
String fileName = URLEncoder.encode("应收款管理数据", "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
//保單持有人(中/英、繁简/大小写)、签单人、转介人名称(主)、受保人(中/英、繁简/大小写)、查询保单号列表
List<String> queryPolicyNoList = policyFollowService.queryPolicyNoList(commissionExpectedQueryRequest.getPolicyHolder(),
commissionExpectedQueryRequest.getSigner(),
commissionExpectedQueryRequest.getBrokerName(),
commissionExpectedQueryRequest.getInsured());
// 构建查询条件
commissionExpectedQueryRequest.setPolicyNoList(queryPolicyNoList);
QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService.getQueryWrapper(commissionExpectedQueryRequest);
// 先查询所有符合条件的记录列表
List<CommissionExpected> allCommissionExpectedList = commissionExpectedService.list(queryWrapper);
if (CollectionUtils.isEmpty(allCommissionExpectedList)) {
throw new BusinessException("无导出数据");
}
commissionExpectedQueryRequest.setPageNo(1);
commissionExpectedQueryRequest.setPageSize(99999999);
Page<CommissionExpectedNewVO> page = commissionExpectedService.getCommissionExpectedVONewPage(commissionExpectedQueryRequest,allCommissionExpectedList);
log.info("应收款导出=>查询所有符合条件的记录列表=>Page<CommissionExpectedNewVO>:{}", JSON.toJSONString(page));
// 转换为导出DTO
List<CommissionExpectedExportNewDTO> exportDataList = page.getRecords().stream()
.map(CommissionExpectedExportNewDTO::convertToExportDTO)
.collect(Collectors.toList());
log.info("应收款导出=>转换为导出DTO=>exportDataList:{}", JSON.toJSONString(exportDataList));
// 使用EasyExcel导出
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), CommissionExpectedExportNewDTO.class).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("应收款数据").build();
excelWriter.write(exportDataList, writeSheet);
} catch (Exception e) {
throw new RuntimeException("导出应收款数据失败", e);
}
}
}
......@@ -14,6 +14,8 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.EnglishTextUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.async.ApiExpectedFortuneAsyncService;
import com.yd.csf.api.service.ApiExpectedFortuneService;
......@@ -129,6 +131,19 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
*/
@Override
public Result<IPage<ApiPremiumReconciliationPageResponse>> page(ApiPremiumReconciliationPageRequest request) {
// 投保人-中文转简体
String policyHolderNameSc = ChineseTextConverter.traditionalToSimplified(request.getPolicyHolder());
// 投保人-英文转小写
String policyHolderNameEnLc = EnglishTextUtil.toLowerCase(request.getPolicyHolder());
// 受保人-中文转简体
String insuredNameSc = ChineseTextConverter.traditionalToSimplified(request.getPolicyHolder());
// 受保人-英文转小写
String insuredNameEnLc = EnglishTextUtil.toLowerCase(request.getPolicyHolder());
request.setPolicyHolderNameSc(policyHolderNameSc);
request.setPolicyHolderNameEnLc(policyHolderNameEnLc);
request.setInsuredNameSc(insuredNameSc);
request.setInsuredNameEnLc(insuredNameEnLc);
Page<ApiPremiumReconciliationPageResponse> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiPremiumReconciliationPageResponse> iPage = iPremiumReconciliationService.page(page, request);
......
......@@ -6,6 +6,7 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.common.utils.UrlPathExtractor;
import com.yd.csf.api.service.ApiPremiumRemittanceFileService;
import com.yd.csf.api.service.ApiPremiumRemittanceService;
import com.yd.csf.feign.dto.premiumremittance.ApiPremiumRemittanceDto;
......@@ -15,6 +16,9 @@ import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationP
import com.yd.csf.service.dto.PremiumRemittanceDto;
import com.yd.csf.service.model.PremiumRemittance;
import com.yd.csf.service.service.IPremiumRemittanceService;
import com.yd.oss.feign.client.ApiOssFileFeignClient;
import com.yd.oss.feign.request.ApiOssFileListRequest;
import com.yd.oss.feign.response.ApiOssFileListResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
......@@ -38,6 +42,9 @@ public class ApiPremiumRemittanceServiceImpl implements ApiPremiumRemittanceServ
@Autowired
private ApiPremiumRemittanceFileService apiPremiumRemittanceFileService;
@Autowired
private ApiOssFileFeignClient apiOssFileFeignClient;
/**
* 分页列表查询-保费对账汇款记录信息
* @param request
......@@ -176,9 +183,41 @@ public class ApiPremiumRemittanceServiceImpl implements ApiPremiumRemittanceServ
ApiPremiumRemittanceDto remittanceDto = new ApiPremiumRemittanceDto();
BeanUtils.copyProperties(dto,remittanceDto);
//支付凭证列表
remittanceDto.setPaymentVoucherList(StringUtils.isNotBlank(dto.getPaymentVoucher()) ? Arrays.asList(dto.getPaymentVoucher().split(";").clone()) : new ArrayList<>());
ApiOssFileListRequest request = new ApiOssFileListRequest();
if (StringUtils.isNotBlank(dto.getPaymentVoucher())) {
List<String> fileKeyList = UrlPathExtractor.extractPaths(dto.getPaymentVoucher());
request.setFileKeyList(fileKeyList);
Result<List<ApiOssFileListResponse>> result = apiOssFileFeignClient.list(request);
if (!CollectionUtils.isEmpty(result.getData())) {
List<ApiPremiumRemittanceFileDto> paymentVoucherDtoList = result.getData().stream().map(d -> {
ApiPremiumRemittanceFileDto fileDto = new ApiPremiumRemittanceFileDto();
fileDto.setFileName(d.getOriginalName());
fileDto.setFileUrl(d.getFileUrl());
fileDto.setFileType(d.getFileType());
return fileDto;
}).collect(Collectors.toList());
remittanceDto.setPaymentVoucherDtoList(paymentVoucherDtoList);
}
}
// remittanceDto.setPaymentVoucherList(StringUtils.isNotBlank(dto.getPaymentVoucher()) ? Arrays.asList(dto.getPaymentVoucher().split(";").clone()) : new ArrayList<>());
//账户证明列表
remittanceDto.setAccountVerificationList(StringUtils.isNotBlank(dto.getAccountVerification()) ? Arrays.asList(dto.getAccountVerification().split(";").clone()) : new ArrayList<>());
ApiOssFileListRequest request1 = new ApiOssFileListRequest();
if (StringUtils.isNotBlank(dto.getAccountVerification())) {
List<String> fileKeyList = UrlPathExtractor.extractPaths(dto.getAccountVerification());
request1.setFileKeyList(fileKeyList);
Result<List<ApiOssFileListResponse>> result = apiOssFileFeignClient.list(request1);
if (!CollectionUtils.isEmpty(result.getData())) {
List<ApiPremiumRemittanceFileDto> accountVerificationDtoList = result.getData().stream().map(d -> {
ApiPremiumRemittanceFileDto fileDto = new ApiPremiumRemittanceFileDto();
fileDto.setFileName(d.getOriginalName());
fileDto.setFileUrl(d.getFileUrl());
fileDto.setFileType(d.getFileType());
return fileDto;
}).collect(Collectors.toList());
remittanceDto.setAccountVerificationDtoList(accountVerificationDtoList);
}
}
// remittanceDto.setAccountVerificationList(StringUtils.isNotBlank(dto.getAccountVerification()) ? Arrays.asList(dto.getAccountVerification().split(";").clone()) : new ArrayList<>());
//其他资料列表
List<ApiPremiumRemittanceFileDto> fileDtoList = apiPremiumRemittanceFileService.apiPremiumRemittanceFileDtoList(dto.getPremiumRemittanceBizId());
......
......@@ -133,6 +133,21 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
if (fortuneAccount == null) {
throw new BusinessException("出账记录不存在");
}
//统计保存入参的薪资拆分应发记录原币种金额金额之和
if (CollectionUtils.isNotEmpty(request.getApiSalarySplitBatchSaveDtoList())) {
//入参的薪资拆分应发记录原币种金额金额之和
BigDecimal total = request.getApiSalarySplitBatchSaveDtoList().stream()
.map(ApiSalarySplitBatchSaveDto::getFromAmount)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
//原币种总金额
BigDecimal fortuneAmount = fortuneAccount.getHkdAmount() != null ? fortuneAccount.getHkdAmount() : BigDecimal.ZERO;
//入参的薪资拆分应发记录原币种金额金额之和不能大于原币种总金额
if (fortuneAmount.compareTo(total) < 0) {
throw new BusinessException("拆分的原币种金额之和不能大于原币种总金额");
}
}
//薪资拆分应发记录-先删除后新增
iSalarySplitService.deleteByFortuneAccountBizId(request.getFortuneAccountBizId());
......
......@@ -43,7 +43,7 @@ public class ApiSalarySplitSummaryExcelDto {
@Excel(name = "本期总出账金额(原币种)", orderNum = "12")
private BigDecimal hkdAmount;
@Excel(name = "出账记录业务id", orderNum = "13")
private String fortuneAccountBizId;
@Excel(name = "出账业务编号", orderNum = "13")
private String businessNo;
}
......@@ -86,6 +86,18 @@ public class ApiPremiumRemittanceDto {
private List<String> accountVerificationList;
/**
* 支付凭证列表
*/
// @NotEmpty(message = "支付凭证列表不能为空")
private List<ApiPremiumRemittanceFileDto> paymentVoucherDtoList;
/**
* 账户证明列表
*/
// @NotEmpty(message = "账户证明列表不能为空")
private List<ApiPremiumRemittanceFileDto> accountVerificationDtoList;
/**
* 其他资料列表
*/
private List<ApiPremiumRemittanceFileDto> apiPremiumRemittanceFileDtoList;
......
......@@ -24,6 +24,11 @@ public class ApiSalarySplitSummaryPageDto {
private String fortuneAccountBizId;
/**
* 出账业务编号(出账年月 + 转介人内部编号(后6位)(如无,用0补齐)+流水号(6位))
*/
private String businessNo;
/**
* 转介人名称
*/
private String brokerName;
......
......@@ -59,4 +59,12 @@ public class ApiExpectedFortunePageRequest extends PageDto {
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
private String fortuneBizType;
/**
* 保單持有人(中/英)
*/
private String policyHolder;
private List<String> PolicyNoList;
}
......@@ -76,10 +76,16 @@ public class ExpectedFortuneAddRequest {
private String fortuneType;
/**
* 出账金额
* 结算汇率
*/
@Schema(description = "出账金额")
private BigDecimal amount;
@Schema(description = "结算汇率")
private BigDecimal exchangeRate;
/**
* 出账金额 单位:港币
*/
@Schema(description = "出账金额 单位:港币")
private BigDecimal hkdAmount;
/**
* 出账币种
......@@ -107,4 +113,9 @@ public class ExpectedFortuneAddRequest {
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
private String status;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
}
......@@ -2,7 +2,9 @@ package com.yd.csf.feign.request.premiumreconciliation;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.yd.common.dto.PageDto;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.CustomLocalDateTimeDeserializer;
import com.yd.common.utils.EnglishTextUtil;
import lombok.Data;
import java.time.LocalDateTime;
......@@ -35,11 +37,16 @@ public class ApiPremiumReconciliationPageRequest extends PageDto {
private String appointmentNo;
/**
* 保單持有人(投保人)
* 保單持有人(投保人)(中文名/英文名)(繁简/大小写)
*/
private String policyHolder;
/**
* 受保人(保单表)(中文名/英文名)(繁简/大小写)
*/
private String insured;
/**
* 缴费方式
*/
private String paymentMethod;
......@@ -59,6 +66,15 @@ public class ApiPremiumReconciliationPageRequest extends PageDto {
*/
private String reconciliationType;
// 投保人-中文转简体
private String policyHolderNameSc;
// 投保人-英文转小写
private String policyHolderNameEnLc;
// 受保人-中文转简体
private String insuredNameSc;
// 受保人-英文转小写
private String insuredNameEnLc;
/**
* 付款日期
*/
......
......@@ -236,9 +236,15 @@ public class ApiExpectedFortunePageResponse {
private LocalDateTime createTime;
/**
* 更新时间
* 创建人名称
*/
private String creatorName;
/**
* 更新时间(操作时间)
*/
@Schema(description = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
/**
......
package com.yd.csf.feign.response.policyfollow;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ApiPolicyFollowDetailResponse {
/**
* id
*/
private Long id;
/**
* 新单跟进唯一业务ID
*/
private String policyBizId;
/**
* 保单号
*/
private String policyNo;
/**
* FNA 业务ID
*/
private String fnaBizId;
/**
* 预约信息主表唯一业务ID
*/
private String appointmentBizId;
/**
* 预约编号
*/
private String appointmentNo;
/**
* 客户业务id
*/
private String customerBizId;
/**
* 递交日期
*/
private Date submitDate;
/**
* 客户名称
*/
private String customerName;
/**
* 签单日期
*/
private Date signDate;
/**
* 签单人
*/
private String signer;
/**
* 签单人业务id
*/
private String signerBizId;
/**
* 签单人执业编号
*/
private String practiceCode;
/**
* 签单地点
*/
private String signLocation;
/**
* 缮发日期
*/
private Date issueDate;
/**
* 冷静期结束日期
*/
private Date coolingOffEndDate;
/**
* 冷静期天数
*/
private Integer coolingOffDays;
/**
* 核保日期
*/
private Date underwritingDate;
/**
* 生效日期
*/
private Date effectiveDate;
/**
* 续保日期
*/
private Date renewalDate;
/**
* 保单回执日期
*/
private Date receiptDate;
/**
* 回执状态
*/
private String receiptStatus;
/**
* 是否开通直接支付
*/
private Integer directPaymentEnabled;
/**
* 供款年期
*/
private Object issueNumber;
/**
* 保障期限
*/
private String guaranteePeriod;
/**
* 保额(重疾险)
*/
private BigDecimal sumInsured;
/**
* 付款频率(字典)
*/
private String paymentFrequency;
/**
* 每期保费
*/
private BigDecimal eachIssuePremium;
/**
* 是否预缴: 0-否, 1-是
*/
private Integer isPrepay;
/**
* 是否追溯: 0-否, 1-是
*/
private Integer isTraceable;
/**
* 回溯日期
*/
private Date retroactiveDate;
/**
* 预缴年期
*/
private Integer prepaidTerm;
/**
* 预付额
*/
private String prepaidAmount;
/**
* 折扣后预付额
*/
private String prepaidAmountAfterDiscount;
/**
* 保单截止日期
*/
private Date policyExpirationDate;
/**
* 缴费编号
*/
private String paymentNumber;
/**
* 产品上架信息表唯一业务ID
*/
private String productLaunchBizId;
/**
* 产品名称
*/
private String productName;
/**
* 产品险种
*/
private String productCate;
/**
* 产品险种代码
*/
private String categoryCode;
/**
* 产品险种业务 id
*/
private String insuranceCategoryBizId;
/**
* 保险公司
*/
private String insuranceCompany;
/**
* 保险公司业务id
*/
private String insuranceCompanyBizId;
/**
* 对账公司
*/
private String reconciliationCompany;
/**
* 对账公司编码
*/
private String reconciliationCompanyCode;
/**
* 对账公司业务id
*/
private String reconciliationCompanyBizId;
/**
* 新单跟进状态
*/
private String status;
/**
* 下一步跟进状态列表
*/
private String nextStatusList;
/**
* 保單持有人
*/
private String policyHolder;
/**
* 受保人
*/
private String insured;
/**
* 受保人业务id
*/
private String insuredBizId;
/**
* 受保人年龄
*/
private Integer insuredAge;
/**
* 宽限期
*/
private Integer gracePeriod;
/**
* 是否参加递增保障权益: 0-否, 1-是(字典)
*/
private Integer isJoin;
/**
* 保单币种
*/
private String policyCurrency;
/**
* 首期付款方式(字典)
*/
private String initialPaymentMethod;
/**
* 首期保费(不含徽费,预缴保费)
*/
private BigDecimal initialPremium;
/**
* 首期已缴保费
*/
private BigDecimal initialPremiumPaid;
/**
* 首期待缴保费
*/
private BigDecimal initialPremiumDue;
/**
* 首期缴费总额
*/
private BigDecimal initialPremiumTotal;
/**
* 首期缴费状态
*/
private String initialPaymentStatus;
/**
* 首期保费优惠金额
*/
private BigDecimal initialPremiumDiscount;
/**
* 寄送方式 字典值:1-自提 2-快递
*/
private String mailingMethod;
/**
* 续期付款方式(字典)
*/
private String renewalPaymentMethod;
/**
* 红利方式(字典)
*/
private String dividendDistributionMethod;
/**
* 快递单号
*/
private String deliveryNo;
/**
* 专业投资者: Yes/No
*/
private String professionalInvestor;
/**
* 邮寄物品
*/
private String mailingItem;
/**
* 保单征费
*/
private String policyLevy;
/**
* 最晚缴费日期
*/
private Date latestPaymentDate;
/**
* 经纪公司签收日期
*/
private Date brokerSignDate;
/**
* 保险公司寄出日期
*/
private Date insurerMailingDate;
/**
* 客户签收日期
*/
private Date customerSignDate;
/**
* 附件地址列表 逗号隔开
*/
private String attachments;
/**
* 通用备注
*/
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
private Integer isDeleted;
/**
* 创建人ID
*/
private String creatorId;
/**
* 更新人ID
*/
private String updaterId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 保单类型: 1-电子, 2-纸质
*/
private String policyType;
}
......@@ -85,16 +85,26 @@ public class ApiPremiumReconciliationPageResponse {
private String payingBank;
/**
* 保單持有人(投保人,保单表)
* 保單持有人(投保人,保单表)(中文名)
*/
private String policyHolder;
/**
* 受保人(保单表)
* 保單持有人(投保人,保单表)(英文名)
*/
private String policyHolderEn;
/**
* 受保人(保单表)(中文名)
*/
private String insured;
/**
* 受保人(保单表)(英文名)
*/
private String insuredEn;
/**
* 转介人名称(保单转介人表,多个分号分隔)
*/
private String brokerName;
......
......@@ -51,7 +51,7 @@ public class CsfMybatisPlusConfig {
if (authUserDto != null) {
//自动注入创建人和创建用户名
this.strictInsertFill(metaObject, "creatorId", String.class, authUserDto.getUserBizId());
this.strictInsertFill(metaObject, "creatorName", String.class, authUserDto.getUsername());
this.strictInsertFill(metaObject, "creatorName", String.class, authUserDto.getRealName());
}
}
......@@ -68,7 +68,7 @@ public class CsfMybatisPlusConfig {
if (authUserDto != null) {
//自动注入更新人和更新用户名
this.strictUpdateFill(metaObject, "updaterId", String.class, authUserDto.getUserBizId());
this.strictUpdateFill(metaObject, "updaterName", String.class, authUserDto.getUsername());
this.strictUpdateFill(metaObject, "updaterName", String.class, authUserDto.getRealName());
}
}
};
......
......@@ -5,6 +5,8 @@ import com.yd.csf.service.dto.PolicyReportData;
import com.yd.csf.service.model.PolicyFollow;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author Zhang Jianan
* @description 针对表【policy_follow(新单跟进表)】的数据库操作Mapper
......@@ -14,6 +16,15 @@ import org.apache.ibatis.annotations.Param;
public interface PolicyFollowMapper extends BaseMapper<PolicyFollow> {
PolicyReportData queryPolicyReportData(@Param("policyBizId") String policyBizId);
List<String> queryPolicyNoList(
@Param("policyHolderSc") String policyHolderSc,
@Param("policyHolderEnLc") String policyHolderEnLc,
@Param("signer") String signer,
@Param("brokerName") String brokerName,
@Param("insuredSc") String insuredSc,
@Param("insuredEnLc") String insuredEnLc
);
}
......
......@@ -94,6 +94,12 @@ public class CommissionExpectedAddDto {
private BigDecimal amount;
/**
* 结算汇率
*/
@Schema(description = "结算汇率")
private BigDecimal exchangeRate;
/**
* 入账日 (估)
*/
@Schema(description = "入账日 (估) format:yyyy-MM-dd")
......
......@@ -81,4 +81,28 @@ public class CommissionExpectedQueryRequest extends PageDto {
*/
@Schema(description = "转介人所属团队业务ID")
private String teamBizId;
/**
* 保單持有人(中/英、繁简/大小写)
*/
private String policyHolder;
/**
* 受保人(中/英、繁简/大小写)
*/
@Schema(description = "受保人")
private String insured;
/**
* 签单人
*/
private String signer;
/**
* 转介人名称(主)
*/
private String brokerName;
private List<String> policyNoList;
}
......@@ -18,7 +18,7 @@ public class CustomerQueryRequest extends PageDto implements Serializable {
/**
* 客户名称
*/
@Schema(description = "客户名称")
@Schema(description = "客户名称(中文/英文,繁简/大小写)")
private String name;
/**
......
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class EditActualPayoutDateRequest {
@Schema(description = "出账业务ID", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneBizId;
@Schema(description = "实际出账年月(实)", requiredMode = Schema.RequiredMode.REQUIRED)
private String actualPayoutDate;
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class EditExchangeRateRequest {
@Schema(description = "fortuneBizId", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneBizId;
/**
* 保单币种金额
*/
@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 exchangeRate;
/**
* 原币种
*/
@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;
}
package com.yd.csf.service.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema;
......@@ -69,6 +71,12 @@ public class FnaQueryRequest extends PageDto implements Serializable {
private String policyBizId;
/**
* 创建人名称
*/
@Schema(description = "创建人名称")
private String creatorName;
/**
* 保单号
*/
@Schema(description = "保单号")
......
......@@ -6,6 +6,7 @@ import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -32,6 +33,8 @@ public class FortuneAccountExportDTO implements Serializable {
private List<Fortune> fortuneList;
private LocalDate actualPayoutDate;
// 动态字段,用于存储不同的fortune项目
private Map<String, BigDecimal> fortuneAmounts = new HashMap<>();
......
......@@ -83,16 +83,64 @@ public class FortuneAddRequest implements Serializable {
private String fortuneType;
/**
* 出账金额
* 保单币种金额
*/
@Schema(description = "出账金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal amount;
@Schema(description = "保单币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal ruleAmount;
/**
* 出账币种
* 保单币种
*/
@Schema(description = "出账币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String currency;
@Schema(description = "保单币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String ruleCurrency;
/**
* 保单币种→港币汇率(入账检核汇率)
*/
@Schema(description = "保单币种→港币汇率(入账检核汇率)", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal exchangeRate;
/**
* 原币种
*/
@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;
/**
* 出账日期
......
......@@ -10,4 +10,7 @@ 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;
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class FortuneSplitDto {
/**
* 出账比例
*/
@Schema(description = "出账比例", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal splitRatio;
/**
* 保单币种金额
*/
@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 exchangeRate;
/**
* 原币种
*/
@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 = "出账年月(估)", requiredMode = Schema.RequiredMode.REQUIRED)
private String payoutYearMonth;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class FortuneSplitRequest implements Serializable {
/**
* 保单出账业务id
*/
@Schema(description = "保单出账业务id", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneBizId;
/**
* 分期出账列表
*/
@Schema(description = "分期出账列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<FortuneSplitDto> fortuneSplitDtoList;
private static final long serialVersionUID = 1L;
}
......@@ -164,10 +164,10 @@ public class PolicyFollowDto implements Serializable {
@Schema(description = "下一步跟进状态列表")
private String nextStatusList;
@Schema(description = "保單持有人")
@Schema(description = "保單持有人(中文)")
private String policyHolder;
@Schema(description = "受保人")
@Schema(description = "受保人(中文)")
private String insured;
@Schema(description = "受保人业务id")
......
......@@ -85,5 +85,26 @@ public class PolicyFollowQueryRequest extends PageDto implements Serializable {
@Schema(description = "缴费年期")
private Integer issueNumber;
/**
* 保單持有人(中(繁/简)/英文(大小写))
*/
private String policyHolder;
/**
* 受保人(中(繁/简)/英文(大小写))
*/
private String insured;
/**
* 签单人
*/
private String signer;
/**
* 转介人名称
*/
private String brokerName;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class QueryCommissionExchangeRateRequest {
@Schema(description = "保单号", requiredMode = Schema.RequiredMode.REQUIRED)
private String policyNo;
@Schema(description = "佣金期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer commissionPeriod;
}
......@@ -27,4 +27,9 @@ public class QueryPolicyBrokerDto {
* 转介人业务ID(客户端用户表唯一业务ID)
*/
private String brokerBizId;
/**
* 转介人名称
*/
private String brokerName;
}
......@@ -34,11 +34,21 @@ public class Customer implements Serializable {
private String nameCn;
/**
* 姓名-中文(简体)
*/
private String nameSc;
/**
* 姓名-(拼音/英文,通过中文自动加载全部大写的拼音)
*/
private String namePyEn;
/**
* 姓名-英文(大小写)
*/
private String nameEnLc;
/**
* 证件类型(字典,下拉选择)
*/
private String documentType;
......
......@@ -43,6 +43,12 @@ public class ExpectedFortune implements Serializable {
private String fortuneBizType;
/**
* 是否拆分出来的出账 1-是 0-否 2-拆分的原纪录
*/
@TableField("is_part")
private Integer isPart;
/**
* 应付款编号
*/
@TableField("payable_no")
......@@ -144,17 +150,18 @@ public class ExpectedFortune implements Serializable {
@TableField("standard_amount")
private BigDecimal standardAmount;
// ========== 保单币种及金额(基本法币种) ==========
/**
* 实际发佣金额(实际发佣金额 = 标准发佣金额 * 转介人介绍费占比)
* 保单币种金额(保单币种金额 = 标准发佣金额 * 转介人介绍费占比)
*/
@TableField("amount")
private BigDecimal amount;
@TableField("rule_amount")
private BigDecimal ruleAmount;
/**
* 发佣币种
* 保单币种
*/
@TableField("currency")
private String currency;
@TableField("rule_currency")
private String ruleCurrency;
/**
* 出账状态 0=待出账 1=可出帐 2=可出帐,待检核 3=部分出账 4=保留 5=已失效 6=可出账, 已检核 7=未找到当前预计发佣对应的来佣 字典值: csf_expected_fortune_status
......@@ -169,12 +176,6 @@ public class ExpectedFortune implements Serializable {
private String statusDesc;
/**
* 本次出账金额
*/
// @TableField("current_payment_amount")
// private BigDecimal currentPaymentAmount;
/**
* 预计出账日期
*/
@TableField("payout_date")
......@@ -187,11 +188,30 @@ public class ExpectedFortune implements Serializable {
private LocalDate actualPayoutDate;
/**
* 默认结算汇率
* 默认保单币种汇率
*/
@TableField("default_exchange_rate")
private BigDecimal defaultExchangeRate;
// ========== 原币种及金额 ==========
@TableField("original_currency")
private String originalCurrency; // 原币种
@TableField("original_amount")
private BigDecimal originalAmount; // 原币种金额
@TableField("original_to_hkd_rate")
private BigDecimal originalToHkdRate; // 原币→港币汇率
// ========== 发放币种及金额 ==========
@TableField("payout_currency")
private String payoutCurrency; // 发放币种
@TableField("payout_amount")
private BigDecimal payoutAmount; // 发放币种金额
@TableField("hkd_to_payout_rate")
private BigDecimal hkdToPayoutRate; // 港币→发放币汇率
/**
* 港币预计出账金额
*/
......@@ -261,10 +281,16 @@ public class ExpectedFortune implements Serializable {
/**
* 创建人ID
*/
@TableField(value = "creator_id", fill = FieldFill.INSERT)
@TableField(value = "creator_id")
private String creatorId;
/**
* 创建人名称
*/
@TableField(value = "creator_name")
private String creatorName;
/**
* 更新人ID
*/
@TableField(value = "updater_id", fill = FieldFill.UPDATE)
......
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
......@@ -129,11 +126,23 @@ public class Fna implements Serializable {
private String creatorId;
/**
* 创建人名称
*/
@TableField(value = "creator_name", fill = FieldFill.INSERT)
private String creatorName;
/**
* 更新人ID
*/
private String updaterId;
/**
* 更新人名称
*/
@TableField(value = "updater_name", fill = FieldFill.UPDATE)
private String updaterName;
/**
* 创建时间
*/
private Date createTime;
......
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import lombok.Data;
/**
* 保单出账
* 保单发佣
*
* @TableName fortune
*/
@TableName(value = "fortune")
@Data
public class Fortune implements Serializable {
public class Fortune {
/**
* serial id
*/
......@@ -28,7 +28,12 @@ public class Fortune implements Serializable {
private String expectedFortuneBizId;
/**
* 检核年月
* 应付账款编号
*/
private String payableNo;
/**
* 检核年月 yyyy-MM
*/
private String reconciliationYearMonth;
......@@ -38,22 +43,22 @@ public class Fortune implements Serializable {
private String fortuneBizType;
/**
* 是否部分出账拆分出来的出账记录 0=No, 1=Yes
* 是否拆分出来的出账 1-是 0-否 2-拆分的原纪录
*/
private Integer isPart;
/**
* 保单出账批次ID
* 保单发佣批次ID
*/
private String batchBizId;
/**
* 保单出账业务id
* 保单发佣业务id
*/
private String fortuneBizId;
/**
* 来佣保单业务id
* 保单来佣业务id
*/
private String commissionBizId;
......@@ -73,12 +78,12 @@ public class Fortune implements Serializable {
private String policyCurrency;
/**
* 出账期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
private Integer fortunePeriod;
/**
* 出账总期数
* 发佣总期数
*/
private Integer fortuneTotalPeriod;
......@@ -118,26 +123,56 @@ public class Fortune implements Serializable {
private String fortuneName;
/**
* 出账类型
* 发佣类型
*/
private String fortuneType;
/**
* 出账金额
* 保单币种金额
*/
private BigDecimal amount;
private BigDecimal ruleAmount;
/**
* 出账币种
* 保单币种
*/
private String currency;
private String ruleCurrency;
/**
* 结算汇率
* 保单币种→港币汇率(入账检核汇率)
*/
private BigDecimal exchangeRate;
/**
* 原币种
*/
private String originalCurrency;
/**
* 原币种金额
*/
private BigDecimal originalAmount;
/**
* 原币种→港币汇率
*/
private BigDecimal originalToHkdRate;
/**
* 发放币种
*/
private String payoutCurrency;
/**
* 发放币种金额
*/
private BigDecimal payoutAmount;
/**
* 港币→发放币种汇率
*/
private BigDecimal hkdToPayoutRate;
/**
* 港币金额
*/
private BigDecimal hkdAmount;
......@@ -153,7 +188,7 @@ public class Fortune implements Serializable {
private BigDecimal currentPaymentHkdAmount;
/**
* 本出账比例
* 本出账比例
*/
private BigDecimal currentPaymentRatio;
......@@ -173,12 +208,12 @@ public class Fortune implements Serializable {
private LocalDate actualPayoutDate;
/**
* 检核人
* 检核人
*/
private String reconciliationOperator;
/**
* 出账数据业务ID
* 出账记录业务ID
*/
private String fortuneAccountBizId;
......@@ -193,7 +228,7 @@ public class Fortune implements Serializable {
private BigDecimal taxAmount;
/**
* 税后出账
* 税后发佣
*/
private BigDecimal netAmount;
......@@ -253,6 +288,4 @@ public class Fortune implements Serializable {
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -28,6 +28,12 @@ public class FortuneAccount implements Serializable {
private String fortuneAccountBizId;
/**
* 出账业务编号(出账年月 + 转介人内部编号(后6位)(如无,用0补齐)+流水号(6位))
*/
@TableField("business_no")
private String businessNo;
/**
* 转介人
*/
private String broker;
......
......@@ -64,11 +64,21 @@ public class PolicyInsurant implements Serializable {
private String name;
/**
* 名字-简体(入库名字统一转换简体,方便查询)
*/
private String nameSc;
/**
* 名字-英文
*/
private String nameEn;
/**
* 名字-英文-小写(入库名字英文统一转换小写,方便查询)
*/
private String nameEnLc;
/**
* 性别(字典)
*/
private String gender;
......
......@@ -59,11 +59,21 @@ public class PolicyPolicyholder implements Serializable {
private String name;
/**
* 名字-简体(入库名字统一转换简体,方便查询)
*/
private String nameSc;
/**
* 名字-英文
*/
private String nameEn;
/**
* 名字-英文-小写(入库名字英文统一转换小写,方便查询)
*/
private String nameEnLc;
/**
* 性别(字典)
*/
private String gender;
......
......@@ -10,9 +10,7 @@ import com.yd.csf.service.dto.CommissionExpectedUpdateRequest;
import com.yd.csf.service.model.CommissionExpected;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import com.yd.csf.service.vo.CommissionExpectedVO;
import com.yd.csf.service.vo.ReceivableReportVO;
import com.yd.csf.service.vo.*;
import com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse;
import java.io.IOException;
......@@ -27,6 +25,8 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
Page<CommissionExpectedVO> getCommissionExpectedVOPage(Page<CommissionExpected> commissionExpectedPage);
Page<CommissionExpectedNewVO> getCommissionExpectedVONewPage(CommissionExpectedQueryRequest request,List<CommissionExpected> allExpectedList);
/**
* 校验数据
*
......@@ -59,6 +59,8 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
CommissionExpectedStatisticsVO getExpectedStatistics(List<Long> expectedIds);
CommissionExpectedStatisticsVO getExpectedStatisticsNew(List<Long> expectedIds);
CommissionExpected getByBizId(String commissionExpectedBizId);
void getExpectedCommissionByProductlaunchId(Policy policy, String productLaunchBizId, String insuranceCompanyBizId, String reconciliationCompany, String reconciliationCompanyCode, String reconciliationCompanyBizId, String professionalInvestor);
......
......@@ -11,6 +11,7 @@ import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO;
import java.math.BigDecimal;
import java.util.List;
/**
......@@ -59,4 +60,13 @@ public interface CommissionService extends IService<Commission> {
boolean deleteByIdPhysical(Long id);
Boolean deleteCommission(Commission oldCommission);
/**
* 根据保单号和期数查询入账记录的结算汇率
*
* @param policyNo 保单号
* @param commissionPeriod 佣金期数
* @return 结算汇率
*/
BigDecimal queryCommissionExchangeRate(String policyNo, Integer commissionPeriod);
}
......@@ -7,6 +7,7 @@ import com.yd.csf.service.model.FortuneAccount;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.vo.FortuneAccountVO;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
......@@ -21,7 +22,7 @@ public interface FortuneAccountService extends IService<FortuneAccount> {
Page<FortuneAccountVO> getFortuneAccountVOPage(Page<FortuneAccount> fortunePage);
void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList);
void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList, LocalDate actualPayoutDate);
FortuneAccount getByFortuneAccountBizId(String fortuneAccountBizId);
......
......@@ -40,4 +40,11 @@ public interface FortuneService extends IService<Fortune> {
FortuneStatisticsVO getFortuneStatistics(List<Long> fortuneIdList);
Boolean addFortuneBatch(List<FortuneAddRequest> fortuneAddRequestList);
Boolean splitFortune(FortuneSplitRequest fortuneSplitRequest);
Boolean editActualPayoutDate(EditActualPayoutDateRequest editActualPayoutDateRequest);
Boolean editExchangeRate(EditExchangeRateRequest editExchangeRateRequest);
}
......@@ -45,4 +45,15 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
IPage<PayableReportVO> payableReportPage(Page<PayableReportVO> page, List<Long> expectedFortuneIds);
void updateBatchByBizId(List<String> expectedFortuneBizIdList, String status);
ExpectedFortune getByBizId(String expectedFortuneBizId);
Integer getPayableNoCurrentSeq();
/**
* 生成应付款编号(序号递增) 格式:发佣类型-CSF+年份+序号
* @param fortuneType 发佣类型
* @return 应付款编号
*/
String getPayableNo(String fortuneType);
}
......@@ -5,6 +5,7 @@ import com.yd.csf.service.model.PolicyBroker;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* @author Zhang Jianan
......@@ -20,4 +21,7 @@ public interface PolicyBrokerService extends IService<PolicyBroker> {
void removeByPolicyBizId(String policyBizId);
List<String> selectRelatedBrokerBizIds(String clientUserId);
Map<String, String> queryInternalCodeMap(List<String> brokerBizIdList);
}
......@@ -3,6 +3,8 @@ package com.yd.csf.service.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.common.result.Result;
import com.yd.csf.feign.response.policyfollow.ApiPolicyFollowDetailResponse;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.PolicyFollowStatusEnum;
import com.yd.csf.service.model.*;
......@@ -179,4 +181,10 @@ public interface PolicyFollowService extends IService<PolicyFollow> {
* @return 是否成功
*/
Boolean updatePolicySecondHolder(PolicySecondHolderUpdateRequest policySecondHolderUpdateRequest);
Result<ApiPolicyFollowDetailResponse> detail(String policyNo);
List<String> queryPolicyNoList(String policyHolder,String signer,String brokerName,String insured);
Result updateTs();
}
......@@ -3,6 +3,9 @@ package com.yd.csf.service.service;
import com.yd.csf.service.dto.PolicyInsurantUpdateRequest;
import com.yd.csf.service.model.PolicyInsurant;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.model.PolicyPolicyholder;
import java.util.List;
/**
* @author Zhang Jianan
......@@ -18,4 +21,8 @@ public interface PolicyInsurantService extends IService<PolicyInsurant> {
*/
boolean update(PolicyInsurantUpdateRequest policyInsurantUpdateRequest);
List<PolicyInsurant> queryList(String policyHolder);
boolean updateName(String policyBizId,String name);
}
......@@ -4,6 +4,8 @@ import com.yd.csf.service.dto.PolicyPolicyholderUpdateRequest;
import com.yd.csf.service.model.PolicyPolicyholder;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @author Zhang Jianan
* @description 针对表【policy_policyholder(保单投保人信息表)】的数据库操作Service
......@@ -19,4 +21,8 @@ public interface PolicyPolicyholderService extends IService<PolicyPolicyholder>
boolean update(PolicyPolicyholderUpdateRequest policyPolicyholderUpdateRequest);
PolicyPolicyholder queryOne(String policyBizId);
List<PolicyPolicyholder> queryList(String policyHolder);
boolean updateName(String policyBizId,String name);
}
......@@ -116,7 +116,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
// 查询预计入账日期及之前的记录, 关联查询 commission_expected 表
if (expectedDate != null) {
queryWrapper.apply("EXISTS (SELECT 1 FROM commission_expected ce WHERE ce.commission_expected_biz_id = commission.commission_expected_biz_id AND ce.commission_date <= {0})",
expectedDate);
expectedDate);
}
queryWrapper.orderByDesc("id");
......@@ -235,7 +235,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
QueryWrapper<Policy> queryWrapper = new QueryWrapper<Policy>();
queryWrapper.in("policy_no", policyNoSet);
queryWrapper.select(
"policy_no", "payment_premium","currency",
"policy_no", "payment_premium", "currency",
"product_launch_biz_id", "product_name",
"insurance_company_biz_id", "insurance_company",
"reconciliation_company", "reconciliation_company_code", "reconciliation_company_biz_id");
......@@ -361,7 +361,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
&& Objects.equals(i.getCommissionBizType(), commission.getCommissionBizType())
&& Objects.equals(i.getCommissionPeriod(), commission.getCommissionPeriod())
&& Objects.equals(i.getCommissionName(), commission.getCommissionName())
) {
) {
return i;
}
} else {
......@@ -386,6 +386,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (commission == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到该来佣记录");
}
if (!Objects.equals(commission.getPolicyNo(), commissionUpdateRequest.getPolicyNo())) {
throw new BusinessException("当前保单号不匹配");
}
Policy policy = null;
if (StringUtils.isNotBlank(commissionUpdateRequest.getPolicyNo())) {
policy = policyService.lambdaQuery().eq(Policy::getPolicyNo, commission.getPolicyNo()).one();
......@@ -642,11 +645,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
// 2.3 校验预计发佣记录是否有出账币种、默认结算汇率
for (ExpectedFortune expectedFortune : filteredExpectedFortuneList2) {
if (StringUtils.isBlank(expectedFortune.getCurrency())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计发佣记录" + expectedFortune.getExpectedFortuneBizId() + "未配置出账币种");
}
if (expectedFortune.getDefaultExchangeRate() == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计发佣记录" + expectedFortune.getExpectedFortuneBizId() + "未配置默认结算汇率");
if (StringUtils.isBlank(expectedFortune.getRuleCurrency())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计发佣记录" + expectedFortune.getExpectedFortuneBizId() + "未配置保单币种");
}
}
......@@ -699,9 +699,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
fortune.setId(null);
fortune.setFortuneBizType("R");
fortune.setExchangeRate(expectedFortune.getDefaultExchangeRate());
fortune.setAmount(expectedFortune.getAmount());
fortune.setHkdAmount(expectedFortune.getHkdAmount());
fortune.setCurrentPaymentAmount(expectedFortune.getAmount());
fortune.setCurrentPaymentAmount(expectedFortune.getOriginalAmount());
fortune.setCurrentPaymentHkdAmount(expectedFortune.getHkdAmount());
fortune.setExpectedFortuneBizId(expectedFortune.getExpectedFortuneBizId());
fortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
......@@ -728,8 +727,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
/**
* 保单币种对预计来佣的结算币种的默认汇率
*
* @param policyCurrency 保单币种
* @param currency 预计来佣的结算币种
* @param currency 预计来佣的结算币种
* @return 汇率
*/
private BigDecimal queryExchangeRateByFeign(String policyCurrency, String currency) {
......@@ -849,26 +849,25 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setCommissionBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_COMMISSION.getCode()));
// 关联业务id
if ("R".equals(request.getCommissionBizType())) {
if (MapUtils.isNotEmpty(policyMap)) {
Policy policy = policyMap.get(request.getPolicyNo());
if (policy != null) {
commission.setReconciliationCompany(policy.getReconciliationCompany());
commission.setReconciliationCompanyBizId(policy.getReconciliationCompanyBizId());
commission.setProductLaunchBizId(policy.getProductLaunchBizId());
commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
commission.setPremium(Convert.toStr(policy.getPaymentPremium()));
commission.setPolicyCurrency(policy.getCurrency());
// 本次入账比例
commission.setCurrentCommissionRatio(calculateCurrentCommissionRatio(
commission.getPremium(),
commission.getAmount(),
commission.getCurrency(),
commission.getExchangeRate(),
commission.getPolicyCurrency())
);
} else {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单不存在, policyNo: " + request.getPolicyNo());
}
Policy policy = policyMap.get(request.getPolicyNo());
if (policy != null) {
commission.setReconciliationCompany(policy.getReconciliationCompany());
commission.setReconciliationCompanyBizId(policy.getReconciliationCompanyBizId());
commission.setProductLaunchBizId(policy.getProductLaunchBizId());
commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
commission.setPremium(Convert.toStr(policy.getPaymentPremium()));
commission.setPolicyCurrency(policy.getCurrency());
// 本次入账比例
commission.setCurrentCommissionRatio(calculateCurrentCommissionRatio(
commission.getPremium(),
commission.getAmount(),
commission.getCurrency(),
commission.getExchangeRate(),
commission.getPolicyCurrency())
);
} else {
// throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单不存在, policyNo: " + request.getPolicyNo());
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单号不存在");
}
} else {
commission.setPolicyNo(null);
......@@ -1112,6 +1111,22 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return true;
}
@Override
public BigDecimal queryCommissionExchangeRate(String policyNo, Integer commissionPeriod) {
// 查询当前期数入账记录的结算汇率
Commission commissionRecord = this.getOne(
new QueryWrapper<Commission>()
.eq("policy_no", policyNo)
.eq("commission_period", commissionPeriod)
.orderByDesc("commission_date")
.last("LIMIT 1")
);
if (ObjectUtils.isEmpty(commissionRecord)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单号为" + policyNo + "的佣金期数为" + commissionPeriod + "的入账记录不存在");
}
return commissionRecord.getExchangeRate();
}
/**
* 查询列表
*
......
......@@ -11,6 +11,8 @@ import com.google.gson.reflect.TypeToken;
import com.yd.base.feign.dto.ApiCertificateDto;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.EnglishTextUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dao.CustomerMapper;
......@@ -69,8 +71,13 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
String mobile = customerQueryRequest.getMobile();
String email = customerQueryRequest.getEmail();
queryWrapper.like(StringUtils.isNotBlank(name), "name_cn", name)
.or().like(StringUtils.isNotBlank(name), "name_py_en", name);
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(name);
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(name);
queryWrapper.like(StringUtils.isNotBlank(nameSc), "name_sc", nameSc)
.or().like(StringUtils.isNotBlank(nameEnLc), "name_en_lc", nameEnLc);
queryWrapper.like(StringUtils.isNotBlank(mobile), "mobile", mobile);
queryWrapper.like(StringUtils.isNotBlank(email), "email", email);
......@@ -139,6 +146,14 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
validCustomer(customer);
customer.setCustomerBizId(customerBizId);
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(customerAddRequest.getNameCn());
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(customerAddRequest.getNamePyEn());
customer.setNameSc(nameSc);
customer.setNameEnLc(nameEnLc);
boolean result = customerService.saveOrUpdate(customer);
if (!result) {
throw new BusinessException(ErrorCode.OPERATION_ERROR.getCode(), ErrorCode.OPERATION_ERROR.getMessage());
......@@ -245,6 +260,12 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
// 数据校验
customerService.validCustomer(oldCustomer);
// 更新主表
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(customerUpdateRequest.getNameCn());
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(customerUpdateRequest.getNamePyEn());
oldCustomer.setNameSc(nameSc);
oldCustomer.setNameEnLc(nameEnLc);
boolean result = customerService.updateById(oldCustomer);
if (StringUtils.isNotBlank(customerUpdateRequest.getNamePyEn())) {
fnaService.updateCustomerNameByCustomerBizId(customerUpdateRequest.getNamePyEn(), customerBizId);
......
......@@ -2,6 +2,7 @@ package com.yd.csf.service.service.impl;
import cn.hutool.core.collection.CollUtil;
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;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
......@@ -19,9 +20,9 @@ import com.yd.csf.service.vo.PayableReportVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -141,7 +142,7 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
ApiExpectedFortunePageResponse vo = new ApiExpectedFortunePageResponse();
BeanUtils.copyProperties(ef, vo);
vo.setCurrencyName(CurrencyEnum.toLabel(ef.getCurrency()));
vo.setCurrencyName("港币");
String ratio = finalBrokerRatioMap.get(ef.getBrokerBizId());
vo.setCommissionRatio(ratio);
......@@ -175,4 +176,35 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
public void updateBatchByBizId(List<String> expectedFortuneBizIdList, String status) {
baseMapper.updateBatchByBizId(expectedFortuneBizIdList, status);
}
@Override
public ExpectedFortune getByBizId(String expectedFortuneBizId) {
return this.getOne(new QueryWrapper<ExpectedFortune>().eq("expected_fortune_biz_id", expectedFortuneBizId));
}
@Override
public Integer getPayableNoCurrentSeq() {
ExpectedFortune latest = this.getOne(
new QueryWrapper<ExpectedFortune>().isNotNull("payable_no").orderByDesc("id").last("LIMIT 1"),
true
);
//获取当前序号作为起点
int currentSeq = 0;
if (!Objects.isNull(latest)) {
String payableNo = latest.getPayableNo();
currentSeq = Integer.parseInt(payableNo.substring(payableNo.length() - 6));
}
return currentSeq;
}
@Override
public String getPayableNo(String fortuneType) {
Integer currentSeq = getPayableNoCurrentSeq();
return String.format("%s%s%s",
fortuneType + "-CSF",
LocalDate.now().getYear() % 100,
currentSeq + 1);
}
}
......@@ -124,6 +124,7 @@ public class FnaServiceImpl extends ServiceImpl<FnaMapper, Fna> implements FnaSe
return queryWrapper;
}
String customerName = fnaQueryRequest.getCustomerName();
String creatorName = fnaQueryRequest.getCreatorName();
String appointmentNo = fnaQueryRequest.getAppointmentNo();
String policyBizId = fnaQueryRequest.getPolicyBizId();
String policyNo = fnaQueryRequest.getPolicyNo();
......@@ -154,6 +155,8 @@ public class FnaServiceImpl extends ServiceImpl<FnaMapper, Fna> implements FnaSe
queryWrapper.like(StringUtils.isNotBlank(policyBizId), "policy_biz_id", policyBizId);
// 保单号
queryWrapper.like(StringUtils.isNotBlank(policyNo), "policy_no", policyNo);
// 创建人名称
queryWrapper.like(StringUtils.isNotBlank(creatorName), "creator_name", creatorName);
String sortField = fnaQueryRequest.getSortField();
String sortOrder = fnaQueryRequest.getSortOrder();
......
......@@ -2,6 +2,7 @@ package com.yd.csf.service.service.impl;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
......@@ -18,15 +19,10 @@ import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.FortuneAccountStatusEnum;
import com.yd.csf.service.enums.FortuneStatusEnum;
import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.model.Fortune;
import com.yd.csf.service.model.FortuneAccount;
import com.yd.csf.service.model.FortuneAccountEditRecord;
import com.yd.csf.service.service.FortuneAccountEditRecordService;
import com.yd.csf.service.service.FortuneAccountService;
import com.yd.csf.service.model.*;
import com.yd.csf.service.service.*;
import com.yd.csf.service.dao.FortuneAccountMapper;
import com.yd.csf.service.service.FortuneService;
import com.yd.csf.service.service.IExpectedFortuneService;
import com.yd.csf.service.utils.BusinessNoUtils;
import com.yd.csf.service.vo.FortuneAccountVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
......@@ -59,6 +55,9 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
@Resource
private IExpectedFortuneService expectedFortuneService;
@Resource
private PolicyBrokerService policyBrokerService;
private final Gson GSON = new Gson();
@Override
......@@ -100,6 +99,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
for (FortuneAccount fortuneAccount : fortuneAccountList) {
FortuneAccountVO fortuneAccountVO = FortuneAccountVO.objToVo(fortuneAccount);
fortuneAccountVO.setFortuneList(GSON.fromJson(fortuneAccount.getContent(), new TypeToken<List<Map<String, Object>>>(){}.getType()));
fortuneAccountVO.setFortuneAccountMonth(fortuneAccount.getFortuneAccountDate());
fortuneAccountVOList.add(fortuneAccountVO);
}
......@@ -109,7 +109,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
@Override
@Transactional(rollbackFor = BusinessException.class)
public void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList) {
public void saveFortuneAccount(List<FortuneAccountExportDTO> accountExportDTOList, LocalDate actualPayoutDate) {
if (CollectionUtils.isEmpty(accountExportDTOList)) {
return;
}
......@@ -117,18 +117,32 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
Long loginUserId = currentLoginUser.getId();
//查询转介人的内部编号列表信息
List<String> brokerBizIdList = accountExportDTOList.stream().map(FortuneAccountExportDTO::getBrokerBizId).collect(Collectors.toList());
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"))
: "";
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位))
fortuneAccount.setBusinessNo(businessNo);
fortuneAccount.setBroker(accountExportDTO.getBroker());
fortuneAccount.setBrokerBizId(accountExportDTO.getBrokerBizId());
fortuneAccount.setTeam(accountExportDTO.getTeam());
fortuneAccount.setTeamBizId(accountExportDTO.getTeamBizId());
fortuneAccount.setCurrency(accountExportDTO.getCurrency());
fortuneAccount.setHkdAmount(accountExportDTO.getAmount());
fortuneAccount.setFortuneAccountDate(currentDate);
fortuneAccount.setFortuneAccountDate(this.getActualPayoutDate(actualPayoutDate));
// 出账状态默认待出账
fortuneAccount.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
......@@ -186,11 +200,31 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
}
// 更新预计发佣记录的出账状态
if (CollectionUtils.isNotEmpty(expectedFortuneBizIdList)) {
expectedFortuneService.updateBatchByBizId(expectedFortuneBizIdList, FortuneStatusEnum.CHECKED.getItemValue());
// 查询预计发佣记录
List<ExpectedFortune> expectedFortuneList = expectedFortuneService.list(new QueryWrapper<ExpectedFortune>()
.in("expected_fortune_biz_id", expectedFortuneBizIdList));
List<ExpectedFortune> updateExpectedFortuneList = new ArrayList<>();
for (ExpectedFortune expectedFortune : expectedFortuneList) {
ExpectedFortune updateExpectedFortune = new ExpectedFortune();
updateExpectedFortune.setId(expectedFortune.getId());
updateExpectedFortune.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
updateExpectedFortune.setActualPayoutDate(actualPayoutDate);
updateExpectedFortuneList.add(updateExpectedFortune);
}
expectedFortuneService.updateBatchById(updateExpectedFortuneList);
}
}
private Date getActualPayoutDate(LocalDate actualPayoutDate) {
if (actualPayoutDate == null) {
return null;
}
return Date.from(actualPayoutDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
}
@Override
public FortuneAccount getByFortuneAccountBizId(String fortuneAccountBizId) {
return this.getOne(new QueryWrapper<FortuneAccount>().eq("fortune_account_biz_id", fortuneAccountBizId));
......@@ -222,7 +256,9 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
Long loginUserId = currentLoginUser.getId();
FortuneAccount fortuneAccount = this.getByFortuneAccountBizId(fortuneAccountUpdateRequest.getFortuneAccountBizId());
String fortuneAccountBizId = fortuneAccountUpdateRequest.getFortuneAccountBizId();
FortuneAccount fortuneAccount = this.getByFortuneAccountBizId(fortuneAccountBizId);
if (fortuneAccount == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), ResultCode.NULL_ERROR.getMessage());
}
......@@ -235,6 +271,18 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
this.updateById(fortuneAccount);
// // 更新关联 expected_fortune、fortune的出账日期
// if (fortuneAccountUpdateRequest.getFortuneAccountDate() != null) {
// List<Fortune> fortuneList = fortuneService.lambdaQuery().eq(Fortune::getFortuneAccountBizId, fortuneAccountBizId).list();
// if (CollectionUtils.isNotEmpty(fortuneList)) {
// Set<String> expectedBizIdSet = fortuneList.stream().map(Fortune::getExpectedFortuneBizId).collect(Collectors.toSet());
// // 查询 expected_fortune 列表
// List<ExpectedFortune> expectedList = expectedFortuneService.lambdaQuery()
// .in(ExpectedFortune::getExpectedFortuneBizId, expectedBizIdSet)
// .list();
//
// }
// }
return true;
}
......@@ -285,7 +333,6 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
/* 2. 更新 FortuneAccount 状态为已出账 ----------------------------------*/
accountList.forEach(a -> {
a.setStatus(FortuneStatusEnum.SENT.getItemValue());
a.setFortuneAccountDate(new Date());
a.setUpdaterId(loginUserId.toString());
a.setUpdateTime(new Date());
});
......@@ -361,7 +408,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
.set(ExpectedFortune::getUnpaidRatio,
unpaid.divide(totalAmount, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)))
.set(ExpectedFortune::getStatus, newStatus)
.set(ExpectedFortune::getActualPayoutDate, new Date())
// .set(ExpectedFortune::getActualPayoutDate, new Date())
.set(ExpectedFortune::getUpdaterId, loginUserId.toString())
.set(ExpectedFortune::getUpdateTime, LocalDateTime.now())
.eq(ExpectedFortune::getId, ef.getId())
......
......@@ -7,10 +7,14 @@ import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyBroker;
import com.yd.csf.service.service.PolicyBrokerService;
import com.yd.csf.service.dao.PolicyBrokerMapper;
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.stream.Collectors;
/**
* @author Zhang Jianan
......@@ -29,6 +33,7 @@ public class PolicyBrokerServiceImpl extends ServiceImpl<PolicyBrokerMapper, Pol
@Override
public List<PolicyBroker> queryList(QueryPolicyBrokerDto dto) {
List<PolicyBroker> list = baseMapper.selectList(new LambdaQueryWrapper<PolicyBroker>()
.like(StringUtils.isNotBlank(dto.getBrokerName()),PolicyBroker::getBrokerName,dto.getBrokerName())
.in(!CollectionUtils.isEmpty(dto.getPolicyNoList()),PolicyBroker::getPolicyNo,dto.getPolicyNoList())
);
return list;
......@@ -54,6 +59,23 @@ public class PolicyBrokerServiceImpl extends ServiceImpl<PolicyBrokerMapper, Pol
public List<String> selectRelatedBrokerBizIds(String clientUserId) {
return baseMapper.selectRelatedBrokerBizIds(clientUserId);
}
@Override
public Map<String, String> queryInternalCodeMap(List<String> brokerBizIdList) {
if (CollectionUtils.isEmpty(brokerBizIdList)) {
return Collections.emptyMap();
}
List<PolicyBroker> list = baseMapper.selectList(new LambdaQueryWrapper<PolicyBroker>()
.select(PolicyBroker::getBrokerBizId, PolicyBroker::getInternalCode) // 只查需要的字段
.in(PolicyBroker::getBrokerBizId, brokerBizIdList)
.isNotNull(PolicyBroker::getInternalCode) // 排除 internalCode 为 null 的记录(可选)
);
return list.stream().collect(Collectors.toMap(
PolicyBroker::getBrokerBizId,
PolicyBroker::getInternalCode,
(v1, v2) -> v1 // 如果 brokerBizId 可能重复,保留其中一个
));
}
}
......
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.EnglishTextUtil;
import com.yd.csf.service.dto.PolicyInsurantUpdateRequest;
import com.yd.csf.service.model.PolicyInsurant;
import com.yd.csf.service.model.PolicyPolicyholder;
import com.yd.csf.service.service.PolicyInsurantService;
import com.yd.csf.service.dao.PolicyInsurantMapper;
import com.yd.csf.service.utils.GSONUtil;
......@@ -14,7 +19,9 @@ 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;
/**
* @author Zhang Jianan
......@@ -42,6 +49,36 @@ public class PolicyInsurantServiceImpl extends ServiceImpl<PolicyInsurantMapper,
policyInsurant.setUpdateTime(new Date());
return this.updateById(policyInsurant);
}
@Override
public List<PolicyInsurant> queryList(String insured) {
// 输入为空时直接返回空列表,避免无意义的全表查询
if (StringUtils.isBlank(insured)) {
return Collections.emptyList();
}
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(insured);
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(insured);
return this.baseMapper.selectList(new LambdaQueryWrapper<PolicyInsurant>()
.and(wrapper -> wrapper
.like(StringUtils.isNotBlank(nameSc), PolicyInsurant::getNameSc, nameSc)
.or()
.like(StringUtils.isNotBlank(nameEnLc), PolicyInsurant::getNameEnLc, nameEnLc)
)
);
}
@Override
public boolean updateName(String policyBizId, String name) {
String nameSc = ChineseTextConverter.traditionalToSimplified(name);
return this.update(new UpdateWrapper<PolicyInsurant>()
.set("name", name)
.set("name_sc", nameSc)
.eq("policy_biz_id", policyBizId));
}
}
......
......@@ -2,19 +2,27 @@ package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.common.enums.ResultCode;
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;
import com.yd.csf.service.utils.GSONUtil;
import org.apache.commons.collections4.CollectionUtils;
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;
/**
* @author Zhang Jianan
......@@ -48,6 +56,36 @@ public class PolicyPolicyholderServiceImpl extends ServiceImpl<PolicyPolicyholde
return this.baseMapper.selectOne(new LambdaQueryWrapper<PolicyPolicyholder>()
.eq(PolicyPolicyholder::getPolicyBizId,policyBizId).last(" limit 1 "));
}
@Override
public List<PolicyPolicyholder> queryList(String policyHolder) {
// 输入为空时直接返回空列表,避免无意义的全表查询
if (StringUtils.isBlank(policyHolder)) {
return Collections.emptyList();
}
// 中文转简体
String nameSc = ChineseTextConverter.traditionalToSimplified(policyHolder);
// 英文转小写
String nameEnLc = EnglishTextUtil.toLowerCase(policyHolder);
return this.baseMapper.selectList(new LambdaQueryWrapper<PolicyPolicyholder>()
.and(wrapper -> wrapper
.like(StringUtils.isNotBlank(nameSc), PolicyPolicyholder::getNameSc, nameSc)
.or()
.like(StringUtils.isNotBlank(nameEnLc), PolicyPolicyholder::getNameEnLc, nameEnLc)
)
);
}
@Override
public boolean updateName(String policyBizId, String name) {
String nameSc = ChineseTextConverter.traditionalToSimplified(name);
return this.update(new UpdateWrapper<PolicyPolicyholder>()
.set("name", name)
.set("name_sc", nameSc)
.eq("policy_biz_id", policyBizId));
}
}
......
package com.yd.csf.service.utils;
import java.util.concurrent.ThreadLocalRandom;
/**
* 业务编号生成工具类
* <p>格式:出账年月 + 转介人内部编号后6位(无则补0) + 6位随机数字</p>
*/
public class BusinessNoUtils {
/**
* 生成业务编号
*
* @param billingYearMonth 出账年月,如 "202604"
* @param referrerInnerNo 转介人内部编号,可为 null 或空字符串
* @return 完整的业务编号字符串
*/
public static String generate(String billingYearMonth, String referrerInnerNo) {
String referrerPart = formatReferrerInnerNo(referrerInnerNo);
String serialPart = generateRandomSerial();
return billingYearMonth + referrerPart + serialPart;
}
// 格式化转介人内部编号:取后6位,不足左补0,无则全0
private static String formatReferrerInnerNo(String referrerInnerNo) {
if (referrerInnerNo == null || referrerInnerNo.trim().isEmpty()) {
return "000000";
}
String no = referrerInnerNo.trim();
if (no.length() > 6) {
return no.substring(no.length() - 6);
}
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);
}
}
\ No newline at end of file
package com.yd.csf.service.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.model.CommissionExpected;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ContentRowHeight(15)
@HeadRowHeight(20)
@ColumnWidth(20)
public class CommissionExpectedExportNewDTO {
/**
* 是否实收:1-预计(预计来佣记录) 2-实收(保单来佣表记录)*
*/
@ExcelProperty("是否实收")
private String typeName;
/**
* 应收款类型 R=关联保单应收单 U=非关联保单应收单
*/
@ExcelProperty("应收单类型")
private String commissionBizType;
/**
* 组编号(应收单编号)*
*/
@ExcelProperty("应收单编号")
private String no;
/**
* 预计来佣-保单号
*/
@ExcelProperty("保单号")
private String policyNo;
/**
* 预计来佣-对账公司
*/
@ExcelProperty("对账公司")
private String reconciliationCompany;
/**
* 预计来佣-入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效
*/
@ExcelProperty("入账状态")
private String status;
/**
* 预计来佣-佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@ExcelProperty("入账期数")
private Integer commissionPeriod;
/**
* 预计来佣-总来佣期数
*/
@ExcelProperty("入账总期数")
private Integer totalPeriod;
/**
* 预计来佣-来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
@ExcelProperty("入账项目")
private String commissionName;
/**
* 预计来佣-入账年月(估) * (预计来佣日期)
*/
@ExcelProperty("入账年月(估)")
@DateTimeFormat("yyyyMM")
private Date commissionDateMonth;
/**
* 入账检核记录-入账年月实(来佣日期 yyyyMM)
*/
@ExcelProperty("入账年月(实)")
@DateTimeFormat("yyyyMM")
private Date commissionDate;
/**
* 预计来佣-已入账来佣比例 (%) ( 累积已入账比例 = 预计来佣实佣率realRate/产品对应来佣率)
*/
@ExcelProperty("累积已入账比例")
private BigDecimal totalRevenueRatio;
/**
* 预计来佣-预计入账比例 (%)(产品对应来佣率)
*/
@ExcelProperty("产品对应来佣率")
private BigDecimal commissionRatio;
/**
* 入账检核记录-实佣率(入账金额/结算汇率/期交保费) *
* 如果这里是否实收是预计:realRate统计当前预计下面的实际来拥记录的实佣率累加和
* 如果这里是否实收是实收:realRate取realCurrentCommissionRatio赋值
*/
@ExcelProperty("实佣率")
private BigDecimal realRate;
/**
* 达成率缺口(1-实佣率/产品对应来佣率)*
*/
@ExcelProperty("达成率缺口")
private BigDecimal gapRate;
/**
* 入账检核记录-当前结算汇率(结算汇率(实))
*/
@ExcelProperty("结算汇率实")
private BigDecimal realExchangeRate;
/**
* 入账检核记录-来佣金额(已入账金额)(预计类型需要统计累计和值)
*/
@ExcelProperty("已入账金额")
private BigDecimal realAmount;
/**
* 入账检核记录-入账检核年月 yyyyMM(检核年月)
*/
@ExcelProperty("检核年月")
private String realReconciliationYearMonth;
/**
* 入账检核记录-本次入账比例(实佣率/产品对应来佣率)
*/
@ExcelProperty("本次入账比例")
private BigDecimal revenueRatio;
/**
* 预计来佣-待入账金额
*/
@ExcelProperty("待入账金额")
private BigDecimal pendingAmount;
/**
* 预计来佣-预计入账金额(HKD)
*/
@ExcelProperty("预计入账金额")
private BigDecimal expectedAmount;
/**
* 预计来佣-结算汇率(估)
*/
@ExcelProperty("结算汇率估")
private BigDecimal defaultExchangeRate;
/**
* 预计来佣-保险公司
*/
@ExcelProperty("保险公司")
private String insuranceCompany;
/**
* 预计来佣-产品计划名称
*/
@ExcelProperty("产品计划")
private String productName;
/**
* 年期(供款年期)
*/
@ExcelProperty("年期")
private Integer issueNumber;
/**
* 预计来佣-保单币种
*/
@ExcelProperty("保单币种")
private String policyCurrency;
/**
* 预计来佣-期交保费
*/
@ExcelProperty("期交保费")
private String premium;
/**
* 入账检核记录-通用备注
*/
@ExcelProperty("备注")
private String realRemark;
/**
* 入账检核记录-更新人名称
*/
@ExcelProperty("操作人")
private String realUpdaterName;
/**
* 入账检核记录-更新时间
*/
@ExcelProperty("操作时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
@ColumnWidth(20)
private Date realUpdateTime;
/**
* 将对象转换为导出DTO
*/
public static CommissionExpectedExportNewDTO convertToExportDTO(CommissionExpectedNewVO vo) {
CommissionExpectedExportNewDTO dto = new CommissionExpectedExportNewDTO();
BeanUtils.copyProperties(vo,dto);
dto.setTypeName(vo.getType() == 1 ? "预计" : "实收");
dto.setCommissionBizType("R".equals(vo.getCommissionBizType()) ? "关联保单应收单" : "非关联保单应收单");
dto.setStatus(getStatusText(vo.getStatus()));
dto.setPremium(vo.getPremium() != null ? vo.getPremium().toString() : "");
return dto;
}
/**
* 获取状态文本
*/
public static String getStatusText(String status) {
if (status == null) return "未知";
switch (status) {
case "0":
return "待入账";
case "1":
return "完成入账";
case "2":
return "部分入账";
case "3":
return "已失效";
default:
return "未知";
}
}
}
package com.yd.csf.service.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* 应收款管理统计VO
*/
@Data
public class CommissionExpectedStatisticsNewVO {
/**
* 预计入账金额(HKD)
*/
// @Schema(description = "预计入账金额(HKD)")
private BigDecimal totalAmount;
/**
* 已入账金额(HKD)
*/
// @Schema(description = "已入账金额(HKD)")
private BigDecimal totalPaidAmount;
/**
* 待入账金额(HKD)
*/
// @Schema(description = "待入账金额(HKD)")
private BigDecimal pendingPaidAmount;
/**
* 已入账比例 %(已入账金额/总金额)
*/
// @Schema(description = "已入账比例 %(已入账金额/总金额)")
private BigDecimal paidAmountRatio;
/**
* 总保单数
*/
// @Schema(description = "总保单数")
private Integer totalPolicyCount;
/**
* 总保费(HKD)
*/
// @Schema(description = "总保费(HKD)")
private BigDecimal totalPremium;
/**
* 原币种总保费
*/
private BigDecimal fromTotalPremium;
@JsonIgnore
private String policyNos;
}
......@@ -14,39 +14,83 @@ public class CommissionExpectedStatisticsVO {
/**
* 预计入账金额(HKD)
*/
@Schema(description = "预计入账金额(HKD)")
// @Schema(description = "预计入账金额(HKD)")
private BigDecimal totalAmount;
/**
* 已入账金额(HKD)
*/
@Schema(description = "已入账金额(HKD)")
// @Schema(description = "已入账金额(HKD)")
private BigDecimal totalPaidAmount;
/**
* 待入账金额(HKD)
*/
@Schema(description = "待入账金额(HKD)")
// @Schema(description = "待入账金额(HKD)")
private BigDecimal pendingPaidAmount;
/**
* 已入账比例 %(已入账金额/总金额)
*/
@Schema(description = "已入账比例 %(已入账金额/总金额)")
// @Schema(description = "已入账比例 %(已入账金额/总金额)")
private BigDecimal paidAmountRatio;
/**
* 总保单数
*/
@Schema(description = "总保单数")
// @Schema(description = "总保单数")
private Integer totalPolicyCount;
/**
* 总保费(HKD)
*/
@Schema(description = "总保费(HKD)")
// @Schema(description = "总保费(HKD)")
private BigDecimal totalPremium;
/**
* 原币种总保费
*/
private BigDecimal fromTotalPremium;
@JsonIgnore
private String policyNos;
// /**
// * 预计入账金额(HKD)
// */
// @Schema(description = "预计入账金额(HKD)")
// private BigDecimal totalAmount;
//
// /**
// * 已入账金额(HKD)
// */
// @Schema(description = "已入账金额(HKD)")
// private BigDecimal totalPaidAmount;
//
// /**
// * 待入账金额(HKD)
// */
// @Schema(description = "待入账金额(HKD)")
// private BigDecimal pendingPaidAmount;
//
// /**
// * 已入账比例 %(已入账金额/总金额)
// */
// @Schema(description = "已入账比例 %(已入账金额/总金额)")
// private BigDecimal paidAmountRatio;
//
// /**
// * 总保单数
// */
// @Schema(description = "总保单数")
// private Integer totalPolicyCount;
//
// /**
// * 总保费(HKD)
// */
// @Schema(description = "总保费(HKD)")
// private BigDecimal totalPremium;
//
// @JsonIgnore
// private String policyNos;
}
......@@ -142,6 +142,12 @@ public class FnaVO implements Serializable {
private Date createTime;
/**
* 创建人名称
*/
@Schema(description = "创建人名称")
private String creatorName;
/**
* 封装类转对象
*
* @param fnaVO
......
package com.yd.csf.service.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.model.FortuneAccount;
import io.swagger.v3.oas.annotations.media.Schema;
......@@ -26,6 +27,12 @@ public class FortuneAccountVO {
private String fortuneAccountBizId;
/**
* 出账业务编号(出账年月 + 转介人内部编号(后6位)(如无,用0补齐)+流水号(6位))
*/
@Schema(description = "出账业务编号")
private String businessNo;
/**
* 转介人
*/
@Schema(description = "转介人")
......@@ -69,6 +76,13 @@ public class FortuneAccountVO {
private Date fortuneAccountDate;
/**
* 出账月
*/
@Schema(description = "出账月")
@JsonFormat(pattern = "yyyyMM", timezone = "GMT+8")
private Date fortuneAccountMonth;
/**
* 出账信息
*/
@Schema(description = "出账信息")
......
......@@ -42,12 +42,24 @@ public class FortuneVO implements Serializable {
private String fortuneBizType;
/**
* 是否拆分出来的出账 1-是 0-否 2-拆分的原纪录
*/
@Schema(description = "是否拆分出来的出账 1-是 0-否 2-拆分的原纪录")
private Integer isPart;
/**
* 预计出账业务ID
*/
@Schema(description = "预计出账业务ID")
private String expectedFortuneBizId;
/**
* 应付账款编号
*/
@Schema(description = "应付账款编号")
private String payableNo;
/**
* 保单号
*/
@Schema(description = "保单号")
......@@ -156,24 +168,60 @@ public class FortuneVO implements Serializable {
private String fortuneType;
/**
* 出账金额
* 保单币种金额
*/
@Schema(description = "应出账金额")
private BigDecimal amount;
@Schema(description = "保单币种金额")
private BigDecimal ruleAmount;
/**
* 出账币种
* 保单币种
*/
@Schema(description = "出账币种")
private String currency;
@Schema(description = "保单币种")
private String ruleCurrency;
/**
* 结算汇率
* 保单币种→港币汇率(入账检核汇率)
*/
@Schema(description = "结算汇率")
@Schema(description = "保单币种→港币汇率(入账检核汇率)")
private BigDecimal exchangeRate;
/**
* 原币种
*/
@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;
/**
* 港币出账金额
*/
@Schema(description = "港币出账金额")
......@@ -317,6 +365,7 @@ public class FortuneVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 对象转封装类
*
......@@ -329,21 +378,33 @@ public class FortuneVO implements Serializable {
}
FortuneVO fortuneVO = new FortuneVO();
BeanUtils.copyProperties(fortune, fortuneVO);
// 计算已出账金额和待出账金额
BigDecimal currentPaymentHkdAmount = "2".equals(fortune.getStatus()) ? fortune.getCurrentPaymentHkdAmount() : BigDecimal.ZERO;
// 安全获取港币金额,避免 null
BigDecimal hkdAmount = ObjectUtil.defaultIfNull(fortune.getHkdAmount(), BigDecimal.ZERO);
// 已出账金额(status=2 时取 currentPaymentHkdAmount,否则为 0)
BigDecimal currentPaymentHkdAmount = "2".equals(fortune.getStatus())
? ObjectUtil.defaultIfNull(fortune.getCurrentPaymentHkdAmount(), BigDecimal.ZERO)
: BigDecimal.ZERO;
fortuneVO.setFortunePaidAmount(currentPaymentHkdAmount);
fortuneVO.setFortuneUnpaidAmount(NumberUtil.sub(fortune.getHkdAmount(), currentPaymentHkdAmount));
// 计算已出账比例
BigDecimal currentPaymentRatio = NumberUtil
.div(currentPaymentHkdAmount, fortune.getHkdAmount(), 4)
.multiply(BigDecimal.valueOf(100));
fortuneVO.setFortuneUnpaidAmount(NumberUtil.sub(hkdAmount, currentPaymentHkdAmount));
// 计算已出账比例,分母为 0 时直接设为 0%
BigDecimal currentPaymentRatio;
if (hkdAmount.compareTo(BigDecimal.ZERO) == 0) {
currentPaymentRatio = BigDecimal.ZERO;
} else {
currentPaymentRatio = NumberUtil.div(currentPaymentHkdAmount, hkdAmount, 4)
.multiply(BigDecimal.valueOf(100));
}
fortuneVO.setCurrentPaymentRatio(currentPaymentRatio);
// 计算剩余出账比例
fortuneVO.setFortuneUnpaidRatio(BigDecimal.valueOf(100).subtract(currentPaymentRatio));
fortuneVO.setCurrency(CurrencyEnum.toLabel(fortune.getCurrency()));
// fortuneVO.setCurrency(CurrencyEnum.toLabel(fortune.getCurrency()));
fortuneVO.setPolicyCurrency((CurrencyEnum.toLabel(fortune.getPolicyCurrency())));
return fortuneVO;
}
}
......@@ -134,4 +134,14 @@ public class PayableReportVO {
*/
@Schema(description = "产品计划")
private String productName;
/**
* 保單持有人(投保人,保单表)(中文名)
*/
private String policyHolder;
/**
* 保單持有人(投保人,保单表)(英文名)
*/
private String policyHolderEn;
}
......@@ -9,6 +9,7 @@ import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
/**
......@@ -93,12 +94,24 @@ public class PolicyFollowVO implements Serializable {
private String policyHolder;
/**
* 保單持有人-英文
*/
@Schema(description = "投保人-英文")
private String policyHolderEn;
/**
* 受保人
*/
@Schema(description = "受保人")
private String insured;
/**
* 受保人-英文
*/
@Schema(description = "受保人-英文")
private String insuredEn;
/**
* 受保人业务id
*/
@Schema(description = "受保人业务id")
......@@ -153,6 +166,27 @@ public class PolicyFollowVO implements Serializable {
private String mailingItem;
/**
* 转介人名称(取保单转介人表第一个)
*/
private String brokerName;
/**
* 每期保费
*/
private BigDecimal eachIssuePremium;
/**
* 签单人
*/
private String signer;
/**
* 冷静期结束日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date coolingOffEndDate;
/**
* 对象转封装类
*
* @param policyFollow
......
package com.yd.csf.service.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
......@@ -138,4 +139,30 @@ public class ReceivableReportVO {
*/
@Schema(description = "保单币种")
private String policyCurrency;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
/**
* 保單持有人(投保人,保单表)(中文名)
*/
private String policyHolder;
/**
* 保單持有人(投保人,保单表)(英文名)
*/
private String policyHolderEn;
/**
* 受保人
*/
private String insured;
/**
* 受保人-英文
*/
private String insuredEn;
}
......@@ -71,6 +71,11 @@
select
null as receivableNo,
ce.policy_no as policyNo,
(select pp.name from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolder,
(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,
MAX(ce.reconciliation_company) as reconciliationCompany,
MAX(ce.reconciliation_company_biz_id) as reconciliationCompanyBizId,
ce.commission_period as commissionPeriod,
......@@ -112,6 +117,11 @@
select
ce.receivable_no as receivableNo,
ce.policy_no as policyNo,
(select pp.name from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolder,
(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.reconciliation_company as reconciliationCompany,
ce.reconciliation_company_biz_id as reconciliationCompanyBizId,
ce.commission_period as commissionPeriod,
......
......@@ -48,6 +48,7 @@
#{item}
</foreach>
</if>
AND ef.is_part in (0,1)
</where>
</select>
......@@ -55,6 +56,8 @@
select
null as payable_no,
ef.policy_no as policyNo,
(select pp.name from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolder,
(select pp.name_en from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolderEn,
MAX(ef.premium) as premium,
MAX(ef.insurance_company_biz_id) as insuranceCompanyBizId,
MAX(p.insurance_company) as insuranceCompany,
......@@ -62,9 +65,9 @@
MAX(p.product_name) as productName,
ef.fortune_period as fortunePeriod,
MAX(ef.fortune_total_period) as fortuneTotalPeriod,
ifnull(sum(ef.amount), 0) as amount,
ifnull(sum(ef.original_amount), 0) as amount,
ifnull(sum(ef.hkd_amount), 0) as hkdAmount,
MAX(ef.currency) as currency,
MAX(ef.original_currency) as currency,
ifnull(sum(ef.paid_amount), 0) as paidAmount,
ifnull(sum(ef.unpaid_amount), 0) as unpaidAmount,
case when ifnull(sum(ef.hkd_amount), 0) > 0
......@@ -108,6 +111,8 @@
select
ef.payable_no as payable_no,
ef.policy_no as policyNo,
(select pp.name from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolder,
(select pp.name_en from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolderEn,
ef.premium as premium,
ef.insurance_company_biz_id as insuranceCompanyBizId,
p.insurance_company as insuranceCompany,
......@@ -115,9 +120,9 @@
p.product_name as productName,
ef.fortune_period as fortunePeriod,
ef.fortune_total_period as fortuneTotalPeriod,
ifnull(ef.amount, 0) as amount,
ifnull(ef.original_amount, 0) as amount,
ifnull(ef.hkd_amount, 0) as hkdAmount,
ef.currency as currency,
ef.original_currency as currency,
ifnull(ef.paid_amount, 0) as paidAmount,
ifnull(ef.unpaid_amount, 0) as unpaidAmount,
case when ifnull(ef.hkd_amount, 0) > 0
......
......@@ -8,6 +8,7 @@
<id property="id" column="id" />
<result property="fortuneBizId" column="fortune_biz_id" />
<result property="expectedFortuneBizId" column="expected_fortune_biz_id" />
<result property="payableNo" column="payable_no" />
<result property="reconciliationYearMonth" column="reconciliation_year_month" />
<result property="fortuneBizType" column="fortune_biz_type" />
<result property="isPart" column="is_part" />
......@@ -51,7 +52,7 @@
</resultMap>
<sql id="Base_Column_List">
id,fortune_biz_id,expected_fortune_biz_id,reconciliation_year_month,fortune_biz_type,batch_biz_id,
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,
......@@ -79,6 +80,7 @@
#{fortuneId}
</foreach>
</if>
AND f.is_part in (0,1)
GROUP BY f.policy_no
</select>
......
......@@ -130,4 +130,65 @@
left join policy_insurant i on t.policy_biz_id = i.policy_biz_id
where t.policy_biz_id = #{policyBizId}
</select>
<select id="queryPolicyNoList" resultType="java.lang.String">
select distinct pf.policy_no
from policy_follow pf
left join policy_policyholder pp
on pf.policy_biz_id = pp.policy_biz_id
and pp.is_deleted = 0
left join policy_insurant pi
on pf.policy_biz_id = pi.policy_biz_id
and pi.is_deleted = 0
left join (
select pb.policy_biz_id, pb.broker_name
from policy_broker pb
inner join (
select policy_biz_id, min(id) as min_id
from policy_broker
where is_deleted = 0
group by policy_biz_id
) t on pb.id = t.min_id
) first_broker
on pf.policy_biz_id = first_broker.policy_biz_id
<where>
pf.is_deleted = 0
<!-- 投保人:简体中文或英文小写,满足其一即可 -->
<if test="(policyHolderSc != null and policyHolderSc != '') or (policyHolderEnLc != null and policyHolderEnLc != '')">
and (
<if test="policyHolderSc != null and policyHolderSc != ''">
pp.name_sc like concat('%', #{policyHolderSc}, '%')
</if>
<if test="policyHolderSc != null and policyHolderSc != '' and policyHolderEnLc != null and policyHolderEnLc != ''">
or
</if>
<if test="policyHolderEnLc != null and policyHolderEnLc != ''">
pp.name_en_lc like concat('%', #{policyHolderEnLc}, '%')
</if>
)
</if>
<!-- 受保人:简体中文或英文小写,满足其一即可 -->
<if test="(insuredSc != null and insuredSc != '') or (insuredEnLc != null and insuredEnLc != '')">
and (
<if test="insuredSc != null and insuredSc != ''">
pi.name_sc like concat('%', #{insuredSc}, '%')
</if>
<if test="insuredSc != null and insuredSc != '' and insuredEnLc != null and insuredEnLc != ''">
or
</if>
<if test="insuredEnLc != null and insuredEnLc != ''">
pi.name_en_lc like concat('%', #{insuredEnLc}, '%')
</if>
)
</if>
<if test="signer != null and signer != ''">
and pf.signer like concat('%', #{signer}, '%')
</if>
<if test="brokerName != null and brokerName != ''">
and first_broker.broker_name like concat('%', #{brokerName}, '%')
</if>
</where>
</select>
</mapper>
......@@ -22,8 +22,10 @@
pr.recognized_currency,
prm_total.payer,
prm_total.paying_bank,
p.policy_holder,
p.insured,
pp.name AS policyHolder,
pp.name_en AS policyHolderEn,
pi.name AS insured,
pi.name_en AS insuredEn,
pb.broker_name AS brokerName,
pr.create_time,
pr.update_time,
......@@ -31,6 +33,8 @@
FROM premium_reconciliation pr
LEFT JOIN policy p ON p.policy_no = pr.policy_no AND p.is_deleted = 0
LEFT JOIN policy_follow pf ON pf.policy_no = pr.policy_no AND pf.is_deleted = 0
LEFT JOIN policy_policyholder pp ON pp.policy_biz_id = pf.policy_biz_id AND pp.is_deleted = 0
LEFT JOIN policy_insurant pi ON pi.policy_biz_id = pf.policy_biz_id AND pi.is_deleted = 0
LEFT JOIN (
SELECT
premium_reconciliation_biz_id,
......@@ -71,9 +75,6 @@
<if test="request.appointmentNo != null and request.appointmentNo != ''">
AND pf.appointment_no LIKE CONCAT('%', #{request.appointmentNo}, '%')
</if>
<if test="request.policyHolder != null and request.policyHolder != ''">
AND p.policy_holder LIKE CONCAT('%', #{request.policyHolder}, '%')
</if>
<if test="request.paymentMethod != null and request.paymentMethod != ''">
AND prm_total.payment_method LIKE CONCAT('%', #{request.paymentMethod}, '%')
</if>
......@@ -86,13 +87,38 @@
<if test="request.reconciliationType != null and request.reconciliationType != ''">
AND pr.reconciliation_type = #{request.reconciliationType}
</if>
<choose>
<when test="request.paymentDate != null">
AND prm_total.premium_reconciliation_biz_id IS NOT NULL
</when>
<otherwise>
</otherwise>
</choose>
<!-- 投保人查询:支持中文繁/简体和英文大小写 -->
<if test="request.policyHolderNameSc != null and request.policyHolderNameSc != ''
or request.policyHolderNameEnLc != null and request.policyHolderNameEnLc != ''">
AND (
<if test="request.policyHolderNameSc != null and request.policyHolderNameSc != ''">
pp.name LIKE CONCAT('%', #{request.policyHolderNameSc}, '%')
</if>
<if test="request.policyHolderNameSc != null and request.policyHolderNameSc != ''
and request.policyHolderNameEnLc != null and request.policyHolderNameEnLc != ''">
OR
</if>
<if test="request.policyHolderNameEnLc != null and request.policyHolderNameEnLc != ''">
pp.name_en LIKE CONCAT('%', #{request.policyHolderNameEnLc}, '%')
</if>
)
</if>
<!-- 受保人查询:支持中文繁/简体和英文大小写 -->
<if test="request.insuredNameSc != null and request.insuredNameSc != ''
or request.insuredNameEnLc != null and request.insuredNameEnLc != ''">
AND (
<if test="request.insuredNameSc != null and request.insuredNameSc != ''">
pi.name LIKE CONCAT('%', #{request.insuredNameSc}, '%')
</if>
<if test="request.insuredNameSc != null and request.insuredNameSc != ''
and request.insuredNameEnLc != null and request.insuredNameEnLc != ''">
OR
</if>
<if test="request.insuredNameEnLc != null and request.insuredNameEnLc != ''">
pi.name_en LIKE CONCAT('%', #{request.insuredNameEnLc}, '%')
</if>
)
</if>
ORDER BY pr.create_time DESC
</select>
</mapper>
\ No newline at end of file
......@@ -29,7 +29,8 @@
fa.amount,
fa.hkd_amount,
fa.currency,
DATE_FORMAT(fa.fortune_account_date, '%Y%m') as fortune_account_month
DATE_FORMAT(fa.fortune_account_date, '%Y%m') as fortune_account_month,
fa.business_no
from salary_split ss
inner join fortune_account fa
on ss.fortune_account_biz_id = fa.fortune_account_biz_id
......@@ -105,7 +106,8 @@
fa.amount,
fa.hkd_amount,
fa.currency,
DATE_FORMAT(fa.fortune_account_date, '%Y%m') as fortune_account_month
DATE_FORMAT(fa.fortune_account_date, '%Y%m') as fortune_account_month,
fa.business_no
from salary_split ss
inner join fortune_account fa
on ss.fortune_account_biz_id = fa.fortune_account_biz_id
......
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