xuqiang 1 год назад
Родитель
Сommit
99d7611cfa
19 измененных файлов с 1537 добавлено и 0 удалено
  1. 39 0
      commons/src/main/java/com/jzg/commons/async/AsyncFactory.java
  2. 60 0
      commons/src/main/java/com/jzg/commons/async/AsyncManager.java
  3. 62 0
      commons/src/main/java/com/jzg/commons/config/ThreadPoolConfig.java
  4. 44 0
      commons/src/main/java/com/jzg/commons/constants/Crud.java
  5. 29 0
      commons/src/main/java/com/jzg/commons/entity/dto/LogParam.java
  6. 570 0
      commons/src/main/java/com/jzg/commons/entity/log/InsOrdersLogVo.java
  7. 32 0
      commons/src/main/java/com/jzg/commons/entity/vo/ImagesVo.java
  8. 51 0
      commons/src/main/java/com/jzg/commons/util/SchemaAnnotationUtils.java
  9. 94 0
      commons/src/main/java/com/jzg/commons/util/Threads.java
  10. 39 0
      commons/src/main/java/com/jzg/commons/util/comparble/CompareResult.java
  11. 151 0
      commons/src/main/java/com/jzg/commons/util/comparble/CompatibleUtils.java
  12. 27 0
      commons/src/main/java/com/jzg/commons/util/comparble/EnumDataChangeHandedType.java
  13. 34 0
      platform/src/main/java/com/jzg/controller/OperatorTrajectoryController.java
  14. 34 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/orders/InsOrdersEnd.java
  15. 10 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersCostsMapper.java
  16. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCostsService.java
  17. 11 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCostsServiceImpl.java
  18. 35 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsTaskImagesMapper.xml
  19. 208 0
      tenant/insurance/quotation-yongcheng/dependency-reduced-pom.xml

+ 39 - 0
commons/src/main/java/com/jzg/commons/async/AsyncFactory.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.async;
+
+import com.jzg.commons.entity.po.OperatorTrajectory;
+import com.jzg.commons.service.OperatorTrajectoryService;
+import com.jzg.commons.util.spring.SpringUtils;
+
+import java.util.TimerTask;
+
+public class AsyncFactory {
+
+    /**
+     * 记录操作日志
+     * @param operatorTrajectory 日志信息
+     * @return 任务task
+     */
+    public static TimerTask saveRecord(OperatorTrajectory operatorTrajectory) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                // 找到日志服务bean,进行日志持久化操作
+                SpringUtils.getBean(OperatorTrajectoryService.class).save(operatorTrajectory);
+            }
+        };
+    }
+
+
+
+    public static TimerTask deleteById(String id,String systemCode) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                // 找到日志服务bean,进行日志持久化操作
+                SpringUtils.getBean(OperatorTrajectoryService.class).deleteById(id,systemCode);
+            }
+        };
+    }
+
+
+}

+ 60 - 0
commons/src/main/java/com/jzg/commons/async/AsyncManager.java

