Commit 088170a8 by zhangxingmin

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

parents 99069997 e59b9174
package com.yd.csf.api.controller;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.auth.core.dto.AuthUserDto;
......@@ -11,12 +12,16 @@ import com.yd.common.result.Result;
import com.yd.csf.api.dto.CommissionExcelDTO;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.CommissionStatusEnum;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionCompareRecord;
import com.yd.csf.service.model.CommissionEditRecord;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionCompareRecordService;
import com.yd.csf.service.service.CommissionEditRecordService;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.CommissionService;
import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.collections4.CollectionUtils;
......@@ -56,6 +61,13 @@ public class ApiCommissionController {
@Resource
private CommissionExpectedService commissionExpectedService;
@Resource
private CommissionEditRecordService commissionEditRecordService;
@Resource
private CommissionCompareRecordService commissionCompareRecordService;
@PostMapping("/upload/excel")
@Operation(summary = "上传保单来佣Excel文件")
......@@ -140,13 +152,17 @@ public class ApiCommissionController {
Integer commissionPeriod = commission.getCommissionPeriod();
String commissionName = commission.getCommissionName();
CommissionExpected expected = getCommissionExpected(expectedList, policyNo, commissionPeriod, commissionName);
if (expected != null) {
commissionService.compareWithExpected(commission, expected);
} else {
// 查询预计来佣
CommissionExpected commissionExpected;
try {
commissionExpected = commissionService.queryByCommission(commission);
// 对比预计来佣
commissionService.compareWithExpected(commission.getPremium(), commission, commissionExpected);
commissionExpectedService.updateById(commissionExpected);
} catch (Exception e) {
// 预计来佣不存在,来佣状态设置为 比对失败
commission.setStatus("2");
commission.setRemark("未找到当前来佣对应的预计来佣,比对失败");
commission.setStatus(CommissionStatusEnum.COMPARE_FAIL.getItemValue());
commission.setRemark(e.getMessage());
}
}
......@@ -183,7 +199,6 @@ public class ApiCommissionController {
return Result.success(commissionService.generateFortune(generateFortuneRequest));
}
/**
* 创建保单来佣
*
......@@ -201,6 +216,24 @@ public class ApiCommissionController {
}
/**
* 来佣比对记录列表
*/
@PostMapping("/compare/records")
@Operation(summary = "来佣比对记录列表")
public Result<Page<CommissionCompareRecord>> getCommissionCompareRecords(@RequestBody CommissionCompareRecordQueryRequest queryRequest) {
if (StringUtils.isBlank(queryRequest.getCommissionBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "commissionBizId不能为空");
}
// 查询来佣比对记录
Page<CommissionCompareRecord> page = commissionCompareRecordService.page(new Page<>(queryRequest.getPageNo(), queryRequest.getPageSize()),
new LambdaQueryWrapper<CommissionCompareRecord>()
.eq(CommissionCompareRecord::getCommissionBizId, queryRequest.getCommissionBizId())
.orderByAsc(CommissionCompareRecord::getCommissionPeriod));
return Result.success(page);
}
/**
* 删除来佣
*
* @param deleteRequest
......@@ -251,6 +284,25 @@ public class ApiCommissionController {
}
/**
* 来佣操作记录列表
*
* @param queryRequest
* @return
*/
@PostMapping("/edit/records")
@Operation(summary = "来佣操作记录列表")
public Result<Page<CommissionEditRecord>> getCommissionEditRecords(@RequestBody CommissionEditRecordQueryRequest queryRequest) {
if (StringUtils.isBlank(queryRequest.getCommissionBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "commissionBizId不能为空");
}
// 查询来佣操作记录
Page<CommissionEditRecord> page = commissionEditRecordService.page(new Page<>(queryRequest.getPageNo(), queryRequest.getPageSize()), new LambdaQueryWrapper<CommissionEditRecord>()
.eq(CommissionEditRecord::getCommissionBizId, queryRequest.getCommissionBizId())
.orderByAsc(CommissionEditRecord::getSeq));
return Result.success(page);
}
/**
* 计算统计数据 总金额、总入账金额、待入账金额、已入账比例(已入账金额/总金额)、总保单数
*/
@PostMapping("/statistics")
......
......@@ -113,6 +113,7 @@ public class ApiCommissionExpectedController {
}
long current = CommissionExpectedQueryRequest.getPageNo();
long size = CommissionExpectedQueryRequest.getPageSize();
// 查询数据库
Page<CommissionExpected> CommissionExpectedPage = CommissionExpectedService.page(new Page<>(current, size),
CommissionExpectedService.getQueryWrapper(CommissionExpectedQueryRequest));
......
package com.yd.csf.api.controller;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yd.auth.core.dto.AuthUserDto;
......@@ -15,10 +17,10 @@ import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
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.service.FortuneService;
import com.yd.csf.service.vo.FortuneAccountVO;
import com.yd.csf.service.vo.FortuneVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.collections4.CollectionUtils;
......@@ -34,8 +36,8 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
......@@ -59,6 +61,9 @@ public class ApiFortuneController {
@Resource
private FortuneAccountService fortuneAccountService;
@Resource
private FortuneAccountEditRecordService fortuneAccountEditRecordService;
@PostMapping("/upload/excel")
@Operation(summary = "上传保单发佣Excel文件")
......@@ -187,7 +192,7 @@ public class ApiFortuneController {
Result<String> errorResult = Result.fail(
ResultCode.FAIL.getCode(),
"文件下载失败: " + e.getMessage()
e.getMessage()
);
response.getWriter().write(new ObjectMapper().writeValueAsString(errorResult));
......@@ -203,19 +208,43 @@ public class ApiFortuneController {
*/
@PostMapping("/list/page/fortuneAccount")
@Operation(summary = "分页获取出账列表")
public Result<Page<FortuneAccountVO>> listAccountByPage(@RequestBody FortuneAccountQueryRequest fortuneAccountQueryRequest,
public Result<Map<String, Object>> listAccountByPage(@RequestBody FortuneAccountQueryRequest fortuneAccountQueryRequest,
HttpServletRequest request) {
long current = fortuneAccountQueryRequest.getPageNo();
long size = fortuneAccountQueryRequest.getPageSize();
// 查询数据库
QueryWrapper<FortuneAccount> queryWrapper = fortuneAccountService.getQueryWrapper(fortuneAccountQueryRequest);
Page<FortuneAccount> fortunePage = fortuneAccountService.page(new Page<>(current, size),
fortuneAccountService.getQueryWrapper(fortuneAccountQueryRequest));
queryWrapper);
// 统计数据 总金额、总人数
List<FortuneAccount> fortuneAccountList = fortuneAccountService.list(queryWrapper);
FortuneAccountStatisticsVO statisticsVO = fortuneAccountService.getFortuneAccountStatistics(fortuneAccountList.stream()
.map(FortuneAccount::getId)
.collect(Collectors.toList()));
// 获取封装类
return Result.success(fortuneAccountService.getFortuneAccountVOPage(fortunePage));
Map<String, Object> result = new HashMap<>();
result.put("page", fortuneAccountService.getFortuneAccountVOPage(fortunePage));
result.put("statisticsVO", statisticsVO);
return Result.success(result);
}
/**
* 统计数据 总金额、总人数
*
* @param fortuneAccountQueryRequest
* @param request
* @return
*/
@PostMapping("/fortuneAccount/statistics")
@Operation(summary = "统计数据 总金额、总人数")
public Result<FortuneAccountStatisticsVO> getFortuneAccountStatistics(@RequestBody FortuneAccountStatisticsQueryRequest fortuneAccountQueryRequest,
HttpServletRequest request) {
return Result.success(fortuneAccountService.getFortuneAccountStatistics(fortuneAccountQueryRequest.getFortuneAccountIdList()));
}
/**
* 创建出账
*
* @param fortuneAccountAddRequest
......@@ -283,6 +312,24 @@ public class ApiFortuneController {
}
/**
* 修订记录
*
* @param queryRequest
* @return
*/
@PostMapping("/editRecords/fortuneAccount")
@Operation(summary = "修订记录")
public Result<Page<FortuneAccountEditRecord>> getFortuneAccountEditRecords(@RequestBody FortuneAccountEditRecordQueryRequest queryRequest) {
if (StringUtils.isBlank(queryRequest.getFortuneAccountBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneAccountBizId不能为空");
}
Page<FortuneAccountEditRecord> page = fortuneAccountEditRecordService.page(new Page<>(queryRequest.getPageNo(), queryRequest.getPageSize()),
new QueryWrapper<FortuneAccountEditRecord>()
.eq("fortune_account_biz_id", queryRequest.getFortuneAccountBizId()));
return Result.success(page);
}
/**
* 完成出账
*
* @param completeFortuneAccountRequest
......@@ -411,16 +458,37 @@ public class ApiFortuneController {
*/
@PostMapping("/list/page/vo")
@Operation(summary = "分页获取保单发佣列表")
public Result<Page<FortuneVO>> listFortuneByPage(@RequestBody FortuneQueryRequest fortuneQueryRequest,
public Result<Map<String, Object>> listFortuneByPage(@RequestBody FortuneQueryRequest fortuneQueryRequest,
HttpServletRequest request) {
long current = fortuneQueryRequest.getPageNo();
long size = fortuneQueryRequest.getPageSize();
// 查询数据库
// 查询条件
Wrapper<Fortune> queryWrapper = fortuneService.getQueryWrapper(fortuneQueryRequest);
// 分页查询
Page<Fortune> fortunePage = fortuneService.page(new Page<>(current, size),
fortuneService.getQueryWrapper(fortuneQueryRequest));
// 获取封装类
return Result.success(fortuneService.getFortuneVOPage(fortunePage));
queryWrapper);
// 查询统计数据
List<Fortune> fortuneList = fortuneService.list(queryWrapper);
FortuneStatisticsVO statisticsVO = fortuneService.getFortuneStatistics(fortuneList.stream().map(Fortune::getId).collect(Collectors.toList()));
// 组装返回结果
Map<String, Object> result = new HashMap<>();
result.put("statisticsVO", statisticsVO);
result.put("page", fortuneService.getFortuneVOPage(fortunePage));
return Result.success(result);
}
/**
* 计算统计数据 总出账金额、对应这些保单的总入账金额、总保单数
*/
@PostMapping("/statistics")
@Operation(summary = "计算统计数据 总出账金额、对应这些保单的总入账金额、总保单数")
public Result<FortuneStatisticsVO> getFortuneStatistics(@RequestBody FortuneStatisticsRequest statisticsRequest) {
if (CollectionUtils.isEmpty(statisticsRequest.getFortuneIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneId列表不能为空");
}
return Result.success(fortuneService.getFortuneStatistics(statisticsRequest.getFortuneIdList()));
}
}
......@@ -27,6 +27,7 @@ import com.yd.csf.service.service.*;
import com.yd.csf.service.vo.PolicyFollowDetailVO;
import com.yd.csf.service.vo.PolicyFollowRecordVO;
import com.yd.csf.service.vo.PolicyFollowVO;
import com.yd.product.feign.client.expectedcommissionratio.ApiExpectedCommissionRatioFeignClient;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.collections4.CollectionUtils;
......@@ -42,7 +43,6 @@ import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.*;
......@@ -81,10 +81,10 @@ public class ApiPolicyFollowController {
private PolicyFollowRecordService policyFollowRecordService;
@Resource
private PolicyFollowFileService policyFollowFileService;
@Resource
private PolicyReportPdfService policyReportPdfService;
@Resource
private ApiExpectedCommissionRatioFeignClient apiExpectedCommissionRatioFeignClient;
@PostMapping("/upload/excel")
......@@ -159,14 +159,14 @@ public class ApiPolicyFollowController {
// 获取当前登录用户的ID
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
// 保存预计来佣
List<CommissionExpected> commissionExpectedList = new ArrayList<>();
for (CommissionExcelDTO commissionExcelDTO : dataList) {
CommissionExpected commissionExpected = CommissionExcelDTO.convertToCommissionExpectedObj(commissionExcelDTO, loginUserId);
commissionExpected.setReconciliationCompanyBizId(reconciliationCompanyMap.get(commissionExcelDTO.getReconciliationCompany()));
commissionExpectedList.add(commissionExpected);
}
commissionExpectedService.saveBatch(commissionExpectedList);
// todo 保存预计来佣, 查询产品获取预计来佣比例
// List<CommissionExpected> commissionExpectedList = new ArrayList<>();
// for (CommissionExcelDTO commissionExcelDTO : dataList) {
// CommissionExpected commissionExpected = CommissionExcelDTO.convertToCommissionExpectedObj(commissionExcelDTO, loginUserId);
// commissionExpected.setReconciliationCompanyBizId(reconciliationCompanyMap.get(commissionExcelDTO.getReconciliationCompany()));
// commissionExpectedList.add(commissionExpected);
// }
// commissionExpectedService.saveBatch(commissionExpectedList);
return Result.success(true);
}
......@@ -463,6 +463,27 @@ public class ApiPolicyFollowController {
if (policyFollow == null) {
return Result.fail(ErrorCode.NOT_FOUND_ERROR.getCode(), ErrorCode.NOT_FOUND_ERROR.getMessage());
}
// 异步查询产品上架信息表
if (StringUtils.isNotBlank(policyFollow.getPolicyNo()) && StringUtils.isBlank(policyFollow.getProductLaunchBizId())) {
// 异步查询产品上架信息表
// ApiExpectedCommissionRatioPageRequest apiExpectedCommissionRatioPageRequest = new ApiExpectedCommissionRatioPageRequest();
// apiExpectedCommissionRatioPageRequest.setPageNo(1);
// apiExpectedCommissionRatioPageRequest.setPageSize(100);
// apiExpectedCommissionRatioPageRequest.setWarrantyPeriod(String.valueOf(policyFollow.getPaymentTerm()));
// Result<Page<ApiExpectedCommissionRatioPageResponse>> result = apiExpectedCommissionRatioFeignClient.page(apiExpectedCommissionRatioPageRequest);
// if (result != null && result.getData() != null) {
// List<ApiExpectedCommissionRatioPageResponse> records = (List<ApiExpectedCommissionRatioPageResponse>) result.getData();
// if (CollectionUtils.isNotEmpty(records)) {
// policyFollow.setProductLaunchBizId(records.get(0).getProductLaunchBizId());
// }
// }
PolicyFollow updatePolicyFollow = new PolicyFollow();
updatePolicyFollow.setId(policyFollow.getId());
updatePolicyFollow.setProductLaunchBizId("product_launch_kudwRqXsz1");
policyFollowService.updateById(updatePolicyFollow);
}
// 获取封装类
return Result.success(policyFollowService.getPolicyFollowVO(policyFollow));
......@@ -565,44 +586,26 @@ public class ApiPolicyFollowController {
public void previewPolicyReport(@RequestParam("policyBizId") String policyBizId,
HttpServletResponse response) {
PolicyFollow policyFollow = policyFollowService.getByPolicyBizId(policyBizId);
if (policyFollow == null) {
PolicyReportData reportData = policyFollowService.queryPolicyReportData(policyBizId);
if (reportData == null) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR.getCode(), ErrorCode.NOT_FOUND_ERROR.getMessage());
}
PolicyReportData reportData = new PolicyReportData();
// 填充数据
// reportData.setStartTime("2025-10-30");
// reportData.setEndTime("2025-10-30");
// reportData.setLocation("香港");
// reportData.setServiceManager("Vickie");
// reportData.setPolicyHolder(policyFollow.getPolicyHolder());
// reportData.setPolicyNumber(policyFollow.getPolicyNo());
// reportData.setInsuranceCompany(policyFollow.getInsurer());
// reportData.setInsuredPerson(policyFollow.getInsured());
// reportData.setInsurancePlan(policyFollow.getProductName());
// reportData.setInsuredAge(0);
// reportData.setCurrency(policyFollow.getCurrency());
// reportData.setPaymentPeriod((Integer) policyFollow.getPaymentTerm());
// reportData.setAnnualAmount(policyFollow.getPaymentPremium());
// reportData.setTotalPrepayment(BigDecimal.ZERO);
// reportData.setPremiumFee(BigDecimal.ZERO);
reportData.setStartTime("2025-10-30");
reportData.setEndTime("2025-10-30");
reportData.setLocation("香港");
reportData.setServiceManager("Vickie");
reportData.setPolicyHolder("policyHolder");
reportData.setPolicyNumber("B635379588");
reportData.setInsuranceCompany("友邦保险");
reportData.setInsuredPerson("insuredPerson");
reportData.setInsurancePlan("环宇盈活储蓄保险计划");
reportData.setInsuredAge(1);
reportData.setCurrency("HKD");
reportData.setPaymentPeriod(5);
reportData.setAnnualAmount(BigDecimal.valueOf(30000.08));
reportData.setTotalPrepayment(BigDecimal.valueOf(150064.70));
reportData.setPremiumFee(BigDecimal.valueOf(12.86));
// reportData.setPolicyHolder("policyHolder");
// reportData.setPolicyNumber("B635379588");
// reportData.setInsuranceCompany("友邦保险");
// reportData.setInsuredPerson("insuredPerson");
// reportData.setInsurancePlan("环宇盈活储蓄保险计划");
// reportData.setInsuredAge(1);
// reportData.setCurrency("HKD");
// reportData.setPaymentPeriod(5);
// reportData.setAnnualAmount(BigDecimal.valueOf(30000.08));
// reportData.setTotalPrepayment(BigDecimal.valueOf(150064.70));
// reportData.setPremiumFee(BigDecimal.valueOf(12.86));
try {
log.info("收到PDF生成请求: {}", reportData);
......
......@@ -17,6 +17,9 @@ public class CommissionExcelDTO {
@ExcelProperty("保单号")
private String policyNo;
@ExcelProperty("保费")
private String premium;
@ExcelProperty("对账公司")
private String reconciliationCompany;
......@@ -35,6 +38,9 @@ public class CommissionExcelDTO {
@ExcelProperty("来佣币种")
private String currency;
@ExcelProperty("结算汇率")
private String exchangeRate;
@ExcelProperty("来佣日期")
private Date commissionDate;
......@@ -48,6 +54,7 @@ public class CommissionExcelDTO {
Commission entity = new Commission();
// 字段映射
entity.setPolicyNo(data.getPolicyNo());
entity.setPremium(data.getPremium());
entity.setCommissionBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_COMMISSION.getCode()));
entity.setReconciliationCompany(data.getReconciliationCompany());
entity.setCommissionPeriod(data.getCommissionPeriod());
......@@ -55,6 +62,7 @@ public class CommissionExcelDTO {
entity.setCommissionName(data.getCommissionName());
entity.setAmount(data.getAmount());
entity.setCurrency(data.getCurrency());
entity.setExchangeRate(data.getExchangeRate());
entity.setCommissionDate(data.getCommissionDate());
entity.setRemark(data.getRemark());
entity.setStatus(null);
......@@ -81,8 +89,9 @@ public class CommissionExcelDTO {
entity.setCommissionPeriod(data.getCommissionPeriod());
entity.setTotalPeriod(data.getTotalPeriod());
entity.setCommissionName(data.getCommissionName());
entity.setAmount(data.getAmount());
entity.setCommissionRatio(data.getAmount());
entity.setCurrency(data.getCurrency());
entity.setCommissionRatio(null);
entity.setCommissionDate(data.getCommissionDate());
entity.setRemark(data.getRemark());
entity.setStatus("0");
......
......@@ -471,7 +471,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
}
//待跟进
follow.setStatus(PolicyFollowStatusEnum.FOLLOW_UP.getItemValue());
follow.setNextStatusList(policyFollowService.getNextStatus(PolicyFollowStatusEnum.CHECKING));
follow.setNextStatusList(policyFollowService.getNextStatus(PolicyFollowStatusEnum.FOLLOW_UP));
//TODO 保险公司业务id
// follow.setInsurerBizId();
//TODO 期交保费
......
......@@ -99,6 +99,12 @@
<artifactId>yd-oss-feign</artifactId>
<version>${project.version}</version>
</dependency>
<!-- yd-product-feign模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-product-feign</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 认证模块 -->
<dependency>
......
package com.yd.csf.service.dao;
import com.yd.csf.service.model.CommissionCompareRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Zhang Jianan
* @description 针对表【commission_compare_record(来佣比对记录表)】的数据库操作Mapper
* @createDate 2025-11-25 13:43:10
* @Entity generator.domain.CommissionCompareRecord
*/
public interface CommissionCompareRecordMapper extends BaseMapper<CommissionCompareRecord> {
}
package com.yd.csf.service.dao;
import com.yd.csf.service.model.CommissionEditRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Zhang Jianan
* @description 针对表【commission_edit_record(来佣修改记录表)】的数据库操作Mapper
* @createDate 2025-11-24 16:45:37
* @Entity generator.domain.CommissionEditRecord
*/
public interface CommissionEditRecordMapper extends BaseMapper<CommissionEditRecord> {
}
package com.yd.csf.service.dao;
import com.yd.csf.service.model.FortuneAccountEditRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Zhang Jianan
* @description 针对表【fortune_account_edit_record(薪资修订记录表)】的数据库操作Mapper
* @createDate 2025-11-25 11:14:20
* @Entity generator.domain.FortuneAccountEditRecord
*/
public interface FortuneAccountEditRecordMapper extends BaseMapper<FortuneAccountEditRecord> {
}
package com.yd.csf.service.dao;
import com.yd.csf.service.dto.FortuneStatisticsVO;
import com.yd.csf.service.model.Fortune;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author Zhang Jianan
......@@ -11,6 +15,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface FortuneMapper extends BaseMapper<Fortune> {
FortuneStatisticsVO getFortuneStatistics(@Param("fortuneIdList") List<Long> fortuneIdList);
}
......
package com.yd.csf.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yd.csf.service.dto.PolicyReportData;
import com.yd.csf.service.model.PolicyFollow;
import org.apache.ibatis.annotations.Param;
/**
* @author Zhang Jianan
......@@ -11,6 +13,7 @@ import com.yd.csf.service.model.PolicyFollow;
*/
public interface PolicyFollowMapper extends BaseMapper<PolicyFollow> {
PolicyReportData queryPolicyReportData(@Param("policyBizId") String policyBizId);
}
......
......@@ -16,6 +16,12 @@ public class CommissionAddRequest implements Serializable {
@Schema(description = "保单号", requiredMode = Schema.RequiredMode.REQUIRED)
private String policyNo;
/**
* 保费
*/
@Schema(description = "保费", requiredMode = Schema.RequiredMode.REQUIRED)
private String premium;
/**
* 对账公司
*/
......
package com.yd.csf.service.dto;
import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class CommissionCompareRecordQueryRequest extends PageDto {
/**
* 来佣业务ID
*/
@Schema(description = "来佣业务ID")
private String commissionBizId;
}
package com.yd.csf.service.dto;
import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class CommissionEditRecordQueryRequest extends PageDto {
/**
* 来佣业务ID
*/
@Schema(description = "来佣业务ID")
private String commissionBizId;
}
......@@ -63,10 +63,10 @@ public class CommissionExpectedAddDto {
private String commissionType;
/**
* 来佣金额
* 来佣比例 (%)
*/
@Schema(description = "来佣金额")
private BigDecimal amount;
@Schema(description = "来佣比例 (%)")
private BigDecimal commissionRatio;
/**
* 来佣币种
......
package com.yd.csf.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 编辑预计来佣请求
*
*/
@Data
public class CommissionExpectedEditRequest implements Serializable {
/**
* id
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* 标签列表
*/
private List<String> tags;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -67,6 +67,17 @@ public class CommissionExpectedUpdateRequest implements Serializable {
@Schema(description = "来佣类型(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)")
private String commissionType;
/**
* 来佣比例
*/
@Schema(description = "来佣比例")
private BigDecimal commissionRatio;
/**
* 来佣比例
*/
private BigDecimal ratio;
/**
* 来佣金额
*/
......
......@@ -21,6 +21,12 @@ public class CommissionUpdateRequest implements Serializable {
@Schema(description = "保单号")
private String policyNo;
/**
* 保费
*/
@Schema(description = "保费")
private String premium;
/**
* 对账公司
*/
......
package com.yd.csf.service.dto;
import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class FortuneAccountEditRecordQueryRequest extends PageDto {
/**
* 薪资记录业务ID
*/
@Schema(description = "薪资记录业务ID")
private String fortuneAccountBizId;
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class FortuneAccountStatisticsQueryRequest {
/**
* 薪资记录id列表
*/
@Schema(description = "薪资记录id列表")
private List<Long> fortuneAccountIdList;
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class FortuneAccountStatisticsVO {
/**
* 总金额
*/
@Schema(description = "总金额")
private BigDecimal totalAmount;
/**
* 总人数
*/
@Schema(description = "总人数")
private Object brokerCount;
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class FortuneStatisticsRequest {
/**
* fortuneId 列表
*/
@Schema(description = "fortuneId 列表")
private List<Long> fortuneIdList;
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class FortuneStatisticsVO {
/**
* 总出账金额
*/
@Schema(description = "总出账金额")
private BigDecimal totalOutAmount;
/**
* 总入账金额
*/
@Schema(description = "总入账金额")
private BigDecimal totalInAmount;
/**
* 总保单数
*/
@Schema(description = "总保单数")
private Long totalPolicyCount;
}
......@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
......@@ -30,6 +31,11 @@ public class Commission implements Serializable {
*/
private String policyNo;
/**
* 保费
*/
private String premium;
/**
* 对账公司
*/
......@@ -71,6 +77,26 @@ public class Commission implements Serializable {
private String currency;
/**
* 结算汇率
*/
private String exchangeRate;
/**
* 当前来佣比例
*/
private BigDecimal currentCommissionRatio;
/**
* 当期已入账来佣比例
*/
private BigDecimal periodPaidRatio;
/**
* 当期剩余来佣比例
*/
private BigDecimal periodPendingRatio;
/**
* 来佣日期
*/
private Date commissionDate;
......@@ -81,6 +107,26 @@ public class Commission implements Serializable {
private String status;
/**
* 预计来佣业务id
*/
private String commissionExpectedBizId;
/**
* 总金额
*/
private BigDecimal expectedAmount;
/**
* 已入账金额
*/
private BigDecimal paidAmount;
/**
* 待入账金额
*/
private BigDecimal pendingAmount;
/**
* 通用备注
*/
private String remark;
......
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 来佣比对记录表
* @TableName commission_compare_record
*/
@TableName(value ="commission_compare_record")
@Data
public class CommissionCompareRecord implements Serializable {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 预计来佣业务id
*/
@Schema(description = "预计来佣业务id")
private String commissionExpectedBizId;
/**
* 保单来佣业务id
*/
@Schema(description = "保单来佣业务id")
private String commissionBizId;
/**
* 佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)")
private Integer commissionPeriod;
/**
* 总期数
*/
@Schema(description = "总期数")
private Integer totalPeriod;
/**
* 比对状态 1=比对成功 2=比对失败
*/
@Schema(description = "比对状态 1=比对成功 2=比对失败")
private String status;
/**
* 来佣币种
*/
@Schema(description = "来佣币种")
private String currency;
/**
* 比对时间
*/
@Schema(description = "比对时间")
private Date createTime;
/**
* 结算汇率
*/
@Schema(description = "结算汇率")
private String exchangeRate;
/**
* 入账金额
*/
@Schema(description = "入账金额")
private BigDecimal amount;
/**
* 通用备注
*/
@JsonIgnore
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@JsonIgnore
private Integer isDeleted;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 来佣修改记录表
* @TableName commission_edit_record
*/
@TableName(value ="commission_edit_record")
@Data
public class CommissionEditRecord implements Serializable {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 保单来佣业务id
*/
@Schema(description = "保单来佣业务id")
private String commissionBizId;
/**
* 操作人userid
*/
@Schema(description = "操作人userid")
private String userBizId;
/**
* 操作人
*/
@Schema(description = "操作人")
private String userName;
/**
* 序号
*/
@Schema(description = "序号")
private Integer seq;
/**
* 变更字段
*/
@Schema(description = "变更字段")
private String field;
/**
* 变更前信息
*/
@Schema(description = "变更前信息")
private Object beforeChange;
/**
* 变更后信息
*/
@Schema(description = "变更后信息")
private Object afterChange;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
private Integer isDeleted;
/**
* 创建时间
*/
@Schema(description = "创建时间")
private Date createTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -66,9 +66,9 @@ public class CommissionExpected implements Serializable {
private String commissionType;
/**
* 来佣金额
* 来佣比例 (%)
*/
private BigDecimal amount;
private BigDecimal commissionRatio;
/**
* 来佣币种
......@@ -86,6 +86,26 @@ public class CommissionExpected implements Serializable {
private String status;
/**
* 默认结算汇率
*/
private BigDecimal defaultExchangeRate;
/**
* 预计来佣金额
*/
private BigDecimal expectedAmount;
/**
* 已入账来佣金额
*/
private BigDecimal paidAmount;
/**
* 已入账来佣比例
*/
private BigDecimal paidRatio;
/**
* 通用备注
*/
private String remark;
......
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 薪资修订记录表
* @TableName fortune_account_edit_record
*/
@TableName(value ="fortune_account_edit_record")
@Data
public class FortuneAccountEditRecord implements Serializable {
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 薪资记录业务id
*/
@Schema(description = "薪资记录业务id")
private String fortuneAccountBizId;
/**
* 修订人userid
*/
@Schema(description = "修订人userid")
private String userBizId;
/**
* 修订人
*/
@Schema(description = "修订人")
private String userName;
/**
* 修订内容
*/
@Schema(description = "修订内容")
private String editContent;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
private Integer isDeleted;
/**
* 创建时间
*/
@Schema(description = "创建时间")
private Date createTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -139,9 +139,9 @@ public class PolicyFollow implements Serializable {
private String paymentNumber;
/**
* 产品业务id
* 产品上架信息表唯一业务ID
*/
private String productBizId;
private String productLaunchBizId;
/**
* 产品名称
......
package com.yd.csf.service.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.service.model.CommissionCompareRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @author Zhang Jianan
* @description 针对表【commission_compare_record(来佣比对记录表)】的数据库操作Service
* @createDate 2025-11-25 13:43:10
*/
public interface CommissionCompareRecordService extends IService<CommissionCompareRecord> {
}
package com.yd.csf.service.service;
import com.yd.csf.service.model.CommissionEditRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author Zhang Jianan
* @description 针对表【commission_edit_record(来佣修改记录表)】的数据库操作Service
* @createDate 2025-11-24 16:45:37
*/
public interface CommissionEditRecordService extends IService<CommissionEditRecord> {
}
......@@ -32,11 +32,13 @@ public interface CommissionService extends IService<Commission> {
Commission getByCommissionBizId(String commissionBizId);
void compareWithExpected(Commission commission, CommissionExpected expected);
void compareWithExpected(String premium, Commission commission, CommissionExpected expected);
List<Commission> queryList(CommissionDto dto);
List<CommissionBindPolicyBrokerDto> queryCommissionBindPolicyBrokerList(CommissionDto dto);
CommissionStatisticsVO getCommissionStatistics(List<Long> commissionIds);
CommissionExpected queryByCommission(Commission commission);
}
package com.yd.csf.service.service;
import com.yd.csf.service.model.FortuneAccountEditRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author Zhang Jianan
* @description 针对表【fortune_account_edit_record(薪资修订记录表)】的数据库操作Service
* @createDate 2025-11-25 11:14:20
*/
public interface FortuneAccountEditRecordService extends IService<FortuneAccountEditRecord> {
}
......@@ -30,4 +30,12 @@ public interface FortuneAccountService extends IService<FortuneAccount> {
Boolean updateFortuneAccount(FortuneAccountUpdateRequest fortuneAccountUpdateRequest);
Boolean completeFortuneAccount(CompleteFortuneAccountRequest completeFortuneAccountRequest);
/**
* 统计数据 总金额、总人数
*
* @param fortuneAccountIdList
* @return
*/
FortuneAccountStatisticsVO getFortuneAccountStatistics(List<Long> fortuneAccountIdList);
}
......@@ -10,6 +10,7 @@ import com.yd.csf.service.vo.FortuneVO;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
/**
* @author Zhang Jianan
......@@ -35,4 +36,6 @@ public interface FortuneService extends IService<Fortune> {
Boolean addFortune(FortuneAddRequest fortuneAddRequest);
Fortune queryOne(String fortuneBizId);
FortuneStatisticsVO getFortuneStatistics(List<Long> fortuneIdList);
}
......@@ -44,4 +44,6 @@ public interface PolicyFollowService extends IService<PolicyFollow> {
Page<PolicyFollowDetailVO> getPolicyFollowDetailVOList(Page<PolicyFollow> policyFollowPage);
String getCurrencyValue(String currency);
PolicyReportData queryPolicyReportData(String policyBizId);
}
......@@ -69,7 +69,9 @@ public class PolicyReportPdfService {
addPolicyDetailFields(document, reportData);
// 7. 附加险表头
addAdditionalInsuranceHeader(document);
// 8. 详细信息下方水平线
// 8. 附加险详细信息表格
addAdditionalInsuranceDetail(document, reportData);
// 9. 详细信息下方水平线
addHorizontalLine(document, writer);
// 移除了原来的备注说明,因为现在备注已经整合到保单详细字段中
......@@ -82,6 +84,44 @@ public class PolicyReportPdfService {
}
/**
* 附加险详细信息表格
*/
private void addAdditionalInsuranceDetail(Document document, PolicyReportData reportData) throws DocumentException {
if (reportData.getAdditionalInsurances() == null || reportData.getAdditionalInsurances().isEmpty()) {
return;
}
PdfPTable table = new PdfPTable(4);
table.setWidthPercentage(100);
table.setWidths(new float[]{25, 25, 25, 25});
table.setSpacingBefore(0f);
table.setSpacingAfter(ROW_SPACING);
// 添加附加险数据行
for (PolicyReportData.AdditionalInsurance insurance : reportData.getAdditionalInsurances()) {
addTableCenterCellNoBorder(table, insurance.getName() != null ? insurance.getName() : "");
addTableCenterCellNoBorder(table, insurance.getPaymentTerm() != null ? String.valueOf(insurance.getPaymentTerm()) : "");
addTableCenterCellNoBorder(table, insurance.getCurrency() != null ? insurance.getCurrency() : "");
addTableCenterCellNoBorder(table, insurance.getFirstYearAmount() != null ? formatAmount(insurance.getFirstYearAmount()) : "");
}
document.add(table);
}
/**
* 添加居中对齐的无边框内容单元格
*/
private void addTableCenterCellNoBorder(PdfPTable table, String text) {
Paragraph para = new Paragraph(text, chineseFont);
com.lowagie.text.pdf.PdfPCell cell = new com.lowagie.text.pdf.PdfPCell(para);
cell.setBorder(com.lowagie.text.Rectangle.NO_BORDER);
cell.setHorizontalAlignment(com.lowagie.text.Element.ALIGN_CENTER);
cell.setVerticalAlignment(com.lowagie.text.Element.ALIGN_MIDDLE);
cell.setPadding(2f);
table.addCell(cell);
}
/**
* 主标题 - 放大并居中
*/
private void addMainTitle(Document document, String title) throws DocumentException {
......@@ -170,12 +210,12 @@ public class PolicyReportPdfService {
// 第一行:保單持有人 | 持有人值 | 保險公司 | 公司值
addTableHeaderCellNoBorder(table, "保單持有人");
addTableCellNoBorder(table, data.getPolicyHolder() != null ? data.getPolicyHolder() : "");
addTableHeaderCellNoBorder(table, "保險公司");
addTableCellNoBorder(table, data.getInsuranceCompany() != null ? data.getInsuranceCompany() : "");
// 第二行:保單受保人 | 受保人值 | 受保人年齡 | 年齡值
addTableHeaderCellNoBorder(table, "保單受保人");
addTableCellNoBorder(table, data.getInsuredPerson() != null ? data.getInsuredPerson() : "");
// 第二行:保單受保人 | 受保人值 | 受保人年齡 | 年齡值
addTableHeaderCellNoBorder(table, "保險公司");
addTableCellNoBorder(table, data.getInsuranceCompany() != null ? data.getInsuranceCompany() : "");
addTableHeaderCellNoBorder(table, "受保人年齡");
addTableCellNoBorder(table, data.getInsuredAge() != null ? String.valueOf(data.getInsuredAge()) : "");
......
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.model.CommissionCompareRecord;
import com.yd.csf.service.service.CommissionCompareRecordService;
import com.yd.csf.service.dao.CommissionCompareRecordMapper;
import org.springframework.stereotype.Service;
/**
* @author Zhang Jianan
* @description 针对表【commission_compare_record(来佣比对记录表)】的数据库操作Service实现
* @createDate 2025-11-25 13:43:10
*/
@Service
public class CommissionCompareRecordServiceImpl extends ServiceImpl<CommissionCompareRecordMapper, CommissionCompareRecord>
implements CommissionCompareRecordService{
}
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.model.CommissionEditRecord;
import com.yd.csf.service.service.CommissionEditRecordService;
import com.yd.csf.service.dao.CommissionEditRecordMapper;
import org.springframework.stereotype.Service;
/**
* @author Zhang Jianan
* @description 针对表【commission_edit_record(来佣修改记录表)】的数据库操作Service实现
* @createDate 2025-11-24 16:45:37
*/
@Service
public class CommissionEditRecordServiceImpl extends ServiceImpl<CommissionEditRecordMapper, CommissionEditRecord>
implements CommissionEditRecordService{
}
......@@ -14,8 +14,12 @@ import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import com.yd.csf.service.dto.CommissionExpectedUpdateRequest;
import com.yd.csf.service.enums.CommissionExpectedStatusEnum;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.dao.CommissionExpectedMapper;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
import com.yd.csf.service.vo.CommissionExpectedVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
......@@ -24,7 +28,9 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
......@@ -37,6 +43,13 @@ import java.util.stream.Collectors;
public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpectedMapper, CommissionExpected>
implements CommissionExpectedService{
@Resource
private PolicyService policyService;
@Resource
private PolicyFollowService policyFollowService;
@Override
public Page<CommissionExpectedVO> getCommissionExpectedVOPage(Page<CommissionExpected> commissionExpectedPage) {
List<CommissionExpected> CommissionExpectedList = commissionExpectedPage.getRecords();
......@@ -45,8 +58,23 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
return CommissionExpectedVOPage;
}
// 关联查询保单信息
Set<String> policyNoSet = CommissionExpectedList.stream().map(CommissionExpected::getPolicyNo).collect(Collectors.toSet());
QueryWrapper<PolicyFollow> queryWrapper = new QueryWrapper<PolicyFollow>();
queryWrapper.select("policy_no", "payment_premium");
queryWrapper.in("policy_no", policyNoSet);
Map<String, PolicyFollow> policyMap = policyFollowService.list(queryWrapper)
.stream().collect(Collectors.toMap(PolicyFollow::getPolicyNo, a -> a, (oldValue, newValue) -> newValue));
// 填充信息
List<CommissionExpectedVO> CommissionExpectedVOList = CommissionExpectedList.stream().map(CommissionExpectedVO::objToVo).collect(Collectors.toList());
List<CommissionExpectedVO> CommissionExpectedVOList = CommissionExpectedList.stream().map(commissionExpected -> {
CommissionExpectedVO commissionExpectedVO = CommissionExpectedVO.objToVo(commissionExpected);
PolicyFollow policyFollow = policyMap.get(commissionExpected.getPolicyNo());
if (policyFollow != null) {
commissionExpectedVO.setPremium(policyFollow.getPaymentPremium());
}
return commissionExpectedVO;
}).collect(Collectors.toList());
CommissionExpectedVOPage.setRecords(CommissionExpectedVOList);
return CommissionExpectedVOPage;
}
......@@ -70,9 +98,9 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (StringUtils.isBlank(commissionName)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣名称不能为空");
}
BigDecimal amount = commissionExpected.getAmount();
if (ObjectUtils.isEmpty(amount)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣金额不能为空");
BigDecimal commissionRatio = commissionExpected.getCommissionRatio();
if (ObjectUtils.isEmpty(commissionRatio)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣比例不能为空");
}
Integer commissionPeriod = commissionExpected.getCommissionPeriod();
if (ObjectUtils.isEmpty(commissionPeriod)) {
......@@ -144,12 +172,26 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (CollUtil.isEmpty(addDtoList)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计来佣列表不能为空");
}
// 查询保单信息
String policyNo = addDtoList.get(0).getPolicyNo();
Policy policy = policyService.getOne(new QueryWrapper<Policy>().eq("policy_no", policyNo));
List<CommissionExpected> addList = new ArrayList<>();
List<CommissionExpected> updateList = new ArrayList<>();
for (CommissionExpectedAddDto addDto : addDtoList) {
CommissionExpected commissionExpected = new CommissionExpected();
BeanUtils.copyProperties(addDto, commissionExpected);
// 默认结算汇率 7.8 美元对港币
commissionExpected.setDefaultExchangeRate(BigDecimal.valueOf(7.8));
// 预计总金额
if (policy != null) {
BigDecimal expectedAmount = policy.getPaymentPremium()
.multiply(commissionExpected.getCommissionRatio())
.multiply(commissionExpected.getDefaultExchangeRate())
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
commissionExpected.setExpectedAmount(expectedAmount);
}
// 校验参数
validCommissionExpected(commissionExpected, true);
......@@ -166,13 +208,19 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
commissionExpected.setUpdateTime(new Date());
updateList.add(commissionExpected);
}
}
// 新增预计来佣
if (CollectionUtils.isNotEmpty(addList)) {
this.saveBatch(addList);
}
if (CollectionUtils.isNotEmpty(updateList)) {
List<String> bizIdList = updateList.stream().map(CommissionExpected::getCommissionExpectedBizId).collect(Collectors.toList());
List<CommissionExpected> list = this.list(new QueryWrapper<CommissionExpected>().in("commission_expected_biz_id", bizIdList));
Map<String, CommissionExpected> map = list.stream().collect(Collectors.toMap(CommissionExpected::getCommissionExpectedBizId, a -> a));
for (CommissionExpected update : updateList) {
CommissionExpected commissionExpectedFromDb = map.get(update.getCommissionExpectedBizId());
update.setId(commissionExpectedFromDb.getId());
}
this.updateBatchById(updateList);
}
return true;
......@@ -198,10 +246,22 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (commissionExpected == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计来佣不存在");
}
if (commissionExpected.getCommissionRatio() == null) {
if (commissionExpectedUpdateRequest.getRatio() != null) {
commissionExpected.setCommissionRatio(commissionExpectedUpdateRequest.getRatio());
} else {
commissionExpected.setCommissionRatio(commissionExpectedUpdateRequest.getCommissionRatio());
}
}
// 校验数据
validCommissionExpected(commissionExpected, false);
// 转换为实体类
BeanUtils.copyProperties(commissionExpectedUpdateRequest, commissionExpected);
if (commissionExpectedUpdateRequest.getRatio() != null) {
commissionExpected.setCommissionRatio(commissionExpectedUpdateRequest.getRatio());
} else {
commissionExpected.setCommissionRatio(commissionExpectedUpdateRequest.getCommissionRatio());
}
commissionExpected.setUpdateTime(new Date());
// 更新预计来佣
return this.updateById(commissionExpected);
......
package com.yd.csf.service.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
......@@ -20,7 +21,9 @@ import com.yd.csf.service.service.*;
import com.yd.csf.service.dao.CommissionMapper;
import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO;
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.stereotype.Service;
......@@ -29,8 +32,8 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
......@@ -39,6 +42,7 @@ import java.util.stream.Collectors;
* @createDate 2025-09-19 16:08:05
*/
@Service
@Slf4j
public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commission>
implements CommissionService {
......@@ -54,6 +58,10 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
private CommissionExpectedService commissionExpectedService;
@Resource
private IExpectedFortuneService iExpectedFortuneService;
@Resource
private CommissionEditRecordService commissionEditRecordService;
@Resource
private CommissionCompareRecordService commissionCompareRecordService;
@Override
......@@ -77,9 +85,10 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (commissionDateStart != null && commissionDateEnd != null) {
queryWrapper.between("commission_date", commissionDateStart, commissionDateEnd);
}
// 查询预计入账日期及之前的记录
// 查询预计入账日期及之前的记录, 关联查询 commission_expected 表
if (expectedDate != null) {
queryWrapper.lt("expected_date", expectedDate);
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);
}
queryWrapper.orderByDesc("id");
......@@ -108,35 +117,149 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (commission == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到该来佣记录");
}
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
// 保存修改记录
saveUpdateCommissionRecord(commission, commissionUpdateRequest, currentLoginUser);
// 更新属性
BeanUtils.copyProperties(commissionUpdateRequest, commission, "id", "commissionBizId");
commission.setUpdaterId(loginUserId);
commission.setUpdateTime(new Date());
// 先更新来佣属性
this.updateById(commission);
// 查询预计来佣
CommissionExpected commissionExpected = queryByCommission(commission);
if (commissionExpected != null) {
CommissionExpected commissionExpected;
try {
commissionExpected = queryByCommission(commission);
// 对比预计来佣
compareWithExpected(commission, commissionExpected);
compareWithExpected(commission.getPremium(), commission, commissionExpected);
commissionExpectedService.updateById(commissionExpected);
} else {
} catch (Exception e) {
// 预计来佣不存在,来佣状态设置为 比对失败
commission.setStatus(CommissionStatusEnum.COMPARE_FAIL.getItemValue());
commission.setRemark("未找到当前来佣对应的预计来佣,比对失败");
commission.setRemark(e.getMessage());
}
// 更新比对信息
return this.updateById(commission);
}
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
commission.setUpdaterId(loginUserId);
commission.setUpdateTime(new Date());
private void saveUpdateCommissionRecord(Commission commission, CommissionUpdateRequest commissionUpdateRequest, AuthUserDto currentLoginUser) {
// 保存修改记录
List<CommissionEditRecord> commissionEditRecords = new ArrayList<>();
return this.updateById(commission);
if (!Objects.equals(commission.getPolicyNo(), commissionUpdateRequest.getPolicyNo())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("保单号", commission.getPolicyNo(), commissionUpdateRequest.getPolicyNo(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getReconciliationCompany(), commissionUpdateRequest.getReconciliationCompany())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("对账公司", commission.getReconciliationCompany(), commissionUpdateRequest.getReconciliationCompany(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getCommissionPeriod(), commissionUpdateRequest.getCommissionPeriod())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("佣金期数", commission.getCommissionPeriod(), commissionUpdateRequest.getCommissionPeriod(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getTotalPeriod(), commissionUpdateRequest.getTotalPeriod())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("总来佣期数", commission.getTotalPeriod(), commissionUpdateRequest.getTotalPeriod(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getCommissionName(), commissionUpdateRequest.getCommissionName())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("来佣名称", commission.getCommissionName(), commissionUpdateRequest.getCommissionName(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (commission.getAmount().compareTo(commissionUpdateRequest.getAmount()) != 0) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("来佣金额", commission.getAmount(), commissionUpdateRequest.getAmount(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getCurrency(), commissionUpdateRequest.getCurrency())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("币种", commission.getCurrency(), commissionUpdateRequest.getCurrency(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getExchangeRate(), commissionUpdateRequest.getExchangeRate())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("结算汇率", commission.getExchangeRate(), commissionUpdateRequest.getExchangeRate(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getCommissionDate(), commissionUpdateRequest.getCommissionDate())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("来佣日期",
DateUtil.formatDate(commission.getCommissionDate()),
DateUtil.formatDate(commissionUpdateRequest.getCommissionDate()), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getStatus(), commissionUpdateRequest.getStatus())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("来佣比对状态", commission.getStatus(), commissionUpdateRequest.getStatus(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (!Objects.equals(commission.getRemark(), commissionUpdateRequest.getRemark())) {
CommissionEditRecord commissionRecord = getCommissionEditRecord("备注", commission.getRemark(), commissionUpdateRequest.getRemark(), commission.getCommissionBizId(), currentLoginUser);
commissionEditRecords.add(commissionRecord);
}
if (CollectionUtils.isNotEmpty(commissionEditRecords)) {
// 变更序号从1开始
commissionEditRecords.forEach(commissionRecord -> commissionRecord.setSeq(commissionEditRecords.indexOf(commissionRecord) + 1));
commissionEditRecordService.saveBatch(commissionEditRecords);
}
}
private static CommissionEditRecord getCommissionEditRecord(String field, Object commissionPropertyValue, Object requestPropertyValue, String commissionBizId, AuthUserDto currentLoginUser) {
CommissionEditRecord commissionRecord = new CommissionEditRecord();
commissionRecord.setField(field);
commissionRecord.setBeforeChange(commissionPropertyValue);
commissionRecord.setAfterChange(requestPropertyValue);
commissionRecord.setCommissionBizId(commissionBizId);
commissionRecord.setUserBizId(currentLoginUser.getId().toString());
commissionRecord.setUserName(currentLoginUser.getUsername());
commissionRecord.setCreateTime(new Date());
return commissionRecord;
}
private CommissionExpected queryByCommission(Commission commission) {
@Override
public CommissionExpected queryByCommission(Commission commission) {
QueryWrapper<CommissionExpected> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("policy_no", commission.getPolicyNo());
queryWrapper.eq("commission_name", commission.getCommissionName());
queryWrapper.eq("commission_period", commission.getCommissionPeriod());
queryWrapper.eq("currency", commission.getCurrency());
return commissionExpectedService.getOne(queryWrapper);
CommissionExpected one = commissionExpectedService.getOne(queryWrapper);
if (ObjectUtils.isEmpty(one)) {
String errorMsg = String.format("未找到当前来佣对应的预计来佣,保单号:%s, 来佣名称:%s, 来佣期数:%s, 币种:%s",
commission.getPolicyNo(), commission.getCommissionName(), commission.getCommissionPeriod(), commission.getCurrency());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), errorMsg);
}
// 查询当前来佣对应的所有来佣记录
QueryWrapper<Commission> queryWrapperCommission = new QueryWrapper<>();
queryWrapperCommission.eq("policy_no", commission.getPolicyNo());
queryWrapperCommission.eq("commission_name", commission.getCommissionName());
queryWrapperCommission.eq("commission_period", commission.getCommissionPeriod());
queryWrapperCommission.eq("currency", commission.getCurrency());
List<Commission> commissionList = this.list(queryWrapperCommission);
// 统计已入账金额、已入账比例
BigDecimal paidRatio = BigDecimal.ZERO;
BigDecimal paidAmount = BigDecimal.ZERO;
for (Commission commission1 : commissionList) {
if (commission1.getStatus().equals(CommissionStatusEnum.COMPARE_SUCCESS.getItemValue())) {
paidRatio = paidRatio.add(commission1.getCurrentCommissionRatio());
paidAmount = paidAmount.add(commission1.getAmount());
one.setPaidAmount(paidAmount);
one.setPaidRatio(paidRatio);
}
}
// 计算预计来佣金额 (统一试算币种:HKD)
if (one.getExpectedAmount() == null) {
BigDecimal expectedAmount = new BigDecimal(commission.getPremium())
.multiply(one.getCommissionRatio());
if ("USD".equals(one.getCurrency())) {
expectedAmount = expectedAmount.multiply(one.getDefaultExchangeRate());
}
one.setExpectedAmount(expectedAmount.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
}
return one;
}
@Override
......@@ -154,16 +277,21 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
List<ExpectedFortune> expectedFortuneList = iExpectedFortuneService.list(expectedFortuneQueryWrapper);
if (CollectionUtils.isEmpty(expectedFortuneList)) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到该保单对应的预计发佣记录");
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到保单对应的预计发佣记录,请先创建预计发佣记录");
} else {
Set<String> expectedPolicyNoSet = expectedFortuneList.stream().map(ExpectedFortune::getPolicyNo).collect(Collectors.toSet());
// 获取没有预计发佣的保单号
Set<String> notExpectedPolicyNoSet = policyNoSet.stream().filter(policyNo -> !expectedPolicyNoSet.contains(policyNo)).collect(Collectors.toSet());
if (!CollectionUtils.isEmpty(notExpectedPolicyNoSet)) {
throw new BusinessException(ResultCode.FAIL.getCode(), "未找到以下保单对应的预计发佣记录:" + String.join(",", notExpectedPolicyNoSet));
throw new BusinessException(ResultCode.FAIL.getCode(), "未找到以下保单对应的预计发佣记录,请先创建预计发佣记录:" + String.join(",", notExpectedPolicyNoSet));
}
}
// 构建保单号+期次的复合键集合
Set<String> commissionPolicyPeriodKeys = commissionList.stream()
.map(commission -> buildPolicyPeriodKey(commission.getPolicyNo(), commission.getCommissionPeriod()))
.collect(Collectors.toSet());
// 3. 根据保单号查询所有发佣记录
List<Fortune> fortuneList = fortuneService.list(new QueryWrapper<Fortune>().in("policy_no", policyNoSet));
......@@ -175,40 +303,126 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
}
// 5. 筛出来佣对应的预计发佣记录
// 5. 筛选匹配的预计发佣记录(优化性能)
List<ExpectedFortune> filteredExpectedFortuneList = expectedFortuneList.stream()
.filter(expectedFortune -> commissionList.stream()
.anyMatch(commission -> StringUtils.equals(commission.getPolicyNo(), expectedFortune.getPolicyNo())
&& commission.getCommissionPeriod().equals(expectedFortune.getFortunePeriod())))
.filter(expectedFortune -> commissionPolicyPeriodKeys.contains(
buildPolicyPeriodKey(expectedFortune.getPolicyNo(), expectedFortune.getFortunePeriod())))
.collect(Collectors.toList());
// 6.删除旧的发佣记录
fortuneService.remove(new QueryWrapper<Fortune>().in("policy_no", policyNoSet));
// 7. 构建实际的初始发佣记录
List<Fortune> newFortuneList = new ArrayList<>();
for (ExpectedFortune expectedFortune : filteredExpectedFortuneList) {
Fortune fortune = new Fortune();
BeanUtils.copyProperties(expectedFortune, fortune);
// 7.1 查询所选保单号对应已发薪资记录
QueryWrapper<Fortune> fortuneQueryWrapper = new QueryWrapper<>();
fortuneQueryWrapper.in("policy_no", filteredExpectedFortuneList.stream().map(ExpectedFortune::getPolicyNo).collect(Collectors.toList()));
fortuneQueryWrapper.eq("status", FortuneStatusEnum.SENT.getItemValue());
List<Fortune> policyPaidFortuneList = fortuneService.list(fortuneQueryWrapper);
// 7.2 构建实际的初始发佣记录
List<Fortune> newFortuneList = buildNewFortunes(filteredExpectedFortuneList, commissionList, policyPaidFortuneList);
// List<Fortune> newFortuneList = new ArrayList<>();
// for (ExpectedFortune expectedFortune : filteredExpectedFortuneList) {
// Fortune fortune = new Fortune();
// BeanUtils.copyProperties(expectedFortune, fortune);
//
// fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
// fortune.setStatus(FortuneStatusEnum.WAIT.getItemValue());
// // 关联来佣业务ID
// matchCommission(fortune, commissionList);
// // 扣减已发薪资
// calculateCurrentFortune(fortune, policyPaidFortuneList);
//
// fortune.setCreateTime(new Date());
// fortune.setUpdateTime(new Date());
//
// newFortuneList.add(fortune);
// }
// 10. 保存发佣记录
saveNewFortunes(newFortuneList);
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setStatus(FortuneStatusEnum.WAIT.getItemValue());
// 关联来佣业务ID
matchCommission(fortune, commissionList);
fortune.setCreateTime(new Date());
fortune.setUpdateTime(new Date());
return true;
}
newFortuneList.add(fortune);
/**
* 保存新的发佣记录
*/
private void saveNewFortunes(List<Fortune> newFortuneList) {
if (CollectionUtils.isEmpty(newFortuneList)) {
throw new BusinessException(ResultCode.FAIL.getCode(), "没有可保存的发佣记录");
}
// 8. 保存发佣记录
if (CollUtil.isNotEmpty(newFortuneList)) {
boolean saveSuccess = fortuneService.saveBatch(newFortuneList);
if (!saveSuccess) {
throw new BusinessException(ResultCode.FAIL.getCode(), "保存发佣记录失败");
}
boolean saveSuccess = fortuneService.saveBatch(newFortuneList);
if (!saveSuccess) {
throw new BusinessException(ResultCode.FAIL.getCode(), "保存发佣记录失败");
}
return true;
}
/**
* 构建新的发佣记录
*/
private List<Fortune> buildNewFortunes(List<ExpectedFortune> filteredExpectedFortuneList,
List<Commission> commissionList,
List<Fortune> policyPaidFortuneList) {
// 构建来佣记录映射,用于快速查找
Map<String, Commission> commissionByPolicyPeriod = commissionList.stream()
.collect(Collectors.toMap(
commission -> buildPolicyPeriodKey(commission.getPolicyNo(), commission.getCommissionPeriod()),
Function.identity()
));
Date now = new Date();
return filteredExpectedFortuneList.stream()
.map(expectedFortune -> {
Fortune fortune = new Fortune();
BeanUtils.copyProperties(expectedFortune, fortune);
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
// 关联来佣业务ID
String key = buildPolicyPeriodKey(expectedFortune.getPolicyNo(), expectedFortune.getFortunePeriod());
Commission matchedCommission = commissionByPolicyPeriod.get(key);
if (matchedCommission != null) {
fortune.setCommissionBizId(matchedCommission.getCommissionBizId());
} else {
fortune.setStatus(FortuneStatusEnum.MATCH_FAIL.getItemValue());
fortune.setRemark("未找到当前预计发佣对应的来佣");
}
// 扣减已发薪资
calculateCurrentFortune(fortune, policyPaidFortuneList);
fortune.setCreateTime(now);
fortune.setUpdateTime(now);
return fortune;
})
.collect(Collectors.toList());
}
/**
* 构建保单号+期次的唯一键
*/
private String buildPolicyPeriodKey(String policyNo, Object period) {
return (policyNo == null ? "" : policyNo) + "|" + (period == null ? "" : period.toString());
}
private void calculateCurrentFortune(Fortune fortune, List<Fortune> policyPaidFortuneList) {
// 根据转介人分组
Map<String, List<Fortune>> brokerFortuneMap = policyPaidFortuneList.stream()
.collect(Collectors.groupingBy(Fortune::getBrokerBizId));
// 当前转介人已发薪资
List<Fortune> brokerFortuneList = brokerFortuneMap.getOrDefault(fortune.getBrokerBizId(), new ArrayList<>());
// 计算当前佣金条目已发薪资
BigDecimal brokerPaidAmount = brokerFortuneList.stream()
.filter(item -> StringUtils.equals(item.getFortuneName(), fortune.getFortuneName())
&& item.getFortunePeriod().equals(fortune.getFortunePeriod()))
.map(Fortune::getNetAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 计算当前发佣金额,需要扣减已发薪资
fortune.setAmount(fortune.getAmount().subtract(brokerPaidAmount));
}
private void matchCommission(Fortune fortune, List<Commission> commissionList) {
......@@ -230,10 +444,10 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
public Boolean addCommission(CommissionAddRequest commissionAddRequest) {
// 校验来佣所属保单是否存在
String policyNo = commissionAddRequest.getPolicyNo();
boolean exists = policyService.exists(new QueryWrapper<Policy>().eq("policy_no", policyNo));
Policy policy = policyService.getOne(new QueryWrapper<Policy>().eq("policy_no", policyNo));
// 校验来佣所属保单跟进是否存在
boolean policyFollowExists = policyFollowService.exists(new QueryWrapper<PolicyFollow>().eq("policy_no", policyNo));
if (!exists && !policyFollowExists) {
if (policy == null && !policyFollowExists) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "该保单号不存在,不能添加来佣");
}
......@@ -246,16 +460,27 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
// 生成新单编号
String commissionBizId = RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_COMMISSION.getCode());
commission.setCommissionBizId(commissionBizId);
// 保费为空时,查询保单初始保费或支付保费,为空时默认0
if (ObjectUtils.isEmpty(commission.getPremium())) {
Object object = policy.getInitialPremium() != null ? policy.getInitialPremium() : policy.getPaymentPremium();
if (object != null) {
commission.setPremium(object.toString());
} else {
commission.setPremium(BigDecimal.ZERO.toString());
}
}
// 查询预计来佣
CommissionExpected commissionExpected = queryByCommission(commission);
if (commissionExpected != null) {
// 查询预计来佣
CommissionExpected commissionExpected;
try {
commissionExpected = queryByCommission(commission);
// 对比预计来佣
compareWithExpected(commission, commissionExpected);
compareWithExpected(commission.getPremium(), commission, commissionExpected);
commissionExpectedService.updateById(commissionExpected);
} else {
} catch (Exception e) {
// 预计来佣不存在,来佣状态设置为 比对失败
commission.setStatus(CommissionStatusEnum.COMPARE_FAIL.getItemValue());
commission.setRemark("未找到当前来佣对应的预计来佣,比对失败");
commission.setRemark(e.getMessage());
}
commission.setCreatorId(loginUserId);
......@@ -271,10 +496,50 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return this.getOne(new QueryWrapper<Commission>().eq("commission_biz_id", commissionBizId));
}
/**
* 比对时,当前来佣比例=当前入账金额/结算汇率/保费 和预计来佣的来佣比例对比
*
* @param commission
* @param expected
*/
@Override
public void compareWithExpected(Commission commission, CommissionExpected expected) {
public void compareWithExpected(String premium, Commission commission, CommissionExpected expected) {
if (expected != null) {
if (expected.getAmount().compareTo(commission.getAmount()) == 0) {
if (ObjectUtils.isEmpty(expected.getCommissionRatio())) {
log.error("预计来佣的来佣比例不能为空,预计来佣业务id:{}", expected.getCommissionExpectedBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计来佣的来佣比例不能为空");
}
if (ObjectUtils.isEmpty(expected.getDefaultExchangeRate())) {
log.error("预计来佣的默认汇率不能为空,预计来佣业务id:{}", expected.getCommissionExpectedBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计来佣的默认汇率不能为空");
}
if (ObjectUtils.isEmpty(premium)) {
log.error("保费不能为空,来佣业务id:{}", commission.getCommissionBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "保费不能为空");
}
if (ObjectUtils.isEmpty(commission.getAmount())) {
log.error("当前入账金额不能为空,来佣业务id:{}", commission.getCommissionBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "当前入账金额不能为空");
}
if (ObjectUtils.isEmpty(commission.getExchangeRate())) {
log.error("当前结算汇率不能为空,来佣业务id:{}", commission.getCommissionBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "当前结算汇率不能为空");
}
// 当前来佣比例=当前入账金额/结算汇率/保费 * 100
BigDecimal currentCommissionRatio = commission.getAmount()
.divide(new BigDecimal(premium), 2, RoundingMode.HALF_UP)
.divide(new BigDecimal(commission.getExchangeRate()), 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100))
;
// 预计来佣比例
BigDecimal expectedCommissionRatio = expected.getCommissionRatio();
// 预计总金额
BigDecimal expectedAmount = expected.getExpectedAmount();
// 已入账金额
BigDecimal paidAmount = expected.getPaidAmount();
if (currentCommissionRatio.compareTo(expectedCommissionRatio) == 0) {
// 一致,来佣状态设置为 比对成功
commission.setStatus(CommissionStatusEnum.COMPARE_SUCCESS.getItemValue());
// 预计来佣的状态设置为 已来佣
......@@ -284,9 +549,46 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setStatus(CommissionStatusEnum.COMPARE_FAIL.getItemValue());
expected.setStatus(CommissionExpectedStatusEnum.PARTIAL.getItemValue());
}
// 设置来佣相关字段
commission.setCommissionExpectedBizId(expected.getCommissionExpectedBizId());
// commission.setExpectedAmount(expectedAmount.setScale(2, RoundingMode.HALF_UP));
// commission.setPaidAmount(paidAmount.setScale(2, RoundingMode.HALF_UP));
// // 待入账金额 = 预计来佣总金额 - 已入账金额
// commission.setPendingAmount(expectedAmount.subtract(paidAmount).setScale(2, RoundingMode.HALF_UP));
// 当前来佣比例
commission.setCurrentCommissionRatio(currentCommissionRatio);
// 当期已入账来佣比例 = 当前来佣比例 + 已入账来佣比例
commission.setPeriodPaidRatio(currentCommissionRatio.add(ObjectUtils.defaultIfNull(expected.getPaidRatio(), BigDecimal.ZERO)).setScale(2, RoundingMode.HALF_UP));
// 当期剩余来佣比例 = 预计来佣来佣比例 - 当期已入账来佣比例
commission.setPeriodPendingRatio(expectedCommissionRatio.subtract(commission.getPeriodPaidRatio()).setScale(2, RoundingMode.HALF_UP));
// 达到预计比例时,待入账金额设置为 0
if (commission.getPeriodPendingRatio().compareTo(BigDecimal.ZERO) == 0) {
commission.setPendingAmount(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP));
expected.setPaidAmount(paidAmount.setScale(2, RoundingMode.HALF_UP));
expected.setPaidRatio(commission.getPeriodPaidRatio());
}
// 保存比对记录
saveCompareRecord(commission, expected);
}
}
private void saveCompareRecord(Commission commission, CommissionExpected expected) {
CommissionCompareRecord commissionCompareRecord = new CommissionCompareRecord();
commissionCompareRecord.setCommissionExpectedBizId(expected.getCommissionExpectedBizId());
commissionCompareRecord.setCommissionBizId(commission.getCommissionBizId());
commissionCompareRecord.setCommissionPeriod(commission.getCommissionPeriod());
commissionCompareRecord.setTotalPeriod(commission.getTotalPeriod());
commissionCompareRecord.setAmount(commission.getAmount());
commissionCompareRecord.setCurrency(commission.getCurrency());
commissionCompareRecord.setExchangeRate(commission.getExchangeRate());
commissionCompareRecord.setStatus(commission.getStatus());
commissionCompareRecord.setRemark(commission.getRemark());
commissionCompareRecord.setCreateTime(commission.getCreateTime());
commissionCompareRecordService.save(commissionCompareRecord);
}
/**
* 查询列表
*
......
......@@ -10,25 +10,20 @@ import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
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.csf.service.common.ErrorCode;
import com.yd.csf.service.dao.CustomerMapper;
import com.yd.csf.service.dto.CustomerAddRequest;
import com.yd.csf.service.dto.CustomerQueryRequest;
import com.yd.csf.service.dto.CustomerUpdateRequest;
import com.yd.csf.service.dto.FnaQueryRequest;
import com.yd.csf.service.model.Customer;
import com.yd.csf.service.model.CustomerExpand;
import com.yd.csf.service.model.Fna;
import com.yd.csf.service.service.CustomerExpandService;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.FnaService;
import com.yd.csf.service.utils.ValidateUtil;
import com.yd.csf.service.vo.AddressVO;
import com.yd.csf.service.vo.CustomerExpandVO;
import com.yd.csf.service.vo.CustomerVO;
import com.yd.csf.service.vo.FnaVO;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
......@@ -86,16 +81,20 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
String name = customerQueryRequest.getName();
String phone = customerQueryRequest.getPhone();
String email = customerQueryRequest.getEmail();
queryWrapper.lambda().like(StringUtils.isNotBlank(name), Customer::getName, name)
.like(StringUtils.isNotBlank(phone), Customer::getPhone, phone)
.like(StringUtils.isNotBlank(email), Customer::getEmail, email);
queryWrapper.like(StringUtils.isNotBlank(name), "name", name)
.or().like(StringUtils.isNotBlank(name), "first_name_pinyin", name);
queryWrapper.like(StringUtils.isNotBlank(phone), "phone", phone);
queryWrapper.like(StringUtils.isNotBlank(email), "email", email);
return queryWrapper;
}
@Override
public CustomerExpand getCustomerExpand(CustomerAddRequest customerAddRequest) {
CustomerExpand customerExpand = new CustomerExpand();
BeanUtils.copyProperties(customerAddRequest, customerExpand);
BeanUtils.copyProperties(customerAddRequest, customerExpand, "addressList");
List<AddressVO> addressList = customerAddRequest.getAddressList();
if (CollUtil.isNotEmpty(addressList)) {
customerExpand.setAddressList(GSON.toJson(addressList));
......
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.model.FortuneAccountEditRecord;
import com.yd.csf.service.service.FortuneAccountEditRecordService;
import com.yd.csf.service.dao.FortuneAccountEditRecordMapper;
import org.springframework.stereotype.Service;
/**
* @author Zhang Jianan
* @description 针对表【fortune_account_edit_record(薪资修订记录表)】的数据库操作Service实现
* @createDate 2025-11-25 11:14:20
*/
@Service
public class FortuneAccountEditRecordServiceImpl extends ServiceImpl<FortuneAccountEditRecordMapper, FortuneAccountEditRecord>
implements FortuneAccountEditRecordService{
}
package com.yd.csf.service.service.impl;
import java.util.Date;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -15,6 +16,8 @@ import com.yd.csf.service.enums.FortuneAccountStatusEnum;
import com.yd.csf.service.enums.FortuneStatusEnum;
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.dao.FortuneAccountMapper;
import com.yd.csf.service.service.FortuneService;
......@@ -41,6 +44,9 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
@Resource
private FortuneService fortuneService;
@Resource
private FortuneAccountEditRecordService fortuneAccountEditRecordService;
private final Gson GSON = new Gson();
@Override
......@@ -185,6 +191,8 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
if (fortuneAccount == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), ResultCode.NULL_ERROR.getMessage());
}
// 保存修改记录
saveUpdateFortuneAccountRecord(fortuneAccount, fortuneAccountUpdateRequest);
fortuneAccount.setBroker(fortuneAccountUpdateRequest.getBroker());
fortuneAccount.setTeam(fortuneAccountUpdateRequest.getTeam());
......@@ -196,9 +204,40 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
fortuneAccount.setUpdateTime(new Date());
this.updateById(fortuneAccount);
return true;
}
private void saveUpdateFortuneAccountRecord(FortuneAccount fortuneAccount, FortuneAccountUpdateRequest fortuneAccountUpdateRequest) {
FortuneAccountEditRecord fortuneAccountEditRecord = new FortuneAccountEditRecord();
// 薪资记录业务id
fortuneAccountEditRecord.setFortuneAccountBizId(fortuneAccount.getFortuneAccountBizId());
fortuneAccountEditRecord.setIsDeleted(0);
fortuneAccountEditRecord.setCreateTime(new Date());
// 当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
Long loginUserId = currentLoginUser.getId();
fortuneAccountEditRecord.setUserBizId(loginUserId.toString());
fortuneAccountEditRecord.setUserName(currentLoginUser.getUsername());
// 构建修改内容
StringBuilder editContentBuilder = new StringBuilder();
editContentBuilder.append("修改了薪资记录:");
editContentBuilder.append("转介人:").append(fortuneAccountUpdateRequest.getBroker()).append(";");
editContentBuilder.append("团队:").append(fortuneAccountUpdateRequest.getTeam()).append(";");
editContentBuilder.append("出账金额:").append(fortuneAccountUpdateRequest.getAmount()).append(";");
editContentBuilder.append("出账币种:").append(fortuneAccountUpdateRequest.getCurrency()).append(";");
if (StringUtils.isNotBlank(fortuneAccountUpdateRequest.getRemark())) {
editContentBuilder.append("备注:").append(fortuneAccountUpdateRequest.getRemark()).append(";");
}
fortuneAccountEditRecord.setEditContent(editContentBuilder.toString());
fortuneAccountEditRecord.setRemark(fortuneAccountUpdateRequest.getRemark());
fortuneAccountEditRecordService.save(fortuneAccountEditRecord);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean completeFortuneAccount(CompleteFortuneAccountRequest completeFortuneAccountRequest) {
......@@ -235,6 +274,31 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
return true;
}
@Override
public FortuneAccountStatisticsVO getFortuneAccountStatistics(List<Long> fortuneAccountIdList) {
if (CollectionUtils.isEmpty(fortuneAccountIdList)) {
FortuneAccountStatisticsVO vo = new FortuneAccountStatisticsVO();
vo.setTotalAmount(BigDecimal.ZERO);
vo.setBrokerCount(0L);
return vo;
}
// 统计总金额和总人数
List<FortuneAccount> fortuneAccountList = this.baseMapper.selectBatchIds(fortuneAccountIdList);
BigDecimal totalAmount = fortuneAccountList.stream()
.map(FortuneAccount::getAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
int brokerCount = fortuneAccountList.stream()
.map(FortuneAccount::getBroker)
.collect(Collectors.toSet()).size();
FortuneAccountStatisticsVO vo = new FortuneAccountStatisticsVO();
vo.setTotalAmount(totalAmount);
vo.setBrokerCount(brokerCount);
return vo;
}
}
......
......@@ -16,11 +16,14 @@ import com.yd.common.exception.BusinessException;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.FortuneStatusEnum;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.Fortune;
import com.yd.csf.service.service.CommissionService;
import com.yd.csf.service.service.FortuneAccountService;
import com.yd.csf.service.service.FortuneService;
import com.yd.csf.service.dao.FortuneMapper;
import com.yd.csf.service.vo.FortuneVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
......@@ -48,6 +51,9 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
@Resource
private FortuneAccountService fortuneAccountService;
@Resource
private CommissionService commissionService;
@Override
public Wrapper<Fortune> getQueryWrapper(FortuneQueryRequest fortuneQueryRequest) {
QueryWrapper<Fortune> queryWrapper = new QueryWrapper<>();
......@@ -71,11 +77,14 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
return fortuneVOPage;
}
List<FortuneVO> fortuneVOList = fortuneList.stream().map(fortune -> {
FortuneVO fortuneVO = new FortuneVO();
BeanUtils.copyProperties(fortune, fortuneVO);
return fortuneVO;
}).collect(Collectors.toList());
List<FortuneVO> fortuneVOList = fortuneList.stream().map(FortuneVO::objToVo).collect(Collectors.toList());
// 关联查询已来佣金额
List<Commission> commissionList = commissionService.list(new QueryWrapper<Commission>().in("commission_biz_id", fortuneList.stream().map(Fortune::getCommissionBizId).collect(Collectors.toList())));
Map<String, BigDecimal> commissionAmountMap = commissionList.stream().collect(Collectors.toMap(Commission::getCommissionBizId, Commission::getAmount));
fortuneVOList.forEach(fortuneVO -> {
String commissionBizId = fortuneVO.getCommissionBizId();
fortuneVO.setCommissionAmount(commissionAmountMap.getOrDefault(commissionBizId, BigDecimal.ZERO));
});
fortuneVOPage.setRecords(fortuneVOList);
return fortuneVOPage;
......@@ -297,6 +306,19 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
return this.getOne(new LambdaQueryWrapper<Fortune>().eq(Fortune::getFortuneBizId,fortuneBizId));
}
@Override
public FortuneStatisticsVO getFortuneStatistics(List<Long> fortuneIdList) {
if (CollectionUtils.isEmpty(fortuneIdList)) {
FortuneStatisticsVO fortuneStatisticsVO = new FortuneStatisticsVO();
fortuneStatisticsVO.setTotalOutAmount(BigDecimal.ZERO);
fortuneStatisticsVO.setTotalInAmount(BigDecimal.ZERO);
fortuneStatisticsVO.setTotalPolicyCount(0L);
return fortuneStatisticsVO;
}
// 自定义查询
return this.baseMapper.getFortuneStatistics(fortuneIdList);
}
}
......
......@@ -11,7 +11,6 @@ import com.yd.auth.core.utils.SecurityUtil;
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.RandomStringGenerator;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
......@@ -174,6 +173,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
// 修改转介人
List<PolicyBrokerDto> brokerList = policyFollowUpdateRequest.getBrokerList();
if (CollUtil.isNotEmpty(brokerList)) {
log.info("修改转介人,查看保单号: {}, 转介人数量: {}", policyFollow.getPolicyNo(), brokerList.size());
// 先删除原有的转介人
policyBrokerService.remove(new QueryWrapper<PolicyBroker>().eq("policy_biz_id", policyBizId));
......@@ -335,8 +335,6 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "已完成、已拒绝、已取消状态不能变更");
}
// 校验状态
validPolicyFollowStatus(currentStatusEnum, policyFollowStatusEnum);
String policyBizId = changePolicyFollowStatusRequest.getPolicyBizId();
......@@ -380,21 +378,9 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
@Override
public String getNextStatus(PolicyFollowStatusEnum policyFollowStatusEnum) {
switch (policyFollowStatusEnum) {
case FOLLOW_UP:
return PolicyFollowStatusEnum.CHECKING.getItemValue() + ","
+ PolicyFollowStatusEnum.DECLINED.getItemValue() + ","
+ PolicyFollowStatusEnum.CANCELLED.getItemValue();
case CHECKING:
return PolicyFollowStatusEnum.UNDERWRITING.getItemValue() + ","
+ PolicyFollowStatusEnum.CANCELLED.getItemValue();
case UNDERWRITING:
return PolicyFollowStatusEnum.FINISHED.getItemValue() + ","
+ PolicyFollowStatusEnum.DECLINED.getItemValue() + ","
+ PolicyFollowStatusEnum.CANCELLED.getItemValue();
default:
return null;
}
return PolicyFollowStatusEnum.FINISHED.getItemValue() + ","
+ PolicyFollowStatusEnum.DECLINED.getItemValue() + ","
+ PolicyFollowStatusEnum.CANCELLED.getItemValue();
}
/**
......@@ -568,6 +554,36 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
}
@Override
public PolicyReportData queryPolicyReportData(String policyBizId) {
// 查询主险信息
PolicyReportData policyReportData = this.baseMapper.queryPolicyReportData(policyBizId);
// 处理附加险信息
List<PolicyAdditional> additionalList= policyAdditionalService.list(new QueryWrapper<PolicyAdditional>().eq("policy_biz_id", policyBizId));
List<PolicyReportData.AdditionalInsurance> additionalInsurances = new ArrayList<>();
if (CollUtil.isNotEmpty(additionalList)) {
for (PolicyAdditional additional : additionalList) {
PolicyReportData.AdditionalInsurance additionalInsurance = new PolicyReportData.AdditionalInsurance();
additionalInsurance.setName(additional.getAddProductName());
additionalInsurance.setPaymentTerm(null);
additionalInsurance.setCurrency(getCurrencyValue(additional.getCurrency()));
additionalInsurance.setFirstYearAmount(additional.getPremium());
additionalInsurances.add(additionalInsurance);
}
}
// 处理附加险信息
policyReportData.setAdditionalInsurances(additionalInsurances);
// 处理服务经理
String signerList = policyReportData.getServiceManager();
if (StringUtils.isNotBlank(signerList)) {
PolicySigner[] signers = GSONUtil.fromJson(signerList, PolicySigner[].class);
policyReportData.setServiceManager(signers[0].getSigner());
}
// 处理位置
policyReportData.setLocation("香港");
return policyReportData;
}
@Override
public Boolean uploadAttachment(AttachmentUploadRequest attachmentUploadRequest) {
String policyBizId = attachmentUploadRequest.getPolicyBizId();
if (policyBizId == null) {
......
......@@ -15,6 +15,12 @@ import java.util.Date;
public class CommissionExpectedVO implements Serializable {
/**
* 预计来佣id
*/
@Schema(description = "预计来佣id")
private Long id;
/**
* 预计来佣业务id
*/
@Schema(description = "预计来佣业务id")
......@@ -27,6 +33,12 @@ public class CommissionExpectedVO implements Serializable {
private String policyNo;
/**
* 保费
*/
@Schema(description = "保费")
private Object premium;
/**
* 对账公司
*/
@Schema(description = "对账公司")
......@@ -57,6 +69,18 @@ public class CommissionExpectedVO implements Serializable {
private String commissionType;
/**
* 来佣比例 (%)
*/
@Schema(description = "来佣比例 (%)")
private BigDecimal commissionRatio;
/**
* 来佣比例 (%)
*/
@Schema(description = "来佣比例 (%)")
private BigDecimal ratio;
/**
* 来佣金额
*/
@Schema(description = "来佣金额")
......@@ -127,6 +151,8 @@ public class CommissionExpectedVO implements Serializable {
}
CommissionExpectedVO commissionVO = new CommissionExpectedVO();
BeanUtils.copyProperties(commissionExpected, commissionVO);
commissionVO.setRatio(commissionExpected.getCommissionRatio());
return commissionVO;
}
}
......@@ -32,6 +32,12 @@ public class CommissionVO implements Serializable {
private String policyNo;
/**
* 保费
*/
@Schema(description = "保费")
private String premium;
/**
* 对账公司
*/
@Schema(description = "对账公司")
......@@ -62,6 +68,12 @@ public class CommissionVO implements Serializable {
private String commissionType;
/**
* 当前结算汇率
*/
@Schema(description = "当前结算汇率")
private String exchangeRate;
/**
* 来佣金额
*/
@Schema(description = "来佣金额")
......@@ -81,12 +93,54 @@ public class CommissionVO implements Serializable {
private Date commissionDate;
/**
* 当前来佣比例
*/
@Schema(description = "当前来佣比例")
private BigDecimal currentCommissionRatio;
/**
* 当期已入账比例
*/
@Schema(description = "已入账来佣比例")
private BigDecimal periodPaidRatio;
/**
* 待入账来佣比例
*/
@Schema(description = "当期剩余来佣比例")
private BigDecimal periodPendingRatio;
/**
* 来佣状态
*/
@Schema(description = "来佣状态 0=未比对 1=比对成功 2=比对失败 字典值: csf_commission_status")
private String status;
/**
* 预计来佣业务id
*/
@Schema(description = "预计来佣业务id")
private String commissionExpectedBizId;
/**
* 总金额
*/
@Schema(description = "总金额")
private String expectedAmount;
/**
* 已入账金额
*/
@Schema(description = "已入账金额")
private String paidAmount;
/**
* 待入账金额
*/
@Schema(description = "待入账金额")
private String pendingAmount;
/**
* 通用备注
*/
@Schema(description = "备注")
......
......@@ -14,6 +14,12 @@ import java.util.Map;
@Data
public class FortuneAccountVO {
/**
* fortuneAccount id
*/
@Schema(description = "fortuneAccount id")
private Long id;
/**
* 出账记录业务id
*/
@Schema(description = "出账记录业务id")
......
......@@ -15,6 +15,12 @@ import java.util.Date;
public class FortuneVO implements Serializable {
/**
* fortune id
*/
@Schema(description = "fortune id")
private Long id;
/**
* 保单发佣业务id
*/
@Schema(description = "保单发佣业务id")
......@@ -27,6 +33,18 @@ public class FortuneVO implements Serializable {
private String policyNo;
/**
* 来佣业务id
*/
@Schema(description = "来佣业务id")
private String commissionBizId;
/**
* 本次已来佣金额
*/
@Schema(description = "本次已来佣金额")
private Object commissionAmount;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)")
......
......@@ -128,9 +128,9 @@ public class PolicyFollowDetailVO implements Serializable {
private String paymentNumber;
/**
* 产品业务id
* 产品上架信息表唯一业务ID
*/
private String productBizId;
private String productLaunchBizId;
/**
* 产品名称
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.csf.service.dao.CommissionCompareRecordMapper">
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.CommissionCompareRecord">
<id property="id" column="id" />
<result property="commissionExpectedBizId" column="commission_expected_biz_id" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="commissionPeriod" column="commission_period" />
<result property="totalPeriod" column="total_period" />
<result property="status" column="status" />
<result property="currency" column="currency" />
<result property="createTime" column="create_time" />
<result property="exchangeRate" column="exchange_rate" />
<result property="amount" column="amount" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
</resultMap>
<sql id="Base_Column_List">
id,commission_expected_biz_id,commission_biz_id,commission_period,total_period,status,
currency,create_time,exchange_rate,amount,remark,
is_deleted
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.csf.service.dao.CommissionEditRecordMapper">
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.CommissionEditRecord">
<id property="id" column="id" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="userBizId" column="user_biz_id" />
<result property="userName" column="user_name" />
<result property="seq" column="seq" />
<result property="field" column="field" />
<result property="beforeChange" column="before_change" />
<result property="afterChange" column="after_change" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
<result property="createTime" column="create_time" />
</resultMap>
<sql id="Base_Column_List">
id,commission_biz_id,user_biz_id,user_name,seq,field,before_change,
after_change,remark,is_deleted,create_time
</sql>
</mapper>
......@@ -14,10 +14,13 @@
<result property="totalPeriod" column="total_period" />
<result property="commissionName" column="commission_name" />
<result property="commissionType" column="commission_type" />
<result property="amount" column="amount" />
<result property="commissionRatio" column="commission_ratio" />
<result property="currency" column="currency" />
<result property="commissionDate" column="commission_date" />
<result property="status" column="status" />
<result property="defaultExchangeRate" column="default_exchange_rate" />
<result property="expectedAmount" column="expected_amount" />
<result property="paidAmount" column="paid_amount" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
<result property="creatorId" column="creator_id" />
......@@ -28,8 +31,8 @@
<sql id="Base_Column_List">
id,commission_expected_biz_id,policy_no,reconciliation_company,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,amount,currency,
commission_date,status,remark,is_deleted,creator_id,
total_period,commission_name,commission_type,commission_ratio,currency,default_exchange_rate,expected_amount,
commission_date,status,paid_amount,remark,is_deleted,creator_id,
updater_id,create_time,update_time
</sql>
</mapper>
......@@ -8,15 +8,20 @@
<id property="id" column="id" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="policyNo" column="policy_no" />
<result property="premium" column="premium" />
<result property="reconciliationCompany" column="reconciliation_company" />
<result property="reconciliationCompanyBizId" column="reconciliation_company_biz_id" />
<result property="commissionPeriod" column="commission_period" />
<result property="totalPeriod" column="total_period" />
<result property="commissionName" column="commission_name" />
<result property="commissionType" column="commission_type" />
<result property="exchangeRate" column="exchange_rate" />
<result property="amount" column="amount" />
<result property="currency" column="currency" />
<result property="commissionDate" column="commission_date" />
<result property="currentCommissionRatio" column="current_commission_ratio" />
<result property="periodPaidRatio" column="period_paid_ratio" />
<result property="periodPendingRatio" column="period_pending_ratio" />
<result property="status" column="status" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
......@@ -27,9 +32,9 @@
</resultMap>
<sql id="Base_Column_List">
id,commission_biz_id,policy_no,reconciliation_company,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,amount,currency,
commission_date,status,remark,is_deleted,creator_id,
id,commission_biz_id,policy_no,premium,reconciliation_company,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,exchange_rate,amount,currency,
commission_date,current_commission_ratio,period_paid_ratio,period_pending_ratio,status,remark,is_deleted,creator_id,
updater_id,create_time,update_time
</sql>
......@@ -61,7 +66,7 @@
COUNT(DISTINCT c.policy_no) as totalPolicyCount
FROM commission c
LEFT JOIN (
SELECT policy_no, SUM(amount) as amount
SELECT policy_no, SUM(expected_amount) as amount
FROM commission_expected
GROUP BY policy_no
) e ON c.policy_no = e.policy_no
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.csf.service.dao.FortuneAccountEditRecordMapper">
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.FortuneAccountEditRecord">
<id property="id" column="id" />
<result property="fortuneAccountBizId" column="fortune_account_biz_id" />
<result property="userBizId" column="user_biz_id" />
<result property="userName" column="user_name" />
<result property="editContent" column="edit_content" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
<result property="createTime" column="create_time" />
</resultMap>
<sql id="Base_Column_List">
id,fortune_account_biz_id,user_biz_id,user_name,edit_content,remark,
is_deleted,create_time
</sql>
</mapper>
......@@ -44,4 +44,17 @@
calculation_formula,remark,is_deleted,creator_id,updater_id,
create_time,update_time
</sql>
<select id="getFortuneStatistics" resultType="com.yd.csf.service.dto.FortuneStatisticsVO">
select
ifnull(f.amount,0) as totalOutAmount,
ifnull(c.amount,0) as totalInAmount,
count(distinct f.policy_no) as totalPolicyCount
from fortune f
left join commission c on f.commission_biz_id = c.commission_biz_id
where f.id in
<foreach collection="fortuneIdList" item="fortuneId" open="(" close=")" separator=",">
#{fortuneId}
</foreach>
</select>
</mapper>
......@@ -29,7 +29,7 @@
<result property="prepaidAmountAfterDiscount" column="prepaid_amount_after_discount" />
<result property="policyExpirationDate" column="policy_expiration_date" />
<result property="paymentNumber" column="payment_number" />
<result property="productBizId" column="product_biz_id" />
<result property="productLaunchBizId" column="product_launch_biz_id" />
<result property="productName" column="product_name" />
<result property="productCate" column="product_cate" />
<result property="insurer" column="insurer" />
......@@ -65,11 +65,35 @@
customer_biz_id,submit_date,customer_name,sign_date,signer_list,
issue_date,effective_date,cooling_off_end_date,cooling_off_days,renewal_date,payment_term,payment_premium,
is_prepaid,prepaid_term,prepaid_amount,prepaid_amount_after_discount,policy_expiration_date,
payment_number,product_biz_id,product_name,product_cate,insurer,
payment_number,product_launch_biz_id,product_name,product_cate,insurer,
insurer_biz_id,reconciliation_company,reconciliation_company_biz_id,status,next_status_list,
policy_holder,insured,currency,initial_premium,initial_premium_paid,initial_premium_due,latest_payment_date,policy_levy,mailing_method,
delivery_no,broker_sign_date,insurer_mailing_date,customer_sign_date,attachments,
remark,is_deleted,creator_id,updater_id,create_time,
update_time
</sql>
<select id="queryPolicyReportData" resultType="com.yd.csf.service.dto.PolicyReportData">
select
t.id,
t.policy_biz_id,
t.policy_no as policyNumber,
t.insurer as insuranceCompany,
t.product_name as insurancePlan,
t.payment_term as paymentPeriod,
t.initial_premium as annualAmount,
t.prepaid_amount as totalPrepayment,
t.payment_premium as premiumFee,
t.sign_date as startTime,
t.sign_date as endTime,
t.signer_list as serviceManager,
t.policy_holder as policyHolder,
t.currency as currency,
ifnull(i.name, i.name_en) as insuredPerson,
i.age as insuredAge
from policy_follow t
left join policy_insurant i on t.policy_biz_id = i.policy_biz_id
where t.policy_biz_id = #{policyBizId}
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment