瀏覽代碼

人保修改

wanghao 3 月之前
父節點
當前提交
3036f2d847

+ 38 - 0
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/component/RenBaoNewCrawlerRequestComponent.java

@@ -1005,4 +1005,42 @@ public class RenBaoNewCrawlerRequestComponent {
         log.info("Form data post to: {}", url);
         return requestComponent.formData(url, parts, String.class, headers);
     }
+
+    /**
+     * 查询投保单信息(获取评分)
+     *
+     * <p>对应Python的queryProposalInfo方法,用于获取商业险和交强险的评分</p>
+     *
+     * @param proposalNoDAA 商业险投保单号
+     * @param proposalNoDZA 交强险投保单号
+     * @param headers 请求头
+     * @param username 用户名
+     * @return 投保单信息(包含评分)
+     */
+    public Map<String, Object> queryProposalInfo(String proposalNoDAA, String proposalNoDZA,
+                                                 HttpHeaders headers, String username) {
+        String url = buildUrl(RequestUrl.QUERY_PROPOSAL_INFO.getUrl());
+
+        Map<String, Object> requestData = new HashMap<>();
+        requestData.put("proposalNoDAA", proposalNoDAA != null ? proposalNoDAA : "");
+        requestData.put("proposalNoDZA", proposalNoDZA != null ? proposalNoDZA : "");
+        requestData.put("proposalNoDDA", "");
+        requestData.put("proposalNoYEL", "");
+        requestData.put("proposalNoEAD", "");
+        requestData.put("proposalNo", "");
+        requestData.put("riskCode", "DAA");
+        requestData.put("userCode", "");
+        requestData.put("comCode", "");
+        requestData.put("pageNo", "0");
+        requestData.put("pageSize", "0");
+        requestData.put("proposalNoUnion", new String[]{});
+        requestData.put("editType", "query");
+
+        log.info("Query proposal info for DAA: {}, DZA: {}", proposalNoDAA, proposalNoDZA);
+        ResponseEntity<String> responseEntity = requestComponent.stringPost(url, requestData, String.class, headers);
+
+        updateTokenFromResponse(responseEntity.getHeaders(), username);
+
+        return JSON.parseObject(responseEntity.getBody(), new TypeReference<Map<String, Object>>() {});
+    }
 }

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

