Răsfoiți Sursa

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

wangrq 2 luni în urmă
părinte
comite
87a3fa1dea

+ 5 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/client/HttpURL.java

@@ -127,4 +127,9 @@ public interface HttpURL {
      * 上传影像
      */
     String carCheckUploadFile = host + "/carSelfService/carCheck/upload/file";
+    String carCheckUploadFile2 = host + "/carSelfService/carCheck/qualityVerifyImg";
+    /**
+     * 上传影像提交
+     */
+    String carCheckUploadFileSubmit = host + "/carSelfService/carCheck/submit";
 }

+ 35 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/CarCheckUploadFileSubmitParam.java

@@ -0,0 +1,35 @@
+package com.jzg.quotation.taikang.crawler.model.api;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+@Data
+public class CarCheckUploadFileSubmitParam {
+
+    /**
+     * 上传类型
+     */
+    private String orderType;
+    /**
+     * 表单ID
+     */
+    private String formId;
+    /**
+     * 投保单号
+     */
+    private String fullProposalNo;
+    /**
+     * 渠道编码
+     */
+    private String channelCode;
+    /**
+     * 字段ID列表
+     */
+    private List<String> fieldIds;
+
+}

+ 53 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/CarCheckUploadFileVerifyImgParam.java

@@ -0,0 +1,53 @@
+package com.jzg.quotation.taikang.crawler.model.api;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class CarCheckUploadFileVerifyImgParam {
+
+    /**
+     * 拍摄省份
+     */
+    private String shootProvince;
+
+    /**
+     * 拍摄城市
+     */
+    private String shootCity;
+
+    /**
+     * 类型路径
+     */
+    private String typePath;
+
+    /**
+     * 图片base64编码文件名
+     */
+    private String base64FileName;
+
+    /**
+     * 图片base64编码字符串
+     */
+    private String base64File;
+
+    /**
+     * 上传类型
+     */
+    private Integer uploadType;
+
+    /**
+     * 文件类型(与文件原始名称可能重复,根据业务逻辑确认是否区分)
+     */
+    private String fileType;
+    /**
+     * 投保单号
+     */
+    private String fullProposalNo;
+    /**
+     * 渠道编码
+     */
+    private String channelCode;
+
+}

+ 5 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/TKEntranceFor000086Result.java