@@ -0,0 +1,60 @@
+package com.jzg.commons.async;
+
+import com.jzg.commons.util.Threads;
+import com.jzg.commons.util.spring.SpringUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.TimerTask;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+
+@Slf4j
+public class AsyncManager {
+
+
+    /**
+     * 操作延迟10毫秒
+     */
+    private final int OPERATE_DELAY_TIME = 10;
+
+
+
+    /**
+     * 单例模式,确保类只有一个实例
+     */
+    private AsyncManager() {
+    }
+
+    /**
+     * 饿汉式,在类加载的时候立刻进行实例化
+     */
+    private static final AsyncManager INSTANCE = new AsyncManager();
+
+    public static AsyncManager getInstance() {
+        return INSTANCE;
+    }
+
+    /**
+     * 异步操作任务调度线程池
+     */
+    private final ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
+
+    /**
+     * 执行任务
+     *
+     * @param task 任务
+     */
+    public void execute(TimerTask task) {
+        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * 停止任务线程池
+     */
+    public void shutdown() {
+        Threads.shutdownAndAwaitTermination(executor);
+    }
+
+
+}

+ 62 - 0
commons/src/main/java/com/jzg/commons/config/ThreadPoolConfig.java

@@ -0,0 +1,62 @@
+package com.jzg.commons.config;
+
+import com.jzg.commons.util.Threads;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 线程池配置
+ **/
+@Configuration
+public class ThreadPoolConfig
+{
+    // 核心线程池大小
+    private int corePoolSize = 50;
+
+    // 最大可创建的线程数
+    private int maxPoolSize = 200;
+
+    // 队列最大长度
+    private int queueCapacity = 1000;
+
+    // 线程池维护线程所允许的空闲时间
+    private int keepAliveSeconds = 300;
+
+    @Bean(name = "threadPoolTaskExecutor")
+    public ThreadPoolTaskExecutor threadPoolTaskExecutor()
+    {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setMaxPoolSize(maxPoolSize);
+        executor.setCorePoolSize(corePoolSize);
+        executor.setQueueCapacity(queueCapacity);
+        executor.setKeepAliveSeconds(keepAliveSeconds);
+        // 线程池对拒绝任务(无线程可用)的处理策略
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        return executor;
+    }
+
+    /**
+     * 执行周期性或定时任务
+     */
+    @Bean(name = "scheduledExecutorService")
+    protected ScheduledExecutorService scheduledExecutorService()
+    {
+        return new ScheduledThreadPoolExecutor(corePoolSize,
+                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
+                new ThreadPoolExecutor.CallerRunsPolicy())
+        {
+            @Override
+            protected void afterExecute(Runnable r, Throwable t)
+            {
+                super.afterExecute(r, t);
+                Threads.printException(r, t);
+            }
+        };
+    }
+}

+ 44 - 0
commons/src/main/java/com/jzg/commons/constants/Crud.java

@@ -0,0 +1,44 @@
+package com.jzg.commons.constants;
+
+import com.jzg.commons.util.StringUtils;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Getter
+@AllArgsConstructor
+public enum Crud {
+
+
+    C("C", "添加"),
+    R("R", "查询"),
+    U("U", "变更"),
+    D("D", "删除");
+
+    private final String code;
+    private final String name;
+
+    private static final Map<String, String> CODE_TO_NAME_MAP;
+
+    static {
+        CODE_TO_NAME_MAP = Arrays.stream(Crud.values())
+                .collect(Collectors.toMap(Crud::getCode, Crud::getName));
+    }
+
+    /**
+     * 根据 code 获取对应的 name
+     * @param code 输入的 code
+     * @return 对应的 name,如果未找到则返回 null
+     */
+    public static String getNameByCode(String code) {
+        if (StringUtils.isEmpty(code)) {
+            return null;
+        }
+        return CODE_TO_NAME_MAP.get(code);
+    }
+
+
+}

+ 29 - 0
commons/src/main/java/com/jzg/commons/entity/dto/LogParam.java

@@ -0,0 +1,29 @@
+package com.jzg.commons.entity.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+@Schema(description = "日志参数")
+public class LogParam extends PageRequest {
+
+    @Schema(description = "操作人")
+    private String operator;
+
+    @Schema(description = "操作时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private List<LocalDate> operatingTime;
+
+    @Schema(description = "操作功能")
+    private String function;
+
+    @Schema(description = "操作内容")
+    private String content;
+
+}

+ 570 - 0
commons/src/main/java/com/jzg/commons/entity/log/InsOrdersLogVo.java

@@ -0,0 +1,570 @@
+package com.jzg.commons.entity.log;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+@Data
+public class InsOrdersLogVo {
+
+    @Schema(description = "报价订单号")
+    private Long quoteNo;
+
+    @Schema(description = "协议ID")
+    private String agreementId;
+
+    @Schema(description = "请求类型")
+    private String apiType;
+
+    @Schema(description = "订单状态")
+    private String orderStatus;
+
+    @Schema(description = "保司ID")
+    private String companyId;
+
+    @Schema(description = "保司名称")
+    private String companyName;
+
+    @Schema(description = "产品ID")
+    private String productId;
+
+    @Schema(description = "产品名称")
+    private String productName;
+
+    @Schema(description = "录入状态 1 车险录入 2 待客录单 3 外部订单")
+    private Integer entryStatus;
+
+    @Schema(description = "订单来源 0 pc  1 app")
+    private Integer orderSource;
+
+    @Schema(description = "核保人ID")
+    private String auditId;
+
+    @Schema(description = "核保人姓名")
+    private String auditName;
+
+    @Schema(description = "核保时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime auditTime;
+
+    @Schema(description = "核保意见")
+    private String auditOpinion;
+
+    @Schema(description = "支付时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime payTime;
+
+    @Schema(description = "支付链接")
+    private String payLink;
+
+    @Schema(description = "保险公司订单号")
+    private String insOrderNo;
+
+    @Schema(description = "签单时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate signingTime;
+
+    @Schema(description = "是否暂存0-保存;1-暂存")
+    private byte isTemporarily;
+
+    @Schema(description = "审核状态0-待审核;1-已审核;2-已驳回")
+    private byte auditStatus;
+
+    @Schema(description = "审核意见")
+    private String auditComments;
+
+
+    @Schema(description = "评分")
+    private String scope;
+
+    @Schema(description = "车船税")
+    private String taxPremium;
+
+    @Schema(description = "交强险单号")
+    private String jqApplyNo;
+
+    @Schema(description = "交强续保")
+    private String jqRenewal;
+
+    @Schema(description = "商业续保")
+    private String syRenewal;
+
+    @Schema(description = "商业保单号")
+    private String syPolicyNo;
+
+    @Schema(description = "交强险保费")
+    private String jqPremium;
+
+    @Schema(description = "商业险保费")
+    private String syPremium;
+
+    @Schema(description = "驾意险保费")
+    private String jyPremium;
+
+    @Schema(description = "总保费")
+    private String sumPremium;
+
+    @Schema(description = "是否过户")
+    private Integer transfer;
+
+    @Schema(description = "过户时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime transferDate;
+
+    @Schema(description = "是否商业过户")
+    private Integer transferBi;
+
+    @Schema(description = "交强手续费比例")
+    private String jqSuperviseCostsProportion;
+
+    @Schema(description = "交强跟单比例")
+    private String jqOtherCostsProportion;
+
+    @Schema(description = "商业手续费比例")
+    private String sySuperviseCostsProportion;
+
+    @Schema(description = "商业跟单比例")
+    private String syOtherCostsProportion;
+
+    @Schema(description = "非车手续费比例")
+    private String noSuperviseCostsProportion;
+
+    @Schema(description = "非车跟单比例")
+    private String noOtherCostsProportion;
+
+    @Schema(description = "是否现询 0. 是 1. 否")
+    private int costFlag;
+
+    @Schema(description = "费用id")
+    private Long costId;
+
+    @Schema(description = "图片类型(C01车辆影像,C02车主身份证,C03投保人身份证,C04被保人身份证,C05验车照)")
+    private String imageType;
+
+    @Schema(description = "文件存储ID")
+    private String imageId;
+
+    @Schema(description = "交强保单")
+    private String jqPolicy;
+
+    @Schema(description = "商业保单")
+    private String syPolicy;
+
+    @Schema(description = "非车保单")
+    private String noPolicy;
+
+    @Schema(description = "交强电子标志")
+    private String jqSign;
+
+    /**
+     * 车牌
+     */
+    @Schema(description = "车牌号")
+    private String licenseNo;
+
+    /**
+     * 车架号
+     */
+    @Schema(description = "车架号")
+    private String vinNo;
+
+    /**
+     * 品牌型号
+     */
+    @Schema(description = "品牌型号")
+    private String brandName;
+
+    /**
+     * 发动机号
+     */
+    @Schema(description = "发动机号")
+    private String engineNo;
+
+    /**
+     * 年款
+     */
+    @Schema(description = "年款")
+    private String carYear;
+
+    /**
+     * 座位数[座]
+     */
+    @Schema(description = "座位数")
+    private String seatCount;
+
+    /**
+     * 整备质量[千克(kg)]
+     */
+    @Schema(description = "整备质量")
+    private String completeKerbMass;
+
+    /**
+     * 核定载质量[千克(kg)]
+     */
+    @Schema(description = "核定载质量")
+    private String limitLoad;
+
+    /**
+     * 功率[千瓦(Kw)]
+     */
+    @Schema(description = "功率")
+    private String powerScale;
+
+    /**
+     * 新车购置价[元]
+     */
+    @Schema(description = "新车购置价")
+    private String purchasePrice;
+
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.CarNatureCode
+     * 使用性质代码
+     */
+    @Schema(description = "使用性质代码")
+    private String carNatureCode;
+
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.VehicleUseCode
+     * 车辆用途代码
+     */
+    @Schema(description = "车辆用途代码")
+    private String vehicleUseCode;
+
+    /**
+     * 保司的车辆类型编码都一直 传入code即可
+     * 例如 K33 轿车 H31 轻型普通货车
+     * 车辆类型代码
+     */
+    @Schema(description = "车辆类型代码")
+    private String carTypeCode;
+
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.CarKindCode
+     * 车辆种类代码
+     */
+    @Schema(description = "车辆种类代码")
+    private String carKindCode;
+
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.EnergyTypeCode
+     * 能源种类代码
+     */
+    @Schema(description = "能源种类代码")
+    private String energyTypeCode;
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.PropertyCode
+     * 所属性质代码
+     */
+    @Schema(description = "所属性质代码")
+    private String propertyCode;
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.LicenseColorCode
+     * 号牌颜色代码
+     */
+    @Schema(description = "号牌颜色代码")
+    private String licenseColorCode;
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.CarKindDetailIdCode
+     * 车种明细
+     */
+    @Schema(description = "车种明细")
+    private String carKindDetailIdCode;
+    /**
+     * @see com.jzg.quotation.commons.constant.enums.quote.LicenseKindCode
+     * 号牌种类
+     */
+    @Schema(description = "号牌种类")
+    private String licenseKindCode;
+
+    /**
+     * 注册日期
+     */
+    @Schema(description = "注册日期")
+    private String registerDate;
+    /**
+     * 发证日期
+     */
+    @Schema(description = "发证日期")
+    private String issueDate;
+
+    /**
+     * 商业险过户
+     */
+    @Schema(description = "商业险过户")
+    private boolean ciTransfer;
+    /**
+     * 是否贷款车 true 贷款车
+     */
+    @Schema(description = "是否贷款车")
+    private boolean loanStatus;
+
+    /**
+     * 新能源标志 true 新能源
+     */
+    @Schema(description = "新能源标志")
+    private boolean newEnergyMark;
+
+
+    /**
+     * 姓名
+     */
+    @Schema(description = "姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @Schema(description = "身份证号")
+    private String identifyNumber;
+    /**
+     * 生日
+     */
+    @Schema(description = "生日")
+    private String birthday;
+    /**
+     * 年龄
+     */
+    @Schema(description = "年龄")
+    private String age;
+    /**
+     * 性别
+     */
+    @Schema(description = "性别")
+    private String gender;
+    /**
+     * 身份证有效起期
+     */
+    @Schema(description = "身份证有效起期")
+    private String identifyValidDate;
+    /**
+     * 身份证有效止期
+     */
+    @Schema(description = "身份证有效止期")
+    private String identifyValidEndDate;
+    /**
+     * 证件类型代码
+     */
+    @Schema(description = "证件类型代码")
+    private String documentsTypeCode;
+    /**
+     * 组织机构代码
+     */
+    @Schema(description = "组织机构代码")
+    private String organizationCode;
+    /**
+     * 地址
+     */
+    @Schema(description = "地址")
+    private String addr;
+    /**
+     * 省 区划编码
+     */
+    @Schema(description = "省 区划编码")
+    private String provinceCode;
+    /**
+     * 省
+     */
+    @Schema(description = "省")
+    private String province;
+    /**
+     * 市 区划编码
+     */
+    @Schema(description = "市 区划编码")
+    private String cityCode;
+    /**
+     * 市
+     */
+    @Schema(description = "市")
+    private String city;
+    /**
+     * 县 区划编码
+     */
+    @Schema(description = "县 区划编码")
+    private String countyCode;
+    /**
+     * 县
+     */
+    @Schema(description = "县")
+    private String county;
+    /**
+     * 邮箱
+     */
+    @Schema(description = "邮箱")
+    private String email;
+    /**
+     * 手机号
+     */
+    @Schema(description = "手机号")
+    private String mobile;
+
+    /**
+     * 固定电话
+     */
+    @Schema(description = "固定电话")
+    private String telephone;
+
+    /**
+     * 客户类型
+     */
+    @Schema(description = "客户类型")
+    private String property;
+    /**
+     * 法人
+     */
+    @Schema(description = "法人")
+    private String legalPerson;
+    /**
+     * 法人身份证号
+     */
+    @Schema(description = "法人身份证")
+    private String leaderIdentifyNumber;
+    /**
+     * 法人身份证止期
+     */
+    @Schema(description = "法人身份证止期")
+    private String leaderOtherEffectiveDate;
+    /**
+     * 注册资本金
+     */
+    @Schema(description = "注册资本金")
+    private String registeredCapital;
+
+
+    /**
+     * 险种代码
+     */
+    @Schema(description = "险种代码")
+    private String riskCode;
+
+    /**
+     * 起保日期
+     */
+    @Schema(description = "起保日期")
+    private String startDate;
+
+    /**
+     * 终保日期
+     */
+    @Schema(description = "终保日期")
+    private String endDate;
+
+    /**
+     * 是否及时起保
+     * true 及时起保 false 不及时起保
+     */
+    @Schema(description = "是否及时起保")
+    private boolean instantFlag;
+
+    /**
+     * 险种编码
+     */
+    @Schema(description = "险种编码")
+    private String kindCode;
+    /**
+     * 险种名称
+     */
+    @Schema(description = "险种名称")
+    private String kindName;
+    /**
+     * 平台险种编码
+     */
+    @Schema(description = "平台险种编码")
+    private String platformKindCode;
+    /**
+     * 平台险种名称
+     */
+    @Schema(description = "平台险种名称")
+    private String platformKindName;
+    /**
+     * 保额
+     */
+    @Schema(description = "保额")
+    private String amount;
+    /**
+     * 每座保额
+     */
+    @Schema(description = "每座保额")
+    private String unitAmount;
+    /**
+     * 座位数
+     */
+    @Schema(description = "座位数")
+    private String quantity;
+    /**
+     * 保费
+     */
+    @Schema(description = "保费")
+    private String premium;
+    /**
+     * 附加绝对免赔率
+     */
+    @Schema(description = "附加绝对免赔率")
+    private String deductibleRate;
+    /**
+     * 服务次数
+     */
+    @Schema(description = "服务次数")
+    private String serviceTimes;
+
+    /**
+     * 减免税凭证号 减免税时必传
+     */
+    @Schema(description = "减免税凭证号 减免税时必传")
+    private String extendChar2;
+    /**
+     * 减免比例  减税时必传
+     */
+    @Schema(description = "减免比例  减税时必传")
+    private String taxRelief;
+    /**
+     * 减免税原因代码  减免税时必传
+     */
+    @Schema(description = "减免税原因代码  减免税时必传")
+    private String relifReason;
+    /**
+     * 开具税务机关代码 减免完税时必传
+     */
+    @Schema(description = "开具税务机关代码 减免完税时必传")
+    private String taxComCode;
+    /**
+     * 开具凭证的税务机关名称 减免完税时必传
+     */
+    @Schema(description = "开具税务机关名称 减免完税时必传")
+    private String taxComName;
+    /**
+     * 完税凭证填发日期 完税时必传
+     */
+    @Schema(description = "开具税务机关名称 减免完税时必传")
+    private String taxDocumentDate;
+    /**
+     * 开具完税凭证地区代码 完税时必传
+     */
+    @Schema(description = "开具税务机关名称 减免完税时必传")
+    private String taxPaidAreaCode;
+    /**
+     * 完完税凭证号 完税时必传
+     */
+    @Schema(description = "开具税务机关名称 减免完税时必传")
+    private String paidFreeCertificate;
+    /**
+     * 纳税人名称 正常缴税时必传
+     */
+    @Schema(description = "纳税人名称 正常缴税时必传")
+    private String taxpayerName;
+    /**
+     * 纳税人证件类型 正常缴税时必传
+     */
+    @Schema(description = "纳税人证件类型 正常缴税时必传")
+    private String taxpayerIdentifier;
+
+    /**
+     * 车船税标志 1-正常交税; 2-免税; 3-减税; 4-完税
+     */
+    @Schema(description = "车船税标志 1-正常交税; 2-免税; 3-减税; 4-完税")
+    private String taxRelifFlag;
+
+
+}

+ 32 - 0
commons/src/main/java/com/jzg/commons/entity/vo/ImagesVo.java

@@ -0,0 +1,32 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+@Data
+@Schema(description = "订单影像资料VO")
+public class ImagesVo {
+
+    @Schema(description = "主键")
+    private String id;
+
+    @Schema(description = "图片类型(C01车辆影像,C02车主身份证,C03投保人身份证,C04被保人身份证,C05验车照)")
+    private String imageType;
+
+    @Schema(description = "文件存储ID")
+    private String imageId;
+
+    @Schema(description = "图片地址")
+    private String fileName;
+
+    @Schema(description = "图片地址")
+    private String fileType;
+
+    @Schema(description = "图片地址")
+    private String bucketName;
+
+    @Schema(description = "预览地址")
+    private String previewUrl;
+
+}

+ 51 - 0
commons/src/main/java/com/jzg/commons/util/SchemaAnnotationUtils.java

@@ -0,0 +1,51 @@
+package com.jzg.commons.util;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import java.lang.reflect.Field;
+
+public class SchemaAnnotationUtils {
+
+    /**
+     * 获取字段上的 @Schema 注解信息
+     *
+     * @param entity     实体类的 Class 对象
+     * @param fieldName 字段名
+     * @return 字段上的 @Schema 注解,如果不存在则返回 null
+     */
+    public static String getSchemaAnnotation(String entity, String fieldName) {
+        try {
+            Class<?> clazz = getClassByName(entity);
+            // 获取字段
+            Field field = clazz.getDeclaredField(fieldName);
+            // 获取字段上的 @Schema 注解
+            Schema schemaAnnotation = field.getAnnotation(Schema.class);
+            if (schemaAnnotation != null) {
+                return schemaAnnotation.description();
+            } else {
+                System.out.println("No @Schema annotation found for field: " + fieldName);
+            }
+            return null;
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 通过类名获取 Class 对象
+     *
+     * @param className 类的全限定名(包括包名)
+     * @return 对应的 Class 对象,如果找不到则返回 null
+     */
+    private static Class<?> getClassByName(String className) {
+        try {
+            return Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}

+ 94 - 0
commons/src/main/java/com/jzg/commons/util/Threads.java

@@ -0,0 +1,94 @@
+package com.jzg.commons.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.*;
+
+/**
+ * 线程相关工具类
+ */
+
+@Slf4j
+public class Threads
+{
+
+    /**
+     * sleep等待,单位为毫秒
+     */
+    public static void sleep(long milliseconds)
+    {
+        try
+        {
+            Thread.sleep(milliseconds);
+        }
+        catch (InterruptedException e)
+        {
+            return;
+        }
+    }
+
+    /**
+     * 停止线程池
+     * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
+     * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
+     * 如果仍然超時,則強制退出.
+     * 另对在shutdown时线程本身被调用中断做了处理.
+     */
+    public static void shutdownAndAwaitTermination(ExecutorService pool)
+    {
+        if (pool != null && !pool.isShutdown())
+        {
+            pool.shutdown();
+            try
+            {
+                if (!pool.awaitTermination(120, TimeUnit.SECONDS))
+                {
+                    pool.shutdownNow();
+                    if (!pool.awaitTermination(120, TimeUnit.SECONDS))
+                    {
+                        log.info("Pool did not terminate");
+                    }
+                }
+            }
+            catch (InterruptedException ie)
+            {
+                pool.shutdownNow();
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    /**
+     * 打印线程异常信息
+     */
+    public static void printException(Runnable r, Throwable t)
+    {
+        if (t == null && r instanceof Future<?>)
+        {
+            try
+            {
+                Future<?> future = (Future<?>) r;
+                if (future.isDone())
+                {
+                    future.get();
+                }
+            }
+            catch (CancellationException ce)
+            {
+                t = ce;
+            }
+            catch (ExecutionException ee)
+            {
+                t = ee.getCause();
+            }
+            catch (InterruptedException ie)
+            {
+                Thread.currentThread().interrupt();
+            }
+        }
+        if (t != null)
+        {
+            log.error(t.getMessage(), t);
+        }
+    }
+}

+ 39 - 0
commons/src/main/java/com/jzg/commons/util/comparble/CompareResult.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.util.comparble;
+
+import lombok.Data;
+
+/**
+ * title ComparbleResult
+ * Description
+ * CreateDate 2022/5/31 23:04
+ *
+ * @author izhouy
+ */
+@Data
+public class CompareResult {
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 变更字段
+     */
+    private String fieldName;
+
+    /**
+     * 变更前类的内容容
+     */
+    private String fieldContent;
+    /**
+     * 变更后类的内容容
+     */
+    private String newFieldContent;
+    /**
+     * 变更的枚举类型
+     */
+    private String handedType;
+
+}
+

+ 151 - 0
commons/src/main/java/com/jzg/commons/util/comparble/CompatibleUtils.java

@@ -0,0 +1,151 @@
+package com.jzg.commons.util.comparble;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.jzg.commons.entity.po.OperatorTrajectory;
+import com.jzg.commons.util.SchemaAnnotationUtils;
+import com.jzg.commons.util.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * 比较器工具类
+ */
+@Slf4j
+public class CompatibleUtils {
+
+    // 定义线程安全的日期格式化器
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    private static final Set<String> IGNORED_FIELDS = new HashSet<>(Arrays.asList(
+            "id", "createBy", "createTime", "updateBy", "updateTime", "systemCode"
+    ));
+
+    /**
+     * 比较两个 JSON 字符串的字段差异
+     *
+     * @param operatorTrajectory 操作轨迹对象
+     * @return 比较结果列表
+     */
+    public static List<CompareResult> compareFieldsMap(OperatorTrajectory operatorTrajectory) {
+        String afterJson = operatorTrajectory.getAfterJson();
+        String source = operatorTrajectory.getBeforeJson();
+
+        // 如果两个字符串均为空,直接返回空列表
+        if (StringUtils.isEmpty(afterJson) && StringUtils.isEmpty(source)) {
+            return Collections.emptyList();
+        }
+
+        try {
+            Map<String, Object> oldMap = parseJsonToMap(afterJson);
+            Map<String, Object> sourceMap = parseJsonToMap(source);
+
+            return compareMaps(oldMap, sourceMap, operatorTrajectory.getEntityName());
+        } catch (Exception e) {
+            log.error("JSON解析失败: {}", e.getMessage(), e);
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * 递归比较两个 Map 的字段差异
+     *
+     * @param oldMap      新数据 Map
+     * @param sourceMap   原始数据 Map
+     * @param entityName  实体名称
+     * @return 比较结果列表
+     */
+    private static List<CompareResult> compareMaps(Map<String, Object> oldMap, Map<String, Object> sourceMap, String entityName) {
+        List<CompareResult> results = new ArrayList<>();
+
+        for (Map.Entry<String, Object> entry : oldMap.entrySet()) {
+            String key = entry.getKey();
+            if (IGNORED_FIELDS.contains(key)) {
+                continue;
+            }
+
+            Object newData = entry.getValue();
+            Object oldData = sourceMap.get(key);
+
+            if (isJSONObject(newData)) {
+                results.addAll(compareMaps(parseJsonToMap(newData), parseJsonToMap(oldData), entityName));
+            } else {
+                String newValue = getValue(newData);
+                String oldValue = getValue(oldData);
+
+                if (StringUtils.isNotEmpty(newValue) && !Objects.equals(oldValue, newValue)) {
+                    CompareResult compareResult = new CompareResult();
+                    compareResult.setName(SchemaAnnotationUtils.getSchemaAnnotation(entityName, key));
+                    compareResult.setFieldName(key);
+                    compareResult.setFieldContent(newValue);
+                    compareResult.setNewFieldContent(oldValue);
+                    compareResult.setHandedType(""); // 默认值,可根据需求调整
+                    results.add(compareResult);
+                }
+            }
+        }
+        return results;
+    }
+
+    /**
+     * 判断对象是否为 JSONObject
+     *
+     * @param obj 对象
+     * @return 是否为 JSONObject
+     */
+    public static boolean isJSONObject(Object obj) {
+        return obj instanceof JSONObject;
+    }
+
+    /**
+     * 将 JSON 字符串解析为 Map
+     *
+     * @param json JSON 字符串
+     * @return 解析后的 Map
+     */
+    private static Map<String, Object> parseJsonToMap(Object json) {
+        if (ObjectUtil.isEmpty(json)) {
+            return Collections.emptyMap();
+        }
+
+        try {
+            return JSONObject.parseObject(JSONObject.toJSONString(json), Map.class);
+        } catch (Exception e) {
+            log.warn("JSON解析失败: {}", e.getMessage());
+            return Collections.emptyMap();
+        }
+    }
+
+    /**
+     * 获取对象的字符串表示形式
+     *
+     * @param obj 对象
+     * @return 字符串表示形式
+     */
+    public static String getValue(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+
+        if (obj instanceof String) {
+            return (String) obj;
+        } else if (obj instanceof Number) {
+            return String.valueOf(obj);
+        } else if (obj instanceof Boolean) {
+            return String.valueOf(obj);
+        } else if (obj instanceof LocalDateTime) {
+            return ((LocalDateTime) obj).format(DATE_TIME_FORMATTER);
+        } else if (obj instanceof LocalDate) {
+            return ((LocalDate) obj).format(DATE_FORMATTER);
+        }
+
+        return null;
+    }
+
+}
+

+ 27 - 0
commons/src/main/java/com/jzg/commons/util/comparble/EnumDataChangeHandedType.java

@@ -0,0 +1,27 @@
+package com.jzg.commons.util.comparble;
+
+
+import lombok.Getter;
+
+/**
+ * title EnumDataChangeHandedType
+ * Description 属性变更类型枚举
+ * CreateDate 2022/5/31 23:06
+ *
+ * @author izhouy
+ */
+@Getter
+public enum EnumDataChangeHandedType {
+    // 属性变更类型枚举
+    DELETE("D", "删除"),
+    UPDATE("U", "修改"),
+    SAVE("C", "新增");
+
+    private String code;
+    private String name;
+
+    EnumDataChangeHandedType(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+}

+ 34 - 0
platform/src/main/java/com/jzg/controller/OperatorTrajectoryController.java

@@ -0,0 +1,34 @@
+package com.jzg.controller;
+
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.LogParam;
+import com.jzg.commons.service.OperatorTrajectoryService;
+import com.jzg.commons.util.spring.SpringUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Validated
+@Tag(name="日志")
+@RestController
+@RequestMapping("/operatorTrajectory")
+public class OperatorTrajectoryController {
+
+
+    @Operation(summary = "日志列表")
+    @PostMapping("list")
+    private HttpResult list(@RequestBody LogParam logParam){
+        return HttpResult.ok(SpringUtils.getBean(OperatorTrajectoryService.class).list(logParam));
+    }
+
+    @Schema(description = "查询详情")
+    @GetMapping("selectById")
+    public HttpResult selectById(@RequestParam String id){
+        return HttpResult.ok(SpringUtils.getBean(OperatorTrajectoryService.class).selectById(id));
+    }
+
+
+}

+ 34 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/orders/InsOrdersEnd.java

@@ -0,0 +1,34 @@
+package com.jzg.quotation.commons.entity.vo.orders;
+
+import com.jzg.commons.entity.dto.InsTaskImagesAdd;
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersExternalFee;
+import com.jzg.commons.entity.orders.po.InsOrdersExternalPolicy;
+import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "订单录入修改")
+public class InsOrdersEnd extends QuoteVo {
+
+    @Schema(description = "是否暂存0-保存;1-暂存")
+    private int isTemporarily;
+
+    @Schema(description = "订单信息")
+    private InsOrders insOrders;
+
+    @Schema(description = "订单其他信息")
+    private InsOrdersOtherInfoVo insOrdersOtherInfo;
+
+    @Schema(description = "费用信息")
+    private InsOrdersExternalFee ordersExternal;
+
+    @Schema(description = "订单影像资料")
+    private InsTaskImagesAdd imagesAdds;
+
+    @Schema(description = "保单信息")
+    private InsOrdersExternalPolicy insOrdersExternalPolicy;
+
+}

+ 10 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersCostsMapper.java

@@ -0,0 +1,10 @@
+package com.jzg.quotation.summary.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersCosts;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersCostsMapper extends BaseMapper<InsOrdersCosts> {
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCostsService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersCosts;
+
+public interface InsOrdersCostsService extends IService<InsOrdersCosts> {
+}

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

@@ -0,0 +1,11 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersCosts;
+import com.jzg.quotation.summary.mapper.InsOrdersCostsMapper;
+import com.jzg.quotation.summary.service.InsOrdersCostsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsOrdersCostsServiceImpl extends ServiceImpl<InsOrdersCostsMapper, InsOrdersCosts> implements InsOrdersCostsService {
+}

+ 35 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/InsTaskImagesMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.quotation.summary.mapper.InsTaskImagesMapper">
+
+    <resultMap id="ImageMap" type="com.jzg.commons.entity.vo.InsTaskImagesVo">
+        <result property="quoteNo" column="quote_no" jdbcType="VARCHAR"/>
+        <collection property="images" ofType="com.jzg.commons.entity.vo.ImagesVo">
+            <result property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="imageType" column="image_type" jdbcType="VARCHAR"/>
+            <result property="imageId" column="image_id" jdbcType="VARCHAR"/>
+            <result property="fileName" column="file_name" jdbcType="VARCHAR"/>
+            <result property="fileType" column="file_type" jdbcType="VARCHAR"/>
+            <result property="bucketName" column="bucket_name" jdbcType="VARCHAR"/>
+            <result property="previewUrl" column="preview_url" jdbcType="VARCHAR"/>
+        </collection>
+
+    </resultMap>
+
+
+    <select id="selectByQuoteNo" resultMap="ImageMap">
+        SELECT
+            t.id,
+            t.quote_no,
+            t.image_type,
+            t.image_id,
+            f.file_name,
+            f.file_type,
+            f.bucket_name
+        FROM
+            ins_task_images t
+                LEFT JOIN sys_upload_files f ON f.id = t.image_id where t.quote_no = #{quoteNo}
+    </select>
+</mapper>

+ 208 - 0
tenant/insurance/quotation-yongcheng/dependency-reduced-pom.xml

@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>insurance</artifactId>
+    <groupId>com.jzg</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>quotation-yongcheng</artifactId>
+  <build>
+    <finalName>quotation-yongcheng</finalName>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>16</source>
+          <target>16</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>com.jzg</groupId>
+      <artifactId>quotation-commons</artifactId>
+      <version>1.0-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-xml</artifactId>
+      <version>2.9.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-webflux</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.projectreactor.netty</groupId>
+      <artifactId>reactor-netty-core</artifactId>
+      <version>1.1.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-crypto</artifactId>
+      <version>5.8.31</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-mongodb</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-openfeign</artifactId>
+      <version>4.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>8.0.26</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+      <version>3.5.7</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus</artifactId>
+      <version>3.5.7</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.baomidou</groupId>
+      <artifactId>mybatis-plus-extension</artifactId>
+      <version>3.5.7</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.jzg</groupId>
+      <artifactId>commons</artifactId>
+      <version>1.0-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <version>1.18.24</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.rocketmq</groupId>
+      <artifactId>rocketmq-spring-boot-starter</artifactId>
+      <version>2.2.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.jzg</groupId>
+      <artifactId>rocketmq</artifactId>
+      <version>1.0-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <version>3.0.0</version>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>spring-boot-test</artifactId>
+          <groupId>org.springframework.boot</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>spring-boot-test-autoconfigure</artifactId>
+          <groupId>org.springframework.boot</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>json-path</artifactId>
+          <groupId>com.jayway.jsonpath</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>assertj-core</artifactId>
+          <groupId>org.assertj</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>hamcrest</artifactId>
+          <groupId>org.hamcrest</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>junit-jupiter</artifactId>
+          <groupId>org.junit.jupiter</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>mockito-core</artifactId>
+          <groupId>org.mockito</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>mockito-junit-jupiter</artifactId>
+          <groupId>org.mockito</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jsonassert</artifactId>
+          <groupId>org.skyscreamer</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>spring-test</artifactId>
+          <groupId>org.springframework</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>xmlunit-core</artifactId>
+          <groupId>org.xmlunit</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-aop</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-validation</artifactId>
+      <version>3.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.statemachine</groupId>
+      <artifactId>spring-statemachine-core</artifactId>
+      <version>4.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>2.0.43</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>de.siegmar</groupId>
+      <artifactId>logback-gelf</artifactId>
+      <version>5.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+      <version>2022.0.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+      <version>2022.0.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+</project>