@@ -130,7 +130,12 @@ public enum RequestUrl {
     /**
      * 影像单一上传接口(只有交强险或商业险)
      */
-    IMAGE_OCR_UPLOAD("/front/019K0000003/yxgl/imageOCRUpload");
+    IMAGE_OCR_UPLOAD("/front/019K0000003/yxgl/imageOCRUpload"),
+
+    /**
+     * 查询投保单信息接口(获取评分)
+     */
+    QUERY_PROPOSAL_INFO("/front/019K0000003/ipdi/queryProposalInfo");
 
     /**
      * 接口URL路径

+ 5 - 0
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/entity/response/RenBaoNewCrawlerQuoteResponse.java

@@ -344,6 +344,11 @@ public class RenBaoNewCrawlerQuoteResponse {
          * 被保险人信息列表
          */
         private List<Object> prpInsuredVos;
+
+        /**
+         * 人保评分
+         */
+        private String piccscore;
     }
 
     /**

+ 31 - 16
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestBuilder.java

@@ -8,6 +8,7 @@ import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.entity.vo.ImagesVo;
 import com.jzg.commons.entity.vo.InsTaskImagesVo;
+import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.quotation.renbaonew.crawler.component.RenBaoNewCrawlerRequestComponent;
 import com.jzg.quotation.renbaonew.mapper.RenBaoImageMapper;
@@ -176,9 +177,6 @@ public class RenBaoNewCrawlerRequestBuilder {
             }
         }
 
-        // 设置顶层参数
-        buildTopLevelParameters(request);
-
         // =====================================================================
         // 步骤2.2:查询归属人信息(业务归属)
         // =====================================================================
@@ -293,6 +291,10 @@ public class RenBaoNewCrawlerRequestBuilder {
         // 0=燃油, 1=纯电动, 2=燃料电池, 3=插电混动, 4=其他混动, 9=其他
         // =====================================================================
         String energyTypePlat = calculateEnergyTypePlat(fuelType);
+        String isEnergyCar = carInfo.getEnergyTypeCode() != null && carInfo.getEnergyTypeCode().equals("1") ? "1" : "0";
+
+        // 设置顶层参数
+        buildTopLevelParameters(request, isEnergyCar, energyTypePlat);
 
         // =====================================================================
         // 步骤4:计算车辆实际价值(车损险保额计算基础)
@@ -343,7 +345,7 @@ public class RenBaoNewCrawlerRequestBuilder {
                 seatCount,                                // 座位数
                 vehicleTonnage,                           // 核定载质量(货车用)
                 energyTypePlat,                           // 能源类型平台代码
-                carInfo.getEnergyTypeCode() != null && carInfo.getEnergyTypeCode().equals("1") ? "1" : "0",  // 是否新能源
+                isEnergyCar,                              // 是否新能源
                 startDate,                                // 起保日期
                 gscomCode,                                // 归属部门代码
                 headers,
@@ -416,13 +418,13 @@ public class RenBaoNewCrawlerRequestBuilder {
                 handlerCodeUni, handler1CodeUni, useYear, cqpCount, linkerName));
         request.setPrpCitemCar(buildPrpCitemCar(carInfo, actualValueStr, vehicleModelCode,
                 vehicleId, vehicleModelCode, useNatureCode, vehicleClassPicc, fuelType, clauseType, vehicleFgwCode, purchasePrice,
-                gscomCode, loginInfo.getUserCode(), headers, username, queryArea));
+                gscomCode, loginInfo.getUserCode(), headers, username, queryArea, isEnergyCar, energyTypePlat));
         request.setPrpCinsureds(buildPrpCinsureds(quoteVo,customerResponse));
 
         // 价格系数默认使用1.0(与Python保持一致)
         String priceCoefficient = "1.0";
         List<Map<String, Object>> kindMapList = convertKindInfoToMapList(quoteVo.getKindInfoVo());
-        request.setPrpCitemKindsTemp(buildPrpCitemKindsTemp(kindMapList, actualValueStr, priceCoefficient, seatCount));
+        request.setPrpCitemKindsTemp(buildPrpCitemKindsTemp(kindMapList, actualValueStr, priceCoefficient, seatCount, isEnergyCar));
 
         request.setPrpCitemKindCI(buildPrpCitemKindCI(quoteVo));
         request.setPrpCcarShipTax(buildPrpCcarShipTax(customerResponse, carInfo));
@@ -518,7 +520,7 @@ public class RenBaoNewCrawlerRequestBuilder {
      * 构建顶层参数 - 规整所有顶级字段
      *
      */
