|
|
@@ -219,96 +219,67 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
|
|
|
return underwritingResultsVo;
|
|
|
}
|
|
|
|
|
|
- private void buildCheckCar(TKEntranceFor000038Result tkEntranceFor000038Result, UnderwritingVo underwritingVo, PreciseInitResult preciseInitResult, UnderwritingResultsVo underwritingResultsVo) {
|
|
|
+ /**
|
|
|
+ * 处理验车上传影像流程
|
|
|
+ * <p>
|
|
|
+ * 当核保返回需要验车上传影像时,执行以下流程:
|
|
|
+ * 1. 获取核保返回的保司订单号
|
|
|
+ * 2. 从 Redis 获取前端提前缓存的影像上传参数
|
|
|
+ * 3. 设置保司订单号并上传影像到保司
|
|
|
+ * 4. 查询订单状态并更新核保结果
|
|
|
+ *
|
|
|
+ * @param tkEntranceFor000038Result 核保结果
|
|
|
+ * @param underwritingVo 核保参数
|
|
|
+ * @param preciseInitResult 精准报价结果
|
|
|
+ * @param underwritingResultsVo 核保结果返回
|
|
|
+ */
|
|
|
+ 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;
|
|
|
- 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));
|
|
|
- // }
|
|
|
-
|
|
|
+ // 1. 获取核保返回的保司订单号
|
|
|
+ String proposalNo = extractProposalNo(tkEntranceFor000038Result, underwritingVo);
|
|
|
+
|
|
|
// 2. 从 Redis 获取缓存的影像上传参数(前端提前上传的)
|
|
|
- InsuranceUploadImageVo insuranceUploadImageVo = redisCacheUtil.getImageUploadParam(underwritingVo.getOrder().getOrdersNo());
|
|
|
+ String ordersNo = underwritingVo.getOrder().getOrdersNo();
|
|
|
+ InsuranceUploadImageVo insuranceUploadImageVo = redisCacheUtil.getImageUploadParam(ordersNo);
|
|
|
|
|
|
- // 3. 如果 Redis 中有缓存的影像上传参数,设置保司订单号
|
|
|
+ // 3. 如果有缓存的影像参数,设置保司订单号并清除缓存
|
|
|
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());
|
|
|
+ redisCacheUtil.deleteImageUploadParam(ordersNo);
|
|
|
}
|
|
|
|
|
|
- // 5. 如果有影像资料,上传到保司
|
|
|
- if (insuranceUploadImageVo != null && insuranceUploadImageVo.getImageVoList() != null && !insuranceUploadImageVo.getImageVoList().isEmpty()) {
|
|
|
+ // 4. 如果有影像资料,上传到保司并查询订单状态
|
|
|
+ if (hasValidImages(insuranceUploadImageVo)) {
|
|
|
// 上传影像
|
|
|
log.info("开始上传影像资料...");
|
|
|
qualityVerifyImg(insuranceUploadImageVo);
|
|
|
log.info("影像资料上传成功");
|
|
|
|
|
|
- // 6. 上传成功后查询订单状态
|
|
|
+ // 查询订单状态
|
|
|
log.info("开始查询订单状态...");
|
|
|
- OrderStatusVo orderStatusVo = new OrderStatusVo();
|
|
|
- orderStatusVo.setOrder(underwritingVo.getOrder());
|
|
|
- OrderStatusResultVo orderStatusResultVo = queryOrderState(orderStatusVo);
|
|
|
+ OrderStatusResultVo orderStatusResultVo = queryOrderStatus(underwritingVo);
|
|
|
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());
|
|
|
- }
|
|
|
- }
|
|
|
+ // 更新核保结果
|
|
|
+ updateUnderwritingResultByOrderStatus(tkEntranceFor000038Result, orderStatusResultVo, underwritingResultsVo);
|
|
|
log.info("订单状态查询完成,状态: {}", underwritingResultsVo.getUnderwritingStatus());
|
|
|
} else {
|
|
|
// 没有影像资料,保持人工处理状态
|
|
|
- log.warn("未查询到影像资料,保持人工处理状态");
|
|
|
- underwritingResultsVo.setUnderwritingResult(tkEntranceFor000038Result.getData().getSpResMsg() + ",原因:" + tkEntranceFor000038Result.getCheckCarData());
|
|
|
- underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
|
|
|
+ setStaffProcessStatus(tkEntranceFor000038Result, underwritingResultsVo, "未查询到影像资料");
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
@@ -322,68 +293,132 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 重新核保
|
|
|
+ * 从核保结果中提取保司订单号
|
|
|
*
|
|
|
- * @param session 登录会话
|
|
|
- * @param underwritingVo 核保参数
|
|
|
- * @param preciseInitResult 初始化结果
|
|
|
- * @param underwritingResultsVo 核保结果
|
|
|
+ * @param tkEntranceFor000038Result 核保结果
|
|
|
+ * @param underwritingVo 核保参数
|
|
|
+ * @return 保司订单号
|
|
|
*/
|
|
|
- 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;
|
|
|
- }
|
|
|
+ private String extractProposalNo(TKEntranceFor000038Result tkEntranceFor000038Result, UnderwritingVo underwritingVo) {
|
|
|
+ TKOrderData tkOrderData = tkEntranceFor000038Result.getData();
|
|
|
+ if (tkOrderData == null || tkOrderData.getProposalNo() == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ String proposalNo = tkOrderData.getProposalNo();
|
|
|
+ underwritingVo.getOrder().setCompanyOrderNo(proposalNo);
|
|
|
+ log.info("核保返回保司订单号: {}", proposalNo);
|
|
|
+ return proposalNo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否有有效的影像资料
|
|
|
+ *
|
|
|
+ * @param insuranceUploadImageVo 影像上传参数
|
|
|
+ * @return true 表示有有效影像,false 表示无
|
|
|
+ */
|
|
|
+ private boolean hasValidImages(InsuranceUploadImageVo insuranceUploadImageVo) {
|
|
|
+ return insuranceUploadImageVo != null && CollectionUtils.isNotEmpty(insuranceUploadImageVo.getImageVoList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询订单状态
|
|
|
+ *
|
|
|
+ * @param underwritingVo 核保参数
|
|
|
+ * @return 订单状态查询结果
|
|
|
+ */
|
|
|
+ private OrderStatusResultVo queryOrderStatus(UnderwritingVo underwritingVo) {
|
|
|
+ OrderStatusVo orderStatusVo = new OrderStatusVo();
|
|
|
+ orderStatusVo.setOrder(underwritingVo.getOrder());
|
|
|
+ return queryOrderState(orderStatusVo);
|
|
|
+ }
|
|
|
|
|
|
- InsOrdersCarUserInfo insOrdersCarUserInfo = insOrdersCarUserInfoList.get(0);
|
|
|
- InitProposalResult initProposalResult = tkSimpleService.queryCarOwner(session, preciseInitResult.getMainOrderId());
|
|
|
- TKInsureInfo insureInfo = tkSimpleService.dataCreateInsureInfo(initProposalResult, insOrdersCarUserInfo);
|
|
|
+ /**
|
|
|
+ * 根据订单状态查询结果更新核保结果
|
|
|
+ *
|
|
|
+ * @param tkEntranceFor000038Result 核保结果
|
|
|
+ * @param orderStatusResultVo 订单状态查询结果
|
|
|
+ * @param underwritingResultsVo 核保结果返回
|
|
|
+ */
|
|
|
+ private void updateUnderwritingResultByOrderStatus(TKEntranceFor000038Result tkEntranceFor000038Result,
|
|
|
+ OrderStatusResultVo orderStatusResultVo,
|
|
|
+ UnderwritingResultsVo underwritingResultsVo) {
|
|
|
+ if (orderStatusResultVo == null || orderStatusResultVo.getOrderStatus() == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- log.info("重新核保 - 车主信息: {}", new Gson().toJson(insureInfo));
|
|
|
+ InsOrderStatusEnum orderStatus = orderStatusResultVo.getOrderStatus();
|
|
|
+ underwritingResultsVo.setUnderwritingStatus(orderStatus);
|
|
|
|
|
|
- // 调用核保接口
|
|
|
- TKEntranceFor000038Result reUnderwritingResult = tkSimpleService.orderSubmit(session, preciseInitResult.getMainOrderId(), insureInfo);
|
|
|
+ // 根据不同状态设置核保结果描述
|
|
|
+ String resultDesc = buildResultDescription(orderStatus, orderStatusResultVo, tkEntranceFor000038Result);
|
|
|
+ underwritingResultsVo.setUnderwritingResult(resultDesc);
|
|
|
|
|
|
- if (reUnderwritingResult != null) {
|
|
|
- TKOrderData tkOrderData = reUnderwritingResult.getData();
|
|
|
+ // 设置支付链接(仅待支付状态)
|
|
|
+ if (InsOrderStatusEnum.PAY_PENDING.equals(orderStatus)) {
|
|
|
+ underwritingResultsVo.setPaymentLink(orderStatusResultVo.getPaymentLink());
|
|
|
+ }
|
|
|
|
|
|
- // 更新保单编号缓存
|
|
|
- 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);
|
|
|
- }
|
|
|
+ // 更新投保单号(交强险、商业险、驾意险)
|
|
|
+ updateApplyNos(orderStatusResultVo, underwritingResultsVo);
|
|
|
+ }
|
|
|
|
|
|
- // 检查是否还需要验车
|
|
|
- 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,核保失败");
|
|
|
+ /**
|
|
|
+ * 构建核保结果描述
|
|
|
+ *
|
|
|
+ * @param orderStatus 订单状态
|
|
|
+ * @param orderStatusResultVo 订单状态查询结果
|
|
|
+ * @param tkEntranceFor000038Result 核保结果
|
|
|
+ * @return 核保结果描述
|
|
|
+ */
|
|
|
+ private String buildResultDescription(InsOrderStatusEnum orderStatus,
|
|
|
+ OrderStatusResultVo orderStatusResultVo,
|
|
|
+ TKEntranceFor000038Result tkEntranceFor000038Result) {
|
|
|
+ return switch (orderStatus) {
|
|
|
+ case PAY_PENDING -> "核保成功";
|
|
|
+ case UNDERWRITED -> "已承保";
|
|
|
+ case WAIT_AUDIT -> "待核保";
|
|
|
+ case AUDIT_FAIL -> "核保失败";
|
|
|
+ case STAFF_PROCESS -> "人工审核,原因:" + orderStatusResultVo.getErrorMsg();
|
|
|
+ default -> {
|
|
|
+ TKOrderData data = tkEntranceFor000038Result.getData();
|
|
|
+ yield (data != null ? data.getSpResMsg() : "") + ",原因:" + tkEntranceFor000038Result.getCheckCarData();
|
|
|
}
|
|
|
+ };
|
|
|
+ }
|
|
|
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("重新核保失败", e);
|
|
|
- underwritingResultsVo.setUnderwritingResult("重新核保异常:" + e.getMessage());
|
|
|
- underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
|
|
|
+ /**
|
|
|
+ * 更新投保单号信息
|
|
|
+ *
|
|
|
+ * @param orderStatusResultVo 订单状态查询结果
|
|
|
+ * @param underwritingResultsVo 核保结果返回
|
|
|
+ */
|
|
|
+ private void updateApplyNos(OrderStatusResultVo orderStatusResultVo, UnderwritingResultsVo underwritingResultsVo) {
|
|
|
+ if (orderStatusResultVo.getJqApplyNo() != null) {
|
|
|
+ underwritingResultsVo.setJqApplyNo(orderStatusResultVo.getJqApplyNo());
|
|
|
}
|
|
|
+ if (orderStatusResultVo.getSyApplyNo() != null) {
|
|
|
+ underwritingResultsVo.setSyApplyNo(orderStatusResultVo.getSyApplyNo());
|
|
|
+ }
|
|
|
+ if (orderStatusResultVo.getJyApplyNo() != null) {
|
|
|
+ underwritingResultsVo.setJyApplyNo(orderStatusResultVo.getJyApplyNo());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置人工处理状态
|
|
|
+ *
|
|
|
+ * @param tkEntranceFor000038Result 核保结果
|
|
|
+ * @param underwritingResultsVo 核保结果返回
|
|
|
+ * @param reason 原因描述
|
|
|
+ */
|
|
|
+ private void setStaffProcessStatus(TKEntranceFor000038Result tkEntranceFor000038Result,
|
|
|
+ UnderwritingResultsVo underwritingResultsVo,
|
|
|
+ String reason) {
|
|
|
+ log.warn("{},保持人工处理状态", reason);
|
|
|
+ TKOrderData data = tkEntranceFor000038Result.getData();
|
|
|
+ underwritingResultsVo.setUnderwritingResult((data != null ? data.getSpResMsg() : "") + ",原因:" + tkEntranceFor000038Result.getCheckCarData());
|
|
|
+ underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
|
|
|
}
|
|
|
|
|
|
@Override
|