dongxin 1 год назад
Родитель
Сommit
8e64147099
23 измененных файлов с 851 добавлено и 126 удалено
  1. 25 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarInfo.java
  2. 21 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarUserInfo.java
  3. 8 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersKind.java
  4. 13 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersTax.java
  5. 23 17
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersTrack.java
  6. 3 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java
  7. 6 0
      commons/src/main/java/com/jzg/commons/util/comparble/DiffUtils.java
  8. 100 0
      commons/src/main/java/com/jzg/commons/util/comparble/ListDiffUtil.java
  9. 14 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/SpElMapping.java
  10. 38 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/SpElFieldExtractor.java
  11. 19 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLog.java
  12. 366 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java
  13. 49 69
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  14. 3 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarInfoService.java
  15. 5 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarUserInfoService.java
  16. 3 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersKindService.java
  17. 5 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersTaxService.java
  18. 28 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarInfoServiceImpl.java
  19. 41 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarUserInfoServiceImpl.java
  20. 15 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersKindServiceImpl.java
  21. 4 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersRiskServiceImpl.java
  22. 31 27
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  23. 31 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersTaxServiceImpl.java

+ 25 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarInfo.java

@@ -2,6 +2,7 @@ package com.jzg.commons.entity.orders.po;
 
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.aop.aspect.DiffProperty;
 import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -25,76 +26,100 @@ public class InsOrdersCarInfo extends BaseModel {
     private String licenseNo;
 
     @Schema(description = "车架号")
+    @DiffProperty(name = "车架号")
     private String vinNo;
 
     @Schema(description = "品牌型号")
+    @DiffProperty(name = "品牌型号")
     private String brandName;
 
     @Schema(description = "发动机号")
+    @DiffProperty(name = "发动机号")
     private String engineNo;
 
     @Schema(description = "年款")
+    @DiffProperty(name = "年款")
     private String carYear;
 
     @Schema(description = "排量")
+    @DiffProperty(name = "排量")
     private String displacement;
 
     @Schema(description = "座位数")
+    @DiffProperty(name = "座位数")
     private Integer seatCount;
 
     @Schema(description = "整备质量")
+    @DiffProperty(name = "整备质量")
     private BigDecimal completeKerbMass;
 
     @Schema(description = "核定载质量")
+    @DiffProperty(name = "核定载质量")
     private BigDecimal limitLoad;
 
     @Schema(description = "功率")
+    @DiffProperty(name = "功率")
     private BigDecimal powerScale;
 
     @Schema(description = "新车购置价")
+    @DiffProperty(name = "新车购置价")
     private BigDecimal purchasePrice;
 
     @Schema(description = "使用性质")
+    @DiffProperty(name = "使用性质")
     private String carNatureCode;
 
     @Schema(description = "车辆用途代码")
+    @DiffProperty(name = "车辆用途代码")
     private String vehicleUseCode;
 
     @Schema(description = "车辆类型代码")
+    @DiffProperty(name = "车辆类型代码")
     private String carTypeCode;
 
     @Schema(description = "车辆种类代码")
+    @DiffProperty(name = "车辆种类代码")
     private String carKindCode;
 
     @Schema(description = "能源种类代码")
+    @DiffProperty(name = "能源种类代码")
     private String energyTypeCode;
 
     @Schema(description = "所属性质代码")
+    @DiffProperty(name = "所属性质代码")
     private String propertyCode;
 
     @Schema(description = "号牌颜色代码")
+    @DiffProperty(name = "号牌颜色代码")
     private String licenseColorCode;
 
     @Schema(description = "车种明细代码")
+    @DiffProperty(name = "车种明细代码")
     private String carKindDetailIdCode;
 
     @Schema(description = "号牌种类")
+    @DiffProperty(name = "号牌种类")
     private String licenseKindCode;
 
     @Schema(description = "注册日期")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DiffProperty(name = "注册日期")
     private LocalDateTime registerDate;
 
     @Schema(description = "发证日期")
+    @DiffProperty(name = "发证日期")
     private LocalDateTime issueDate;
 
     @Schema(description = "过户日期")
+    @DiffProperty(name = "过户日期")
     private LocalDateTime transferDate;
 
     @Schema(description = "是否过户")
+    @DiffProperty(name = "是否过户")
     private int transfer;
 
     @Schema(description = "是否商业过户")
+    @DiffProperty(name = "是否商业过户")
     private int transferBi;
 
 }

+ 21 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarUserInfo.java

@@ -3,6 +3,7 @@ package com.jzg.commons.entity.orders.po;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.aop.aspect.DiffProperty;
 import com.jzg.commons.core.base.BaseModel;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.util.IDCardUtils;