-    private void buildTopLevelParameters(RenBaoNewCrawlerQuoteRequest request) {
+    private void buildTopLevelParameters(RenBaoNewCrawlerQuoteRequest request, String isEnergyCar, String energyTypePlat) {
         // ========== req2.json 独有的字段 ==========
         // 注意:userName, userCode 在调用处单独设置,因为需要 loginInfo
         request.setUserSonType(null);
@@ -526,8 +528,8 @@ public class RenBaoNewCrawlerRequestBuilder {
         request.setProfitinfoFlag(true);
         request.setTaskNo("");
         request.setDmFlag("");
-        request.setEnergyFlag("0");
-        request.setEnergyTypePlat("0");
+        request.setEnergyFlag(isEnergyCar != null ? isEnergyCar : "0");
+        request.setEnergyTypePlat(energyTypePlat != null ? energyTypePlat : "0");
         request.setIsForbiddenFlag("0");
         request.setIsBusinessType("I");
         request.setLastDamagedBI("");
@@ -655,9 +657,11 @@ public class RenBaoNewCrawlerRequestBuilder {
 
                     if (addResponse != null && "Success".equals(addResponse.getMessage())) {
                         log.info("Customer add success: {}", customerInfo.getName());
-                        if (addResponse.getData() != null) {
+                        if (addResponse.getData() != null && addResponse.getData().get("errorMessage").equals("")) {
                             customerData = JSON.parseObject(JSON.toJSONString(addResponse.getData()),
                                     RenBaoNewCrawlerCustomerResponse.CustomerData.class);
+                        }else{
+                            throw new SystemException(addResponse.getData().get("errorMessage")+"");
                         }
                         return customerData;
                     } else {
@@ -1578,7 +1582,7 @@ public class RenBaoNewCrawlerRequestBuilder {
                                                 String carKindCode, String fuelType, String clauseType,
                                                 String vehicleFgwCode, BigDecimal purchasePrice,
                                                 String comCode, String userCode, HttpHeaders headers, String username,
-                                                String queryArea) {
+                                                String queryArea, String isEnergyCar, String energyTypePlat) {
         Map<String, Object> prpCitemCar = new HashMap<>();
         String formattedRegisterDate = formatDateWithTimezone(carInfo.getRegisterDate());
 
@@ -1639,7 +1643,7 @@ public class RenBaoNewCrawlerRequestBuilder {
         prpCitemCar.put("modelCode", finalVehicleId != null && !finalVehicleId.isEmpty() ? finalVehicleId : carInfo.getCarModelNo());
         prpCitemCar.put("ModelCodePlat", finalVehicleModelCode != null ? finalVehicleModelCode : "");
         prpCitemCar.put("useNatureCode", useNatureCode != null && !useNatureCode.isEmpty() ? useNatureCode : "211");
-        prpCitemCar.put("licenseType", "02");
+        prpCitemCar.put("licenseType", "1".equals(isEnergyCar) ? "52" : "02");
         prpCitemCar.put("carKindCode", carKindCode != null ? carKindCode : "A01");
         prpCitemCar.put("clauseType", clauseType != null ? clauseType : "F42");
         prpCitemCar.put("clauseTypeOld", clauseType != null ? clauseType : "F42");
@@ -1685,7 +1689,8 @@ public class RenBaoNewCrawlerRequestBuilder {
             }
         }
         prpCitemCar.put("carLotEquQuality", carLotEquQuality != null ? carLotEquQuality : "");
-        prpCitemCar.put("isEnergyCar", matchedIsEnergyCar != null ? matchedIsEnergyCar : "0");
+        String finalIsEnergyCar = matchedIsEnergyCar != null ? matchedIsEnergyCar : isEnergyCar;
+        prpCitemCar.put("isEnergyCar", finalIsEnergyCar != null ? finalIsEnergyCar : "0");
         prpCitemCar.put("isDangerous", "0");
         prpCitemCar.put("isDropinVisitInsure", "0");
         prpCitemCar.put("indexn", "");
@@ -1715,9 +1720,9 @@ public class RenBaoNewCrawlerRequestBuilder {
 
         // ========== 车辆基本属性 ==========
         prpCitemCar.put("licenseFlag", "1");
-        prpCitemCar.put("energyFlag", "0");
+        prpCitemCar.put("energyFlag", finalIsEnergyCar != null ? finalIsEnergyCar : "0");
         prpCitemCar.put("energyTypePlatCode", "");
-        prpCitemCar.put("energyTypePlat", calculateEnergyTypePlat(fuelType));
+        prpCitemCar.put("energyTypePlat", energyTypePlat != null ? energyTypePlat : calculateEnergyTypePlat(fuelType));
         prpCitemCar.put("energyTypePlatQ39", "");
         prpCitemCar.put("vehicleFgwCode", vehicleFgwCode != null ? vehicleFgwCode : "");
         prpCitemCar.put("modelCodeAlias", "");
@@ -2387,10 +2392,12 @@ public class RenBaoNewCrawlerRequestBuilder {
      * @param actualValue 车辆真实价值
      * @param priceCoefficient 价格系数
      * @param seatCount 座位数
+     * @param isEnergyCar 是否新能源车
      * @return 商业险险种信息列表
      */
     public List<Map<String, Object>> buildPrpCitemKindsTemp(List<Map<String, Object>> kindList,
-                                                            String actualValue, String priceCoefficient, Integer seatCount) {
+                                                            String actualValue, String priceCoefficient, Integer seatCount,
+                                                            String isEnergyCar) {
         List<Map<String, Object>> kindsTemp = new ArrayList<>();
 
         if (kindList == null || kindList.isEmpty()) {
@@ -2436,6 +2443,14 @@ public class RenBaoNewCrawlerRequestBuilder {
             // 深拷贝映射模板
             Map<String, Object> kind = new HashMap<>(zgRbMap.get(zgKindCode));
 
+            // 根据车辆类型动态选择险种名称
+            if ("1".equals(isEnergyCar) && kind.containsKey("energKindName")) {
+                String energKindName = (String) kind.get("energKindName");
+                if (energKindName != null && !energKindName.isEmpty()) {
+                    kind.put("kindName", energKindName);
+                }
+            }
+
             // 通用处理
             kind.put("chooseFlag", "on");
             kind.put("newInsertFlag", "");

+ 55 - 3
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java

@@ -98,7 +98,7 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
         RenBaoNewCrawlerSaveResponse saveResponse = requestComponent.saveAsProposal(saveRequest, headers);
 
         // 4. 构建结果
-        QuoteResultsVo resultsVo = buildQuoteResultsVo(quoteVo, quoteRequest, saveResponse);
+        QuoteResultsVo resultsVo = buildQuoteResultsVo(quoteVo, quoteRequest, saveResponse, headers, username);
 
         // 5. 保存订单信息
         orderService.saveOrder(
@@ -176,9 +176,10 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
                     continue;
                 } else {
                     // 无法解析日期,直接退出
-                    break;
+                    throw new SystemException( response.getData().getError());
                 }
             }
+            throw new SystemException( response.getData().getError());
         }
         throw new SystemException("报价重试失败");
     }
@@ -461,25 +462,43 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
      * @param quoteVo 报价请求
      * @param quoteRequest 报价请求参数
      * @param saveResponse 保存响应
+     * @param headers 请求头
+     * @param username 用户名
      * @return 报价结果VO
      */
     private QuoteResultsVo buildQuoteResultsVo(QuoteVo quoteVo, RenBaoNewCrawlerQuoteRequest quoteRequest,
-                                               RenBaoNewCrawlerSaveResponse saveResponse) {
+                                               RenBaoNewCrawlerSaveResponse saveResponse,
+                                               HttpHeaders headers, String username) {
         QuoteResultsVo resultsVo = new QuoteResultsVo();
         resultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
         RiskInfoVo ciRisk = quoteVo.getCiRiskInfoVo() != null ?quoteVo.getCiRiskInfoVo() : new RiskInfoVo();
         if(quoteRequest.getPrpCmainCI().get("startDate") != null && quoteRequest.getPrpCmainCI().get("endDate") != null){
             ciRisk.setStartDate(quoteRequest.getPrpCmainCI().get("startDate")+"");
+            if(ciRisk.getStartDate().length()<11){
+                ciRisk.setStartDate(quoteRequest.getPrpCmainCI().get("startDate")+" 00:00:00");
+            }
             ciRisk.setEndDate(quoteRequest.getPrpCmainCI().get("endDate")+"");
+            if(ciRisk.getEndDate().length()<11){
+                ciRisk.setEndDate(quoteRequest.getPrpCmainCI().get("endDate")+" 00:00:00");
+            }
         }
         RiskInfoVo biRisk = quoteVo.getBiRiskInfoVo() != null ?quoteVo.getBiRiskInfoVo() : new RiskInfoVo();
         if(quoteRequest.getPrpCmain().get("startDate") != null && quoteRequest.getPrpCmainCI().get("endDate") != null){
             biRisk.setStartDate(quoteRequest.getPrpCmainCI().get("startDate")+"");
+            if(biRisk.getStartDate().length()<11){
+                biRisk.setStartDate(quoteRequest.getPrpCmainCI().get("startDate")+" 00:00:00");
+            }
             biRisk.setEndDate(quoteRequest.getPrpCmainCI().get("endDate")+"");
+            if(biRisk.getEndDate().length()<11){
+                biRisk.setEndDate(quoteRequest.getPrpCmainCI().get("endDate")+" 00:00:00");
+            }
         }
         resultsVo.setCiRiskInfoVo(ciRisk);
         resultsVo.setBiRiskInfoVo(biRisk);
 
+        String proposalNoDAA = "";
+        String proposalNoDZA = "";
+
         if (saveResponse != null && saveResponse.getData() != null &&
                 saveResponse.getData().getCarQuoteTransProposalRspList() != null) {
 
@@ -496,8 +515,10 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
                 if (proposalNo != null) {
                     if (proposalNo.contains("DAA")) {
                         resultsVo.setBiPolicyNumber(proposalNo);
+                        proposalNoDAA = proposalNo;
                     } else if (proposalNo.contains("DZA")) {
                         resultsVo.setCiPolicyNumber(proposalNo);
+                        proposalNoDZA = proposalNo;
                     }
                 }
 
@@ -549,6 +570,37 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
             costs.setVvTax(vvTax.toString());
             resultsVo.setCosts(costs);
         }
+
+        // 获取评分
+        if (!proposalNoDAA.isEmpty() || !proposalNoDZA.isEmpty()) {
+            try {
+                Map<String, Object> proposalInfo = requestComponent.queryProposalInfo(
+                        proposalNoDAA, proposalNoDZA, headers, username);
+                if (proposalInfo != null && proposalInfo.containsKey("data")) {
+                    Map<String, Object> data = (Map<String, Object>) proposalInfo.get("data");
+                    if (data != null) {
+                        QuoteResultsVo.ScoreVo scoreVo = resultsVo.getScoreVo();
+                        if (scoreVo == null) {
+                            scoreVo = new QuoteResultsVo.ScoreVo();
+                            resultsVo.setScoreVo(scoreVo);
+                        }
+                        // 获取商业险评分
+                        Map<String, Object> prpCmain = (Map<String, Object>) data.get("PrpCmain");
+                        if (prpCmain != null && prpCmain.get("piccscore") != null) {
+                            scoreVo.setSyLossRation(prpCmain.get("piccscore").toString());
+                        }
+                        // 获取交强险评分
+                        Map<String, Object> prpCmainCI = (Map<String, Object>) data.get("prpCmainCI");
+                        if (prpCmainCI != null && prpCmainCI.get("piccscore") != null) {
+                            scoreVo.setJqLossRation(prpCmainCI.get("piccscore").toString());
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                log.warn("获取人保评分失败: {}", e.getMessage());
+            }
+        }
+
         resultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         return resultsVo;
     }

文件差異過大導致無法顯示
+ 3808 - 0
tenant/insurance/quotation-renbaonew/src/main/renbao.py


+ 33 - 0
tenant/insurance/quotation-renbaonew/src/main/req2.json

@@ -0,0 +1,33 @@
+"newPhone": [
+{
+"mobilephoneNumber": "15934102105",
+"phoneNumber": "",
+"phoneExtensionIntl": "",
+"phoneExtension": "",
+"extensionNumber": "",
+"phoneType": "1",
+"versionNo": "",
+"phoneProperties": "01",
+"isDefault": true,
+"indexNum": 0,
+"phoneSeqNo": 1,
+"delFlag": false,
+"addFlag": false
+}
+],"newPhone": [
+{
+"mobilephoneNumber": "15934102105",
+"phoneNumber": "",
+"phoneExtensionIntl": "",
+"phoneExtension": "",
+"extensionNumber": "",
+"phoneType": "1",
+"versionNo": null,
+"phoneProperties": "01",
+"isDefault": true,
+"indexNum": 0,
+"phoneSeqNo": 1,
+"delFlag": false,
+"addFlag": false
+}
+],

部分文件因文件數量過多而無法顯示