|
|
@@ -1,18 +1,24 @@
|
|
|
package com.jzg.organization.aop;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.json.JSONConfig;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.jzg.commons.core.page.HttpResult;
|
|
|
import com.jzg.commons.entity.finance.vo.BatchModifyVo;
|
|
|
+import com.jzg.commons.entity.finance.vo.importbatchmodify.InsPlyIncomeExportVo;
|
|
|
import com.jzg.commons.entity.orders.po.InsOrders;
|
|
|
import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
|
|
|
+import com.jzg.commons.entity.orders.po.InsOrdersPolicy;
|
|
|
import com.jzg.commons.entity.orders.po.InsOrdersTrack;
|
|
|
import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
|
|
|
import com.jzg.commons.entity.vo.QuestionOrder;
|
|
|
import com.jzg.commons.util.JsonDiffUtil;
|
|
|
import com.jzg.commons.util.SchemaDescriptionParser;
|
|
|
import com.jzg.organization.client.summary.InsOrdersClient;
|
|
|
+import com.jzg.organization.mapper.InsOrdersPolicyMapper;
|
|
|
import com.jzg.quotation.summary.aop.aspect.OrderOperationLog;
|
|
|
import org.aspectj.lang.ProceedingJoinPoint;
|
|
|
import org.aspectj.lang.annotation.Around;
|
|
|
@@ -27,8 +33,11 @@ import org.springframework.expression.ExpressionParser;
|
|
|
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
|
|
import org.springframework.expression.spel.support.StandardEvaluationContext;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+import java.io.InputStream;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Aspect
|
|
|
@Component
|
|
|
@@ -40,6 +49,10 @@ public class OrderOperationLogAspect {
|
|
|
@Lazy
|
|
|
private InsOrdersClient insOrdersClient;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ @Lazy
|
|
|
+ private InsOrdersPolicyMapper insOrdersPolicyMapper;
|
|
|
+
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -101,10 +114,105 @@ public class OrderOperationLogAspect {
|
|
|
result = joinPoint.proceed();
|
|
|
this.updateToQuestionOrder(result,log, questionOrder);
|
|
|
break;
|
|
|
+ // 导入批量修改比例
|
|
|
+ case 18:
|
|
|
+ logger.info("导入批量修改比例.log.orderSpEl()=[{}]",log.orderSpEl());
|
|
|
+ // 1. 通过 SpEL 取出 MultipartFile 文件对象
|
|
|
+ MultipartFile file = parser.parseExpression(log.orderSpEl()).getValue(context, MultipartFile.class);
|
|
|
+ if (file == null || file.isEmpty()) {
|
|
|
+ throw new RuntimeException("导入文件为空,无法记录操作轨迹");
|
|
|
+ }
|
|
|
+ // 2. 解析 Excel,提取保单号列表,换算为 orderNo(与 Service fillExcelConte 逻辑一致)
|
|
|
+ List<String> importOrderNos = resolveOrderNosFromFile(file);
|
|
|
+ if (CollUtil.isEmpty(importOrderNos)) {
|
|
|
+ logger.warn("导入批量修改比例:解析后未获取到任何有效 orderNo,跳过轨迹记录");
|
|
|
+ result = joinPoint.proceed();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 3. 批量修改前快照
|
|
|
+ Map<String, QuoteEchoVo> importOldOrders = new HashMap<>();
|
|
|
+ for (String orderNo : importOrderNos) {
|
|
|
+ HttpResult<QuoteEchoVo> echoRes = insOrdersClient.auditInfo(orderNo);
|
|
|
+ importOldOrders.put(orderNo, echoRes.getData());
|
|
|
+ }
|
|
|
+ // 4. 执行实际导入修改业务
|
|
|
+ result = joinPoint.proceed();
|
|
|
+ // 5. 批量修改后快照
|
|
|
+ Map<String, QuoteEchoVo> importNewOrders = new HashMap<>();
|
|
|
+ for (String orderNo : importOrderNos) {
|
|
|
+ HttpResult<QuoteEchoVo> echoRes = insOrdersClient.auditInfo(orderNo);
|
|
|
+ importNewOrders.put(orderNo, echoRes.getData());
|
|
|
+ }
|
|
|
+ // 6. 构造 BatchModifyVo 以便复用 batchModify 轨迹落库方法
|
|
|
+ BatchModifyVo importVo = new BatchModifyVo();
|
|
|
+ importVo.setOrderNos(importOrderNos);
|
|
|
+ this.batchModify(result, log, importVo, importOldOrders, importNewOrders);
|
|
|
+ break;
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 从导入的 Excel 文件中解析出所有行的保单号,再通过 InsOrdersPolicy 表转换为 orderNo 列表
|
|
|
+ * 逻辑与 ReceivableServiceImpl.fillExcelConte 保持一致,按交强 → 商业 → 驾意 的优先级匹配保单号
|
|
|
+ *
|
|
|
+ * @return 去重后的 orderNo 列表
|
|
|
+ * @author lipf / trae
|
|
|
+ * @date 2026/8/31
|
|
|
+ */
|
|
|
+ private List<String> resolveOrderNosFromFile(MultipartFile file) {
|
|
|
+ Set<String> orderNoSet = new LinkedHashSet<>();
|
|
|
+ try (InputStream is = file.getInputStream()) {
|
|
|
+ // 使用 EasyExcel 同步读取,头类为 InsPlyIncomeExportVo(与 Service 解析一致)
|
|
|
+ List<InsPlyIncomeExportVo> rows = EasyExcel.read(is)
|
|
|
+ .head(InsPlyIncomeExportVo.class)
|
|
|
+ .sheet()
|
|
|
+ .doReadSync();
|
|
|
+ if (CollUtil.isEmpty(rows)) {
|
|
|
+ logger.warn("resolveOrderNosFromFile:Excel 为空或无有效数据行");
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ for (InsPlyIncomeExportVo row : rows) {
|
|
|
+ String orderNo = resolveOneOrderNo(row);
|
|
|
+ if (StrUtil.isNotBlank(orderNo)) {
|
|
|
+ orderNoSet.add(orderNo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ logger.info("resolveOrderNosFromFile:解析 Excel 行数={}, 去重后 orderNo 数={}", rows.size(), orderNoSet.size());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("resolveOrderNosFromFile 解析导入文件异常:{}", e.getMessage(), e);
|
|
|
+ }
|
|
|
+ return new ArrayList<>(orderNoSet);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单行数据:按 交强 → 商业 → 驾意 优先级查询订单号
|
|
|
+ */
|
|
|
+ private String resolveOneOrderNo(InsPlyIncomeExportVo row) {
|
|
|
+ if (StrUtil.isNotBlank(row.getJqPolicyNo())) {
|
|
|
+ List<InsOrdersPolicy> list = insOrdersPolicyMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<InsOrdersPolicy>().eq(InsOrdersPolicy::getJqPolicyNo, row.getJqPolicyNo()));
|
|
|
+ if (CollUtil.isNotEmpty(list)) {
|
|
|
+ return list.get(0).getOrderNo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StrUtil.isNotBlank(row.getSyPolicyNo())) {
|
|
|
+ List<InsOrdersPolicy> list = insOrdersPolicyMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<InsOrdersPolicy>().eq(InsOrdersPolicy::getSyPolicyNo, row.getSyPolicyNo()));
|
|
|
+ if (CollUtil.isNotEmpty(list)) {
|
|
|
+ return list.get(0).getOrderNo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StrUtil.isNotBlank(row.getJyPolicyNo())) {
|
|
|
+ List<InsOrdersPolicy> list = insOrdersPolicyMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<InsOrdersPolicy>().eq(InsOrdersPolicy::getJyPolicyNo, row.getJyPolicyNo()));
|
|
|
+ if (CollUtil.isNotEmpty(list)) {
|
|
|
+ return list.get(0).getOrderNo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 设置为疑问订单
|
|
|
*
|