@@ -33,67 +34,87 @@ public class InsOrdersCarUserInfo extends BaseModel {
     private Integer policyPersonType;
 
     @Schema(description = "人员类型 1 个人 2 法人")
+    @DiffProperty(name = "人员类型")
     private Integer personType;
 
     @Schema(description = "证件类型 1 身份证  2 社会信用代码")
+    @DiffProperty(name = "证件类型")
     private Integer cerType;
 
     @Schema(description = "姓名")
+    @DiffProperty(name = "姓名")
     private String name;
 
     @Schema(description = "身份证号")
+    @DiffProperty(name = "身份证号")
     private String identifyNumber;
 
     @Schema(description = "年龄")
+    @DiffProperty(name = "年龄")
     private Integer age;
 
     @Schema(description = "性别")
+    @DiffProperty(name = "性别")
     private String gender;
 
     @Schema(description = "省code  企业使用")
+    @DiffProperty(name = "省")
     private String provinceCode;
 
     @Schema(description = "市code  企业使用")
+    @DiffProperty(name = "市")
     private String cityCode;
 
     @Schema(description = "县code  企业使用")
+    @DiffProperty(name = "县")
     private String countyCode;
 
     @Schema(description = "地址")
+    @DiffProperty(name = "地址")
     private String addr;
 
     @Schema(description = "证件有效开始时间")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DiffProperty(name = "证件有效开始时间")
     private LocalDateTime identifyValidDate;
 
     @Schema(description = "证件有效结束时间")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DiffProperty(name = "证件有效结束时间")
     private LocalDateTime identifyValidEndDate;
 
     @Schema(description = "手机号码")
+    @DiffProperty(name = "手机号码")
     private String mobile;
 
     @Schema(description = "座机号码")
+    @DiffProperty(name = "座机号码")
     private String landline;
 
     @Schema(description = "联系人名称")
+    @DiffProperty(name = "联系人名称")
     private String contact;
 
     @Schema(description = "联系人证件号码")
+    @DiffProperty(name = "联系人证件号码")
     private String contactIdentifyNumber;
 
     @Schema(description = "联系人证件有效开始时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DiffProperty(name = "联系人证件有效开始时间")
     private LocalDateTime contactIdentifyValidDate;
 
     @Schema(description = "联系人证件有效结束时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DiffProperty(name = "联系人证件有效结束时间")
     private LocalDateTime contactIdentifyValidEndDate;
 
     @Schema(description = "电子邮箱")
+    @DiffProperty(name = "电子邮箱")
     private String email;
 
     @Schema(description = "是否车主 0-否 1-是")
+    @DiffProperty(name = "是否车主")
     private int carOwner;
 
 

+ 8 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersKind.java

@@ -3,6 +3,7 @@ package com.jzg.commons.entity.orders.po;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.jzg.commons.aop.aspect.DiffProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -19,23 +20,30 @@ public class InsOrdersKind {
     private String orderNo;
 
     @Schema(description = "金额或数量")
+    @DiffProperty(name = "金额或数量")
     private BigDecimal amount;
 
     @Schema(description = "险种类型")
+    @DiffProperty(name = "险种类型")
     private String kindCode;
 
     @Schema(description = "服务次数")
+    @DiffProperty(name = "服务次数")
     private Integer serviceTimes;
 
     @Schema(description = "险种名称")
+    @DiffProperty(name = "险种名称")
     private String kindName;
 
     @Schema(description = "座位金额")
+    @DiffProperty(name = "座位金额")
     private BigDecimal unitAmount;
 
     @Schema(description = "附加绝对免赔率")
+    @DiffProperty(name = "附加绝对免赔率")
     private BigDecimal deductibleRate;
 
     @Schema(description = "保费")
+    @DiffProperty(name = "保费")
     private BigDecimal premium;
 }

+ 13 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersTax.java

@@ -2,6 +2,7 @@ package com.jzg.commons.entity.orders.po;
 
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.aop.aspect.DiffProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -17,39 +18,51 @@ public class InsOrdersTax {
     private String orderNo;
 
     @Schema(description = "减免税凭证号(减免税时必传)")
+    @DiffProperty(name = "减免税凭证号")
     private String extendChar2;
 
     @Schema(description = "减免比例(减税时必传)")
+    @DiffProperty(name = "减免比例")
     private BigDecimal taxRelief;
 
     @Schema(description = "减免税原因代码(减免税时必传)")
+    @DiffProperty(name = "减免税原因代码")
     private String relifReason;
 
     @Schema(description = "开具税务机关代码(减免完税时必传)")
+    @DiffProperty(name = "开具税务机关代码")
     private String taxComCode;
 
     @Schema(description = "开具凭证的税务机关名称(减免完税时必传)")
+    @DiffProperty(name = "开具凭证的税务机关名称")
     private String taxComName;
 
     @Schema(description = "完税凭证填发日期(完税时必传)")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DiffProperty(name = "完税凭证填发日期")
     private LocalDateTime taxDocumentDate;
 
     @Schema(description = "开具完税凭证地区代码(完税时必传)")
+    @DiffProperty(name = "开具完税凭证地区代码")
     private String taxPaidAreaCode;
 
     @Schema(description = "完税凭证号(完税时必传)")
+    @DiffProperty(name = "完税凭证号")
     private String paidFreeCertificate;
 
     @Schema(description = "纳税人名称(正常缴税时必传)")
+    @DiffProperty(name = "纳税人名称")
     private String taxpayerName;
 
     @Schema(description = "纳税人证件类型(正常缴税时必传)")
+    @DiffProperty(name = "纳税人证件类型")
     private String taxpayerIdentifier;
 
     @Schema(description = "纳税人证件号码(正常缴税时必传)")
+    @DiffProperty(name = "纳税人证件号码")
     private String identifyNumber;
 
     @Schema(description = "车船税标志:1-正常交税; 2-免税; 3-减税; 4-完税")
+    @DiffProperty(name = "车船税标志")
     private Integer taxRelifFlag;
 }

+ 23 - 17
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersTrack.java

@@ -1,8 +1,5 @@
 package com.jzg.commons.entity.orders.po;
 
-import java.io.Serializable;
-import java.util.Date;
-
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.jzg.commons.core.base.BaseModel;
@@ -23,6 +20,12 @@ public class InsOrdersTrack extends BaseModel {
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private String id;
 
+    @Schema(description = "模块名")
+    private String module;        // 模块名,如“补录订单”
+
+    @Schema(description = "二级模块")
+    private String subModule;
+
     @Schema(description = "订单号")
     private String orderNo;
 
@@ -44,20 +47,23 @@ public class InsOrdersTrack extends BaseModel {
     @Schema(description = "返回结果")
     private String result;
 
-    public InsOrdersTrack(String orderNo,
-                          String companyId,
-                          String licenseNo,
-                          Integer status,
-                          Integer optType,
-                          String optContent,
-                          String result) {
-        this.orderNo = orderNo;
-        this.companyId = companyId;
-        this.licenseNo = licenseNo;
-        this.status = status;
-        this.optType = optType;
-        this.optContent = optContent;
-        this.result = result;
+    @Schema(description = "变更前")
+    private String changeBefore;     // 变更前
 
+    @Schema(description = "变更后")
+    private String changeAfter;      // 变更后
+
+    public InsOrdersTrack(String changeBefore, String changeAfter, InsOrdersCarInfo carInfo, InsOrders insOrders) {
+        this.orderNo = insOrders.getId();
+        this.companyId = insOrders.getCompanyId();
+        this.licenseNo = carInfo.getLicenseNo();
+        this.module = "车险订单";
+        this.subModule = "订单详情";
+        this.optType = 10;
+        this.optContent = "报价方案";
+        this.status = 1;
+        this.changeBefore = changeBefore;
+        this.changeAfter = changeAfter;
     }
+
 }

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java

@@ -98,4 +98,7 @@ public class InsOrdersVo extends QuoteVo {
     @Schema(description = "车船税信息")
     private InsOrdersTax insOrdersTax;
 
+    @Schema(description = "险种信息")
+    private List<InsOrdersKind> insOrdersKindList;
+
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/util/comparble/DiffUtils.java

@@ -2,10 +2,16 @@ package com.jzg.commons.util.comparble;
 
 import com.jzg.commons.aop.aspect.DiffProperty;
 import lombok.SneakyThrows;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.util.ConcurrentReferenceHashMap;
 
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 对象比较工具类

+ 100 - 0
commons/src/main/java/com/jzg/commons/util/comparble/ListDiffUtil.java

@@ -0,0 +1,100 @@
+package com.jzg.commons.util.comparble;
+
+import com.jzg.commons.aop.aspect.DiffProperty;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class ListDiffUtil<T> {
+
+    public interface IdExtractor<T> {
+        String getId(T obj); // 比对主键字段(如 orderId)
+    }
+
+    public static class DiffResult<T> {
+        public List<T> added = new ArrayList<>();
+        public List<T> removed = new ArrayList<>();
+        public List<ChangedItem<T>> changed = new ArrayList<>();
+        public List<T> unchanged = new ArrayList<>();
+    }
+
+    public static class ChangedItem<T> {
+        public T oldItem;
+        public T newItem;
+        public Map<String, String[]> fieldDiff = new LinkedHashMap<>(); // 字段中文名 → [旧值, 新值]
+    }
+
+    public DiffResult<T> compare(List<T> oldList, List<T> newList, IdExtractor<T> idExtractor) {
+        Map<String, T> oldMap = oldList.stream().collect(Collectors.toMap(idExtractor::getId, Function.identity()));
+        Map<String, T> newMap = newList.stream().collect(Collectors.toMap(idExtractor::getId, Function.identity()));
+
+        Set<String> allKeys = new HashSet<>();
+        allKeys.addAll(oldMap.keySet());
+        allKeys.addAll(newMap.keySet());
+
+        DiffResult<T> result = new DiffResult<>();
+
+        for (String key : allKeys) {
+            T oldItem = oldMap.get(key);
+            T newItem = newMap.get(key);
+
+            if (oldItem == null) {
+                result.added.add(newItem);
+            } else if (newItem == null) {
+                result.removed.add(oldItem);
+            } else {
+                Map<String, String[]> fieldDiff = compareFieldsWithAnnotation(oldItem, newItem);
+                if (fieldDiff.isEmpty()) {
+                    result.unchanged.add(newItem);
+                } else {
+                    ChangedItem<T> changed = new ChangedItem<>();
+                    changed.oldItem = oldItem;
+                    changed.newItem = newItem;
+                    changed.fieldDiff = fieldDiff;
+                    result.changed.add(changed);
+                }
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 对比两个对象,仅对打了 @DiffField 的字段进行比对
+     */
+    private Map<String, String[]> compareFieldsWithAnnotation(T oldObj, T newObj) {
+        Map<String, String[]> diff = new LinkedHashMap<>();
+        try {
+            Class<?> clazz = oldObj.getClass();
+            for (Field field : clazz.getDeclaredFields()) {
+                if (!field.isAnnotationPresent(DiffProperty.class)) continue;
+
+                field.setAccessible(true);
+                Object oldVal = field.get(oldObj);
+                Object newVal = field.get(newObj);
+
+                if (!Objects.equals(oldVal, newVal)) {
+                    DiffProperty annotation = field.getAnnotation(DiffProperty.class);
+                    String name = annotation.name();
+                    if (name.isBlank()) {
+                        name = field.getName();
+                    }
+                    diff.put(name, new String[]{
+                            oldVal == null ? "null" : oldVal.toString(),
+                            newVal == null ? "null" : newVal.toString()
+                    });
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("字段对比失败:" + e.getMessage(), e);
+        }
+        return diff;
+    }
+}

+ 14 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/SpElMapping.java

@@ -0,0 +1,14 @@
+package com.jzg.quotation.commons.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SpElMapping {
+
+    private String fieldName;   // 最终生成日志的字段名,如 "orderId"
+    private String spel;        // SpEL 表达式,如 "#ret.data.orderId"
+}

+ 38 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/SpElFieldExtractor.java

@@ -0,0 +1,38 @@
+package com.jzg.quotation.commons.utils;
+
+import com.jzg.quotation.commons.constant.SpElMapping;
+import org.springframework.expression.EvaluationContext;
+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 java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class SpElFieldExtractor {
+
+    private final ExpressionParser parser = new SpelExpressionParser();
+
+    /**
+     * 从返回对象中提取多个字段(根据 SpElMapping 定义)
+     */
+    public Map<String, String> extractFields(Object returnValue, List<SpElMapping> mappings) {
+        Map<String, String> result = new HashMap<>();
+        EvaluationContext context = new StandardEvaluationContext();
+        context.setVariable("ret", returnValue);
+
+        for (SpElMapping mapping : mappings) {
+            try {
+                String value = parser.parseExpression(mapping.getSpel())
+                        .getValue(context, String.class);
+                result.put(mapping.getFieldName(), value);
+            } catch (Exception e) {
+                result.put(mapping.getFieldName(), "SpEL解析失败");
+            }
+        }
+        return result;
+    }
+}

+ 19 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLog.java

@@ -0,0 +1,19 @@
+package com.jzg.quotation.summary.aop;
+
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OrderOperationLog {
+    String module();        // 模块名,如“补录订单”
+    String subModule();     // 二级模块,如“订单详情”
+    QuoteNumberConstant.QuoteOptType optType();     // 操作类型,如“订单创建”
+    String description() default "";   // 说明
+    String feedbackSpEl() default ""; // 使用 SpEL 表达式提取返回字段(可选)
+    String orderSpEl() default "";  // NEW: 用 SpEL 指定 入参 提取路径
+}

+ 366 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java

@@ -0,0 +1,366 @@
+package com.jzg.quotation.summary.aop;
+
+import com.alibaba.fastjson2.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersTrack;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.constant.SpElMapping;
+import com.jzg.quotation.commons.utils.SpElFieldExtractor;
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
+import com.jzg.quotation.summary.service.InsOrdersCarInfoService;
+import com.jzg.quotation.summary.service.InsOrdersService;
+import com.jzg.quotation.summary.service.InsOrdersTrackService;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.expression.EvaluationContext;
+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 java.lang.reflect.Method;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Aspect
+@Component
+public class OrderOperationLogAspect {
+
+    public static final ExpressionParser PARSER = new SpelExpressionParser();
+    @Autowired
+    private InsOrdersService orderService;
+
+    @Autowired
+    private InsOrdersCarInfoService carInfoService;
+
+    @Autowired
+    private InsOrdersTrackService traceService;
+
+    @Autowired
+    private SpElFieldExtractor fieldExtractor;
+
+    @Around("@annotation(log)")
+    public Object handleLog(ProceedingJoinPoint joinPoint, OrderOperationLog log) throws Throwable {
+        // 获取方法信息和参数
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Object[] args = joinPoint.getArgs();
+        String[] paramNames = signature.getParameterNames();
+        // 设置 SpEL 上下文
+        EvaluationContext context = new StandardEvaluationContext();
+        for (int i = 0; i < args.length; i++) {
+            context.setVariable(paramNames[i], args[i]); // 命名参数:#dto
+            context.setVariable("p" + i, args[i]); // 索引参数:#p0
+        }
+        ExpressionParser parser = new SpelExpressionParser();
+        Object result = null;
+        switch (log.optType().getCode()){
+            // 创建订单
+            case 0:
+                // 通过 SpEL 提取 入参
+                QuoteVo quoteVo = parser.parseExpression(log.orderSpEl()).getValue(context, QuoteVo.class);
+                // 生成订单的条件
+                // 1个保险公司只有一个主订单   不区分险种
+                InsOrders mainOrders = orderService.getMainOrders(
+                        quoteVo.getOrder().getInsuranceCompanyCode(),
+                        quoteVo.getCarInfoVo().getLicenseNo(),
+                        quoteVo.getCarInfoVo().getVinNo());
+                boolean isExistsMainOrder = false;
+                if (Objects.nonNull(mainOrders))
+                {
+                    isExistsMainOrder = true;
+                }
+                result = joinPoint.proceed(); // 执行方法
+                this.createLog(result,log, quoteVo,isExistsMainOrder);
+                break;
+            // 核保
+            case 5:
+                // 通过 SpEL 提取 入参
+                UnderwritingVo underwritingVo = parser.parseExpression(log.orderSpEl()).getValue(context, UnderwritingVo.class);
+                result = joinPoint.proceed();
+                this.underwritingLog(underwritingVo.getOrder().getOrdersNo(),result,log);
+                break;
+            // 获取支付码
+            case 6:
+                // 通过 SpEL 提取 入参
+                PaymentLinkVo paymentLinkVo = parser.parseExpression(log.orderSpEl()).getValue(context, PaymentLinkVo.class);
+                result = joinPoint.proceed();
+                this.getPamentLog(paymentLinkVo.getOrder().getOrdersNo(),result,log);
+                break;
+            // 下载电子保单
+            case 8:
+                // 通过 SpEL 提取 入参
+                DownloadPolicyVo downloadPolicyVo = parser.parseExpression(log.orderSpEl()).getValue(context, DownloadPolicyVo.class);
+                result = joinPoint.proceed();
+                this.downloadLog("orderId",result,log);
+                break;
+            // 同步订单
+            case 9:
+                // 通过 SpEL 提取 入参
+                OrderStatusVo orderStatusVo = parser.parseExpression(log.orderSpEl()).getValue(context, OrderStatusVo.class);
+                InsOrders before = loadBeforeState(orderStatusVo.getOrder().getOrdersNo()); // 可选:旧状态
+                result = joinPoint.proceed();
+                InsOrders after = loadAfterState(orderStatusVo.getOrder().getOrdersNo()); // 可选:新状态
+                this.getOrderStatusLog(orderStatusVo.getOrder().getOrdersNo(),before,after,result,log);
+                break;
+
+        }
+        return result;
+    }
+
+    /**
+     * 更新订单状态日志
+     * @param orderId
+     * @param before
+     * @param after
+     * @param result
+     * @param log
+     */
+    private void getOrderStatusLog(String orderId, InsOrders before, InsOrders after,Object result, OrderOperationLog log) {
+        // 定义要提取的字段
+        List<SpElMapping> mappings = List.of(
+                new SpElMapping("msg", "#ret.msg"),
+                new SpElMapping("code", "#ret.code"),
+                new SpElMapping("data", "#ret.data")
+        );
+        // 执行提取
+        Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
+        InsOrdersCarInfo carInfo = carInfoService.getByOrderId(orderId);
+        if(extracted.get("code").equals("200")){
+            if(!before.getOrderStatus().equals(after.getOrderStatus())){
+                InsOrdersTrack track = new InsOrdersTrack();
+                track.setOrderNo(orderId);
+                track.setModule(log.module());
+                track.setSubModule(log.subModule());
+                track.setOptType(log.optType().getCode());
+                track.setOptContent(log.description());
+                track.setCompanyId(after.getCompanyId());
+                track.setLicenseNo(carInfo.getLicenseNo());
+                track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+                InsOrderStatusEnum beforeStatus = InsOrderStatusEnum.matchKey(before.getOrderStatus());
+                InsOrderStatusEnum afterStatus = InsOrderStatusEnum.matchKey(after.getOrderStatus());
+                track.setChangeBefore(beforeStatus.getDesc());
+                track.setChangeAfter(afterStatus.getDesc());
+                traceService.save(track);
+            }
+        }
+    }
+
+    /**
+     * 下载电子保单日志
+     * @param orderId
+     * @param result
+     * @param log
+     */
+    private void downloadLog(String orderId, Object result, OrderOperationLog log) throws Throwable {
+        // 定义要提取的字段
+        List<SpElMapping> mappings = List.of(
+                new SpElMapping("msg", "#ret.msg"),
+                new SpElMapping("code", "#ret.code"),
+                new SpElMapping("data", "#ret.data")
+        );
+        // 执行提取
+        Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
+        InsOrders insOrders = orderService.getById(orderId);
+        InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
+        InsOrdersTrack track = new InsOrdersTrack();
+        track.setOrderNo(orderId);
+        track.setModule(log.module());
+        track.setSubModule(log.subModule());
+        track.setOptType(log.optType().getCode());
+        track.setOptContent(log.description());
+        track.setCompanyId(insOrders.getCompanyId());
+        track.setLicenseNo(carInfo.getLicenseNo());
+        if(extracted.get("code").equals("200")){
+            track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+            track.setChangeBefore("电子保单未下载");
+            track.setChangeAfter("电子保单已下载");
+            track.setResult("下载电子保单成功");
+        }else{
+            track.setStatus(QuoteNumberConstant.QuoteResult.FAIL.getCode());
+            track.setChangeBefore("电子保单未下载");
+            track.setChangeAfter("电子保单下载失败");
+            track.setResult("下载电子保单失败");
+        }
+        traceService.save(track);
+    }
+
+
+    /**
+     * 获取支付码日志
+     * @param orderId
+     * @param result
+     * @param log
+     */
+    private void getPamentLog(String orderId, Object result, OrderOperationLog log) throws Throwable {
+        // 定义要提取的字段
+        List<SpElMapping> mappings = List.of(
+                new SpElMapping("msg", "#ret.msg"),
+                new SpElMapping("code", "#ret.code"),
+                new SpElMapping("data", "#ret.data")
+        );
+        // 执行提取
+        Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
+        InsOrders insOrders = orderService.getById(orderId);
+        InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
+        if(extracted.get("code").equals("200")){
+            InsOrdersTrack track = new InsOrdersTrack();
+            track.setOrderNo(orderId);
+            track.setModule(log.module());
+            track.setSubModule(log.subModule());
+            track.setOptType(log.optType().getCode());
+            track.setOptContent(log.description());
+            track.setCompanyId(insOrders.getCompanyId());
+            track.setLicenseNo(carInfo.getLicenseNo());
+            track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+            track.setResult("调用接口获取订单支付码并生成掌柜支付码");
+            traceService.save(track);
+        }
+    }
+
+    /**
+     * 核保日志
+     * @param result
+     * @param log
+     */
+    private void underwritingLog(String orderId, Object result, OrderOperationLog log) throws Throwable {
+        // 定义要提取的字段
+        List<SpElMapping> mappings = List.of(
+                new SpElMapping("msg", "#ret.msg"),
+                new SpElMapping("code", "#ret.code"),
+                new SpElMapping("data", "#ret.data")
+        );
+        // 执行提取
+        Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
+        UnderwritingResultsVo res = JSON.parseObject(extracted.get("data")).toJavaObject(UnderwritingResultsVo.class);
+        InsOrders insOrders = orderService.getById(orderId);
+        InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
+        InsOrdersTrack track = new InsOrdersTrack();
+        track.setOrderNo(orderId);
+        track.setModule(log.module());
+        track.setSubModule(log.subModule());
+        track.setOptType(log.optType().getCode());
+        track.setOptContent(log.description());
+        track.setCompanyId(insOrders.getCompanyId());
+        track.setLicenseNo(carInfo.getLicenseNo());
+        track.setChangeBefore("待核保");
+
+        if(extracted.get("code").equals("200")){
+            track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+            track.setResult("核保通过");
+            track.setChangeAfter(InsOrderStatusEnum.PAY_PENDING.getDesc());
+            traceService.save(track);
+            // 获取支付码轨迹
+            InsOrdersTrack pamentTrack = new InsOrdersTrack();
+            pamentTrack.setOrderNo(orderId);
+            pamentTrack.setModule(log.module());
+            pamentTrack.setSubModule(log.subModule());
+            pamentTrack.setOptType(log.optType().getCode());
+            pamentTrack.setOptContent(log.description());
+            pamentTrack.setCompanyId(insOrders.getCompanyId());
+            pamentTrack.setLicenseNo(carInfo.getLicenseNo());
+            pamentTrack.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+            pamentTrack.setResult("调用接口获取订单支付码并生成掌柜支付码");
+            traceService.save(pamentTrack);
+        }else{
+            track.setStatus(QuoteNumberConstant.QuoteResult.FAIL.getCode());
+            track.setResult(res.getUnderwritingResult());
+            InsOrderStatusEnum orderStatusEnum = InsOrderStatusEnum.matchKey(insOrders.getOrderStatus());
+            track.setChangeAfter(orderStatusEnum.getDesc());
+            traceService.save(track);
+        }
+
+    }
+
+    /**
+     * 创建订单日志
+     *
+     * @param log
+     * @param isExistsMainOrder
+     */
+    private void createLog(Object result, OrderOperationLog log, QuoteVo quoteVo, boolean isExistsMainOrder) throws Throwable {
+
+        // 定义要提取的字段
+        List<SpElMapping> mappings = List.of(
+                new SpElMapping("msg", "#ret.msg"),
+                new SpElMapping("code", "#ret.code"),
+                new SpElMapping("data", "#ret.data")
+        );
+        // 执行提取
+        Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
+        QuoteResultsVo res = JSON.parseObject(extracted.get("data")).toJavaObject(QuoteResultsVo.class);
+        String orderId = res.getOrdersNo();
+        InsOrders insOrders = orderService.getById(orderId);
+        InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
+        if (!isExistsMainOrder) {
+            // 创建订单轨迹
+            InsOrdersTrack track = new InsOrdersTrack();
+            track.setOrderNo(orderId);
+            track.setModule(log.module());
+            track.setSubModule(log.subModule());
+            track.setOptType(log.optType().getCode());
+            track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+            track.setOptContent(log.description());
+            track.setResult(log.description());
+            track.setCompanyId(insOrders.getCompanyId());
+            track.setLicenseNo(carInfo.getLicenseNo());
+            traceService.save(track);
+        }
+        // 报价成功
+        if(res.getQuoteStatusEnum()
+                .equals(InsOrderStatusEnum.WAIT_AUDIT) ){
+            // 报价成功轨迹
+            InsOrdersTrack trackSccess = new InsOrdersTrack();
+            trackSccess.setOrderNo(orderId);
+            trackSccess.setModule(log.module());
+            trackSccess.setSubModule(log.subModule());
+            trackSccess.setOptType(QuoteNumberConstant.QuoteOptType.OPT_TYPE_1.getCode());
+            trackSccess.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+            trackSccess.setOptContent("手动报价");
+            // 组装报价成功返回参数
+            StringBuffer successResult = new StringBuffer();
+            successResult.append(res.getCosts().getSumPremium()+", ");
+            successResult.append("交强(" + res.getCosts().getCiPremium() + "), ");
+            successResult.append("商业(" + res.getCosts().getBiPremium() + "), ");
+            successResult.append("驾意险(" + res.getCosts().getNiPremium() + "), ");
+            successResult.append("车船税(" + res.getCosts().getVvTax() + "); ");
+            trackSccess.setResult(successResult.toString());
+            trackSccess.setCompanyId(insOrders.getCompanyId());
+            trackSccess.setLicenseNo(carInfo.getLicenseNo());
+            trackSccess.setChangeBefore("订单已提交");
+            trackSccess.setChangeAfter(InsOrderStatusEnum.WAIT_AUDIT.getDesc());
+            traceService.save(trackSccess);
+        }else{
+            // 报价失败轨迹
+            InsOrdersTrack trackFail = new InsOrdersTrack();
+            trackFail.setOrderNo(orderId);
+            trackFail.setModule(log.module());
+            trackFail.setSubModule(log.subModule());
+            trackFail.setOptType(QuoteNumberConstant.QuoteOptType.OPT_TYPE_1.getCode());
+            trackFail.setStatus(QuoteNumberConstant.QuoteResult.FAIL.getCode());
+            trackFail.setOptContent("手动报价");
+            trackFail.setResult(res.getErrorMessage());
+            trackFail.setCompanyId(insOrders.getCompanyId());
+            trackFail.setLicenseNo(carInfo.getLicenseNo());
+            trackFail.setChangeBefore("订单已提交");
+            trackFail.setChangeAfter("报价失败");
+            traceService.save(trackFail);
+        }
+    }
+
+    private InsOrders loadBeforeState(String orderId) {
+        return orderService.getById(orderId);
+    }
+
+    private InsOrders loadAfterState(String orderId) {
+        return orderService.getById(orderId);
+    }
+}

+ 49 - 69
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -26,6 +26,7 @@ import com.jzg.commons.constants.quote.enums.base.QuoteRuleCategory;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.quotation.commons.service.QuotationBaseService;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
+import com.jzg.quotation.summary.aop.OrderOperationLog;
 import com.jzg.quotation.summary.constants.QuoteNumberConstant;
 import com.jzg.quotation.summary.classifier.QuoteInfoParameterFilling;
 import com.jzg.quotation.summary.converter.QuoteInfoConverter;
@@ -34,6 +35,7 @@ import com.jzg.quotation.summary.factory.CompanyFactory;
 import com.jzg.quotation.summary.mapper.SysUploadFilesMapper;
 import com.jzg.quotation.summary.service.*;
 import com.jzg.quotation.summary.state.listener.OrderStateListener;
+import com.jzg.quotation.zhongmei.crawler.service.ZhongMeiCrawlerRequest;
 import io.minio.MinioClient;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -124,6 +126,11 @@ public class UnifyOrderManager {
     @Autowired
     private InsOrdersTrackService insOrdersTrackService;
 
+    @Autowired
+    private ZhongMeiCrawlerRequest zhongMeiCrawlerRequest;
+
+
+
 
     private String getSystemCode() {
         //如果是APP登录的话 则传递SystemCode的头部字段
@@ -177,6 +184,14 @@ public class UnifyOrderManager {
      * @param quoteVo
      * @return
      */
+    @OrderOperationLog(
+            module = "车险订单",
+            subModule = "订单详情",
+            optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_0,
+            description = "订单创建",
+            orderSpEl = "#QuoteVo",
+            feedbackSpEl = "#ret.code + ' - ' + #ret.msg+ ' - ' + #ret.data"
+    )
     @Operation(summary = "统一报价")
     @PostMapping("/quote")
     public HttpResult quote(@RequestBody QuoteVo quoteVo) throws Exception {
@@ -224,38 +239,21 @@ public class UnifyOrderManager {
         quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
         quoteResultsVo.setQuoteStatus(quoteResultsVo.getQuoteStatusEnum().getCode());
         quoteResultsVo.setOrdersNo(ordersNo);
-
-        // 报价轨迹
-        String optContent = baseController.getUserName() + "提交了报价";
-        // 获取报价结果
-        String result = "";
-        if (quoteResultsVo.getQuoteStatus().equals(InsOrderStatusEnum.WAIT_AUDIT.getCode())) {
-            // 报价成功订单轨迹返回结果
-            result = "总保费:" + quoteResultsVo.getCosts().getSumPremium() + ",交强险:" + quoteResultsVo.getCosts().getCiPremium()
-                    + ",商业险:" + quoteResultsVo.getCosts().getBiPremium() +",驾意险:"+ quoteResultsVo.getCosts().getNiPremium()
-                    + ",车船税:" + quoteResultsVo.getCosts().getVvTax();
-        } else {
-            // 报价失败订单轨迹返回结果
-            result = quoteResultsVo.getErrorMessage();
-        }
-        InsOrdersTrack track = new InsOrdersTrack(ordersNo,
-                quoteVo.getOrder().getInsuranceCompanyCode(),
-                quoteVo.getCarInfoVo().getLicenseNo(),
-                quoteResultsVo.getQuoteStatus().equals(InsOrderStatusEnum.WAIT_AUDIT.getCode())
-                        ? QuoteNumberConstant.QuoteResult.SUCCESS.getCode()
-                        : QuoteNumberConstant.QuoteResult.FAIL.getCode(),
-                QuoteNumberConstant.QuoteOptType.OPT_TYPE_1.getCode(),
-                optContent,
-                result
-        );
-        insOrdersTrackService.save(track);
         // 报价后更新订单
         insOrdersService.orderAfterUpdateQuote(ordersNo, quoteResultsVo);
         return quoteResultsVo.getQuoteStatusEnum()
-                .equals(InsOrderStatusEnum.WAIT_AUDIT) ? HttpResult.ok(quoteResultsVo) : HttpResult.error(quoteResultsVo.getErrorMessage());
+                .equals(InsOrderStatusEnum.WAIT_AUDIT) ? HttpResult.ok(quoteResultsVo) : HttpResult.error(quoteResultsVo);
     }
 
 
+    @OrderOperationLog(
+            module = "车险订单",
+            subModule = "订单详情",
+            optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_5,
+            description = "订单状态",
+            orderSpEl = "#UnderwritingVo",
+            feedbackSpEl = "#ret.code + ' - ' + #ret.msg+ ' - ' + #ret.data"
+    )
     @Operation(summary = "统一核保")
     @PostMapping("/underwriting")
     public HttpResult underwriting(@RequestBody UnderwritingVo underwritingVo) throws Exception {
@@ -295,16 +293,6 @@ public class UnifyOrderManager {
         insOrdersService.orderAfterUpdateUnderwriting(underwritingResultsVo);
 
         if (underwritingResultsVo.getUnderwritingStatus().equals(InsOrderStatusEnum.PAY_PENDING)) {
-            // 核保轨迹
-            String optContent = baseController.getUserName() + "提交了核保";
-            InsOrdersTrack track = new InsOrdersTrack(insOrders.getId(),
-                    insOrders.getCompanyId(),
-                    insOrdersCarInfo.getLicenseNo(),
-                    QuoteNumberConstant.QuoteResult.SUCCESS.getCode(),
-                    QuoteNumberConstant.QuoteOptType.OPT_TYPE_5.getCode(),
-                    optContent,"核保成功"
-            );
-            insOrdersTrackService.save(track);
             // 发送订单状态变更消息
             insOrdersService.orderStatusMessage(insOrders,
                     insOrdersCarInfo,insOrdersCosts,
@@ -321,17 +309,6 @@ public class UnifyOrderManager {
                         insOrdersCarInfo,insOrdersCosts,
                         baseController.getToken(), MessageCodeEnum.TEMPLATE_4);
             }
-            // 核保轨迹
-            String optContent = baseController.getUserName() + "提交了核保";
-            InsOrdersTrack track = new InsOrdersTrack(insOrders.getId(),
-                    insOrders.getCompanyId(),
-                    insOrdersCarInfo.getLicenseNo(),
-                    QuoteNumberConstant.QuoteResult.FAIL.getCode(),
-                    QuoteNumberConstant.QuoteOptType.OPT_TYPE_5.getCode(),
-                    optContent,
-                    underwritingResultsVo.getUnderwritingResult()
-            );
-            insOrdersTrackService.save(track);
             throw new SystemException(underwritingResultsVo.getUnderwritingResult());
         }
     }
@@ -343,6 +320,14 @@ public class UnifyOrderManager {
      * @return
      * @throws JsonProcessingException
      */
+    @OrderOperationLog(
+            module = "车险订单",
+            subModule = "订单详情",
+            optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_6,
+            description = "生成支付码",
+            orderSpEl = "#PaymentLinkVo",
+            feedbackSpEl = "#ret.code + ' - ' + #ret.msg+ ' - ' + #ret.data"
+    )
     @Operation(summary = "获取支付链接")
     @PostMapping("/getPaymentLink")
     public HttpResult getPaymentLink(@RequestBody PaymentLinkVo paymentLinkVo) throws Exception {
@@ -368,17 +353,6 @@ public class UnifyOrderManager {
         insOrders.setPayLink(paymentLinkResultsVo.getPaymentLink());
         insOrdersService.updateById(insOrders);
         insOrdersQrcodeService.saveQrCode(insOrders);
-
-        // 获取支付链接轨迹
-        String optContent = baseController.getUserName() + "请求获取支付码";
-        InsOrdersTrack track = new InsOrdersTrack(insOrders.getId(),
-                insOrders.getCompanyId(),
-                insOrdersCarInfo.getLicenseNo(),
-                QuoteNumberConstant.QuoteResult.SUCCESS.getCode(),
-                QuoteNumberConstant.QuoteOptType.OPT_TYPE_6.getCode(),
-                optContent,null
-        );
-        insOrdersTrackService.save(track);
         return HttpResult.ok("");
     }
 
@@ -408,6 +382,15 @@ public class UnifyOrderManager {
         return HttpResult.ok();
     }
 
+
+    @OrderOperationLog(
+            module = "车险订单",
+            subModule = "订单详情",
+            optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_9,
+            description = "更新订单",
+            orderSpEl = "#OrderStatusVo",
+            feedbackSpEl = "#ret.code + ' - ' + #ret.msg+ ' - ' + #ret.data"
+    )
     @Operation(summary = "获取订单状态")
     @PostMapping("/getOrderStatus")
     public HttpResult getOrderStatus(@RequestBody OrderStatusVo orderStatusVo) throws Exception {
@@ -432,7 +415,14 @@ public class UnifyOrderManager {
         return HttpResult.ok("状态刷新成功");
     }
 
-
+    @OrderOperationLog(
+            module = "车险订单",
+            subModule = "订单详情",
+            optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_8,
+            description = "下载电子保单",
+            orderSpEl = "#DownloadPolicyVo",
+            feedbackSpEl = "#ret.code + ' - ' + #ret.msg+ ' - ' + #ret.data"
+    )
     @Operation(summary = "获取保单")
     @PostMapping("/downloadPolicy")
     public HttpResult downloadPolicy(@RequestBody DownloadPolicyVo downloadPolicyVo) throws IOException {
@@ -496,16 +486,6 @@ public class UnifyOrderManager {
         insOrdersService.orderStatusMessage(insOrders,
                 carInfo,costs,
                 baseController.getToken(), MessageCodeEnum.TEMPLATE_7);
-        // 下载保单轨迹
-        String optContent = baseController.getUserName() + "请求下载电子保单";
-        InsOrdersTrack track = new InsOrdersTrack(insOrders.getId(),
-                insOrders.getCompanyId(),
-                carInfo.getLicenseNo(),
-                QuoteNumberConstant.QuoteResult.SUCCESS.getCode(),
-                QuoteNumberConstant.QuoteOptType.OPT_TYPE_8.getCode(),
-                optContent,null
-        );
-        insOrdersTrackService.save(track);
         return HttpResult.ok(insOrdersPdfUrl);
     }
 }

+ 3 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarInfoService.java

@@ -6,8 +6,6 @@ import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 
-import java.time.format.DateTimeFormatter;
-
 public interface InsOrdersCarInfoService extends IService<InsOrdersCarInfo> {
     InsOrdersCarInfo createCarInfo(InsOrders insOrders, CarInfoVo carInfoVo);
 
@@ -15,11 +13,13 @@ public interface InsOrdersCarInfoService extends IService<InsOrdersCarInfo> {
 
     /**
      * 更新主订单车辆信息
+     *
      * @param carInfoVo
      * @param insOrdersCarInfo
+     * @param insOrders
      * @return
      */
-    InsOrdersCarInfo updateMainOrderCarInfo(CarInfoVo carInfoVo, InsOrdersCarInfo insOrdersCarInfo);
+    InsOrdersCarInfo updateMainOrderCarInfo(CarInfoVo carInfoVo, InsOrdersCarInfo insOrdersCarInfo, InsOrders insOrders);
 
     /**
      * 获取车辆档案信息

+ 5 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarUserInfoService.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.summary.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
 
@@ -16,9 +17,12 @@ public interface InsOrdersCarUserInfoService extends IService<InsOrdersCarUserIn
 
     /**
      * 更新主订单人员信息
+     *
      * @param insOrdersCarUserInfoList 主订单人员信息
      * @param subOrdersCarUserInfoList 子订单人员信息
+     * @param carInfo
+     * @param insOrders
      * @return
      */
-    List<InsOrdersCarUserInfo> updateMainOrderCarUserInfo(List<InsOrdersCarUserInfo> insOrdersCarUserInfoList, List<InsOrdersCarUserInfo> subOrdersCarUserInfoList);
+    List<InsOrdersCarUserInfo> updateMainOrderCarUserInfo(List<InsOrdersCarUserInfo> insOrdersCarUserInfoList, List<InsOrdersCarUserInfo> subOrdersCarUserInfoList, InsOrdersCarInfo carInfo, InsOrders insOrders);
 }

+ 3 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersKindService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.summary.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersKind;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 
@@ -14,9 +15,10 @@ public interface InsOrdersKindService extends IService<InsOrdersKind> {
 
     /**
      * 更新主订单险种信息
+     *
      * @param subKindInfoVo
      * @param mainOrderNo
      */
-    void updateMainKind(List<KindInfoVo> subKindInfoVo,String mainOrderNo);
+    List<InsOrdersKind> updateMainKind(List<KindInfoVo> subKindInfoVo, String mainOrderNo);
 
 }

+ 5 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersTaxService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.summary.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersTax;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 
@@ -11,9 +12,11 @@ public interface InsOrdersTaxService extends IService<InsOrdersTax> {
 
     /**
      * 更新主订单的税费信息
-     * @param insOrders
+     *
      * @param quoteVo
+     * @param carInfo
+     * @param insOrders
      */
-    void updateMainTax(QuoteVo quoteVo, String mainOrderNo);
+    void updateMainTax(QuoteVo quoteVo, String mainOrderNo, InsOrdersCarInfo carInfo, InsOrders insOrders);
 
 }

+ 28 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarInfoServiceImpl.java

@@ -1,17 +1,24 @@
 package com.jzg.quotation.summary.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersTrack;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.util.comparble.DiffResult;
+import com.jzg.commons.util.comparble.DiffUtils;
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
 import com.jzg.quotation.summary.mapper.InsOrdersCarInfoMapper;
 import com.jzg.quotation.summary.service.InsOrdersCarInfoService;
 import com.jzg.quotation.summary.service.InsOrdersCarUserInfoService;
+import com.jzg.quotation.summary.service.InsOrdersTrackService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -27,6 +34,9 @@ public class InsOrdersCarInfoServiceImpl extends ServiceImpl<InsOrdersCarInfoMap
     @Autowired
     InsOrdersCarUserInfoService insOrdersCarUserInfoService;
 
+    @Autowired
+    InsOrdersTrackService trackService;
+
     @Override
     public InsOrdersCarInfo createCarInfo(InsOrders insOrders, CarInfoVo carInfoVo) {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -75,7 +85,10 @@ public class InsOrdersCarInfoServiceImpl extends ServiceImpl<InsOrdersCarInfoMap
     }
 
     @Override
-    public InsOrdersCarInfo updateMainOrderCarInfo(CarInfoVo carInfoVo, InsOrdersCarInfo insOrdersCarInfo) {
+    public InsOrdersCarInfo updateMainOrderCarInfo(CarInfoVo carInfoVo, InsOrdersCarInfo insOrdersCarInfo, InsOrders insOrders) {
+
+        InsOrdersCarInfo oldCarInfo = new InsOrdersCarInfo();
+        BeanUtils.copyProperties(insOrdersCarInfo, oldCarInfo);
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
         insOrdersCarInfo.setOrderNo(insOrdersCarInfo.getOrderNo());
@@ -112,6 +125,20 @@ public class InsOrdersCarInfoServiceImpl extends ServiceImpl<InsOrdersCarInfoMap
         }
         insOrdersCarInfo.setTransferBi(Integer.parseInt(carInfoVo.isBiTransfer() ? "1" : "0"));
         this.updateById(insOrdersCarInfo);
+
+        // 字段比对
+        List<DiffResult> diffResultList = DiffUtils.diff(oldCarInfo, insOrdersCarInfo);
+        InsOrdersTrack track = new InsOrdersTrack();
+        track.setOrderNo(insOrdersCarInfo.getOrderNo());
+        track.setModule("车险订单");
+        track.setSubModule("订单详情");
+        track.setLicenseNo(insOrdersCarInfo.getLicenseNo());
+        track.setCompanyId(insOrders.getCompanyId());
+        track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+        track.setOptType(QuoteNumberConstant.QuoteOptType.OPT_TYPE_10.getCode());
+        track.setOptContent("车辆信息");
+        track.setResult(JSON.toJSONString(diffResultList));
+        trackService.save(track);
         return insOrdersCarInfo;
     }
 

+ 41 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarUserInfoServiceImpl.java

@@ -1,27 +1,43 @@
 package com.jzg.quotation.summary.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersTrack;
+import com.jzg.commons.util.comparble.DiffResult;
+import com.jzg.commons.util.comparble.DiffUtils;
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
 import com.jzg.quotation.summary.mapper.InsOrdersCarUserInfoMapper;
 import com.jzg.quotation.summary.service.InsOrdersCarUserInfoService;
+import com.jzg.quotation.summary.service.InsOrdersTrackService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
 public class InsOrdersCarUserInfoServiceImpl extends ServiceImpl<InsOrdersCarUserInfoMapper, InsOrdersCarUserInfo> implements InsOrdersCarUserInfoService {
+
+    @Autowired
+    InsOrdersTrackService trackService;
+
     @Override
     public void deleteOrderNo(Long orderNo) {
         baseMapper.deleteOrderNo(orderNo);
     }
 
     @Override
-    public List<InsOrdersCarUserInfo> updateMainOrderCarUserInfo(List<InsOrdersCarUserInfo> insOrdersCarUserInfoList, List<InsOrdersCarUserInfo> subOrdersCarUserInfoList) {
+    public List<InsOrdersCarUserInfo> updateMainOrderCarUserInfo(List<InsOrdersCarUserInfo> insOrdersCarUserInfoList, List<InsOrdersCarUserInfo> subOrdersCarUserInfoList, InsOrdersCarInfo carInfo, InsOrders insOrders) {
+        List<InsOrdersTrack> tracks = new ArrayList<>();
         for (InsOrdersCarUserInfo carUserInfo: insOrdersCarUserInfoList) {
+
+            InsOrdersCarUserInfo oldCarUserInfo = new InsOrdersCarUserInfo();
+            BeanUtils.copyProperties(carUserInfo, oldCarUserInfo);
             InsOrdersCarUserInfo insOrdersCarUserInfo = subOrdersCarUserInfoList.stream().filter(x -> x.getPolicyPersonType().equals(carUserInfo.getPolicyPersonType())).findFirst().get();
             carUserInfo.setPersonType(insOrdersCarUserInfo.getPersonType());
             carUserInfo.setName(insOrdersCarUserInfo.getName());
@@ -45,8 +61,30 @@ public class InsOrdersCarUserInfoServiceImpl extends ServiceImpl<InsOrdersCarUse
                 carUserInfo.setCityCode(insOrdersCarUserInfo.getCityCode());
                 carUserInfo.setCountyCode(insOrdersCarUserInfo.getCountyCode());
             }
+
+            // 字段比对
+            List<DiffResult> diffResultList = DiffUtils.diff(oldCarUserInfo, carUserInfo);
+            InsOrdersTrack track = new InsOrdersTrack();
+            track.setOrderNo(carUserInfo.getOrderNo());
+            track.setModule("车险订单");
+            track.setSubModule("订单详情");
+            track.setLicenseNo(carInfo.getLicenseNo());
+            track.setCompanyId(insOrders.getCompanyId());
+            track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+            track.setOptType(QuoteNumberConstant.QuoteOptType.OPT_TYPE_10.getCode());
+            if(carUserInfo.getPolicyPersonType().equals(1)){
+                track.setOptContent("车主信息");
+            }else if(carUserInfo.getPolicyPersonType().equals(2)){
+                track.setOptContent("投保人信息");
+            } else{
+                track.setOptContent("被保人信息");
+            }
+            track.setResult(JSON.toJSONString(diffResultList));
+            tracks.add(track);
         }
         this.updateBatchById(insOrdersCarUserInfoList);
+        trackService.saveBatch(tracks);
+
         return insOrdersCarUserInfoList;
     }
 

+ 15 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersKindServiceImpl.java

@@ -1,13 +1,24 @@
 package com.jzg.quotation.summary.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersKind;
+import com.jzg.commons.entity.orders.po.InsOrdersTrack;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
+import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.util.StringUtils;
+import com.jzg.commons.util.comparble.DiffResult;
+import com.jzg.commons.util.comparble.DiffUtils;
+import com.jzg.commons.util.comparble.ListDiffUtil;
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
 import com.jzg.quotation.summary.mapper.InsOrdersKindMapper;
 import com.jzg.quotation.summary.service.InsOrdersKindService;
+import com.jzg.quotation.summary.service.InsOrdersTrackService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -17,6 +28,7 @@ import java.util.Objects;
 
 @Service
 public class InsOrdersKindServiceImpl extends ServiceImpl<InsOrdersKindMapper, InsOrdersKind> implements InsOrdersKindService {
+
     @Override
     public void createKind(InsOrders insOrders, List<KindInfoVo> kindInfoVo, String companyCode) {
         List<InsOrdersKind> insOrdersKinds = new ArrayList<>();
@@ -50,7 +62,7 @@ public class InsOrdersKindServiceImpl extends ServiceImpl<InsOrdersKindMapper, I
     }
 
     @Override
-    public void updateMainKind(List<KindInfoVo> subKindInfoVo,String mainOrderNo) {
+    public List<InsOrdersKind> updateMainKind(List<KindInfoVo> subKindInfoVo, String mainOrderNo) {
         // 先删除主订单险种信息
         this.deleteOrderNo(Long.parseLong(mainOrderNo));
         List<InsOrdersKind> insOrdersKinds = new ArrayList<>();
@@ -76,5 +88,7 @@ public class InsOrdersKindServiceImpl extends ServiceImpl<InsOrdersKindMapper, I
             }
             this.saveBatch(insOrdersKinds);
         }
+        return insOrdersKinds;
     }
+
 }

+ 4 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersRiskServiceImpl.java

@@ -49,6 +49,9 @@ public class InsOrdersRiskServiceImpl extends ServiceImpl<InsOrdersRiskMapper, I
 
     @Override
     public void updateMainRisk(RiskInfoVo ciRiskInfoVo, RiskInfoVo biRiskInfoVo,String mainOrderNo) {
+
+        // 获取原来的报价方案
+        List<InsOrdersRisk> oldRiskList = this.getById(mainOrderNo);
         // 先删除 再新增
         this.deleteOrderNo(Long.parseLong(mainOrderNo));
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -72,6 +75,7 @@ public class InsOrdersRiskServiceImpl extends ServiceImpl<InsOrdersRiskMapper, I
             insOrdersRiskList.add(biInsOrdersRisk);
         }
         this.saveBatch(insOrdersRiskList);
+
     }
 
     @Override

+ 31 - 27
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -112,6 +113,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     @Autowired
     private InsOrdersCarInfoService insOrdersCarInfoService;
 
+    @Autowired
+    private InsOrdersTrackService trackService;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -785,17 +789,6 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         // 保存订单车船税税信息 ins_orders_tax
         insOrdersTaxService.createTax(insOrders,quoteVo);
 
-        // 创建订单轨迹
-        String optContent = baseController.getUserName() + "创建了订单";
-        InsOrdersTrack track = new InsOrdersTrack(insOrders.getId(),
-                insOrders.getCompanyId(),
-                carInfo.getLicenseNo(),
-                QuoteNumberConstant.QuoteResult.SUCCESS.getCode(),
-                QuoteNumberConstant.QuoteOptType.OPT_TYPE_0.getCode(),
-                optContent,
-                null
-        );
-        insOrdersTrackService.save(track);
         return insOrders.getId();
     }
 
@@ -806,6 +799,12 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
      */
     private String updateMainOrders(QuoteVo quoteVo,String mainOrderNo, String companyName){
         InsOrders insOrders = this.getById(mainOrderNo);
+
+        // 轨迹赋值
+        InsOrdersVo oldOrder = new InsOrdersVo();
+        oldOrder.setProductId(insOrders.getProductId());
+        oldOrder.setProductName(insOrders.getProductName());
+
         insOrders.setQuoteNo(quoteVo.getOrder().getQuoteNo());
         insOrders.setAgreementId(quoteVo.getOrder().getAgreementId());
         insOrders.setOrderStatus(InsOrderStatusEnum.QUOTE_ING.getCode()); // 订单状态 报价中
@@ -822,10 +821,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrders.setRealQuoteUserId(quoteVo.getOrder().getRealQuoteUserId());
         }
         this.updateById(insOrders);
-
+        // 轨迹赋值
+        InsOrdersVo newOrder = new InsOrdersVo();
+        newOrder.setProductId(insOrders.getProductId());
+        newOrder.setProductName(insOrders.getProductName());
         // 更新主订单车辆信息
         InsOrdersCarInfo carInfo = ordersCarInfoService.getById(mainOrderNo);
-        ordersCarInfoService.updateMainOrderCarInfo(quoteVo.getCarInfoVo(), carInfo);
+        ordersCarInfoService.updateMainOrderCarInfo(quoteVo.getCarInfoVo(), carInfo,insOrders);
 
         // 更新主订单用户信息
         List<InsOrdersCarUserInfo> subOrdersCarUserInfoList = new ArrayList<>();
@@ -837,14 +839,26 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         subOrdersCarUserInfoList.add(new InsOrdersCarUserInfo(quoteVo.getPolicyHolderInfo(), insOrders.getId(),2));
         // 添加被保险人信息
         subOrdersCarUserInfoList.add(new InsOrdersCarUserInfo(quoteVo.getInsuredPersonInfo(), insOrders.getId(),3));
-        ordersCarUserInfoService.updateMainOrderCarUserInfo(insOrdersCarUserInfoList, subOrdersCarUserInfoList);
+        ordersCarUserInfoService.updateMainOrderCarUserInfo(insOrdersCarUserInfoList, subOrdersCarUserInfoList,carInfo,insOrders);
 
         // 更新订单费用信息 ins_orders_costs
         insOrdersCostsService.updateMainCosts(insOrders);
 
+        // 轨迹赋值
+        LambdaQueryWrapper<InsOrdersKind> kindWrapper = new LambdaQueryWrapper<>();
+        kindWrapper.eq(InsOrdersKind::getOrderNo, mainOrderNo);
+        List<InsOrdersKind> oldKinds = insOrdersKindService.list(kindWrapper);
+        oldOrder.setInsOrdersKindList(oldKinds);
         // 更新订单险种信息 ins_orders_kind
-        insOrdersKindService.updateMainKind(quoteVo.getKindInfoVo(), mainOrderNo);
-
+        List<InsOrdersKind> newKinds = insOrdersKindService.updateMainKind(quoteVo.getKindInfoVo(), mainOrderNo);
+        // 轨迹赋值
+        newOrder.setInsOrdersKindList(newKinds);
+
+        InsOrdersTrack track = new InsOrdersTrack(JSON.toJSONString(oldOrder),
+                JSON.toJSONString(newOrder),
+                carInfo,
+                insOrders);
+        trackService.save(track);
         // 在报价的时候更新其他信息
         // 更新订单其他信息 ins_orders_other
 //        insOrdersOtherService.createOther(insOrders);
@@ -856,7 +870,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         insOrdersRiskService.updateMainRisk(quoteVo.getCiRiskInfoVo(),quoteVo.getBiRiskInfoVo(), mainOrderNo);
 
         // 保存订单车船税税信息 ins_orders_tax
-        insOrdersTaxService.updateMainTax(quoteVo, mainOrderNo);
+        insOrdersTaxService.updateMainTax(quoteVo, mainOrderNo,carInfo,insOrders);
         return mainOrderNo;
     }
 
@@ -919,16 +933,6 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         InsOrdersCosts costs = insOrdersCostsService.getById(insOrders.getId());
         //设置订单状态
         StateResult stateResult = orderStateListener.statusChange(orderStatusResultVo.getOrderStatus(), insOrders.getOrderStatus());
-        // 同步订单轨迹
-        String optContent = baseController.getUserName() + "将订单状态由" +insOrders.getOrderStatus()+ "更新为" +stateResult.getCurrentState();
-        InsOrdersTrack track = new InsOrdersTrack(insOrders.getId(),
-                insOrders.getCompanyId(),
-                insOrdersCarInfo.getLicenseNo(),
-                QuoteNumberConstant.QuoteResult.SUCCESS.getCode(),
-                QuoteNumberConstant.QuoteOptType.OPT_TYPE_9.getCode(),
-                optContent,null
-        );
-        insOrdersTrackService.save(track);
         insOrders.setOrderStatus(String.valueOf(stateResult.getCurrentState()));
 
         //更新保单号

+ 31 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersTaxServiceImpl.java

@@ -1,16 +1,30 @@
 package com.jzg.quotation.summary.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersTax;
+import com.jzg.commons.entity.orders.po.InsOrdersTrack;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.util.comparble.DiffResult;
+import com.jzg.commons.util.comparble.DiffUtils;
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
 import com.jzg.quotation.summary.mapper.InsOrdersTaxMapper;
 import com.jzg.quotation.summary.service.InsOrdersTaxService;
+import com.jzg.quotation.summary.service.InsOrdersTrackService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class InsOrdersTaxServiceImpl extends ServiceImpl<InsOrdersTaxMapper, InsOrdersTax> implements InsOrdersTaxService {
 
+    @Autowired
+    InsOrdersTrackService trackService;
+
     @Override
     public void createTax(InsOrders insOrders, QuoteVo quoteVo) {
         InsOrdersTax insOrdersTax = new InsOrdersTax();
@@ -20,10 +34,26 @@ public class InsOrdersTaxServiceImpl extends ServiceImpl<InsOrdersTaxMapper, Ins
     }
 
     @Override
-    public void updateMainTax(QuoteVo quoteVo, String mainOrderNo) {
+    public void updateMainTax(QuoteVo quoteVo, String mainOrderNo, InsOrdersCarInfo carInfo, InsOrders insOrders) {
         InsOrdersTax mainOrderTax = this.getById(mainOrderNo);
+        InsOrdersTax oldTax = new InsOrdersTax();
+        BeanUtils.copyProperties(mainOrderTax, oldTax);
         mainOrderTax.setTaxRelifFlag(Integer.parseInt(quoteVo.getVehicleAndVesselTaxVo().getTaxRelifFlag()));
         this.updateById(mainOrderTax);
+
+        // 字段比对
+        List<DiffResult> diffResultList = DiffUtils.diff(oldTax, mainOrderTax);
+        InsOrdersTrack track = new InsOrdersTrack();
+        track.setOrderNo(mainOrderNo);
+        track.setModule("车险订单");
+        track.setSubModule("订单详情");
+        track.setLicenseNo(carInfo.getLicenseNo());
+        track.setCompanyId(insOrders.getCompanyId());
+        track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
+        track.setOptType(QuoteNumberConstant.QuoteOptType.OPT_TYPE_10.getCode());
+        track.setOptContent("车船税");
+        track.setResult(JSON.toJSONString(diffResultList));
+        trackService.save(track);
     }
 
 }