Răsfoiți Sursa

泰康:解决核保人工审核缺少影像资料问题

wangrq 3 luni în urmă
părinte
comite
895d3477e4

+ 45 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/cache/RedisCacheUtil.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.taikang.crawler.cache;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.jzg.commons.entity.quote.vo.aggregated.InsuranceUploadImageVo;
 import com.jzg.quotation.taikang.crawler.model.TKLoginSession;
 import com.jzg.quotation.taikang.crawler.model.api.PreciseInitResult;
 import com.jzg.quotation.taikang.crawler.model.entity.po.TKCrawlerOrder;
@@ -22,6 +23,11 @@ public class RedisCacheUtil {
     private static final String SESSION = "SESSION";
     public static String TAIKANG_ORDER_RESPONSE = "taikang:order:response:";
     public static final long TAIKANG_ORDER_RESPONSE_TIME = 1L;
+    
+    /**
+     * 影像上传参数缓存前缀
+     */
+    public static final String TAIKANG_IMAGE_UPLOAD_PARAM = "taikang:image:upload:param:";
 
     public RedisCacheUtil(RedissonClient redissonClient) {
         this.redissonClient = redissonClient;
@@ -122,4 +128,43 @@ public class RedisCacheUtil {
         return tiJinCrawlerOrder;
     }
 
+    /**
+     * 缓存影像上传参数
+     *
+     * @param ordersNo               订单号
+     * @param insuranceUploadImageVo 影像上传参数
+     */
+    public void setImageUploadParam(String ordersNo, InsuranceUploadImageVo insuranceUploadImageVo) {
+        String response = JSONObject.toJSONString(insuranceUploadImageVo);
+        RBucket<String> bucket = redissonClient.getBucket(TAIKANG_IMAGE_UPLOAD_PARAM + ordersNo);
+        bucket.set(response, Duration.ofHours(2L));
+        log.info("影像上传参数已缓存: ordersNo={}", ordersNo);
+    }
+
+    /**
+     * 获取影像上传参数
+     *
+     * @param ordersNo 订单号
+     * @return 影像上传参数
+     */
+    public InsuranceUploadImageVo getImageUploadParam(String ordersNo) {
+        RBucket<String> bucket = redissonClient.getBucket(TAIKANG_IMAGE_UPLOAD_PARAM + ordersNo);
+        String json = bucket.get();
+        if (json == null) {
+            log.warn("未查询到影像上传参数: ordersNo={}", ordersNo);
+            return null;
+        }
+        return JSON.parseObject(json, InsuranceUploadImageVo.class);
+    }
+
+    /**
+     * 删除影像上传参数缓存
+     *
+     * @param ordersNo 订单号
+     */
+    public void deleteImageUploadParam(String ordersNo) {
+        redissonClient.getBucket(TAIKANG_IMAGE_UPLOAD_PARAM + ordersNo).delete();
+        log.info("影像上传参数缓存已删除: ordersNo={}", ordersNo);
+    }
+
 }

+ 159 - 32
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/impl/TKQuotationBaseServiceImpl.java

@@ -217,29 +217,137 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
     }
 
     private void buildCheckCar(TKEntranceFor000038Result tkEntranceFor000038Result, UnderwritingVo underwritingVo, PreciseInitResult preciseInitResult, UnderwritingResultsVo underwritingResultsVo) {
-        // 需要验车,需要上传影像
-
-        // 验车照片详情列表
-        // List<TKOrderCheckCarSpecification> checkCarSpecification = tkEntranceFor000038Result.getCheckCarSpecification();
-        // // 验车原因
-        // Object checkReason = tkEntranceFor000038Result.getCheckReason();
-        // // 人工审核
-        // List<String> underwriteReason = tkEntranceFor000038Result.getUnderwriteReason();
-        // 验车码
-        // String checkCarCode = httpService.entranceFor000133(session.getToken(), preciseInitResult.getMainOrderId());
-        // 上传视频图像的二维码数据示例:https://car.tk.cn/carTKInsure/#/schema?type=checkcar&fullProposalNo=00671070808142500000004429&orderType=1
-        // 其中 00671070808142500000004429 的商业保险单号
-
-        // todo: 需要找个有验车码的车辆进行测试
-        // InsuranceUploadImageVo insuranceUploadImageVo = new InsuranceUploadImageVo();
-        // insuranceUploadImageVo.setOrder(underwritingVo.getOrder());
-        // insuranceUploadImageVo.setImageVoList();
-        // uploadImage(insuranceUploadImageVo);
-
-        // 核保结果
-        underwritingResultsVo.setUnderwritingResult(tkEntranceFor000038Result.getData().getSpResMsg() + ",原因:" + tkEntranceFor000038Result.getCheckReason());
-        // 核保状态
-        underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+        log.info("========== 开始处理验车上传影像流程 ==========");
+        
+        try {
+            // 获取登录会话信息
+            AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
+            TKLoginSession session = loginSession(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+            
+            // 获取核保返回的保司订单号
+            TKOrderData tkOrderData = tkEntranceFor000038Result.getData();
+            String proposalNo = null;
+            if (tkOrderData != null && tkOrderData.getProposalNo() != null) {
+                proposalNo = tkOrderData.getProposalNo();
+                underwritingVo.getOrder().setCompanyOrderNo(proposalNo);
+                log.info("核保返回保司订单号: {}", proposalNo);
+            }
+            
+            // 1. 查询验车照片详情列表(保司要求上传的影像类型)
+            // List<TKOrderCheckCarSpecification> checkCarSpecification = tkEntranceFor000038Result.getCheckCarSpecification();
+            // if (checkCarSpecification != null && !checkCarSpecification.isEmpty()) {
+            //     log.info("验车照片详情列表: {}", new Gson().toJson(checkCarSpecification));
+            // }
+            
+            // 2. 从 Redis 获取缓存的影像上传参数(前端提前上传的)
+            InsuranceUploadImageVo insuranceUploadImageVo = redisCacheUtil.getImageUploadParam(underwritingVo.getOrder().getOrdersNo());
+            
+            // 3. 如果 Redis 中有缓存的影像上传参数,设置保司订单号
+            if (insuranceUploadImageVo != null) {
+                log.info("从 Redis 获取到缓存的影像上传参数,影像数量: {}", 
+                        insuranceUploadImageVo.getImageVoList() != null ? insuranceUploadImageVo.getImageVoList().size() : 0);
+                
+                // 设置保司订单号(核保成功后已返回)
+                if (proposalNo != null) {
+                    insuranceUploadImageVo.getOrder().setCompanyOrderNo(proposalNo);
+                    log.info("已为缓存的影像上传参数设置保司订单号: {}", proposalNo);
+                }
+                
+                // 删除 Redis 中的缓存(已使用,不再需要)
+                redisCacheUtil.deleteImageUploadParam(underwritingVo.getOrder().getOrdersNo());
+            }
+            
+            // 5. 如果有影像资料,上传到保司
+            if (insuranceUploadImageVo != null && insuranceUploadImageVo.getImageVoList() != null && !insuranceUploadImageVo.getImageVoList().isEmpty()) {
+                // 上传影像
+                log.info("开始上传影像资料...");
+                doUploadImage(insuranceUploadImageVo);
+                log.info("影像资料上传成功");
+                
+                // 6. 上传成功后重新进行核保
+                log.info("开始重新核保...");
+                reUnderwriting(session, underwritingVo, preciseInitResult, underwritingResultsVo);
+                log.info("重新核保完成");
+            } else {
+                // 没有影像资料,保持人工处理状态
+                log.warn("未查询到影像资料,保持人工处理状态");
+                underwritingResultsVo.setUnderwritingResult(tkEntranceFor000038Result.getData().getSpResMsg() + ",原因:" + tkEntranceFor000038Result.getCheckCarData());
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            }
+            
+        } catch (Exception e) {
+            log.error("处理验车上传影像失败", e);
+            // 处理失败时保持人工处理状态
+            underwritingResultsVo.setUnderwritingResult("验车影像上传处理异常:" + e.getMessage());
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+        }
+        
+        log.info("========== 验车上传影像流程处理结束 ==========");
+    }
+
+    /**
+     * 重新核保
+     * 
+     * @param session               登录会话
+     * @param underwritingVo       核保参数
+     * @param preciseInitResult     初始化结果
+     * @param underwritingResultsVo 核保结果
+     */
+    private void reUnderwriting(TKLoginSession session, UnderwritingVo underwritingVo, 
+                                  PreciseInitResult preciseInitResult, UnderwritingResultsVo underwritingResultsVo) {
+        try {
+            // 获取车主信息(与第一次核保相同)
+            List<InsOrdersCarUserInfo> insOrdersCarUserInfoList = underwritingVo.getInsOrdersCarUserInfoList();
+            if (insOrdersCarUserInfoList == null || insOrdersCarUserInfoList.isEmpty()) {
+                log.warn("车主信息为空,无法重新核保");
+                return;
+            }
+            
+            InsOrdersCarUserInfo insOrdersCarUserInfo = insOrdersCarUserInfoList.get(0);
+            InitProposalResult initProposalResult = tkSimpleService.queryCarOwner(session, preciseInitResult.getMainOrderId());
+            TKInsureInfo insureInfo = tkSimpleService.dataCreateInsureInfo(initProposalResult, insOrdersCarUserInfo);
+            
+            log.info("重新核保 - 车主信息: {}", new Gson().toJson(insureInfo));
+            
+            // 调用核保接口
+            TKEntranceFor000038Result reUnderwritingResult = tkSimpleService.orderSubmit(session, preciseInitResult.getMainOrderId(), insureInfo);
+            
+            if (reUnderwritingResult != null) {
+                TKOrderData tkOrderData = reUnderwritingResult.getData();
+                
+                // 更新保单编号缓存
+                if (tkOrderData != null && tkOrderData.getProposalNo() != null) {
+                    redisCacheUtil.setCache(tkOrderData.getProposalNo(), underwritingVo.getOrder().getOrdersNo(), "HB");
+                    underwritingResultsVo.setCompanyOrderNo(tkOrderData.getProposalNo());
+                    underwritingResultsVo.setJqApplyNo(tkOrderData.getProposalNoCI());
+                    underwritingResultsVo.setSyApplyNo(tkOrderData.getProposalNoBI());
+                    underwritingResultsVo.setJyApplyNo(tkOrderData.getCarAccident() != null ? tkOrderData.getCarAccident().getProposalNo() : null);
+                }
+                
+                // 检查是否还需要验车
+                if ("1".equals(reUnderwritingResult.getCheckCarFlag()) && "9".equals(reUnderwritingResult.getData().getUnderWriteFlag())) {
+                    // 仍然需要验车,保持人工处理状态
+                    underwritingResultsVo.setUnderwritingResult(reUnderwritingResult.getData().getSpResMsg() + ",原因:" + reUnderwritingResult.getCheckCarData());
+                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+                    log.info("重新核保后仍需要验车: {}", underwritingResultsVo.getUnderwritingResult());
+                } else {
+                    // 核保通过
+                    underwritingResultsVo.setUnderwritingResult("核保成功");
+                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+                    log.info("重新核保通过");
+                }
+            } else {
+                // 重新核保失败
+                underwritingResultsVo.setUnderwritingResult("重新核保失败");
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                log.warn("重新核保返回null,核保失败");
+            }
+            
+        } catch (Exception e) {
+            log.error("重新核保失败", e);
+            underwritingResultsVo.setUnderwritingResult("重新核保异常:" + e.getMessage());
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+        }
     }
 
     @Override
@@ -255,19 +363,41 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+        // 获取保司订单号(fullProposalNo),核保成功后才会有值
+        String companyOrderNo = insuranceUploadImageVo.getOrder().getCompanyOrderNo();
+        
+        // 如果保司订单号为空,说明第一次进行核保,将影像上传参数缓存到 Redis
+        // 泰康只有进行验车时必须要进行影像资料上传,其他情况没有验车资料也可以进行核保
+        if (companyOrderNo == null || companyOrderNo.isEmpty()) {
+            log.info("保司订单号为空,影像上传参数将缓存到 Redis,等待核保完成后再上传: ordersNo={}", 
+                    insuranceUploadImageVo.getOrder().getOrdersNo());
+            redisCacheUtil.setImageUploadParam(insuranceUploadImageVo.getOrder().getOrdersNo(), insuranceUploadImageVo);
+            return;
+        }
+        
+        // 保司订单号已存在,直接进行影像上传
+        doUploadImage(insuranceUploadImageVo);
+    }
+
+    /**
+     * 执行影像上传操作
+     * 
+     * @param insuranceUploadImageVo 影像上传参数
+     */
+    private void doUploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder().getAttributionInformationVo();
         TKLoginSession session = loginSession(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         CarCheckUploadFileParam param = new CarCheckUploadFileParam();
-        // 泰康订单
+        
+        // 获取泰康订单号
         String orderID = redisCacheUtil.getCache(insuranceUploadImageVo.getOrder().getOrdersNo(), "DD");
-        // 泰康保单号, 现在获取不到,核保成功之后才会返回
-        // String proposalNo = redisCacheUtil.getCache(insuranceUploadImageVo.getOrder().getOrdersNo(), "HB");
-
+        
+        // 设置上传参数
         param.setChannelCode("OffWeb");
         param.setTplatformId(session.getTplatformId());
         param.setOnlyId(orderID);
         param.setOrderID(orderID);
-        param.setFullProposalNo(insuranceUploadImageVo.getOrder().getCompanyOrderNo() == null ? insuranceUploadImageVo.getOrder().getQuoteNo() : insuranceUploadImageVo.getOrder().getCompanyOrderNo());
+        param.setFullProposalNo(insuranceUploadImageVo.getOrder().getCompanyOrderNo());
         param.setLastFullProposalNo(insuranceUploadImageVo.getOrder().getCompanyOrderNo());
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Date date = new Date();
@@ -329,8 +459,8 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
                     }
                 });
             }
-
         });
+    }
 
 
 //        {
@@ -454,9 +584,6 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
 //            param.setFileType("1fileOrgName01-12-0117429775996580");
 //        }
 
-
-    }
-
     @Override
     public void queryClauseData(ClauseDataVo clauseDataVo) {