Kaynağa Gözat

费用匹配新增匹配因子(被保人年龄、车主年龄、医保外用险保额、保司评分、非车险保费)

li.pengfei 2 yıl önce
ebeveyn
işleme
13a72b8d43

+ 9 - 3
src/main/java/com/ydtech/modules/fee/dto/FeeFactorInfoDto.java

@@ -16,7 +16,7 @@ public class FeeFactorInfoDto {
     private String factorName;
     @ApiModelProperty("是否需要匹配该因子   true  需要进行匹配校验  false 不校验该因子")
     private boolean isNeedMatch;
-    @ApiModelProperty("匹配类型  1.单字符串匹配(相等)  2.多字符串匹配(包含)  3.区间范围比较(左闭右闭)   ")
+    @ApiModelProperty("匹配类型  1.单字符串匹配(相等)  2.多字符串匹配(包含)  3.区间范围比较(左闭右闭)  4.司乘险特殊  5.医保外用特殊 ")
     private String matchType;
     @ApiModelProperty("匹配顺序")
     private Integer matchSequence;
@@ -42,6 +42,12 @@ public class FeeFactorInfoDto {
     private boolean passengerIsNeedMatch;
     @ApiModelProperty("司乘保额校验关联关系")
     private String driverPassengerRelation;
-
-
+    @ApiModelProperty("三者医保外用最小值")
+    private Integer thirdMedicalAmountVal;
+    @ApiModelProperty("司机医保外用最小值")
+    private Integer driverMedicalAmountVal;
+    @ApiModelProperty("乘客医保外用最小值")
+    private Integer passengerMedicalAmountVal;
+    @ApiModelProperty("任意医保外用保额最小值")
+    private Integer anyMedicalAmountVal;
 }

+ 13 - 0
src/main/java/com/ydtech/modules/fee/dto/FeeSchemeReqDto.java

@@ -58,4 +58,17 @@ public class FeeSchemeReqDto {
     @ApiModelProperty("人员乘客险保额")
     private String passengerAmount;
 
+    @ApiModelProperty("被保人年龄")
+    private String insureAge;
+    @ApiModelProperty("车主年龄")
+    private String carOwnerAge;
+    @ApiModelProperty("医保外用三者保额")
+    private String thirdMedicalAmount;
+    @ApiModelProperty("医保外用司机保额")
+    private String driverMedicalAmount;
+    @ApiModelProperty("医保外用乘客保额")
+    private String passengerMedicalAmount;
+
+
+
 }

+ 181 - 3
src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceImpl.java

@@ -363,6 +363,83 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
                         }
                     }
                 }
