|
|
@@ -35,7 +35,6 @@ import java.lang.reflect.Method;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
|
|
|
/**
|
|
|
* @author quchen
|
|
|
@@ -487,6 +486,160 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
|
|
|
return insFeeOrdersMapper.getInsFeeOrderByOrderNo(orderNo);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public InsFeeOrders updateFeeRatio(String orderNo, BigDecimal jqInletRatio, BigDecimal syInletRatio, BigDecimal jyInletRatio,
|
|
|
+ BigDecimal jqExportRatio, BigDecimal syExportRatio, BigDecimal jyExportRatio) {
|
|
|
+ final int SCALE = 5;
|
|
|
+
|
|
|
+ // 1. 查询订单费用记录
|
|
|
+ InsFeeOrders insFeeOrders = getFeeOrderByOrderNo(orderNo);
|
|
|
+ AssertionUtils.isFail(insFeeOrders == null, "根据订单号查询订单费用表查无数据,订单号:" + orderNo);
|
|
|
+
|
|
|
+ // 2. 获取关联数据用于费用重算
|
|
|
+ InsOrders insOrders = insOrdersService.getById(orderNo);
|
|
|
+ InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
|
|
|
+ PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrders.getAgreementId());
|
|
|
+ Integer withTax = ptlAgreement.getWithTax();
|
|
|
+ BigDecimal taxFactor = BigDecimal.ONE;
|
|
|
+ if (withTax == 0) {
|
|
|
+ taxFactor = new BigDecimal("1.06");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保费
|
|
|
+ BigDecimal jqPremium = insOrdersCosts.getJqPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getJqPremium();
|
|
|
+ BigDecimal syPremium = insOrdersCosts.getSyPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getSyPremium();
|
|
|
+ BigDecimal jyPremium = insOrdersCosts.getJyPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getJyPremium();
|
|
|
+
|
|
|
+ // 3. 更新出入口比例(前端传0-100,服务端除以100后保存)
|
|
|
+ // 入口比例变化时,同步调整手续费比例和跟单比例
|
|
|
+ if (jqInletRatio != null) {
|
|
|
+ adjustInletAndRelatedRatios(insFeeOrders, "jq", covertPercent(jqInletRatio));
|
|
|
+ }
|
|
|
+ if (syInletRatio != null) {
|
|
|
+ adjustInletAndRelatedRatios(insFeeOrders, "sy", covertPercent(syInletRatio));
|
|
|
+ }
|
|
|
+ if (jyInletRatio != null) {
|
|
|
+ adjustInletAndRelatedRatios(insFeeOrders, "jy", covertPercent(jyInletRatio));
|
|
|
+ }
|
|
|
+ if (jqExportRatio != null) {
|
|
|
+ insFeeOrders.setJqExportRatio(covertPercent(jqExportRatio));
|
|
|
+ }
|
|
|
+ if (syExportRatio != null) {
|
|
|
+ insFeeOrders.setSyExportRatio(covertPercent(syExportRatio));
|
|
|
+ }
|
|
|
+ if (jyExportRatio != null) {
|
|
|
+ insFeeOrders.setJyExportRatio(covertPercent(jyExportRatio));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 根据新的出入口比例重新计算留点比例和含分销出口比例
|
|
|
+ BigDecimal distributionRatio = BigDecimalUtil.divide(
|
|
|
+ BigDecimalUtil.add(insFeeOrders.getFirstDistributionRatio(),
|
|
|
+ insFeeOrders.getSecondDistributionRatio(),
|
|
|
+ insFeeOrders.getThirdDistributionRatio()),
|
|
|
+ new BigDecimal(100));
|
|
|
+
|
|
|
+ insFeeOrders.setJqExportRatioContainDistribution(BigDecimalUtil.add(insFeeOrders.getJqExportRatio(), distributionRatio));
|
|
|
+ insFeeOrders.setSyExportRatioContainDistribution(BigDecimalUtil.add(insFeeOrders.getSyExportRatio(), distributionRatio));
|
|
|
+ insFeeOrders.setJyExportRatioContainDistribution(BigDecimalUtil.add(insFeeOrders.getJyExportRatio(), distributionRatio));
|
|
|
+
|
|
|
+ BigDecimal jqKeepPointRatio = insFeeOrders.getJqInletRatio().divide(taxFactor, SCALE, RoundingMode.HALF_EVEN)
|
|
|
+ .add(insFeeOrders.getJqAdditionalRatio())
|
|
|
+ .subtract(BigDecimalUtil.add(insFeeOrders.getJqExportRatio(), distributionRatio));
|
|
|
+ BigDecimal syKeepPointRatio = insFeeOrders.getSyInletRatio().divide(taxFactor, SCALE, RoundingMode.HALF_EVEN)
|
|
|
+ .add(insFeeOrders.getSyAdditionalRatio())
|
|
|
+ .subtract(BigDecimalUtil.add(insFeeOrders.getSyExportRatio(), distributionRatio));
|
|
|
+ BigDecimal jyKeepPointRatio = insFeeOrders.getJyInletRatio().divide(taxFactor, SCALE, RoundingMode.HALF_EVEN)
|
|
|
+ .add(insFeeOrders.getJyAdditionalRatio())
|
|
|
+ .subtract(BigDecimalUtil.add(insFeeOrders.getJyExportRatio(), distributionRatio));
|
|
|
+
|
|
|
+ insFeeOrders.setJqKeepPointRatio(jqKeepPointRatio);
|
|
|
+ insFeeOrders.setSyKeepPointRatio(syKeepPointRatio);
|
|
|
+ insFeeOrders.setJyKeepPointRatio(jyKeepPointRatio);
|
|
|
+
|
|
|
+ // 5. 按险种重新计算所有费用
|
|
|
+ calculatePremiumByRule(insFeeOrders, "jq", jqPremium,
|
|
|
+ insFeeOrders.getJqCommissionRatio(), insFeeOrders.getJqInletRatio(), insFeeOrders.getJqFollowRatio(),
|
|
|
+ insFeeOrders.getJqAdditionalRatio(), insFeeOrders.getJqKeepPointRatio(), insFeeOrders.getJqExportRatio(),
|
|
|
+ insFeeOrders.getJqExportKeepPointRatio(), insFeeOrders.getJqExportRatioContainDistribution(),
|
|
|
+ withTax, taxFactor, SCALE);
|
|
|
+
|
|
|
+ calculatePremiumByRule(insFeeOrders, "sy", syPremium,
|
|
|
+ insFeeOrders.getSyCommissionRatio(), insFeeOrders.getSyInletRatio(), insFeeOrders.getSyFollowRatio(),
|
|
|
+ insFeeOrders.getSyAdditionalRatio(), insFeeOrders.getSyKeepPointRatio(), insFeeOrders.getSyExportRatio(),
|
|
|
+ insFeeOrders.getSyExportKeepPointRatio(), insFeeOrders.getSyExportRatioContainDistribution(),
|
|
|
+ withTax, taxFactor, SCALE);
|
|
|
+
|
|
|
+ calculatePremiumByRule(insFeeOrders, "jy", jyPremium,
|
|
|
+ insFeeOrders.getJyCommissionRatio(), insFeeOrders.getJyInletRatio(), insFeeOrders.getJyFollowRatio(),
|
|
|
+ insFeeOrders.getJyAdditionalRatio(), insFeeOrders.getJyKeepPointRatio(), insFeeOrders.getJyExportRatio(),
|
|
|
+ insFeeOrders.getJyExportKeepPointRatio(), insFeeOrders.getJyExportRatioContainDistribution(),
|
|
|
+ withTax, taxFactor, SCALE);
|
|
|
+
|
|
|
+ // 6. 重新统计总应收、总应付
|
|
|
+ BigDecimal totalPayable = insFeeOrders.getJqPayablePremium().add(insFeeOrders.getSyPayablePremium()).add(insFeeOrders.getJyPayablePremium());
|
|
|
+ BigDecimal totalReceivable = insFeeOrders.getJqReceivablePremium().add(insFeeOrders.getSyReceivablePremium()).add(insFeeOrders.getJyReceivablePremium());
|
|
|
+ insFeeOrders.setTotalPayablePremium(scale(totalPayable, SCALE));
|
|
|
+ insFeeOrders.setTotalReceivablePremium(scale(totalReceivable, SCALE));
|
|
|
+
|
|
|
+ // 7. 设置已修改标识
|
|
|
+ insFeeOrders.setRatioModified(1);
|
|
|
+
|
|
|
+ // 8. 保存到数据库
|
|
|
+ int updateCount = insFeeOrdersMapper.updateById(insFeeOrders);
|
|
|
+ AssertionUtils.isFail(updateCount <= 0, "修改出入口比例失败,订单号:" + orderNo);
|
|
|
+
|
|
|
+ log.info("修改出入口比例并重算费用成功,orderNo=[{}], jqInletRatio=[{}], syInletRatio=[{}], jyInletRatio=[{}], jqExportRatio=[{}], syExportRatio=[{}], jyExportRatio=[{}]",
|
|
|
+ orderNo, jqInletRatio, syInletRatio, jyInletRatio, jqExportRatio, syExportRatio, jyExportRatio);
|
|
|
+
|
|
|
+ return insFeeOrders;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 调整入口比例及关联的手续费比例和跟单比例
|
|
|
+ * 规则:手续费比例不能大于入口比例,跟单比例 = 入口比例 - 手续费比例
|
|
|
+ *
|
|
|
+ * @param insFeeOrders 费用订单
|
|
|
+ * @param type 险种类型 jq/sy/jy
|
|
|
+ * @param newInletRatio 新的入口比例(已除以100)
|
|
|
+ */
|
|
|
+ private void adjustInletAndRelatedRatios(InsFeeOrders insFeeOrders, String type, BigDecimal newInletRatio) {
|
|
|
+ switch (type) {
|
|
|
+ case "jq": {
|
|
|
+ insFeeOrders.setJqInletRatio(newInletRatio);
|
|
|
+ BigDecimal commissionRatio = insFeeOrders.getJqCommissionRatio();
|
|
|
+ if (newInletRatio.compareTo(commissionRatio) < 0) {
|
|
|
+ insFeeOrders.setJqCommissionRatio(newInletRatio);
|
|
|
+ insFeeOrders.setJqFollowRatio(BigDecimal.ZERO);
|
|
|
+ } else {
|
|
|
+ insFeeOrders.setJqFollowRatio(newInletRatio.subtract(commissionRatio));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case "sy": {
|
|
|
+ insFeeOrders.setSyInletRatio(newInletRatio);
|
|
|
+ BigDecimal commissionRatio = insFeeOrders.getSyCommissionRatio();
|
|
|
+ if (newInletRatio.compareTo(commissionRatio) < 0) {
|
|
|
+ insFeeOrders.setSyCommissionRatio(newInletRatio);
|
|
|
+ insFeeOrders.setSyFollowRatio(BigDecimal.ZERO);
|
|
|
+ } else {
|
|
|
+ insFeeOrders.setSyFollowRatio(newInletRatio.subtract(commissionRatio));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case "jy": {
|
|
|
+ insFeeOrders.setJyInletRatio(newInletRatio);
|
|
|
+ BigDecimal commissionRatio = insFeeOrders.getJyCommissionRatio();
|
|
|
+ if (newInletRatio.compareTo(commissionRatio) < 0) {
|
|
|
+ insFeeOrders.setJyCommissionRatio(newInletRatio);
|
|
|
+ insFeeOrders.setJyFollowRatio(BigDecimal.ZERO);
|
|
|
+ } else {
|
|
|
+ insFeeOrders.setJyFollowRatio(newInletRatio.subtract(commissionRatio));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 更新订单的可用金额,同时调整剩余金额
|
|
|
* 更新前会校验:订单存在性、出口留点比例必须为0、新可用金额不能大于当前金额
|