@@ -65,6 +65,11 @@ public class TKEntranceFor000086Result extends UnknownFieldEntity {
      */
     private String areaCname;
 
+    /**
+     * 意见信息
+     */
+    private String dealOpinion;
+
     /**
      * 内部分发ID
      */

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

@@ -1,12 +1,9 @@
 package com.jzg.quotation.taikang.crawler.service;
 
 import cn.hutool.core.bean.BeanUtil;
-
-import com.jzg.commons.entity.quote.vo.CarInfoVo;
-import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.exception.SystemException;
-
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.taikang.crawler.CodeUtil;
 import com.jzg.quotation.taikang.crawler.JsonUtil;
@@ -16,6 +13,7 @@ import com.jzg.quotation.taikang.crawler.model.api.*;
 import com.jzg.quotation.taikang.crawler.model.entity.*;
 import jakarta.annotation.Resource;
 import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
@@ -24,11 +22,11 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 
 import java.io.File;
-import java.math.BigDecimal;
 import java.util.*;
 
 @Setter
 @Service
+@Slf4j
 public class TKHttpAPIService {
     private static final Logger logger = LoggerFactory.getLogger(TKHttpAPIService.class);
 
@@ -1169,6 +1167,38 @@ public class TKHttpAPIService {
         client.uploadFileWithParams(HttpURL.carCheckUploadFile, formData, file);
     }
 
+    /**
+     * 上传影像(批量上传,直接发送对象集合)
+     *
+     * @param params 影像上传参数集合
+     */
+    public void qualityVerifyImgBatch(List<CarCheckUploadFileVerifyImgParam> params) {
+        logger.info("批量上传影像,参数数量: {}", params != null ? params.size() : 0);
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("Content-Type", "application/json");
+        
+        client.request(HttpURL.carCheckUploadFile2, params, httpHeaders, String.class);
+        log.info("批量上传影像完成");
+    }
+
+    public void carCheckUploadFileSubmit(String token, String fromId, String fullProposalNo, String orderId) {
+        CarCheckUploadFileSubmitParam param = new CarCheckUploadFileSubmitParam();
+        param.setChannelCode("OffWeb");
+        param.setFormId(fromId);
+        ArrayList<String> strings = new ArrayList<>();
+        strings.add("1");
+        param.setFieldIds(strings);
+        param.setFullProposalNo(fullProposalNo);
+        param.setOrderType("1");
+
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("tkCarRequestToken", token);
+        httpHeaders.add("carInsurFlowId", "carInsur1778568776607661015");
+        httpHeaders.add("carInsurOrderId", orderId);
+        Object response = client.request(HttpURL.carCheckUploadFileSubmit, param, httpHeaders, Object.class);
+        log.info("上传影像提交完成,响应: {}", JSONObject.toJSONString(response));
+    }
+
     public TKEntranceFor000021Result entranceFor000021(String token, String fromId, String mainOrderId) {
         TKEntranceFor000021Param param = new TKEntranceFor000021Param();
         param.setChannelCode("OffWeb");

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

@@ -1,5 +1,7 @@
 package com.jzg.quotation.taikang.crawler.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.google.gson.Gson;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
@@ -9,6 +11,7 @@ import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.util.ImageUtil;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
@@ -21,7 +24,6 @@ import com.jzg.quotation.taikang.crawler.model.TKLoginSession;
 import com.jzg.quotation.taikang.crawler.model.api.*;
 import com.jzg.quotation.taikang.crawler.model.entity.TKAreaInfoVo;
 import com.jzg.quotation.taikang.crawler.model.entity.TKInsureInfo;
-import com.jzg.quotation.taikang.crawler.model.entity.TKOrderCheckCarSpecification;
 import com.jzg.quotation.taikang.crawler.model.entity.TKOrderData;
 import com.jzg.quotation.taikang.crawler.model.entity.po.TKCrawlerOrder;
 import com.jzg.quotation.taikang.crawler.repository.TKLoginSessionRepository;
@@ -38,6 +40,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -218,12 +221,12 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
 
     private void buildCheckCar(TKEntranceFor000038Result tkEntranceFor000038Result, UnderwritingVo underwritingVo, PreciseInitResult preciseInitResult, UnderwritingResultsVo underwritingResultsVo) {
         log.info("========== 开始处理验车上传影像流程 ==========");
-        
+
         try {
             // 获取登录会话信息
             AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
             TKLoginSession session = loginSession(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
-            
+
             // 获取核保返回的保司订单号
             TKOrderData tkOrderData = tkEntranceFor000038Result.getData();
             String proposalNo = null;
@@ -232,69 +235,102 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
                 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 获取到缓存的影像上传参数,影像数量: {}", 
+                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);
+                qualityVerifyImg(insuranceUploadImageVo);
                 log.info("影像资料上传成功");
-                
-                // 6. 上传成功后重新进行核保
-                log.info("开始重新核保...");
-                reUnderwriting(session, underwritingVo, preciseInitResult, underwritingResultsVo);
-                log.info("重新核保完成");
+
+                // 6. 上传成功后查询订单状态
+                log.info("开始查询订单状态...");
+                OrderStatusVo orderStatusVo = new OrderStatusVo();
+                orderStatusVo.setOrder(underwritingVo.getOrder());
+                OrderStatusResultVo orderStatusResultVo = queryOrderState(orderStatusVo);
+                log.info("订单状态查询完成,响应: {}", JSONObject.toJSONString(orderStatusResultVo));
+
+                // 根据状态查询结果更新核保结果
+                if (orderStatusResultVo != null && orderStatusResultVo.getOrderStatus() != null) {
+                    underwritingResultsVo.setUnderwritingStatus(orderStatusResultVo.getOrderStatus());
+                    if (InsOrderStatusEnum.PAY_PENDING.equals(orderStatusResultVo.getOrderStatus())) {
+                        underwritingResultsVo.setUnderwritingResult("核保成功");
+                        underwritingResultsVo.setPaymentLink(orderStatusResultVo.getPaymentLink());
+                    } else if (InsOrderStatusEnum.UNDERWRITED.equals(orderStatusResultVo.getOrderStatus())) {
+                        underwritingResultsVo.setUnderwritingResult("已承保");
+                    } else if (InsOrderStatusEnum.WAIT_AUDIT.equals(orderStatusResultVo.getOrderStatus())) {
+                        underwritingResultsVo.setUnderwritingResult("待核保");
+                    } else if (InsOrderStatusEnum.AUDIT_FAIL.equals(orderStatusResultVo.getOrderStatus())) {
+                        underwritingResultsVo.setUnderwritingResult("核保失败");
+                    } else if (InsOrderStatusEnum.STAFF_PROCESS.equals(orderStatusResultVo.getOrderStatus())) {
+                        underwritingResultsVo.setUnderwritingResult("人工审核,原因:" + orderStatusResultVo.getErrorMsg());
+                    } else {
+                        underwritingResultsVo.setUnderwritingResult(tkEntranceFor000038Result.getData().getSpResMsg() + ",原因:" + tkEntranceFor000038Result.getCheckCarData());
+                    }
+
+                    // 更新投保单号
+                    if (orderStatusResultVo.getJqApplyNo() != null) {
+                        underwritingResultsVo.setJqApplyNo(orderStatusResultVo.getJqApplyNo());
+                    }
+                    if (orderStatusResultVo.getSyApplyNo() != null) {
+                        underwritingResultsVo.setSyApplyNo(orderStatusResultVo.getSyApplyNo());
+                    }
+                    if (orderStatusResultVo.getJyApplyNo() != null) {
+                        underwritingResultsVo.setJyApplyNo(orderStatusResultVo.getJyApplyNo());
+                    }
+                }
+                log.info("订单状态查询完成,状态: {}", underwritingResultsVo.getUnderwritingStatus());
             } 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 underwritingVo        核保参数
      * @param preciseInitResult     初始化结果
      * @param underwritingResultsVo 核保结果
      */
-    private void reUnderwriting(TKLoginSession session, UnderwritingVo underwritingVo, 
-                                  PreciseInitResult preciseInitResult, UnderwritingResultsVo underwritingResultsVo) {
+    private void reUnderwriting(TKLoginSession session, UnderwritingVo underwritingVo,
+                                PreciseInitResult preciseInitResult, UnderwritingResultsVo underwritingResultsVo) {
         try {
             // 获取车主信息(与第一次核保相同)
             List<InsOrdersCarUserInfo> insOrdersCarUserInfoList = underwritingVo.getInsOrdersCarUserInfoList();
@@ -302,19 +338,19 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
                 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");
@@ -323,7 +359,7 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
                     underwritingResultsVo.setSyApplyNo(tkOrderData.getProposalNoBI());
                     underwritingResultsVo.setJyApplyNo(tkOrderData.getCarAccident() != null ? tkOrderData.getCarAccident().getProposalNo() : null);
                 }
-                
+
                 // 检查是否还需要验车
                 if ("1".equals(reUnderwritingResult.getCheckCarFlag()) && "9".equals(reUnderwritingResult.getData().getUnderWriteFlag())) {
                     // 仍然需要验车,保持人工处理状态
@@ -342,7 +378,7 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
                 log.warn("重新核保返回null,核保失败");
             }
-            
+
         } catch (Exception e) {
             log.error("重新核保失败", e);
             underwritingResultsVo.setUnderwritingResult("重新核保异常:" + e.getMessage());
@@ -365,33 +401,33 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         // 获取保司订单号(fullProposalNo),核保成功后才会有值
         String companyOrderNo = insuranceUploadImageVo.getOrder().getCompanyOrderNo();
-        
+
         // 如果保司订单号为空,说明第一次进行核保,将影像上传参数缓存到 Redis
         // 泰康只有进行验车时必须要进行影像资料上传,其他情况没有验车资料也可以进行核保
         if (companyOrderNo == null || companyOrderNo.isEmpty()) {
-            log.info("保司订单号为空,影像上传参数将缓存到 Redis,等待核保完成后再上传: ordersNo={}", 
+            log.info("保司订单号为空,影像上传参数将缓存到 Redis,等待核保完成后再上传: ordersNo={}",
                     insuranceUploadImageVo.getOrder().getOrdersNo());
             redisCacheUtil.setImageUploadParam(insuranceUploadImageVo.getOrder().getOrdersNo(), insuranceUploadImageVo);
             return;
         }
-        
+
         // 保司订单号已存在,直接进行影像上传
-        doUploadImage(insuranceUploadImageVo);
+        qualityVerifyImg(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");
-        
+
         // 设置上传参数
         param.setChannelCode("OffWeb");
         param.setTplatformId(session.getTplatformId());
@@ -462,6 +498,156 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
         });
     }
 
+    /**
+     * 执行影像上传操作(批量上传)
+     * <p>
+     * 该方法负责将前端上传的影像资料(行驶证、身份证等)批量上传到泰康保司系统。
+     * 流程:
+     * 1. 获取登录会话信息
+     * 2. 从Redis获取泰康订单号
+     * 3. 遍历影像列表,根据影像类型构建上传参数
+     * 4. 调用批量上传接口将所有影像一次性上传
+     * 5. 调用影像提交接口完成上传流程
+     *
+     * @param insuranceUploadImageVo 影像上传参数,包含订单信息和影像列表
+     */
+    private void qualityVerifyImg(InsuranceUploadImageVo insuranceUploadImageVo) {
+        // 1. 获取归属信息(用户名、密码)用于登录保司系统
+        AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder().getAttributionInformationVo();
+
+        // 2. 获取登录会话信息
+        TKLoginSession session = loginSession(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+
+        // 3. 从Redis缓存中获取泰康订单号(DD标识)
+        String orderID = redisCacheUtil.getCache(insuranceUploadImageVo.getOrder().getOrdersNo(), "DD");
+        log.info("影像上传 - 获取泰康订单号: {}", orderID);
+
+        // 4. 获取影像列表
+        List<InsuranceImageVo> imageVoList = insuranceUploadImageVo.getImageVoList();
+        if (CollectionUtils.isEmpty(imageVoList)) {
+            log.warn("影像上传 - 影像列表为空,跳过上传");
+            return;
+        }
+
+        // 5. 构建批量上传参数列表
+        List<CarCheckUploadFileVerifyImgParam> uploadParamsList = buildUploadParams(insuranceUploadImageVo, imageVoList);
+
+        // 6. 如果没有需要上传的参数,直接返回
+        if (CollectionUtils.isEmpty(uploadParamsList)) {
+            log.warn("影像上传 - 未构建到有效的上传参数,跳过上传");
+            return;
+        }
+
+        log.info("影像上传 - 准备批量上传 {} 个影像参数", uploadParamsList.size());
+
+        // 7. 调用批量上传接口,一次性发送所有影像参数
+        httpService.qualityVerifyImgBatch(uploadParamsList);
+
+        // 8. 调用影像提交接口,完成上传流程
+        httpService.carCheckUploadFileSubmit(
+                session.getToken(),
+                session.getTplatformId(),
+                insuranceUploadImageVo.getOrder().getCompanyOrderNo(),
+                orderID
+        );
+
+        log.info("影像上传 - 上传完成,订单号: {}", orderID);
+    }
+
+    /**
+     * 构建影像上传参数列表
+     * <p>
+     * 根据影像类型(行驶证、身份证)构建对应的上传参数对象。
+     * 影像类型编码说明:
+     * - C01: 行驶证正面
+     * - D01: 行驶证反面
+     * - C02: 车主身份证正面
+     * - D02: 车主身份证反面
+     *
+     * @param insuranceUploadImageVo 影像上传参数
+     * @param imageVoList            影像列表
+     * @return 上传参数列表
+     */
+    private List<CarCheckUploadFileVerifyImgParam> buildUploadParams(
+            InsuranceUploadImageVo insuranceUploadImageVo,
+            List<InsuranceImageVo> imageVoList) {
+
+        List<CarCheckUploadFileVerifyImgParam> uploadParamsList = new ArrayList<>();
+
+        // 获取保司订单号(核保成功后返回的ProposalNo)
+        String companyOrderNo = insuranceUploadImageVo.getOrder().getCompanyOrderNo();
+
+        // 遍历影像列表
+        for (InsuranceImageVo imageVo : imageVoList) {
+            String imageCode = imageVo.getImageCode();
+            List<InsuranceImageVo.ImageDTO> imageBase64List = imageVo.getImageBase64List();
+
+            // 如果影像编码或Base64列表为空,跳过当前影像
+            if (StringUtils.isEmpty(imageCode) || CollectionUtils.isEmpty(imageBase64List)) {
+                log.warn("影像上传 - 影像编码为空或Base64列表为空,跳过: imageCode={}", imageCode);
+                continue;
+            }
+
+            // 根据影像编码确定类型路径
+            String typePath = getTypePathByImageCode(imageCode);
+            if (StringUtils.isEmpty(typePath)) {
+                log.warn("影像上传 - 未匹配到影像类型路径,跳过: imageCode={}", imageCode);
+                continue;
+            }
+
+            // 遍历Base64图片列表,为每张图片构建一个上传参数
+            for (InsuranceImageVo.ImageDTO imageDTO : imageBase64List) {
+                CarCheckUploadFileVerifyImgParam param = new CarCheckUploadFileVerifyImgParam();
+
+                // 设置渠道编码(固定值)
+                param.setChannelCode("OffWeb");
+                // 设置保司订单号(核保成功后返回)
+                param.setFullProposalNo(companyOrderNo);
+                // 设置拍摄城市(暂时为空)
+                param.setShootCity("");
+                // 设置拍摄省份(暂时为空)
+                param.setShootProvince("");
+                // 设置上传类型(1表示正常上传)
+                param.setUploadType(1);
+                // 设置类型路径(根据影像类型确定)
+                param.setTypePath(typePath);
+                // 设置Base64编码的图片内容
+                param.setBase64File(imageDTO.getImageBase64Str());
+                // 生成Base64文件名(保司订单号+类型路径+序号)
+                param.setBase64FileName(companyOrderNo + typePath + "0.png");
+                // 生成文件类型标识(包含时间戳确保唯一性)
+                param.setFileType("1fileOrgName" + typePath + System.currentTimeMillis() + "0");
+
+                uploadParamsList.add(param);
+                log.debug("影像上传 - 构建上传参数: imageCode={}, typePath={}", imageCode, typePath);
+            }
+        }
+
+        return uploadParamsList;
+    }
+
+    /**
+     * 根据影像编码获取类型路径
+     * <p>
+     * 影像类型与类型路径的映射关系:
+     * - C01/C02: 行驶证(正面/反面)-> 01-15-01(投保业务-车辆证件-行驶证)
+     * - C02/D02: 身份证(正面/反面)-> 01-14-01(投保业务-证件照-证件照)
+     *
+     * @param imageCode 影像编码
+     * @return 类型路径,未匹配返回null
+     */
+    private String getTypePathByImageCode(String imageCode) {
+        if (imageCode == null) {
+            return null;
+        }
+
+        return switch (imageCode) {
+            case "C01", "D01" -> "01-15-01";  // 行驶证
+            case "C02", "D02" -> "01-14-01";  // 身份证
+            default -> null;
+        };
+    }
+
 
 //        {
 //            // 核保资料 / 新增设备发票与清单
@@ -659,6 +845,9 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
             orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
         } else if (orderStatus.equals("X")) {
             orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.ORDER_CLOSE);
+        } else if (orderStatus.equals("A3")) {
+            orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            orderStatusResultVo.setErrorMsg(tkEntranceFor000086Result.getCarRuleMessage());
         }
         orderStatusResultVo.setJqPolicyno(tkEntranceFor000086Result.getQuotationNoCI());
         orderStatusResultVo.setSyPolicyno(tkEntranceFor000086Result.getQuotationNoBI());