+            }else if("5".equals(checkFactorInfo.getMatchType())) {//5.特殊规则,医保外用校验,存在互斥关系需要单独判断
+                if(matchKeys[key]!=null){
+                    //先获取跟单医保外用保额  三者-司机-乘客
+                    String[] kindAmountStr= matchKeys[key].split("-");
+                    String thirdMedicalAmount="NULL".equals(kindAmountStr[0])?"0":kindAmountStr[0];
+                    String driverMedicalAmount="NULL".equals(kindAmountStr[1])?"0":kindAmountStr[1];
+                    String passengerMedicalAmount="NULL".equals(kindAmountStr[2])?"0":kindAmountStr[2];
+
+                    if(checkFactorInfo.getAnyMedicalAmountVal()!=null){//不为空时,为任意险别符合即可  三者 司机  乘客 三者为 或的关系
+                        boolean isThirdPass=false;
+                        boolean isDriverPass=false;
+                        boolean isPassengerPass=false;
+                        if(NumberUtils.isCreatable(thirdMedicalAmount)){//如果医保外用三者保额是数字,则可以进行校验
+                            if(Double.parseDouble(thirdMedicalAmount)>=checkFactorInfo.getAnyMedicalAmountVal()){
+                                isThirdPass=true;
+                            }
+                        }
+                        if(NumberUtils.isCreatable(driverMedicalAmount)){//如果医保外用保额是数字,则可以进行校验
+                            if(Double.parseDouble(driverMedicalAmount)>=checkFactorInfo.getAnyMedicalAmountVal()){
+                                isDriverPass=true;
+                            }
+                        }
+                        if(NumberUtils.isCreatable(passengerMedicalAmount)){//如果医保外用乘客保额是数字,则可以进行校验
+                            if(Double.parseDouble(passengerMedicalAmount)>=checkFactorInfo.getAnyMedicalAmountVal()){
+                                isPassengerPass=true;
+                            }
+                        }
+                        if(!isThirdPass&&!isDriverPass&&!isPassengerPass){//三项都不通过的时候,才不符合
+                            result=false;
+                            break;
+                        }else{
+                            result=true;
+                            continue;
+                        }
+
+                    }else {//看指定险别的判断  三者 司机  乘客 三者为 且的关系
+                        boolean isThirdPass=false;
+                        boolean isDriverPass=false;
+                        boolean isPassengerPass=false;
+                        if(NumberUtils.isCreatable(thirdMedicalAmount)){//如果医保外用三者保额是数字,则可以进行校验
+                            if(checkFactorInfo.getThirdMedicalAmountVal()!=null){
+                                if(Double.parseDouble(thirdMedicalAmount)>=checkFactorInfo.getThirdMedicalAmountVal()){
+                                    isThirdPass=true;
+                                }
+                            }else{
+                                isThirdPass=true;
+                            }
+                        }
+                        if(NumberUtils.isCreatable(driverMedicalAmount)){//如果医保外用保额是数字,则可以进行校验
+                            if(checkFactorInfo.getDriverMedicalAmountVal()!=null){
+                                if(Double.parseDouble(driverMedicalAmount)>=checkFactorInfo.getDriverMedicalAmountVal()){
+                                    isDriverPass=true;
+                                }
+                            }else{
+                                isDriverPass=true;
+                            }
+
+                        }
+                        if(NumberUtils.isCreatable(passengerMedicalAmount)){//如果医保外用乘客保额是数字,则可以进行校验
+                            if(checkFactorInfo.getPassengerMedicalAmountVal()!=null){
+                                if(Double.parseDouble(passengerMedicalAmount)>=checkFactorInfo.getPassengerMedicalAmountVal()){
+                                    isPassengerPass=true;
+                                }
+                            }else{
+                                isPassengerPass=true;
+                            }
+                        }
+
+                        if(isThirdPass&&isDriverPass&&isPassengerPass){//三项都通过的时候,才符合
+                            result=true;
+                            continue;
+                        }else{
+                            result=false;
+                            break;
+                        }
+                    }
+                }
             }
         }
 
@@ -395,7 +472,14 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
         result.append(feeSchemeReqDto.getInsuranceScore()).append(",");
         result.append(feeSchemeReqDto.getExpectedLossRate()).append(",");
         result.append(feeSchemeReqDto.getLicenseNo()).append(",");
-        result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverAmount())?feeSchemeReqDto.getDriverAmount():"NULL").append("-").append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerAmount())?feeSchemeReqDto.getPassengerAmount():"NULL");//司乘险保额因子,特殊处理
+        //司乘险保额因子,特殊处理(司机保额-乘客保额)
+        result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverAmount())?feeSchemeReqDto.getDriverAmount():"NULL").append("-").append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerAmount())?feeSchemeReqDto.getPassengerAmount():"NULL").append(",");
+        result.append(feeSchemeReqDto.getInsureAge()).append(",");
+        result.append(feeSchemeReqDto.getCarOwnerAge()).append(",");
+        //医保外用险保额因子,特殊处理(三者保额-司机保额-乘客保额)
+        result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getThirdMedicalAmount())?feeSchemeReqDto.getThirdMedicalAmount():"NULL").append("-")
+                .append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverMedicalAmount())?feeSchemeReqDto.getDriverMedicalAmount():"NULL").append("-")
+                .append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerMedicalAmount())?feeSchemeReqDto.getPassengerMedicalAmount():"NULL");
         return result.toString();
     }
 
