Explorar el Código

修改ins_orders_track的aop轨迹记录方法,增加导入批量修改比例的case

jiakai hace 2 semanas
padre
commit
be9e03ec2e

+ 1 - 0
commons/src/main/java/com/jzg/quotation/summary/constants/QuoteNumberConstant.java

@@ -96,6 +96,7 @@ public class QuoteNumberConstant {
         OPT_TYPE_15(15,"费用调整"),
         OPT_TYPE_16(16,"批量修改比例"),
         OPT_TYPE_17(17,"设置为疑问订单"),
+        OPT_TYPE_18(18,"导入批量修改比例"),
         ;
         private Integer code;
         private String desc;

+ 108 - 0
tenant/organization/src/main/java/com/jzg/organization/aop/OrderOperationLogAspect.java

@@ -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;
+    }
+
     /**
      * 设置为疑问订单
      *

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -142,6 +142,13 @@ public class ReceivableController {
         return HttpResult.ok(receivablePageIds);
     }
 
+    @OrderOperationLog(
+            module = "私有/平台协议应收",
+            subModule = "订单审核",
+            optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_18,
+            description = "导入批量修改比例",
+            orderSpEl = "#file"
+    )
     @PostMapping("/importReceivableListUpdate")
     @Operation(summary = "导入私有协议/平台协议比例修改")
     public HttpResult<ImportUpdateExcelResultVo> importReceivableListUpdate(@RequestParam("file") MultipartFile file){