Forráskód Böngészése

Merge branch 'master' of http://39.101.143.165:8090/785834757/jzg

lipf 2 hónapja
szülő
commit
51ac7a188f
20 módosított fájl, 834 hozzáadás és 34 törlés
  1. 7 0
      commons/src/main/java/com/jzg/commons/entity/scheme/po/PtlSchemeInsuranceDrivingIntention.java
  2. 2 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeSaveVo.java
  3. 2 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/SchemeResultVo.java
  4. 2 0
      commons/src/main/java/com/jzg/commons/entity/vo/RuleAttrMappingVo.java
  5. 44 4
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java
  6. 4 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  7. 7 2
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  8. 1 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerCalculationPremiumRequest.java
  9. 1 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  10. 2 2
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java
  11. 4 5
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java
  12. 480 6
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java
  13. 10 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java
  14. 60 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java
  15. 7 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/RequestUrl.java
  16. 139 4
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerQuotationRequest.java
  17. 1 4
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  18. 53 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  19. 3 1
      tenant/organization/src/main/resources/mapper/PtlSchemeInsuranceDrivingIntentionMapper.xml
  20. 5 1
      tenant/organization/src/main/resources/mapper/PtlSchemeMapper.xml

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/po/PtlSchemeInsuranceDrivingIntention.java

@@ -35,6 +35,13 @@ public class PtlSchemeInsuranceDrivingIntention {
     @Schema(description = "是否删除")
     @TableLogic
     private Integer isDelete;
+
+    @Schema(description = "最小座位数")
+    private Integer minSeatCount;
+
+    @Schema(description = "最大座位数")
+    private Integer maxSeatCount;
+
 }
 
 

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeSaveVo.java

@@ -285,6 +285,8 @@ public class PtlSchemeSaveVo {
                 ptlSchemeInsuranceDrivingIntention.setSelectedStatus(drivingIntention.getSelectedStatus());
                 ptlSchemeInsuranceDrivingIntention.setDrivingIntentionId(drivingIntention.getDrivingIntentionId());
                 ptlSchemeInsuranceDrivingIntention.setQuantity(drivingIntention.getQuantity());
+                ptlSchemeInsuranceDrivingIntention.setMinSeatCount(drivingIntention.getMinSeatCount());
+                ptlSchemeInsuranceDrivingIntention.setMaxSeatCount(drivingIntention.getMaxSeatCount());
                 ptlSchemeInsuranceDrivingIntentionList.add(ptlSchemeInsuranceDrivingIntention);
             });
         }

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/SchemeResultVo.java

@@ -99,5 +99,7 @@ public class SchemeResultVo {
         private String premium;
         private String quantity;
         private String selectedStatus;
+        private Integer minSeatCount;
+        private Integer maxSeatCount;
     }
 }

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/vo/RuleAttrMappingVo.java

@@ -92,6 +92,8 @@ public class RuleAttrMappingVo {
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("OwnersInfoAge", ownerInfo.getAge().toString()));
             //车主 性别
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("OwnersInfoSex", ownerInfo.getGender().equals("男") ? "1" : "2"));
+            //车主 地址
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersAddress", ownerInfo.getAddr()));
         }
         // 投保人
         InsOrdersCarUserInfo policyHolderInfo = insOrdersCarUserInfos.stream()

+ 44 - 4
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java

@@ -172,6 +172,45 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
          *
 
 
+         public PolicyCoveragesDTO(KindInfoVo kind) {
+         this.dutyCode = kind.getKindCode();
+         this.dutyChineseName = kind.getKindName();
+         this.insuredAmount = (StringUtils.equals(kind.getKindCode(),"STORRS") || StringUtils.equals(kind.getKindCode(),"NESTORR")) ? "" : kind.getUnitAmount() ;
+         this.equipmentInsureAmount = "";
+         this.premiumRate = "";
+         this.deductibleDiscount = "";
+         this.totalActualPremium = "";
+         this.deductionRate = "0";
+         this.serviceNum = StringUtils.isNotEmpty(kind.getServiceTimes()) ? kind.getServiceTimes() : "";
+         this.isTelpeson = (StringUtils.equals(kind.getKindCode(),"STORRS") || StringUtils.equals(kind.getKindCode(),"NESTORR")) ? "1" : "";
+         this.telPhone = "";
+         this.mileage = "";
+         this.setMeal = "";
+         this.fireMultiple = "";
+         this.allAmount = "";
+         this.riskPremum = "";
+         this.seats = kind.getQuantity();
+         this.deductible = "";
+         this.totalStandardPremium = 0;
+         this.addedValueTax = 0;
+         this.totalAgreePremium = 0;
+         this.totalNetPremium = 0;
+         this.newEquipmentList = new ArrayList<>();
+         this.chargingPostDataList = new ArrayList<>();
+         this.fullYearPremium = "";
+         this.dieAmount = "";
+         this.medicalAmount = "";
+         this.propertyAmount = "";
+         this.noFaultDieAmount = "";
+         this.noFaultMedicalAmount = "";
+         this.noFaultPropertyAmount = "";
+         this.basePremium = "";
+         }
+         }
+
+
+
+
          PolicyCoveragesDTO dto = new PolicyCoveragesDTO();
          dto.setDutyCode(StringUtils.equals("0",energyTypeCode) ? "STORRS" : "NESTORR");
          dto.setDutyChineseName(StringUtils.equals("0",energyTypeCode) ? "道路救援服务特约条款" : "道路救援服务特约条款(新能源车)");
@@ -1544,16 +1583,17 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
             private String basePremium;
 
             public PolicyCoveragesDTO(KindInfoVo kind) {
+                boolean b = StringUtils.equals(kind.getKindCode(), "STORRS") || StringUtils.equals(kind.getKindCode(), "NESTORR");
                 this.dutyCode = kind.getKindCode();
                 this.dutyChineseName = kind.getKindName();
-                this.insuredAmount = kind.getUnitAmount();
+                this.insuredAmount = b ? "0" : kind.getUnitAmount();
                 this.equipmentInsureAmount = "";
                 this.premiumRate = "";
                 this.deductibleDiscount = "";
                 this.totalActualPremium = "";
-                this.deductionRate = "";
-                this.serviceNum = "";
-                this.isTelpeson = "";
+                this.deductionRate = "0";
+                this.serviceNum = b ? kind.getServiceTimes() : "";
+                this.isTelpeson = b ? "1" : "";
                 this.telPhone = "";
                 this.mileage = "";
                 this.setMeal = "";

+ 4 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -503,6 +503,10 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
             String baseMark = underwriteMarks.get(0);
             boolean allMarksSame = underwriteMarks.stream().allMatch(mark -> Objects.equals(baseMark, mark));
             if (!allMarksSame) {
+                if (underwriteMarks.contains("0")){
+                    resultVo.setErrorMsg("核保失败");
+                    resultVo.setOrderStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                }
                 return resultVo;
             }
             if ("9".equals(baseMark) || "2".equals(baseMark)) {

+ 7 - 2
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java

@@ -306,13 +306,18 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
                     break;
                 }
             }
+            if (premiumCalculationResponse.getHead().getErrorMessage().contains("投保查询校验信息已经校验成功") || premiumCalculationResponse.getHead().getErrorMessage().contains("投保查询校验信息不存在或已经校验成功")) {
+                premiumCalculationRequest.getBasePart().setCommRenewalAnswer("");
+                premiumCalculationRequest.getBasePart().setCompRenewalAnswer("");
+            }
             //处理订单号