@@ -700,6 +784,79 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
         }
         resultMqp.put(18,factor18);
         //--------------------因子处理分割线----------------------------------
+        FeeFactorInfoDto factor19=new FeeFactorInfoDto();
+        factor19.setFactorName("被保人年龄");
+        factor19.setMatchType("3");
+        factor19.setMatchSequence(19);
+        if(checkFactorConfigWithArea(factorCost.getMinInsureAge(),factorCost.getMaxInsureAge(),factor19,factorCost)){
+            factor19.setNeedMatch(true);
+            factor19.setMinRangeVal((double)factorCost.getMinInsureAge());
+            factor19.setMaxRangeVal((double)factorCost.getMaxInsureAge());
+        }else{
+            //如果方案中未录入,则不校验该项因子
+            factor19.setNeedMatch(false);
+        }
+        resultMqp.put(19,factor19);
+        //--------------------因子处理分割线----------------------------------
+        FeeFactorInfoDto factor20=new FeeFactorInfoDto();
+        factor20.setFactorName("车主年龄");
+        factor20.setMatchType("3");
+        factor20.setMatchSequence(20);
+        if(checkFactorConfigWithArea(factorCost.getMinCarOwnerAge(),factorCost.getMaxCarOwnerAge(),factor20,factorCost)){
+            factor20.setNeedMatch(true);
+            factor20.setMinRangeVal((double)factorCost.getMinCarOwnerAge());
+            factor20.setMaxRangeVal((double)factorCost.getMaxCarOwnerAge());
+        }else{
+            //如果方案中未录入,则不校验该项因子
+            factor20.setNeedMatch(false);
+        }
+        resultMqp.put(20,factor20);
+        //--------------------因子处理分割线----------------------------------
+        FeeFactorInfoDto factor21=new FeeFactorInfoDto();
+
+        boolean thirdMCheckFlag=true;//三者医保外用保额是否需要校验
+        boolean driverMCheckFlag=true;//司机医保外用保额是否需要校验
+        boolean passengerMCheckFlag=true;//乘客医保外用保额是否需要校验
+        boolean anyMCheckFlag=true;//任意医保外用保额是否需要校验
+        factor21.setMatchType("5");
+        factor21.setMatchSequence(21);
+        //三者
+        if(factorCost.getThirdMedicalAmount()!=null&&factorCost.getThirdMedicalAmount()!=0){
+            factor21.setThirdMedicalAmountVal(factorCost.getThirdMedicalAmount()*10000);
+        }else{
+            factor21.setThirdMedicalAmountVal(null);
+            thirdMCheckFlag=false;
+        }
+        //司机
+        if(factorCost.getDriverMedicalAmount()!=null&&factorCost.getDriverMedicalAmount()!=0){
+            factor21.setDriverMedicalAmountVal(factorCost.getDriverMedicalAmount()*10000);
+        }else{
+            factor21.setDriverMedicalAmountVal(null);
+            driverMCheckFlag=false;
+        }
+        //乘客
+        if(factorCost.getPassengerMedicalAmount()!=null&&factorCost.getPassengerMedicalAmount()!=0){
+            factor21.setPassengerMedicalAmountVal(factorCost.getPassengerMedicalAmount()*10000);
+        }else{
+            factor21.setPassengerMedicalAmountVal(null);
+            passengerMCheckFlag=false;
+        }
+        //任意
+        if(factorCost.getAnyMedicalAmount()!=null&&factorCost.getAnyMedicalAmount()!=0){
+            factor21.setAnyMedicalAmountVal(factorCost.getAnyMedicalAmount()*10000);
+        }else{
+            factor21.setAnyMedicalAmountVal(null);
+            anyMCheckFlag=false;
+        }
+        //最终给因子赋值
+        factor21.setFactorName("医保外用保额");
+        if(!thirdMCheckFlag&&!driverMCheckFlag&&!passengerMCheckFlag&&!anyMCheckFlag){//如果四项都没有配置时,不需要校验
+            factor21.setNeedMatch(false);
+        }else{
+            factor21.setNeedMatch(true);
+        }
+        resultMqp.put(21,factor21);
+        //--------------------因子处理分割线----------------------------------
         return resultMqp;
     }
 
