Commit 4b9f0054 by zhangxingmin

push

parent 01a1bb96
......@@ -12,9 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 生成预计发佣日志记录表 前端控制器
* </p>
* 生成预计发佣日志记录信息
*
* @author zxm
* @since 2025-11-20
......
......@@ -17,6 +17,8 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
/**
* 保费对账记录信息
*
......@@ -91,4 +93,14 @@ public class ApiPremiumReconciliationController implements ApiPremiumReconciliat
return apiPremiumReconciliationService.editResult(request);
}
/**
* 校验-保单所有期数的保费对账是否对账完成(全部对账完成就不能新增录入对账信息了)
* @param policyNo
* @return
*/
@Override
public Result<Boolean> checkReconciliationComplete(String policyNo) {
return apiPremiumReconciliationService.checkReconciliationComplete(policyNo);
}
}
......@@ -25,5 +25,7 @@ public interface ApiPremiumReconciliationService {
Result editResult(ApiPremiumReconciliationResultEditRequest request);
Result<Boolean> checkReconciliationComplete(String policyNo);
Result<PremiumReconciliation> checkPremiumReconciliationIsExist(String expectedCommissionRatioBizId);
}
package com.yd.csf.api.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.base.feign.client.exchangerate.ApiExchangeRateFeignClient;
import com.yd.base.feign.request.exchangerate.ApiExchangeRateConvertRequest;
import com.yd.base.feign.response.exchangerate.ApiExchangeRateConvertResponse;
......@@ -20,10 +21,13 @@ import com.yd.csf.feign.request.premiumreconciliation.ApiPremiumReconciliationRe
import com.yd.csf.feign.response.premiumreconciliation.ApiCalculateRemainingUnpaidAmountResponse;
import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationDetailResponse;
import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationPageResponse;
import com.yd.csf.feign.response.team.ApiTeamPageResponse;
import com.yd.csf.service.dto.PremiumReconciliationDto;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.model.PremiumReconciliation;
import com.yd.csf.service.service.IPremiumReconciliationService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -52,6 +56,9 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
@Autowired
private ApiExchangeRateFeignClient apiExchangeRateFeignClient;
@Autowired
private PolicyFollowService policyFollowService;
/**
* 分页列表查询-保费对账记录信息
* @param request
......@@ -59,7 +66,9 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
*/
@Override
public Result<IPage<ApiPremiumReconciliationPageResponse>> page(ApiPremiumReconciliationPageRequest request) {
return null;
Page<ApiPremiumReconciliationPageResponse> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiPremiumReconciliationPageResponse> iPage = iPremiumReconciliationService.page(page, request);
return Result.success(iPage);
}
/**
......@@ -69,19 +78,26 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
*/
@Override
public Result add(ApiPremiumReconciliationAddRequest request) {
//根据当前Policy保单信息里面的生效日期、付款频率、缴费宽限期,校验当天是否在缴费期内,不在缴费期内不能保费对账 TODO 校验待定
//保费对账信息
ApiPremiumReconciliationDto apiPremiumReconciliationDto = request.getApiPremiumReconciliationDto();
//校验-保单所有期数的保费对账是否对账完成(全部对账完成就不能新增录入对账信息了)
Result<Boolean> result = checkReconciliationComplete(apiPremiumReconciliationDto.getPolicyNo());
if (!result.getData()) {
throw new BusinessException(result.getMsg());
}
//校验保单信息是否存在
Policy policy = policyService.queryOne(apiPremiumReconciliationDto.getPolicyNo());
if (Objects.isNull(policy)) {
throw new BusinessException("保单信息不存在");
}
//获取保单当前期数 TODO
//计算当前期数
String currentIssueNumber = calculateCurrentIssueNumber(policy.getPolicyNo(),Integer.parseInt(policy.getPaymentTerm().toString()));
PremiumReconciliation premiumReconciliation = new PremiumReconciliation();
//申请人
premiumReconciliation.setApplicant(apiPremiumReconciliationDto.getApplicant());
//当前期数 TODO
// premiumReconciliation.setCurrentIssueNumber();
//当前期数
premiumReconciliation.setCurrentIssueNumber(currentIssueNumber);
//保单受保人(被保人)
premiumReconciliation.setInsured(policy.getInsured());
//保险公司名称
......@@ -102,6 +118,36 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
}
/**
* 计算当前期数
* @param policyNo
* @return
*/
public String calculateCurrentIssueNumber(String policyNo,Integer paymentTerm) {
//保单号查询对账记录无数据,说明第一期。有数据:1、最新的记录的待付金额大于0,当前期数为最新的记录期数。2、最新的记录的待付金额小于等于0,当前期数 = 最新的记录期数 + 1 <= 保单的供款年期
//保单号查询对账记录无数据,说明第一期
//根据保单号查询最新对账记录
PremiumReconciliation premiumReconciliation = iPremiumReconciliationService.queryLatestOneByPolicyNo(policyNo);
if (Objects.isNull(premiumReconciliation)) {
return "1";
}
//有数据,最新的记录的待付金额大于0,当前期数为最新的记录期数
if (premiumReconciliation.getRemainingUnpaidAmount().compareTo(BigDecimal.ZERO) > 0) {
return premiumReconciliation.getCurrentIssueNumber();
}
//最新的记录的待付金额小于等于0,当前期数 = 最新的记录期数 + 1 <= 保单的供款年期
if (premiumReconciliation.getRemainingUnpaidAmount().compareTo(BigDecimal.ZERO) <= 0) {
//最新的记录期数 + 1
Integer thisQs = Integer.parseInt(premiumReconciliation.getCurrentIssueNumber()) + 1;
if (thisQs > paymentTerm) {
//最新的记录期数 + 1 > 保单的供款年期,提示
throw new BusinessException("当前保单保费所有期数已经全部对账完成,不能对账了");
}
return thisQs.toString();
}
return "1";
}
/**
* 编辑-单个保费对账记录信息
* @param request
* @return
......@@ -296,8 +342,89 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
*/
@Override
public Result editResult(ApiPremiumReconciliationResultEditRequest request) {
//校验保费对账记录信息是否存在
Result<PremiumReconciliation> result = checkPremiumReconciliationIsExist(request.getPremiumReconciliationBizId());
PremiumReconciliation premiumReconciliation = result.getData();
BeanUtils.copyProperties(request,premiumReconciliation);
//对账状态->保司对账成功
premiumReconciliation.setReconciliationStatus(ReconciliationStatusEnum.BS_DZ_CG.getItemValue());
//更新保费对账记录信息
iPremiumReconciliationService.saveOrUpdate(premiumReconciliation);
return null;
//校验当期剩余待付金额小于等于0并且当前期数是第一期首期,才会去更新保单生效日期和保单状态
if (premiumReconciliation.getCurrentIssueNumber().equals("1")) {
//当前期数是第一期首期
if (request.getRemainingUnpaidAmount().compareTo(BigDecimal.ZERO) <= 0) {
//校验生效日期、核保日期必填
if (Objects.isNull(request.getEffectiveDate())) {
throw new BusinessException("生效日期不能为空");
}
if (Objects.isNull(request.getUnderwritingDate())) {
throw new BusinessException("核保日期不能为空");
}
//更新新单和保单状态为生效中,更新生效日期和核保日期
//更新新单跟进:新单状态——>生效、生效日期、核保日期
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(premiumReconciliation.getPolicyNo());
if (!Objects.isNull(policyFollow)) {
//生效日期
policyFollow.setEffectiveDate(request.getEffectiveDate());
//核保日期
policyFollow.setUnderwritingDate(request.getUnderwritingDate());
//新单跟进状态——>生效
policyFollow.setStatus("TAKE_EFFECT");
policyFollowService.saveOrUpdate(policyFollow);
}
//更新保单信息:保单状态——>生效、生效日期、核保日期
Policy policy = policyService.queryOne(premiumReconciliation.getPolicyNo());
if (!Objects.isNull(policy)) {
//生效日期
policy.setEffectiveDate(request.getEffectiveDate());
//核保日期
policy.setUnderwritingDate(request.getUnderwritingDate());
//保单状态——>生效
policy.setStatus("TAKE_EFFECT");
policyService.saveOrUpdate(policy);
}
}else {
//大于0,只更新新单跟进:新单状态——>保费对账成功,核保中
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(premiumReconciliation.getPolicyNo());
if (!Objects.isNull(policyFollow)) {
//新单跟进状态——>保费对账成功,核保中
policyFollow.setStatus("UNDERWRITING_PROGRESS");
policyFollowService.saveOrUpdate(policyFollow);
}
}
}
return Result.success();
}
/**
* 校验-保单所有期数的保费对账是否对账完成(全部对账完成就不能新增录入对账信息了)
* @param policyNo
* @return
*/
@Override
public Result<Boolean> checkReconciliationComplete(String policyNo) {
//查询保单信息
Policy policy = policyService.queryOne(policyNo);
if (Objects.isNull(policy)) {
throw new BusinessException("保单信息不存在");
}
//获取保单供款年期
String paymentTerm = String.valueOf(policy.getPaymentTerm());
//根据保单号查询最新对账记录
PremiumReconciliation premiumReconciliation = iPremiumReconciliationService.queryLatestOneByPolicyNo(policyNo);
if (Objects.isNull(premiumReconciliation)) {
//无数据,说明还没有对账记录,可以对账。
return Result.success(true);
}
//有数据
//校验最新对账记录的待付金额是否小于等于0并且当前期数等于保单的供款年期,如果是说明对账所有期数已经全部完成不能对账了。
if (premiumReconciliation.getRemainingUnpaidAmount().compareTo(BigDecimal.ZERO) <= 0
&& premiumReconciliation.getCurrentIssueNumber().equals(paymentTerm)) {
return Result.success(false,"当前保单保费所有期数已经全部对账完成,不能对账了");
}
return Result.success(true);
}
/**
......
......@@ -67,4 +67,12 @@ public interface ApiPremiumReconciliationFeignClient {
*/
@PutMapping("/edit/result")
Result editResult(@Validated @RequestBody ApiPremiumReconciliationResultEditRequest request);
/**
* 校验-保单所有期数的保费对账是否对账完成(全部对账完成就不能新增录入对账信息了)
* @param policyNo
* @return
*/
@GetMapping("/check/reconciliation/complete")
Result<Boolean> checkReconciliationComplete(@NotBlank(message = "保单号能为空") @RequestParam(value = "policyNo") String policyNo);
}
package com.yd.csf.feign.enums;
/**
* 付款频率枚举
*/
public enum PaymentFrequencyEnum {
MONTH("月缴","MONTH"),
SEASON("季缴","SEASON"),
YEAR("年缴","YEAR"),
FULL_PAYMENT("整付","FULL_PAYMENT"),
;
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
PaymentFrequencyEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
}
......@@ -13,6 +13,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotBlank;
/**
* 香港保险服务-保费对账记录信息Feign降级处理
*/
......@@ -51,6 +53,11 @@ public class ApiPremiumReconciliationFeignFallbackFactory implements FallbackFac
public Result editResult(ApiPremiumReconciliationResultEditRequest request) {
return null;
}
@Override
public Result<Boolean> checkReconciliationComplete(String policyNo) {
return null;
}
};
}
}
package com.yd.csf.feign.request.premiumreconciliation;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
......@@ -9,6 +11,12 @@ import java.util.Date;
public class ApiPremiumReconciliationResultEditRequest {
/**
* 保费对账记录表唯一业务ID
*/
@NotBlank(message = "保费对账记录表唯一业务ID不能为空")
private String premiumReconciliationBizId;
/**
* 当次保司认定金额(客户当次缴纳的金额)
*/
@NotNull(message = "当次保司认定金额不能为空")
......@@ -44,9 +52,9 @@ public class ApiPremiumReconciliationResultEditRequest {
*/
private Date underwritingDate;
/**
* 保单状态
*/
private String status;
// /**
// * 保单状态
// */
// private String status;
}
package com.yd.csf.service.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.request.premiumreconciliation.ApiPremiumReconciliationPageRequest;
import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationPageResponse;
import com.yd.csf.service.model.PremiumReconciliation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* <p>
......@@ -13,4 +18,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface PremiumReconciliationMapper extends BaseMapper<PremiumReconciliation> {
IPage<ApiPremiumReconciliationPageResponse> page(@Param("page") Page<ApiPremiumReconciliationPageResponse> page,
@Param("request") ApiPremiumReconciliationPageRequest request);
}
......@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import lombok.Data;
......@@ -132,6 +133,11 @@ public class Policy implements Serializable {
*/
private Date effectiveDate;
/**
* 核保日期
*/
private Date underwritingDate;
/**
* 冷却期结束日期
*/
......@@ -208,6 +214,11 @@ public class Policy implements Serializable {
private String policyLevy;
/**
* 缴费宽限期(每期缴费的最大宽限天数)
*/
private String gracePeriod;
/**
* 通用备注
*/
private String remark;
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
......@@ -83,6 +84,11 @@ public class PolicyFollow implements Serializable {
*/
private Date effectiveDate;
/**
* 核保日期
*/
private Date underwritingDate;
/**
* 冷却期结束日期
*/
......
......@@ -138,4 +138,5 @@ public class PremiumReconciliation implements Serializable {
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
package com.yd.csf.service.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.request.premiumreconciliation.ApiPremiumReconciliationPageRequest;
import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationPageResponse;
import com.yd.csf.service.dto.PremiumReconciliationDto;
import com.yd.csf.service.model.PremiumReconciliation;
import com.baomidou.mybatisplus.extension.service.IService;
......@@ -16,7 +20,12 @@ import java.util.List;
*/
public interface IPremiumReconciliationService extends IService<PremiumReconciliation> {
IPage<ApiPremiumReconciliationPageResponse> page(Page<ApiPremiumReconciliationPageResponse> page,
ApiPremiumReconciliationPageRequest request);
PremiumReconciliation queryOne(String premiumReconciliationBizId);
List<PremiumReconciliation> queryList(PremiumReconciliationDto dto);
PremiumReconciliation queryLatestOneByPolicyNo(String policyNo);
}
......@@ -46,4 +46,6 @@ public interface PolicyFollowService extends IService<PolicyFollow> {
String getCurrencyValue(String currency);
PolicyReportData queryPolicyReportData(String policyBizId);
PolicyFollow queryOneByPolicyNo(String policyNo);
}
......@@ -3,6 +3,7 @@ package com.yd.csf.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
......@@ -583,6 +584,19 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
return policyReportData;
}
/**
* 根据保单号查询保单跟进信息
* @param policyNo
* @return
*/
@Override
public PolicyFollow queryOneByPolicyNo(String policyNo) {
return this.getOne(new LambdaQueryWrapper<PolicyFollow>()
.eq(PolicyFollow::getPolicyNo,policyNo)
.last(" limit 1 ")
);
}
@Override
public Boolean uploadAttachment(AttachmentUploadRequest attachmentUploadRequest) {
String policyBizId = attachmentUploadRequest.getPolicyBizId();
......
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.request.premiumreconciliation.ApiPremiumReconciliationPageRequest;
import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationPageResponse;
import com.yd.csf.service.dto.PremiumReconciliationDto;
import com.yd.csf.service.model.PremiumReconciliation;
import com.yd.csf.service.dao.PremiumReconciliationMapper;
......@@ -24,6 +28,12 @@ import java.util.List;
public class PremiumReconciliationServiceImpl extends ServiceImpl<PremiumReconciliationMapper, PremiumReconciliation> implements IPremiumReconciliationService {
@Override
public IPage<ApiPremiumReconciliationPageResponse> page(Page<ApiPremiumReconciliationPageResponse> page,
ApiPremiumReconciliationPageRequest request) {
return baseMapper.page(page,request);
}
@Override
public PremiumReconciliation queryOne(String premiumReconciliationBizId) {
return this.getOne(new LambdaQueryWrapper<PremiumReconciliation>()
.eq(PremiumReconciliation::getPremiumReconciliationBizId,premiumReconciliationBizId).last(" limit 1 "));
......@@ -39,4 +49,18 @@ public class PremiumReconciliationServiceImpl extends ServiceImpl<PremiumReconci
return list;
}
/**
* 根据保单号查询最新创建时间的对账记录
* @param policyNo
* @return
*/
@Override
public PremiumReconciliation queryLatestOneByPolicyNo(String policyNo) {
return this.getOne(new LambdaQueryWrapper<PremiumReconciliation>()
.eq(PremiumReconciliation::getPolicyNo,policyNo)
.orderByDesc(PremiumReconciliation::getCreateTime)
.last(" limit 1 ")
);
}
}
......@@ -2,4 +2,36 @@
<!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.PremiumReconciliationMapper">
</mapper>
<select id="page"
resultType="com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationPageResponse">
SELECT
MAX(p.insurer) AS insurer,
pr.policy_no,
MAX(pf.status) AS policyFollowStatus,
MAX(pr.reconciliation_status) AS reconciliation_status,
MAX(p.status) AS policyStatus,
MAX(pr.remaining_unpaid_amount) AS remaining_unpaid_amount,
MAX(pr.remaining_unpaid_currency) AS remaining_unpaid_currency,
COALESCE(SUM(prm.payment_amount), 0) AS paymentAmount,
MAX(prm.payment_currency) AS paymentCurrency,
GROUP_CONCAT(DISTINCT prm.payment_method SEPARATOR ';') AS paymentMethod,
MAX(pr.recognized_amount) AS recognized_amount,
MAX(pr.recognized_currency) AS recognized_currency,
GROUP_CONCAT(DISTINCT prm.payer SEPARATOR ';') AS payer,
GROUP_CONCAT(DISTINCT prm.paying_bank SEPARATOR ';') AS paying_bank,
MAX(p.policy_holder) AS policy_holder,
MAX(p.insured) AS insured,
GROUP_CONCAT(DISTINCT pb.broker_name SEPARATOR ';') AS brokerName,
MAX(pr.create_time) AS create_time,
MAX(pr.update_time) AS update_time,
MAX(p.reconciliation_company) AS reconciliation_company
FROM premium_reconciliation pr
LEFT JOIN policy p ON p.policy_no = pr.policy_no AND p.is_deleted = 0
LEFT JOIN policy_follow pf ON pf.policy_no = pr.policy_no AND pf.is_deleted = 0
LEFT JOIN premium_remittance prm ON prm.premium_reconciliation_biz_id = pr.premium_reconciliation_biz_id AND prm.is_deleted = 0
LEFT JOIN policy_broker pb ON pb.policy_no = pr.policy_no AND pb.is_deleted = 0
WHERE pr.is_deleted = 0
GROUP BY pr.premium_reconciliation_biz_id, pr.policy_no
ORDER BY MAX(pr.create_time) DESC
</select>
</mapper>
\ No newline at end of file
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