-            if( premiumCalculationResponse.getCompRisk() != null && premiumCalculationResponse.getCompRisk().getFtrno() != null){
+            if(premiumCalculationResponse.getCompRisk() != null && premiumCalculationResponse.getCompRisk().getFtrno() != null){
                 premiumCalculationRequest.getBasePart().setOrderNumber(premiumCalculationResponse.getCompRisk().getFtrno().getOrderNumber());
             }
-            if( premiumCalculationResponse.getCommRisk() != null && premiumCalculationResponse.getCommRisk().getFtrno() != null){
+            if(premiumCalculationResponse.getCommRisk() != null && premiumCalculationResponse.getCommRisk().getFtrno() != null){
                 premiumCalculationRequest.getBasePart().setOrderNumber(premiumCalculationResponse.getCommRisk().getFtrno().getOrderNumber());
             }
+
         }
         return premiumCalculationResponse;
     }

+ 1 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerCalculationPremiumRequest.java

@@ -283,7 +283,7 @@ public class GuoRenCrawlerCalculationPremiumRequest {
             this.isDeductible = 0;
             this.rate = 0;
             this.amount = kindInfoVo.getAmount();
-            this.unitAmount = Integer.parseInt(kindInfoVo.getUnitAmount());
+            this.unitAmount = StringUtils.isEmpty(kindInfoVo.getUnitAmount()) ? 0 : Integer.parseInt(kindInfoVo.getUnitAmount());
             this.premium = "";
             this.basePremium = "";
             this.benchMarkPremium = "";

+ 1 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -585,6 +585,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                 accidentalDrivingVo.setProductName(insOrdersAccidentalDriving.getRiskName());
                 accidentalDrivingVo.setQuantity(insOrdersAccidentalDriving.getQuantity());
                 accidentalDrivingVo.setSumAmount(insOrdersAccidentalDriving.getAmount());
+                accidentalDrivingVo.setPremium(insOrdersAccidentalDriving.getAmount());
                 accidentalDrivingVos.add(accidentalDrivingVo);
             }
             insOrdersVo.setAccidentalDrivings(accidentalDrivingVos);

+ 2 - 2
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java