@@ -769,6 +926,9 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
         String thirdPartyInsurance = "";
         String driverAmount="";
         String passengerAmount="";
+        String thirdMedicalAmount="";
+        String driverMedicalAmount="";
+        String passengerMedicalAmount="";
         if(kindList!=null && kindList.size()>0){
             for(KindInfoVo kindInfoVo:kindList){
                 //三者保额
@@ -784,6 +944,19 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
                     int quantity = Integer.parseInt(carInfoVo.getSeatCount())-1;
                     passengerAmount = String.valueOf(kindInfoVo.getUnitAmount()*quantity);
                 }
+                //三者医保外用
+                if("SY_FJ_YBW1".equals(kindInfoVo.getKindCode())){
+                    thirdMedicalAmount = String.valueOf(kindInfoVo.getAmount());
+                }
+                //司机医保外用
+                if("SY_FJ_YBW3".equals(kindInfoVo.getKindCode())){
+                    driverMedicalAmount = String.valueOf(kindInfoVo.getAmount());
+                }
+                //乘客医保外用
+                if("SY_FJ_YBW2".equals(kindInfoVo.getKindCode())){
+                    int quantity = Integer.parseInt(carInfoVo.getSeatCount())-1;
+                    passengerMedicalAmount = String.valueOf(kindInfoVo.getUnitAmount()*quantity);
+                }
             }
         }
         FeeSchemeReqDto feeSchemeReqDto = new FeeSchemeReqDto();
@@ -831,10 +1004,10 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
         feeSchemeReqDto.setSyPremium(String.valueOf(quoteRespVo.getSyPremium()));//商业保费
         feeSchemeReqDto.setSumPayTax(String.valueOf(quoteRespVo.getTaxAmount()));//车船税金额
         feeSchemeReqDto.setThirdPartyInsurance(thirdPartyInsurance);//三者险保额  准
-        feeSchemeReqDto.setNoCarPremium("");//随车产品保费
+        feeSchemeReqDto.setNoCarPremium(String.valueOf(quoteRespVo.getJyPremium()));//随车产品保费
         feeSchemeReqDto.setSyDiscount("");//商业险折扣
         feeSchemeReqDto.setJqDiscount("");//交强险折扣
-        // feeSchemeReqDto.setInsuranceScore(quotedPriceResponse.getPlatMain().getZmScore());//保司评分 这里直接取中煤
+        feeSchemeReqDto.setInsuranceScore(quoteRespVo.getILogPreUdwMess());//保司评
         feeSchemeReqDto.setExpectedLossRate("");//预期赔付率
         if(carInfoVo.getLicenseNo()!=null&&!"".equals(carInfoVo.getLicenseNo())&&!"暂未上牌".equals(carInfoVo.getLicenseNo())){
             feeSchemeReqDto.setLicenseNo(carInfoVo.getLicenseNo().substring(0,2));//车牌号
@@ -844,6 +1017,11 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
 
         feeSchemeReqDto.setDriverAmount(driverAmount);//人员司机险保额  准
         feeSchemeReqDto.setPassengerAmount(passengerAmount);//人员乘客险保额  准
+        feeSchemeReqDto.setThirdMedicalAmount(thirdMedicalAmount);//三者医保外用  准
+        feeSchemeReqDto.setDriverMedicalAmount(driverMedicalAmount);//司机医保外用 准
+        feeSchemeReqDto.setPassengerMedicalAmount(passengerMedicalAmount);//乘客医保外用  准
+        feeSchemeReqDto.setInsureAge(quoteInfoVo.getInsuredPersonInfo().getAge());//被保人年龄
+        feeSchemeReqDto.setCarOwnerAge(quoteInfoVo.getOwnerInfo().getAge());//车主年龄
         return feeSchemeReqDto;
     }
 

