Răsfoiți Sursa

紫金重复投保延保

wangrq 3 luni în urmă
părinte
comite
0d92cc92dc

+ 34 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerCacheComponent.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.zijin.crawler.component;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.jzg.quotation.zijin.crawler.entity.po.ZiJinCrawlerOrder;
 import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerSaveQuoteInfoRequest;
 import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerUploadImageInfoListRequest;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerSaveResponse;
@@ -12,6 +13,7 @@ import org.redisson.api.RBucket;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
 
 import java.time.Duration;
 import java.util.HashMap;
@@ -51,6 +53,10 @@ public class ZiJinCrawlerCacheComponent {
 
     public static final long IMAGES_INFO_TIME = 1L;
 
+    public static String ZIJIN_ORDER_RESPONSE = "zijin:order:response:";
+
+    public static final long ZIJIN_ORDER_RESPONSE_TIME = 1L;
+
     /**
      * 缓存认证信息
      * @param token
@@ -131,4 +137,32 @@ public class ZiJinCrawlerCacheComponent {
         String imagesInfo = (String) redissonClient.getBucket(IMAGES_INFO + orderNo).get();
         return JSONArray.parseArray(imagesInfo, ZiJinCrawlerSaveQuoteInfoRequest.ItemFileData.FileInfo.class);
     }
+
+
+    /**
+     * 缓存订单信息
+     *
+     * @param orderNo   订单号
+     * @param order 报价请求信息
+     */
+    public void cacheOrderRequest(String orderNo, ZiJinCrawlerOrder order) {
+        String responseStr = JSONObject.toJSONString(order);
+        redissonClient.getBucket(ZIJIN_ORDER_RESPONSE + orderNo).set(responseStr, Duration.ofDays(ZIJIN_ORDER_RESPONSE_TIME));
+    }
+
+    /**
+     * 获取订单报价信息
+     *
+     * @param orderNo 订单号
+     * @return 报价订单返回
+     */
+    public ZiJinCrawlerOrder getOrderResponse(String orderNo) {
+        String o = (String) redissonClient.getBucket(ZIJIN_ORDER_RESPONSE + orderNo).get();
+        ZiJinCrawlerOrder ziJinCrawlerOrder = JSON.parseObject(o, ZiJinCrawlerOrder.class);
+        if (ObjectUtils.isEmpty(ziJinCrawlerOrder)) {
+            throw new RuntimeException("订单信息不存在");
+        }
+        return ziJinCrawlerOrder;
+    }
+
 }

+ 1 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/enums/ResponseCode.java