@@ -129,7 +129,7 @@ public class TkCrawlerQuoteResultsBuild {
         BigDecimal jyx = premium.getJyxPremium() == null ? BigDecimal.ZERO : premium.getJyxPremium();
         BigDecimal vv = preciseInitResult.getCarTax().getSumPayment() == null ? BigDecimal.ZERO : preciseInitResult.getCarTax().getSumPayment();
         BigDecimal tlt = new BigDecimal(0);
-        if (CollectionUtils.isNotEmpty(preciseInitResult.getNonCarProductList())) {
+        if (CollectionUtils.isNotEmpty(preciseInitResult.getNonCarProductList()) && "1".equals(preciseInitResult.getNonCarProductList().get(0).getIsSelect())) {
             tlt = preciseInitResult.getNonCarProductList().get(0).getPremium() == null ? BigDecimal.ZERO : new BigDecimal(preciseInitResult.getNonCarProductList().get(0).getPremium());
         }
         BigDecimal total = ci.add(bi).add(jyx).add(vv).add(tlt);
@@ -184,7 +184,7 @@ public class TkCrawlerQuoteResultsBuild {
         Map<String, TKCiKindsVo> collect = ciKindsVo.stream().collect(Collectors.toMap(TKCiKindsVo::getKindCode, x -> x));
         kindInfoVo.forEach(kind -> {
             TKCiKindsVo itemKindListDTO = collect.get(kind.getKindCode());
-            if (Objects.nonNull(itemKindListDTO) && itemKindListDTO.getKindCode().equals(kind.getPlatformKindCode())) {
+            if (Objects.nonNull(itemKindListDTO)) {
                 kind.setPremium(itemKindListDTO.getPremium() + "");
             }
         });

+ 4 - 5
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java

@@ -1024,7 +1024,6 @@ public class TKSimpleService {
                     tkCiKindVo.setBjSelect("0");
                     tkCiKindVo.setDeductibleAmount(BigDecimal.ZERO);
                     tkCiKindVo.setIsSelect("0");
-                    tkCiKindVo.setQuantity(0);
                     tkCiKindVo.setQuoteAmountCN("不投保");
                 })
                 .collect(Collectors.toMap(TKCiKindsVo::getKindCode, Function.identity()));
@@ -1040,13 +1039,13 @@ public class TKSimpleService {
                     tkCiKindVo.setQuoteAmount(commonBiKindInfoVo.getAmount());
                     tkCiKindVo.setQuoteAmountCN(commonBiKindInfoVo.getAmount());
 
-                    // 设置数量:优先使用 quantity,其次使用 serviceTimes
+                    if (StringUtils.isNotBlank(commonBiKindInfoVo.getUnitAmount())) {
+                        tkCiKindVo.setUnitAmount(new BigDecimal(commonBiKindInfoVo.getUnitAmount()));
+                        tkCiKindVo.setUnitAmountCN(commonBiKindInfoVo.getUnitAmount());
+                    }
                     String quantity = commonBiKindInfoVo.getQuantity();
-                    String serviceTimes = commonBiKindInfoVo.getServiceTimes();
                     if (StringUtils.isNotBlank(quantity)) {
                         tkCiKindVo.setQuantity(Integer.parseInt(quantity));
-                    } else if (StringUtils.isNotBlank(serviceTimes)) {
-                        tkCiKindVo.setQuantity(Integer.parseInt(serviceTimes));
                     }
                 });
 

+ 480 - 6
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java

@@ -1,28 +1,42 @@
 package com.jzg.quotation.taishan.crawler.build;
 
 import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jzg.commons.entity.po.InsCompanyClause;
 import com.jzg.commons.entity.quote.vo.*;
+import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.IDCardUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.utils.DateUtil;
+import com.jzg.quotation.taishan.crawler.component.TaiShanCrawlerRequestComponent;
+import com.jzg.quotation.taishan.crawler.constant.enums.RequestUrl;
 import com.jzg.quotation.taishan.crawler.constant.enums.TaxTypeYn;
 import com.jzg.quotation.taishan.crawler.entity.TaiShanCrawlerConfigureParameters;
 import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerQuotationRequest;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerCarResponse;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerDeptResponse;
 
+import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.stream.Collectors;
 
+import com.jzg.quotation.taishan.crawler.properties.TaiShanCrawlerProperties;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.util.UriComponentsBuilder;
 
 @Slf4j
 public class TaiShanCrawlerQuoteRequestVoBuild {
 
-    public static TaiShanCrawlerQuotationRequest toQuotationDto(QuoteVo quoteVo, TaiShanCrawlerCarResponse.CarModelInfo modelsDTO, String currentValue, TaiShanCrawlerConfigureParameters parameters, TaiShanCrawlerDeptResponse taiShanCrawlerDeptResponse, AttributionInformationVo attributionInformationVo, String policyPersonId, String insuredPersonId) {
+    public static TaiShanCrawlerQuotationRequest toQuotationDto(QuoteVo quoteVo, TaiShanCrawlerCarResponse.CarModelInfo modelsDTO, String currentValue, TaiShanCrawlerConfigureParameters parameters, TaiShanCrawlerDeptResponse taiShanCrawlerDeptResponse, AttributionInformationVo attributionInformationVo, String policyPersonId, String insuredPersonId, HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
         TaiShanCrawlerQuotationRequest request = new TaiShanCrawlerQuotationRequest();
         // 设置投保人信息
         CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
@@ -56,7 +70,6 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
         request.setHouseholdBInsurance(new Object());
         request.setHouseholdCInsurance(new Object());
         request.setDpInsurance(new Object());
-        request.setDiInsurance(new Object());
         request.setMcInsurance(new Object());
         request.setGlInsurance(new Object());
         request.setTfInsurance(new Object());
@@ -69,10 +82,464 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
         request.setRtInsurance(new Object());
         request.setFlatvhlInfo(new Object());
         request.setBtInsurance(new Object());
-        request.setOpdInsurance(new Object());
+
+        // 1驾意险
+        // 1.1驾乘人员意外伤害险 UN1 50万以上险种 / UN2 50万以下
+        if (quoteVo.getAccidentalDrivings().isEmpty()) {
+            request.setDiInsurance(new TaiShanCrawlerQuotationRequest.DiInsurance());
+        } else {
+            TaiShanCrawlerQuotationRequest.DiInsurance drivingDiInsuranceDto = toDrivingDiInsuranceDto(quoteVo, request, parameters, headers, taiShanCrawlerRequestComponent);
+            if (Objects.nonNull(drivingDiInsuranceDto)) {
+                request.setDiInsurance(drivingDiInsuranceDto);
+                request.getProposalInfo().setDiMark("1");
+            } else {
+                request.setDiInsurance(new TaiShanCrawlerQuotationRequest.DiInsurance());
+            }
+        }
+        // 1.2车主门诊保险 0691_A
+        if (quoteVo.getAccidentalDrivings().isEmpty()) {
+            request.setOpdInsurance(new TaiShanCrawlerQuotationRequest.OpdInsurance());
+        } else {
+            TaiShanCrawlerQuotationRequest.OpdInsurance drivingOpdInsuranceDto = toDrivingOpdInsuranceDto(quoteVo, request, parameters, headers, taiShanCrawlerRequestComponent);
+            if (Objects.nonNull(drivingOpdInsuranceDto)) {
+                request.setOpdInsurance(drivingOpdInsuranceDto);
+                request.getProposalInfo().setOpdmark("1");
+            } else {
+                request.setOpdInsurance(new TaiShanCrawlerQuotationRequest.OpdInsurance());
+            }
+        }
         return request;
     }
 
+    private static TaiShanCrawlerQuotationRequest.DiInsurance toDrivingDiInsuranceDto(QuoteVo quoteVo, TaiShanCrawlerQuotationRequest request, TaiShanCrawlerConfigureParameters parameters, HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
+        List<String> schemeList = List.of("UN1", "UN2");
+        TaiShanCrawlerQuotationRequest.DiInsurance diInsurance = null;
+        String startDate, endDate;
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            startDate = quoteVo.getBiRiskInfoVo().getStartDate();
+            endDate = quoteVo.getBiRiskInfoVo().getEndDate();
+        } else {
+            startDate = quoteVo.getCiRiskInfoVo().getStartDate();
+            endDate = quoteVo.getCiRiskInfoVo().getEndDate();
+        }
+        List<String> accidentalDrivingsProductCodeList = new ArrayList<>();
+        for (AccidentalDrivingVo accidentalDriving : quoteVo.getAccidentalDrivings()) {
+            accidentalDrivingsProductCodeList.add(accidentalDriving.getProductCode());
+        }
+        boolean match = accidentalDrivingsProductCodeList.stream().anyMatch(schemeList::contains);
+        if (match) {
+            diInsurance = new TaiShanCrawlerQuotationRequest.DiInsurance();
+            diInsurance.setStartDate(startDate);
+            diInsurance.setEndDate(endDate);
+            diInsurance.setPremium("");
+            diInsurance.setRiskAmount("");
+            diInsurance.setProposalNo("");
+            diInsurance.setPolicyNo("");
+            diInsurance.setDay(365);
+            Map<String, Object> agreement1301Res = agreement1301(headers, taiShanCrawlerRequestComponent);
+            log.info("diInsurance_agreement1301:{}", JSONObject.toJSONString(agreement1301Res));
+            String specialContent = String.valueOf(agreement1301Res.get("result"));
+            diInsurance.setSpecialContent(specialContent);
+            //自主定价系数
+            diInsurance.setResvNumAutonomy("0.5");
+            //自定义方案
+            diInsurance.setSchemeList("UN");
+            //驾意险份数
+            diInsurance.setNumber(String.valueOf(quoteVo.getAccidentalDrivings().get(0).getQuantity()));
+            diInsurance.setId("");
+            //目前根据python代码暂定驾意险只有一个,后续有问题再优化
+            diInsurance.setDiKinds(getDiKinds(accidentalDrivingsProductCodeList.get(0)));
+
+            // 复制报价参数
+            Map<String, Object> priceUncarDaData = new HashMap<>();
+            try {
+                priceUncarDaData = new ObjectMapper().readValue(JSONObject.toJSONString(request), new TypeReference<Map<String, Object>>() {});
+            } catch (JsonProcessingException e) {
+                throw new SystemException("diInsurance_复制报价参数异常");
+            }
+            priceUncarDaData.put("diInsurance", diInsurance);
+            Map<String, Object> priceUncarDaRes = priceUncarDa(priceUncarDaData, headers, taiShanCrawlerRequestComponent);
+            log.info("diInsurance_非车保费计算结果:{}", JSONObject.toJSONString(priceUncarDaRes));
+
+            Map<String, Object> resRoot = (Map<String, Object>) priceUncarDaRes.get("result");
+            Map<String, Object> diInsurancePrice = (Map<String, Object>) resRoot.get("diInsurance");
+            Map<String, Object> vehicleInfoRes = (Map<String, Object>) resRoot.get("vehicleInfo");
+            String syUuidRes = vehicleInfoRes == null ? "" : String.valueOf(vehicleInfoRes.get("syUuid"));
+            String jqUuidRes = vehicleInfoRes == null ? "" : String.valueOf(vehicleInfoRes.get("jqUuid"));
+            String iidd = String.valueOf(diInsurancePrice.get("id"));
+            String schemeListRes = String.valueOf(diInsurancePrice.get("schemeList"));
+            String numberRes = String.valueOf(diInsurancePrice.get("number"));
+            List<Map<String, Object>> diKindsRaw = (List<Map<String, Object>>) diInsurancePrice.get("diKinds");
+
+            List<Map<String, Object>> diKindsFilter = new ArrayList<>();
+            for (Map<String, Object> item : diKindsRaw) {
+                if (!"0".equals(String.valueOf(item.get("perAmt")))) {
+                    diKindsFilter.add(item);
+                }
+            }
+            String resvNumAutonomyVal = String.valueOf(diInsurancePrice.get("resvNumAutonomy"));
+            String specialContentVal = String.valueOf(diInsurancePrice.get("specialContent"));
+            String riskAmountVal = String.valueOf(diInsurancePrice.get("riskAmount"));
+            String premiumVal = String.valueOf(diInsurancePrice.get("premium"));
+            String sDateVal = String.valueOf(diInsurancePrice.get("startDate"));
+            String eDateVal = String.valueOf(diInsurancePrice.get("endDate"));
+
+            // 组装保存入参
+            Map<String, Object> diInsuranceSaveData = new HashMap<>();
+            diInsuranceSaveData.put("orderNo", "");
+            diInsuranceSaveData.put("jqProposalNo", "");
+            diInsuranceSaveData.put("syProposalNo", "");
+            diInsuranceSaveData.put("unCarTypeCode", "1301");
+            diInsuranceSaveData.put("premium", premiumVal);
+            diInsuranceSaveData.put("riskAmount", riskAmountVal);
+            diInsuranceSaveData.put("specialContent", specialContentVal);
+            diInsuranceSaveData.put("resvNumAutonomy", resvNumAutonomyVal);
+            diInsuranceSaveData.put("diKinds", diKindsFilter);
+            diInsuranceSaveData.put("uncarId", "");
+            diInsuranceSaveData.put("startDate", sDateVal);
+            diInsuranceSaveData.put("endDate", eDateVal);
+            diInsuranceSaveData.put("proposalNo", "");
+            diInsuranceSaveData.put("policyNo", "");
+            diInsuranceSaveData.put("number", numberRes);
+            diInsuranceSaveData.put("schemeList", schemeListRes);
+            diInsuranceSaveData.put("id", iidd);
+            String finalUuid = (syUuidRes != null && !syUuidRes.isBlank()) ? syUuidRes : jqUuidRes;
+            diInsuranceSaveData.put("uuid", finalUuid);
+            diInsuranceSaveData.put("dptCde", parameters.getComCode());
+            diInsuranceSaveData.put("useNatureShow", request.getVehicleInfo().getUseNatureShow());
+            diInsuranceSaveData.put("seatCount", request.getVehicleInfo().getSeatCount());
+
+            Map<String, Object> saveUnCarDARes = saveUnCarDA(diInsuranceSaveData,headers, taiShanCrawlerRequestComponent);
+            Map<String, Object> saveRoot = (Map<String, Object>) saveUnCarDARes.get("result");
+            String newRiskAmount = String.valueOf(saveRoot.get("riskAmount"));
+            String newPremium = String.valueOf(saveRoot.get("premium"));
+            String newId = String.valueOf(saveRoot.get("id"));
+            List<Map<String, Object>> cvrgVOs = (List<Map<String, Object>>) saveRoot.get("cvrgVOs");
+
+            List<String> KEYS = List.of("pkId", "seqNo", "kindCode", "kindName", "amount", "premium", "dailyAllowance", "days", "amountLimit", "perAmt");
+            List<Map<String, Object>> diKindsFinal = new ArrayList<>();
+            for (Map<String, Object> item : diKindsFilter) {
+                // 匹配cvrgVOs赋值pkId、premium
+                for (Map<String, Object> cvr : cvrgVOs) {
+                    if (item.get("kindCode").equals(cvr.get("kindCode"))) {
+                        item.put("premium", cvr.get("premium"));
+                        item.put("pkId", cvr.get("pkId"));
+                        break;
+                    }
+                }
+                // 只保留指定key
+                Map<String, Object> newItem = new HashMap<>();
+                for (String k : KEYS) {
+                    if (item.containsKey(k)) {
+                        newItem.put(k, item.get(k));
+                    }
+                }
+                diKindsFinal.add(newItem);
+            }
+
+            // 更新diInsurance
+            diInsurance.setStartDate(sDateVal);
+            diInsurance.setEndDate(eDateVal);
+            diInsurance.setPremium(newPremium);
+            diInsurance.setRiskAmount(newRiskAmount);
+            diInsurance.setProposalNo("");
+            diInsurance.setPolicyNo("");
+            diInsurance.setDay(365);
+            diInsurance.setSpecialContent(specialContentVal);
+            //自主定价系数
+            diInsurance.setResvNumAutonomy(resvNumAutonomyVal);
+            //自定义方案
+            diInsurance.setSchemeList(schemeListRes);
+            //驾意险份数
+            diInsurance.setNumber(numberRes);
+            diInsurance.setId(newId);
+            //目前根据python代码暂定驾意险只有一个,后续有问题再优化
+            diInsurance.setDiKinds(diKindsFinal);
+            //proposalInfo.put("diMark", "1");
+        }
+        return diInsurance;
+    }
+
+    private static TaiShanCrawlerQuotationRequest.OpdInsurance toDrivingOpdInsuranceDto(QuoteVo quoteVo, TaiShanCrawlerQuotationRequest request, TaiShanCrawlerConfigureParameters parameters, HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
+        List<String> accidentalDrivingsProductCodeList = new ArrayList<>();
+        for (AccidentalDrivingVo accidentalDriving : quoteVo.getAccidentalDrivings()) {
+            accidentalDrivingsProductCodeList.add(accidentalDriving.getProductCode());
+        }
+        TaiShanCrawlerQuotationRequest.OpdInsurance opdInsurance = null;
+        boolean match = accidentalDrivingsProductCodeList.contains("0691_A");
+        if (match) {
+            // 车主门诊保险逻辑
+            //ZGdrivingInsurances.put("resvNumAutonomy", "");
+            //ZGdrivingInsurances.put("name", "车主门诊保险");
+            String startDate, endDate, uuidVal;
+            if (quoteVo.getBiRiskInfoVo() != null) {
+                startDate = quoteVo.getBiRiskInfoVo().getStartDate();
+                endDate = quoteVo.getBiRiskInfoVo().getEndDate();
+                uuidVal = request.getVehicleInfo().getSyUuid();
+            } else {
+                startDate = quoteVo.getCiRiskInfoVo().getStartDate();
+                endDate = quoteVo.getCiRiskInfoVo().getEndDate();
+                uuidVal = request.getVehicleInfo().getJqUuid();
+            }
+            String unCarTypeCode = "0691";
+            String schemeListSplit = quoteVo.getAccidentalDrivings().get(0).getProductCode().split("_")[1];
+            String dptCde = parameters.getComCode();
+            String useNatureShow = request.getVehicleInfo().getUseNatureShow();
+
+            Map<String, Object> unCarInsReq = new HashMap<>();
+            unCarInsReq.put("jqProposalNo", "");
+            unCarInsReq.put("syProposalNo", "");
+            unCarInsReq.put("unCarTypeCode", unCarTypeCode);
+            unCarInsReq.put("schemeList", schemeListSplit);
+            unCarInsReq.put("novhlAge", "");
+            unCarInsReq.put("uuid", uuidVal);
+            unCarInsReq.put("dptCde", dptCde);
+            unCarInsReq.put("useNatureShow", useNatureShow);
+            Map<String, Object> unCarInsRes = unCarIns(unCarInsReq, headers, taiShanCrawlerRequestComponent);
+            log.info("opdInsurance_unCarInsRes: {}", unCarInsRes);
+            Map<String, Object> unCarRoot = (Map<String, Object>) unCarInsRes.get("result");
+            List<Map<String, Object>> novhlList = (List<Map<String, Object>>) unCarRoot.get("novhlList");
+            Map<String, Object> firstNovhl = novhlList.get(0);
+            Map<String, Object> baseInfo = (Map<String, Object>) firstNovhl.get("base");
+            String specialContent = String.valueOf(baseInfo.get("specialContent"));
+            Map<String, Object> cvrgListWrap = (Map<String, Object>) firstNovhl.get("cvrgList");
+            List<Map<String, Object>> cvrgVOs = (List<Map<String, Object>>) cvrgListWrap.get("cvrgVOs");
+
+            BigDecimal totalPrm = BigDecimal.ZERO;
+            for (Map<String, Object> item : cvrgVOs) {
+                item.put("schemeList", schemeListSplit);
+                BigDecimal prm = new BigDecimal(String.valueOf(item.get("premium")));
+                totalPrm = totalPrm.add(prm);
+            }
+            cvrgVOs.get(0).put("totalPrm", totalPrm.toString());
+
+            // 组装保存参数
+            Map<String, Object> saveUnCarData = new HashMap<>();
+            saveUnCarData.put("orderNo", "");
+            saveUnCarData.put("jqProposalNo", "");
+            saveUnCarData.put("syProposalNo", "");
+            saveUnCarData.put("unCarTypeCode", "0691");
+            saveUnCarData.put("uncarId", "");
+            saveUnCarData.put("startDate", startDate);
+            saveUnCarData.put("endDate", endDate);
+            saveUnCarData.put("premium", "");
+            saveUnCarData.put("riskAmount", "");
+            saveUnCarData.put("proposalNo", "");
+            saveUnCarData.put("policyNo", "");
+            saveUnCarData.put("number", String.valueOf(quoteVo.getAccidentalDrivings().get(0).getQuantity()));
+            saveUnCarData.put("specialContent", specialContent);
+            saveUnCarData.put("uncarShortRate", "");
+            //投保人信息
+            saveUnCarData.put("applicant", JSONObject.toJSONString(request.getApplicantInfo()));
+            //被保人信息
+            saveUnCarData.put("insured", JSONObject.toJSONString(request.getInsuredInfo()));
+            saveUnCarData.put("itemKinds", cvrgVOs);
+            saveUnCarData.put("schemeList", schemeListSplit);
+            saveUnCarData.put("amt", "");
+            saveUnCarData.put("prm", "");
+            saveUnCarData.put("seatCount", request.getVehicleInfo().getSeatCount());
+            saveUnCarData.put("uuid", uuidVal);
+            saveUnCarData.put("id", "");
+            saveUnCarData.put("dptCde", dptCde);
+            saveUnCarData.put("useNatureShow", useNatureShow);
+
+            log.info("opdInsurance_非车保存data:{}", JSONObject.toJSONString(saveUnCarData));
+            Map<String, Object> saveUnCarRes = saveUnCar(saveUnCarData, headers, taiShanCrawlerRequestComponent);
+            log.info("opdInsurance_保存返回值:{}", JSONObject.toJSONString(saveUnCarRes));
+            Map<String, Object> saveUnRoot = (Map<String, Object>) saveUnCarRes.get("result");
+            Map<String, Object> saveBase = (Map<String, Object>) saveUnRoot.get("base");
+            String iidd = String.valueOf(saveBase.get("id"));
+
+            // 组装opdInsurance
+            opdInsurance = new TaiShanCrawlerQuotationRequest.OpdInsurance();
+            opdInsurance.setUncarId("");
+            opdInsurance.setStartDate(startDate);
+            opdInsurance.setEndDate(endDate);
+            opdInsurance.setPremium("");
+            opdInsurance.setRiskAmount("");
+            opdInsurance.setProposalNo("");
+            opdInsurance.setPolicyNo("");
+            opdInsurance.setNumber(String.valueOf(quoteVo.getAccidentalDrivings().get(0).getQuantity()));
+            opdInsurance.setUncarShortRate("");
+            opdInsurance.setSpecialContent(specialContent);
+            opdInsurance.setItemKinds(cvrgVOs);
+            opdInsurance.setSchemeList(schemeListSplit);
+            opdInsurance.setAmt("");
+            opdInsurance.setPrm("");
+            opdInsurance.setId(iidd);
+            //priceData.put("opdInsurance", opdInsurance);
+            //proposalInfo.put("opdmark", "1");
+
+            // 加入列表
+            //Map<String, Object> resJyxItem = new HashMap<>();
+            //resJyxItem.put("name", ZGdrivingInsurances.get("name"));
+            //resJyxItem.put("policy", "");
+            //resJyxItem.put("price", totalPrm.toString());
+            //this.resJyx.add(resJyxItem);
+        }
+        return opdInsurance;
+    }
+
+    private static Map<String, Object> saveUnCar(Map<String, Object> saveUnCarData, HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
+        Map map = taiShanCrawlerRequestComponent.post(RequestUrl.SAVE_UN_CAR, saveUnCarData, Map.class, headers);
+        return map;
+    }
+
+    private static Map<String, Object> unCarIns(Map<String, Object> unCarInsReq, HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
+        Map map = taiShanCrawlerRequestComponent.post(RequestUrl.UN_CAR_INS, unCarInsReq, Map.class, headers);
+        return map;
+    }
+
+
+    private static Map<String, Object> saveUnCarDA(Map<String, Object> diInsuranceSaveData, HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
+        Map map = taiShanCrawlerRequestComponent.post(RequestUrl.SAVE_UN_CAR_DA, diInsuranceSaveData, Map.class, headers);
+        return map;
+    }
+
+    private static Map<String, Object> priceUncarDa(Map<String, Object> priceUncarDaData, HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
+        Map map = taiShanCrawlerRequestComponent.post(RequestUrl.PRICE_UN_CAR_DA, priceUncarDaData, Map.class, headers);
+        return map;
+    }
+
+    private static Map<String, Object> agreement1301(HttpHeaders headers, TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent) {
+        Map map = taiShanCrawlerRequestComponent.get(RequestUrl.AGREEMENT1301, new Object(), Map.class, headers);
+        return map;
+    }
+
+    private static List<Map<String, Object>> getDiKinds(String productCode) {
+        List<Map<String, Object>> diKinds = new ArrayList<>();
+        if ("UN1".equals(productCode)) {
+            // UN1 50万以上配置
+            Map<String, Object> item1 = new HashMap<>();
+            item1.put("id", "");
+            item1.put("prodName", "驾乘人意外险");
+            item1.put("prodNo", "1301");
+            item1.put("kindName", "身故保险责任和伤残保险责任");
+            item1.put("kindCode", "130101");
+            item1.put("seqNo", "1");
+            item1.put("riskAmount", "0.0");
+            item1.put("rate", "0.0");
+            item1.put("premium", "0.0");
+            item1.put("otherId", "1301");
+            item1.put("amountLimit", "391008");
+            item1.put("appNo", "");
+            item1.put("schemeList", "");
+            item1.put("amountAll", "");
+            item1.put("premiumAll", "");
+            item1.put("perAmt", "20000");
+            item1.put("dailyAllowance", "");
+
+            Map<String, Object> item2 = new HashMap<>();
+            item2.put("id", "");
+            item2.put("prodName", "驾乘人意外险");
+            item2.put("prodNo", "1301");
+            item2.put("kindName", "医疗保险责任");
+            item2.put("kindCode", "130102");
+            item2.put("seqNo", "2");
+            item2.put("riskAmount", "0.0");
+            item2.put("rate", "0.0");
+            item2.put("premium", "0.0");
+            item2.put("otherId", "1301");
+            item2.put("amountLimit", "392001");
+            item2.put("appNo", "");
+            item2.put("schemeList", "");
+            item2.put("amountAll", "");
+            item2.put("premiumAll", "");
+            item2.put("perAmt", "10000");
+            item2.put("dailyAllowance", "");
+
+            Map<String, Object> item3 = new HashMap<>();
+            item3.put("id", "");
+            item3.put("prodName", "驾乘人意外险");
+            item3.put("prodNo", "1301");
+            item3.put("kindName", "附加住院津贴保险");
+            item3.put("kindCode", "130103");
+            item3.put("seqNo", "3");
+            item3.put("riskAmount", "0.0");
+            item3.put("rate", "0.0");
+            item3.put("premium", "0.0");
+            item3.put("otherId", "1301");
+            item3.put("amountLimit", "393001");
+            item3.put("appNo", "");
+            item3.put("schemeList", "");
+            item3.put("amountAll", "");
+            item3.put("premiumAll", "");
+            item3.put("perAmt", "100");
+            item3.put("dailyAllowance", "100");
+            item3.put("days", "180");
+
+            diKinds.add(item1);
+            diKinds.add(item2);
+            diKinds.add(item3);
+        } else if ("UN2".equals(productCode)) {
+            // UN2 50万以下配置
+            Map<String, Object> item1 = new HashMap<>();
+            item1.put("id", "");
+            item1.put("prodName", "驾乘人意外险");
+            item1.put("prodNo", "1301");
+            item1.put("kindName", "身故保险责任和伤残保险责任");
+            item1.put("kindCode", "130101");
+            item1.put("seqNo", "1");
+            item1.put("riskAmount", "0.0");
+            item1.put("rate", "0.0");
+            item1.put("premium", "0.0");
+            item1.put("otherId", "1301");
+            item1.put("amountLimit", "391007");
+            item1.put("appNo", "");
+            item1.put("schemeList", "");
+            item1.put("amountAll", "");
+            item1.put("premiumAll", "");
+            item1.put("perAmt", "10000");
+            item1.put("dailyAllowance", "");
+
+            Map<String, Object> item2 = new HashMap<>();
+            item2.put("id", "");
+            item2.put("prodName", "驾乘人意外险");
+            item2.put("prodNo", "1301");
+            item2.put("kindName", "医疗保险责任");
+            item2.put("kindCode", "130102");
+            item2.put("seqNo", "2");
+            item2.put("riskAmount", "0.0");
+            item2.put("rate", "0.0");
+            item2.put("premium", "0.0");
+            item2.put("otherId", "1301");
+            item2.put("amountLimit", "000000");
+            item2.put("appNo", "");
+            item2.put("schemeList", "");
+            item2.put("amountAll", "");
+            item2.put("premiumAll", "");
+            item2.put("perAmt", "0");
+            item2.put("dailyAllowance", "");
+
+            Map<String, Object> item3 = new HashMap<>();
+            item3.put("id", "");
+            item3.put("prodName", "驾乘人意外险");
+            item3.put("prodNo", "1301");
+            item3.put("kindName", "附加住院津贴保险");
+            item3.put("kindCode", "130103");
+            item3.put("seqNo", "3");
+            item3.put("riskAmount", "0.0");
+            item3.put("rate", "0.0");
+            item3.put("premium", "0.0");
+            item3.put("otherId", "1301");
+            item3.put("amountLimit", "000000");
+            item3.put("appNo", "");
+            item3.put("schemeList", "");
+            item3.put("amountAll", "");
+            item3.put("premiumAll", "");
+            item3.put("perAmt", "0");
+            item3.put("dailyAllowance", "0");
+            item3.put("days", "180");
+
+            diKinds.add(item1);
+            diKinds.add(item2);
+            diKinds.add(item3);
+        } else {
+            throw new SystemException("获取错误的非车方案,请核实");
+        }
+        return diKinds;
+    }
+
     private static TaiShanCrawlerQuotationRequest.CoefficientInfo toCoefficientInfoDto(QuoteVo quoteVo) {
         RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
         RiskInfoVo ciRiskInfoVo = quoteVo.getCiRiskInfoVo();
@@ -591,6 +1058,13 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
             "MJ1", "MJ2", "BD", "TY4"
     ));
 
+    /** 驾意险险种编码集合 */
+    private static final Set<String> DRIVINGINSURANCES_KIND_CODES = new HashSet<>(Arrays.asList(
+            "UN1", "UN2", "D3", "D4", "G1", "L", "F",
+            "SY_FJ_YBW1", "SY_FJ_YBW2", "SY_FJ_YBW3",
+            "MJ1", "MJ2", "BD", "TY4", "0691_A"
+    ));
+
     /** 【第三者责任险】限额档次 */
     private static final List<String[]> THIRD_LIMIT_AMT = Arrays.asList(
             new String[]{"10万元", "306006005"},
@@ -969,9 +1443,9 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
         vehicleInfo.setPrintUsageCde("");
         vehicleInfo.setPrintUsageCdeFlag("0");
         LocalDate regDate = LocalDate.parse(vehicleInfo.getRegisterDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        int regYear = regDate.getYear();              // 注册年份
-        int currentYear = LocalDate.now().getYear();  // 当前年份
-        int carAge = currentYear - regYear;           // 车龄
+        //int regYear = regDate.getYear();              // 注册年份
+        //int currentYear = LocalDate.now().getYear();  // 当前年份
+        int carAge = (int) ChronoUnit.YEARS.between(regDate, LocalDate.now());           // 车龄
         vehicleInfo.setCarAge(carAge + "");
         vehicleInfo.setPrintUsageCdeSub("");
         vehicleInfo.setJqCResvTxt20("");

+ 10 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java

@@ -205,9 +205,18 @@ public class TaiShanCrawlerQuoteResultsVoBuild {
             quoteResultsVo.getCosts().setVvTax(String.valueOf(saveResponse.getResult().getCompulsoryInsurance().getCarShipTax().getSumTax()));
         }
         //设置非车险(驾意险)保费
-        if (Objects.nonNull(saveResponse.getResult().getDiInsurance())) {
+        if (Objects.nonNull(saveResponse.getResult().getDiInsurance())) {//DiInsurance  驾乘人员意外伤害险 UN1 / UN2
             quoteResultsVo.getCosts().setNiPremium(saveResponse.getResult().getDiInsurance().getPremium());
         }
+        if (Objects.nonNull(saveResponse.getResult().getOpdInsurance())) {//OpdInsurance  车主门诊保险 0691_A
+            if (StringUtils.isNotBlank(quoteResultsVo.getCosts().getNiPremium())) {
+                BigDecimal diPremium = new BigDecimal(saveResponse.getResult().getDiInsurance().getPremium());
+                BigDecimal add = diPremium.add(new BigDecimal(saveResponse.getResult().getOpdInsurance().getPremium()));
+                quoteResultsVo.getCosts().setNiPremium(String.valueOf(add));
+            } else {
+                quoteResultsVo.getCosts().setNiPremium(saveResponse.getResult().getOpdInsurance().getPremium());
+            }
+        }
         // 设置总费用
         BigDecimal bi = StringUtils.hasText(quoteResultsVo.getCosts().getBiPremium()) ? new BigDecimal(quoteResultsVo.getCosts().getBiPremium()) : BigDecimal.ZERO;
         BigDecimal ci = StringUtils.hasText(quoteResultsVo.getCosts().getCiPremium()) ? new BigDecimal(quoteResultsVo.getCosts().getCiPremium()) : BigDecimal.ZERO;

+ 60 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java

@@ -39,6 +39,34 @@ public class TaiShanCrawlerRequestComponent {
 
     private final Map<String, ResponseMessageAbstractHandler> handlerMap;
 
+    public <Response> Response post(
+            RequestUrl requestUrl,
+            Map body,
+            Class<Response> responseClass,
+            HttpHeaders headers) {
+        // 1. 请求体 JSON
+        String jsonString = com.alibaba.fastjson.JSON.toJSONString(body);
+        log.info("请求内容 {}", jsonString);
+        // 2. 执行 POST
+        ResponseEntity<String> responseEntity =
+                requestComponent.post(
+                        requestUrl.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                        jsonString,
+                        String.class,
+                        headers);
+        // 3. 获取响应
+        String responseBody = responseEntity.getBody();
+        log.info("post响应请求地址 {}", requestUrl.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()));
+        log.info("post响应内容 {}", responseBody);
+        // 4. 反序列化
+        Response response = com.alibaba.fastjson.JSON.parseObject(responseBody, responseClass);
+
+        // 5. 判断返回码(注意使用 equals)
+        if (responseEntity.getStatusCode().toString().contains("200 OK")) {
+            return response;
+        }
+        throw new SystemException(response == null ? requestUrl.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()) +"请求异常" : response.toString());
+    }
 
     public <Response extends TaiShanCrawlerBaseResponse> Response post(
             RequestUrl requestUrl,
@@ -63,7 +91,7 @@ public class TaiShanCrawlerRequestComponent {
         Response response = com.alibaba.fastjson.JSON.parseObject(responseBody, responseClass);
 
         // 5. 判断返回码(注意使用 equals)
-        if ("200".equals(response.getCode())) {
+        if (responseEntity.getStatusCode().toString().contains("200 OK")) {
             return response;
         }
         throw new SystemException(response.getMessage());
@@ -129,6 +157,37 @@ public class TaiShanCrawlerRequestComponent {
         throw new SystemException(response.getMessage());
     }
 
+    public <Response> Response get(
+            RequestUrl requestUrl,
+            Object body,
+            Class<Response> responseClass,
+            HttpHeaders headers) {
+        // 1. 请求体 param
+        MultiValueMap<String, String> param = new LinkedMultiValueMap<>();
+        if(Objects.nonNull(body)){
+            param = RequestObjectConversion.convertMultiValueStringMap(body);
+        }
+        // 2. 执行 POST
+        ResponseEntity<String> responseEntity =
+                requestComponent.baseGet(
+                        requestUrl.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                        param,
+                        String.class,
+                        headers);
+        // 3. 获取响应
+        String responseBody = responseEntity.getBody();
+        log.info("get响应请求地址 {}", requestUrl.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()));
+        log.info("get响应内容 {}", responseBody);
+        // 4. 反序列化
+        Response response = com.alibaba.fastjson.JSON.parseObject(responseBody, responseClass);
+
+        // 5. 判断返回码(注意使用 equals)
+        if (responseEntity.getStatusCode().toString().contains("200 OK")) {
+            return response;
+        }
+        throw new SystemException(response == null ? requestUrl.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()) +"请求异常" : response.toString());
+    }
+
     /**
      * 获取滑块
      * @param request

+ 7 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/RequestUrl.java

@@ -19,7 +19,13 @@ public enum RequestUrl {
     DEPT("/api_prod/sys/api/company/tree/", "获取承保机构"),
 //    SALEINFO("/api_prod/sys/api/saleInfo", "获取业务员信息"),
     CONFIRM("/api_prod/ins/api/customerConfirm", "被/投保人确认"),
-
+    // ==================== 非车相关接口 ====================
+    // 非车保费
+    PRICE_UN_CAR_DA("/api_prod/ins/api/order/price_uncarDa", "非车保费"),
+    AGREEMENT1301("/api_prod/sys/api/uncar/agreement/1301", "1301协议接口"),
+    UN_CAR_INS("/api_prod/ins/api/order/unCar_ins", "非车订单"),
+    SAVE_UN_CAR_DA("/api_prod/ins/api/order/save_unCarDA", "非车保存"),
+    SAVE_UN_CAR("/api_prod/ins/api/order/save_unCar", "非车车主门诊保存"),
 
     // 报价相关
     PRICE("/api_prod/ins/api/proposal/price", "报价"),

+ 139 - 4
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerQuotationRequest.java

@@ -113,11 +113,74 @@ public class TaiShanCrawlerQuotationRequest implements Serializable {
     private Object dpInsurance;
 
     /**
-     * 盗抢险
+     * 盗抢险--驾意险
+     */
+    //@JsonProperty("diInsurance")
+    //@JSONField(name = "diInsurance", ordinal = 12)
+    //private Object diInsurance;
+    /**
+     * 驾乘人员意外伤害险 UN1 / UN2
      */
     @JsonProperty("diInsurance")
     @JSONField(name = "diInsurance", ordinal = 12)
-    private Object diInsurance;
+    private DiInsurance diInsurance;
+    @Data
+    @NoArgsConstructor
+    public static class DiInsurance implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+        @JsonProperty("startDate")
+        @JSONField(name = "startDate", ordinal = 1)
+        private String startDate;
+
+        @JsonProperty("endDate")
+        @JSONField(name = "endDate", ordinal = 2)
+        private String endDate;
+
+        @JsonProperty("premium")
+        @JSONField(name = "premium", ordinal = 3)
+        private String premium;
+
+        @JsonProperty("riskAmount")
+        @JSONField(name = "riskAmount", ordinal = 4)
+        private String riskAmount;
+
+        @JsonProperty("proposalNo")
+        @JSONField(name = "proposalNo", ordinal = 5)
+        private String proposalNo;
+
+        @JsonProperty("policyNo")
+        @JSONField(name = "policyNo", ordinal = 6)
+        private String policyNo;
+
+        @JsonProperty("day")
+        @JSONField(name = "day", ordinal = 7)
+        private Integer day;
+
+        @JsonProperty("specialContent")
+        @JSONField(name = "specialContent", ordinal = 8)
+        private String specialContent;
+
+        @JsonProperty("resvNumAutonomy")
+        @JSONField(name = "resvNumAutonomy", ordinal = 9)
+        private String resvNumAutonomy;
+
+        @JsonProperty("schemeList")
+        @JSONField(name = "schemeList", ordinal = 10)
+        private String schemeList;
+
+        @JsonProperty("number")
+        @JSONField(name = "number", ordinal = 11)
+        private String number;
+
+        @JsonProperty("id")
+        @JSONField(name = "id", ordinal = 12)
+        private String id;
+
+        @JsonProperty("diKinds")
+        @JSONField(name = "diKinds", ordinal = 13)
+        private List<Map<String, Object>> diKinds;
+    }
 
     /**
      * 摩托车险
@@ -210,12 +273,84 @@ public class TaiShanCrawlerQuotationRequest implements Serializable {
     @JSONField(name = "rtInsurance", ordinal = 25)
     private Object rtInsurance;
 
+    ///**
+    // * 门诊险
+    // */
+    //@JsonProperty("opdInsurance")
+    //@JSONField(name = "opdInsurance", ordinal = 26)
+    //private Object opdInsurance;
+
     /**
-     * 门诊险
+     * 车主门诊保险 0691_A
      */
     @JsonProperty("opdInsurance")
     @JSONField(name = "opdInsurance", ordinal = 26)
-    private Object opdInsurance;
+    private OpdInsurance opdInsurance;
+    @Data
+    @NoArgsConstructor
+    public static class OpdInsurance implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+        @JsonProperty("uncarId")
+        @JSONField(name = "uncarId", ordinal = 1)
+        private String uncarId;
+
+        @JsonProperty("startDate")
+        @JSONField(name = "startDate", ordinal = 2)
+        private String startDate;
+
+        @JsonProperty("endDate")
+        @JSONField(name = "endDate", ordinal = 3)
+        private String endDate;
+
+        @JsonProperty("premium")
+        @JSONField(name = "premium", ordinal = 4)
+        private String premium;
+
+        @JsonProperty("riskAmount")
+        @JSONField(name = "riskAmount", ordinal = 5)
+        private String riskAmount;
+
+        @JsonProperty("proposalNo")
+        @JSONField(name = "proposalNo", ordinal = 6)
+        private String proposalNo;
+
+        @JsonProperty("policyNo")
+        @JSONField(name = "policyNo", ordinal = 7)
+        private String policyNo;
+
+        @JsonProperty("number")
+        @JSONField(name = "number", ordinal = 8)
+        private String number;
+
+        @JsonProperty("uncarShortRate")
+        @JSONField(name = "uncarShortRate", ordinal = 9)
+        private String uncarShortRate;
+
+        @JsonProperty("specialContent")
+        @JSONField(name = "specialContent", ordinal = 10)
+        private String specialContent;
+
+        @JsonProperty("itemKinds")
+        @JSONField(name = "itemKinds", ordinal = 11)
+        private List<Map<String, Object>> itemKinds;
+
+        @JsonProperty("schemeList")
+        @JSONField(name = "schemeList", ordinal = 12)
+        private String schemeList;
+
+        @JsonProperty("amt")
+        @JSONField(name = "amt", ordinal = 13)
+        private String amt;
+
+        @JsonProperty("prm")
+        @JSONField(name = "prm", ordinal = 14)
+        private String prm;
+
+        @JsonProperty("id")
+        @JSONField(name = "id", ordinal = 15)
+        private String id;
+    }
 
    
 

+ 1 - 4
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java

@@ -35,11 +35,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 import org.springframework.util.StringUtils;
 
-import java.io.IOException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.util.*;
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -134,7 +131,7 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
         String insuredPersonId = insuredConfirmResponse.getResult();
 
         // 3.0 报价接口
-        TaiShanCrawlerQuotationRequest taiShanCrawlerQuotationRequest = TaiShanCrawlerQuoteRequestVoBuild.toQuotationDto(quoteVo,modelsDTO,currentValue,parameters,taiShanCrawlerDeptResponse,attributionInformationVo,policyPersonId,insuredPersonId);
+        TaiShanCrawlerQuotationRequest taiShanCrawlerQuotationRequest = TaiShanCrawlerQuoteRequestVoBuild.toQuotationDto(quoteVo,modelsDTO,currentValue,parameters,taiShanCrawlerDeptResponse,attributionInformationVo,policyPersonId,insuredPersonId, headers, taiShanCrawlerRequestComponent);
         log.info("taiShanCrawlerQuotationRequest参数的值:{}", JSON.toJSONString(taiShanCrawlerQuotationRequest));
         TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse = taiShanCrawlerRequestComponent.quotation(taiShanCrawlerQuotationRequest, headers,CIRCULATE_NUMBER);
         log.info("taiShanCrawlerQuotationResponse参数的值:{}", JSON.toJSONString(taiShanCrawlerQuotationResponse));

+ 53 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

@@ -20,7 +20,6 @@ import com.jzg.commons.entity.agreement.dispatch.vo.PtlAgreementDispatchVo;
 import com.jzg.commons.entity.agreement.dispatch.vo.ValidateDispatchRuleVo;
 import com.jzg.commons.entity.costs.vo.ValidateSchemeRuleVo;
 import com.jzg.commons.entity.po.*;
-import com.jzg.commons.entity.po.jyxSetting;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.SalespersonInfoVo;
 import com.jzg.commons.entity.scheme.po.*;
@@ -29,6 +28,7 @@ import com.jzg.commons.entity.vo.CompanyClauseVo;
 import com.jzg.commons.entity.vo.EsmInsCompanyResVo;
 import com.jzg.commons.entity.vo.InsCompanyClauseVo;
 import com.jzg.commons.exception.NoneException;
+import com.jzg.commons.exception.ValidateException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.commons.util.idgen.IdGenerate;
@@ -149,6 +149,8 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
 
         //驾意险信息
         List<PtlSchemeInsuranceDrivingIntention> ptlSchemeInsuranceDrivingIntentionList = ptlSchemeSaveVo.getPtlSchemeInsuranceDrivingIntentionList();
+        //校验驾意险座位数范围不可重复
+        validateDrivingIntentionSeatRange(ptlSchemeInsuranceDrivingIntentionList);
         //清空驾意险信息
         cleanDrivingIntention(ptlSchemeInfoList);
         ptlSchemeInsuranceDrivingIntentionMapper.insertOrUpdate(ptlSchemeInsuranceDrivingIntentionList);
@@ -175,6 +177,46 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
         ptlSchemeInsuranceDrivingIntentionMapper.delete(new LambdaQueryWrapper<PtlSchemeInsuranceDrivingIntention>().in(PtlSchemeInsuranceDrivingIntention::getSchemeInfoId, ids));
     }
 
+    /**
+     * 校验驾意险座位数范围不可重复
+     * 两组座位数范围 [a_min, a_max] 和 [b_min, b_max] 存在重叠即判定为重复
+     * @param drivingIntentionList 驾意险列表
+     */
+    private void validateDrivingIntentionSeatRange(List<PtlSchemeInsuranceDrivingIntention> drivingIntentionList) {
+        if (CollUtil.isEmpty(drivingIntentionList)) {
+            return;
+        }
+        for (int i = 0; i < drivingIntentionList.size(); i++) {
+            PtlSchemeInsuranceDrivingIntention a = drivingIntentionList.get(i);
+            Integer aMin = a.getMinSeatCount();
+            Integer aMax = a.getMaxSeatCount();
+            for (int j = i + 1; j < drivingIntentionList.size(); j++) {
+                PtlSchemeInsuranceDrivingIntention b = drivingIntentionList.get(j);
+                Integer bMin = b.getMinSeatCount();
+                Integer bMax = b.getMaxSeatCount();
+
+                // null 视为无限制:min=null 视为0, max=null 视为∞
+                boolean overlap = isSeatRangeOverlap(aMin, aMax, bMin, bMax);
+                if (overlap) {
+                    throw new ValidateException("驾意险座位数范围存在重叠,请检查!");
+                }
+            }
+        }
+    }
+
+    /**
+     * 判断两个座位数范围是否重叠
+     */
+    private boolean isSeatRangeOverlap(Integer min1, Integer max1, Integer min2, Integer max2) {
+        // 有效下界:null 视为 -∞(即不限制下限)
+        // 有效上界:null 视为 +∞(即不限制上限)
+        // 不重叠条件:max1 < min2 或 max2 < min1
+        // 因此重叠条件:!(max1 < min2) && !(max2 < min1)
+        boolean leftDisjoint = max1 != null && min2 != null && max1 < min2;
+        boolean rightDisjoint = max2 != null && min1 != null && max2 < min1;
+        return !leftDisjoint && !rightDisjoint;
+    }
+
     /**
      * 清空险种数据
      *
@@ -521,6 +563,16 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
                         driving.setCoverage(setting.getCoverage() != null ? setting.getCoverage().toString() : null);
                     }
                 });
+                // 根据座位数范围过滤驾意险:只保留座位数在 minSeatCount~maxSeatCount 范围内的
+                drivings.removeIf(driving -> {
+                    if (driving.getMinSeatCount() != null && seats < driving.getMinSeatCount()) {
+                        return true;
+                    }
+                    if (driving.getMaxSeatCount() != null && seats > driving.getMaxSeatCount()) {
+                        return true;
+                    }
+                    return false;
+                });
             });
         }
 

+ 3 - 1
tenant/organization/src/main/resources/mapper/PtlSchemeInsuranceDrivingIntentionMapper.xml

@@ -9,7 +9,9 @@
         psidi.selected_status,
         psidi.quantity,
         psidi.scheme_info_id,
-        psidi.driving_intention_id
+        psidi.driving_intention_id,
+        psidi.min_seat_count,
+        psidi.max_seat_count
         FROM
         ptl_scheme_insurance_driving_intention psidi
         LEFT JOIN jyx_config jc ON psidi.driving_intention_id = jc.id AND jc.is_delete = 0

+ 5 - 1
tenant/organization/src/main/resources/mapper/PtlSchemeMapper.xml

@@ -46,6 +46,8 @@
                 <result column="premium" property="premium"/>
                 <result column="quantity" property="quantity"/>
                 <result column="selected_status" property="selectedStatus"/>
+                <result column="min_seat_count" property="minSeatCount"/>
+                <result column="max_seat_count" property="maxSeatCount"/>
             </collection>
         </collection>
     </resultMap>
@@ -160,7 +162,9 @@
             jc.parent_id,
             jc1.product_code as parent_product_code,
             psidi.quantity,
-            psidi.selected_status
+            psidi.selected_status,
+            psidi.min_seat_count,
+            psidi.max_seat_count
         FROM
             ptl_scheme ps
                 left JOIN ptl_scheme_info psi ON ps.id = psi.scheme_id AND psi.is_delete = 0