+ 24 - 0
src/main/java/com/ydtech/modules/protocol/entity/dto/PtlAgreementProductCostsSaveDto.java

@@ -196,6 +196,30 @@ public class PtlAgreementProductCostsSaveDto implements Serializable {
     @ApiModelProperty("方案匹配优先级")
     private Integer priorityLevel;
 
+    @ApiModelProperty("被保人年龄(最小)")
+    private Integer minInsureAge;
+
+    @ApiModelProperty("被保人年龄(最大)")
+    private Integer maxInsureAge;
+
+    @ApiModelProperty("车主年龄(最小)")
+    private Integer minCarOwnerAge;
+
+    @ApiModelProperty("车主年龄(最大)")
+    private Integer maxCarOwnerAge;
+
+    @ApiModelProperty("医保外用任意险别")
+    private Integer anyMedicalAmount;
+
+    @ApiModelProperty("医保外用三者")
+    private Integer thirdMedicalAmount;
+
+    @ApiModelProperty("医保外用司机")
+    private Integer driverMedicalAmount;
+
+    @ApiModelProperty("医保外用乘客")
+    private Integer passengerMedicalAmount;
+
     public static List<PtlAgreementProductCosts> toPtlAgreementProductCosts(String agreementId, List<PltAgreementSchemeSaveDto> scheme) {
         return scheme.stream().map(x -> PtlAgreementProductCosts.toPtlAgreementProductCostsList(agreementId, x.getProductId(), x.getName(), x.getProductCosts())).flatMap(Collection::stream).collect(Collectors.toList());
     }

+ 55 - 0
src/main/java/com/ydtech/modules/protocol/entity/po/PtlAgreementProductCosts.java

@@ -405,6 +405,53 @@ public class PtlAgreementProductCosts implements Serializable {
     @TableField(value = "priority_level")
     private Integer priorityLevel;
 
+    /**
+     * 被保人年龄(最小)
+     */
+    @TableField(value = "min_insure_age")
+    private Integer minInsureAge;
+
+    /**
+     * 被保人年龄(最大)
+     */
+    @TableField(value = "max_insure_age")
+    private Integer maxInsureAge;
+
+    /**
+     * 车主年龄(最小)
+     */
+    @TableField(value = "min_car_owner_age")
+    private Integer minCarOwnerAge;
+
+    /**
+     * 车主年龄(最大)
+     */
+    @TableField(value = "max_car_owner_age")
+    private Integer maxCarOwnerAge;
+
+    /**
+     * 医保外用任意险别
+     */
+    @TableField(value = "any_medical_amount")
+    private Integer anyMedicalAmount;
+
+    /**
+     * 医保外用三者
+     */
+    @TableField(value = "third_medical_amount")
+    private Integer thirdMedicalAmount;
+
+    /**
+     * 医保外用司机
+     */
+    @TableField(value = "driver_medical_amount")
+    private Integer driverMedicalAmount;
+
+    /**
+     * 医保外用乘客
+     */
+    @TableField(value = "passenger_medical_amount")
+    private Integer passengerMedicalAmount;
 
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
@@ -495,6 +542,14 @@ public class PtlAgreementProductCosts implements Serializable {
         result = getObjectHashCode(this.maxPassengerAmount, result);
         result = getObjectHashCode(this.driverPassengerRelation, result);
         result = getObjectHashCode(this.priorityLevel,result);
+        result = getObjectHashCode(this.minInsureAge,result);
+        result = getObjectHashCode(this.maxInsureAge,result);
+        result = getObjectHashCode(this.minCarOwnerAge,result);
+        result = getObjectHashCode(this.maxCarOwnerAge,result);
+        result = getObjectHashCode(this.anyMedicalAmount,result);
+        result = getObjectHashCode(this.thirdMedicalAmount,result);
+        result = getObjectHashCode(this.driverMedicalAmount,result);
+        result = getObjectHashCode(this.passengerMedicalAmount,result);
         return result;
     }