@@ -14,6 +14,7 @@ public enum ResponseCode {
 
     R_0000("0000", "成功"),
     R_0001("9980", "转保标志!"),
+    R_0002("4001", "重复投保"),
     R_Z00002("Z00002", "再次调用此接口确认");
 
     private final String code;

+ 7 - 1
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerOrderServiceImpl.java

@@ -1,6 +1,8 @@
 package com.jzg.quotation.zijin.crawler.service.impl;
 
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.util.ObjectUtil;
+import com.jzg.quotation.zijin.crawler.component.ZiJinCrawlerCacheComponent;
 import com.jzg.quotation.zijin.crawler.entity.po.ZiJinCrawlerOrder;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerQuotationResponse;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerSaveProposalResponse;
@@ -8,6 +10,7 @@ import com.jzg.quotation.zijin.crawler.repository.ZiJinCrawlerOrderRepository;
 import com.jzg.quotation.zijin.crawler.service.ZiJinCrawlerOrderService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 import java.time.LocalDateTime;
 
@@ -21,6 +24,7 @@ import java.time.LocalDateTime;
 public class ZiJinCrawlerOrderServiceImpl implements ZiJinCrawlerOrderService {
 
     private final ZiJinCrawlerOrderRepository ziJinCrawlerOrderRepository;
+    private final ZiJinCrawlerCacheComponent ziJinCrawlerCacheComponent;
 
     /**
      * 保存紫金财险爬虫订单
@@ -33,7 +37,7 @@ public class ZiJinCrawlerOrderServiceImpl implements ZiJinCrawlerOrderService {
     public void save(QuoteVo quoteVo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse, String orderId, boolean success) {
         ZiJinCrawlerOrder order = new ZiJinCrawlerOrder();
         order.setOrdersNo(quoteVo.getOrder().getOrdersNo());
-        order.setOrderNo(ziJinCrawlerQuotationResponse.getOrderNo());
+        order.setOrderNo(ObjectUtils.isEmpty(ziJinCrawlerQuotationResponse.getOrderNo()) ? ziJinCrawlerSaveProposalResponse.getData().getOrderNo() : ziJinCrawlerQuotationResponse.getOrderNo());
         order.setBusUniqueId(orderId);
         order.setQuoteSuccess(success);
         if (success && ziJinCrawlerSaveProposalResponse != null) {
@@ -53,6 +57,8 @@ public class ZiJinCrawlerOrderServiceImpl implements ZiJinCrawlerOrderService {
             order.setErrorMsg(ziJinCrawlerQuotationResponse.getRtnMsg());
         }
         ziJinCrawlerOrderRepository.save(order);
+        // 缓存数据
+        ziJinCrawlerCacheComponent.cacheOrderRequest(quoteVo.getOrder().getOrdersNo(), order);
     }
 
     @Override

+ 56 - 6
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java

@@ -19,6 +19,7 @@ import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
+import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.zijin.api.constant.enums.MotorVehicleInsuranceEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.api.entity.request.UploadImageInfoListRequest;
@@ -47,6 +48,8 @@ import org.springframework.util.StringUtils;
 
 import java.io.IOException;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -196,6 +199,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             ziJinCrawlerQuotationRequest.setVehicleInfo(buildVehicleInfo(quoteVo, actualValue, modelCode, iacVehicleCode, ziJinCrawlerCarResponse));
 
             // 设置盈利数据列表
+            // todo: 完了看是否要调整
             ziJinCrawlerQuotationRequest.setProfitDataList(buildProfitDataList(quoteVo));
 
             // 设置税务字段
@@ -211,6 +215,24 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             // 设置紫金财险爬虫订单号,后面保存到数据库中
             ziJinCrawlerQuotationResponse.setOrderNo(ziJinCrawlerGetOrderNoResponse.getOrderNo());
 
+            // 重复投保,延保
+            if (ResponseCode.R_0002.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode()) && ziJinCrawlerQuotationResponse.getRtnMsg() != null && ziJinCrawlerQuotationResponse.getRtnMsg().contains("重复投保")) {
+                String endTime = extractDuplicateEndTime(ziJinCrawlerQuotationResponse.getRtnMsg());
+                if (StringUtils.hasLength(endTime)) {
+                    String startTime = endTime;
+                    String newEndTime = TimeProcessing.minusOneSecondAfterYear(startTime);
+                    // 修改商业险起保时间(后端接口期望日期格式为 yyyy-MM-dd)
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDate(TimeProcessing.dateTimeToDate(startTime));
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDate(TimeProcessing.minusDays(TimeProcessing.dateTimeToDate(newEndTime), 1));
+                    // 修改交强险起保时间
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDateCI(TimeProcessing.dateTimeToDate(startTime));
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDateCI(TimeProcessing.minusDays(TimeProcessing.dateTimeToDate(newEndTime), 1));
+                    log.info("紫金报价重复投保参数: startTime={}, endTime={}", startTime, newEndTime);
+                    ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
+                    log.info("紫金报价重复投保后响应: {}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
+                }
+            }
+
             // 转保标志
             if (ResponseCode.R_0001.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode())) {
                 if (ziJinCrawlerQuotationResponse.getBasePart() != null) {
@@ -223,6 +245,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                     }
                 }
             }
+
             // 4.0 处理报价失败
             if (!ResponseCode.R_0000.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode())) {
                 ziJinCrawlerOrderService.save(quoteVo, ziJinCrawlerQuotationResponse, null, ziJinCrawlerQuotationRequest.getOrderId(), false);
@@ -353,7 +376,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      */
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-        log.info("uploadImage入参的值:{}", JSONObject.toJSONString(insuranceUploadImageVo));
+        // log.info("uploadImage入参的值:{}", JSONObject.toJSONString(insuranceUploadImageVo));
         try {
 
             // 获取归属信息
@@ -373,6 +396,14 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 throw new SystemException("未找到订单信息,订单号:" + order.getOrdersNo());
             }
 
+            String orderNo = null;
+            if (ObjectUtils.isEmpty(ziJinCrawlerOrder.getOrderNo())) {
+                // 获取订单信息
+                ZiJinCrawlerOrder ziJinCrawlerOrder1 = ziJinCrawlerCacheComponent.getOrderResponse(order.getOrdersNo());
+                log.info("缓存中获取订单信息,订单号:{}, 订单信息:{}", order.getOrdersNo(), JSONObject.toJSONString(ziJinCrawlerOrder1));
+                orderNo = ziJinCrawlerOrder1.getOrderNo();
+            }
+
             // 检查影像列表是否为空
             if (CollectionUtils.isEmpty(insuranceUploadImageVo.getImageVoList())) {
                 log.warn("影像列表为空,订单号:{}", order.getOrdersNo());
@@ -410,7 +441,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 // 设置文件类型,转换为紫金对应的文件类型
                 String fileType = getFileTypeByImageCode(insuranceImageVo.getImageCode());
                 ziJinCrawlerImageUploadRequest.setFileType(fileType);
-                ziJinCrawlerImageUploadRequest.setOrderNo(ziJinCrawlerOrder.getOrderNo());
+                ziJinCrawlerImageUploadRequest.setOrderNo(ziJinCrawlerOrder.getOrderNo() == null ? orderNo : ziJinCrawlerOrder.getOrderNo());
                 ZiJinCrawlerImageUploadResponse ziJinCrawlerImageUploadResponse = ziJinCrawlerRequestComponent.uploadImage(ziJinCrawlerImageUploadRequest, headers);
                 log.info("影像上传响应,订单号:{},响应:{}", ziJinCrawlerOrder.getOrderNo(), JSON.toJSONString(ziJinCrawlerImageUploadResponse));
 
@@ -1388,8 +1419,8 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             carPolicySubInfo.setPlanName(accidentalDriving.getProductName());
             carPolicySubInfo.setInsureGradeNo("");
             carPolicySubInfo.setProductCode(accidentalDriving.getProductCode());
-            carPolicySubInfo.setRiskCode("0736");
-            carPolicySubInfo.setRiskName("全家安行保");
+            carPolicySubInfo.setRiskCode("0736"); // 完了要调整编码,是否要转换
+            carPolicySubInfo.setRiskName("全家安行保"); // 完了要调整成accidentalDriving.getRiskName(),看名称是否传了
             carPolicySubInfo.setSumAmount(ObjectUtils.isEmpty(accidentalDriving.getSumAmount()) ? null : (int) Double.parseDouble(accidentalDriving.getSumAmount()));
             carPolicySubInfo.setQuantity(accidentalDriving.getQuantity() == 0 ? "0" : String.valueOf(accidentalDriving.getQuantity()));
             carPolicySubInfo.setIsUseInsured("1");
@@ -1738,7 +1769,26 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         return profitDataList;
     }
 
+    /**
+     * 截取重复投保终保日期的正则表达式
+     */
+    private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
 
-
-
+    /**
+     * 提取重复投保消息中的终保日期
+     *
+     * @param returnMessage 返回消息
+     * @return 提取到的时间字符串,格式为 yyyy-MM-dd HH:mm:ss,未提取到返回 null
+     */
+    private String extractDuplicateEndTime(String returnMessage) {
+        if (returnMessage == null) {
+            return null;
+        }
+        Matcher matcher = DUPLICATE_END_TIME_PATTERN.matcher(returnMessage);
+        if (matcher.find()) {
+            String shortEndTime = matcher.group(1);
+            return shortEndTime + ":00";
+        }
+        return null;
+    }
 }