浏览代码

永诚报价提交 bug修改

785834757 1 年之前
父节点
当前提交
cc46712811
共有 39 个文件被更改,包括 9182 次插入 和 6 次删除
  1. 2 2
      commons/src/main/java/com/jzg/commons/entity/dto/PosterParam.java
  2. 30 0
      commons/src/main/java/com/jzg/commons/entity/vo/PersonAreaVo.java
  3. 2 0
      platform/src/main/java/com/jzg/controller/EsmInsCompanyController.java
  4. 9 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/enums/quote/EnergyTypeCode.java
  5. 550 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateTimeUtil.java
  6. 280 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  7. 125 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DuplicateInsuranceUtil.java
  8. 23 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/client/SysAreaClient.java
  9. 238 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/components/YcRequestApiComponents.java
  10. 18 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/constants/Constants.java
  11. 23 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/constants/RequestUrl.java
  12. 360 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/YcBuildData.java
  13. 21 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/dto/CarInsDateDto.java
  14. 440 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/AuditRequest.java
  15. 77 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/ModelsQueryRequest.java
  16. 117 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/PriceDiscountRatioRequest.java
  17. 2284 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/QuoteRequest.java
  18. 29 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/RecognitionRequest.java
  19. 121 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/AuditResponse.java
  20. 45 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/CoreModelsResponse.java
  21. 292 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/ModelsQueryResponse.java
  22. 29 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/PriceDiscountRatioResponse.java
  23. 3100 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/QuoteResponse.java
  24. 63 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/RecognitionResponse.java
  25. 24 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/vo/TimeEntity.java
  26. 28 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/AuthorityDataXml.java
  27. 75 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/YcApiConfigurationProperties.java
  28. 11 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/YongChengApiRequest.java
  29. 675 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java
  30. 1 0
      tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java
  31. 4 0
      tenant/organization/src/main/java/com/jzg/organization/controller/PosterController.java
  32. 2 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java
  33. 2 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysAreaService.java
  34. 7 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoService.java
  35. 2 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PosterServiceImpl.java
  36. 51 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAreaServiceImpl.java
  37. 5 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoServiceImpl.java
  38. 8 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java
  39. 9 0
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

+ 2 - 2
commons/src/main/java/com/jzg/commons/entity/dto/PosterParam.java

@@ -10,9 +10,9 @@ import lombok.Data;
 public class PosterParam extends PageRequest {
 
     @Schema(description = "查询参数 标题")
-    private String title;
+    private String searchValue;
 
     @Schema(description = "查询参数 机构")
-    private String orgName;
+    private String sendDeptId;
 
 }

+ 30 - 0
commons/src/main/java/com/jzg/commons/entity/vo/PersonAreaVo.java

@@ -0,0 +1,30 @@
+package com.jzg.commons.entity.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+
+@Data
+@NoArgsConstructor
+public class PersonAreaVo implements Serializable {
+
+    private static final long serialVersionUID = -8235445978142897003L;
+
+    //省
+    private String provinceCode;
+    private String provinceName;
+
+
+    //市
+    private String cityCode;
+    private String cityName;
+
+    //区
+    private String countyCode;
+    private String countyName;
+
+
+}
+

+ 2 - 0
platform/src/main/java/com/jzg/controller/EsmInsCompanyController.java

@@ -89,6 +89,8 @@ public class EsmInsCompanyController extends BaseController {
         LambdaQueryWrapper<EsmInsCompany> lqw = new LambdaQueryWrapper<>();
         lqw.eq(EsmInsCompany::getCompanyCode, companyAdd.getCompanyCode());
         AssertionUtils.isFail(esmInsCompanyService.count(lqw) > 0, "供应商编码重复");
+        AssertionUtils.isFail(esmInsCompanyService.count(
+                new LambdaQueryWrapper<EsmInsCompany>().eq(EsmInsCompany::getName,companyAdd.getName())) > 0, "保司名称重复");
         EsmInsCompany esmInsCompany = BeanUtil.copyProperties(companyAdd, EsmInsCompany.class);
         //如果存在父类型则将type
         if(!companyAdd.getParentId().equals("0")){

+ 9 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/enums/quote/EnergyTypeCode.java

@@ -25,4 +25,13 @@ public enum EnergyTypeCode {
     // 说明
     private final String desc;
 
+    public static String getEnergyTypeDesc(String typeCode) {
+        for (EnergyTypeCode value : EnergyTypeCode.values()) {
+            if (value.getCode().equals(typeCode)) {
+                return value.getDesc();
+            }
+        }
+        return null;
+    }
+
 }

+ 550 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateTimeUtil.java

@@ -0,0 +1,550 @@
+package com.jzg.quotation.commons.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.ParseException;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalAdjusters;
+import java.util.List;
+
+/**
+ * 日期时间工具类   后期替换DateUtil工具类
+ *
+ * @author lig
+ */
+public class DateTimeUtil {
+
+
+    /**
+     * 显示年月日时分秒,例如 2015-08-11 09:51:53.
+     */
+    public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    /**
+     * 显示年月日时分,例如 2015-08-11 09:51.
+     */
+    public static final String DATETIME_PATTERN_EXT1 = "yyyy-MM-dd HH:mm";
+
+    /**
+     * 仅显示年月日,例如 2015-08-11.
+     */
+    public static final String DATE_PATTERN = "yyyy-MM-dd";
+
+    /**
+     * 仅显示时分秒,例如 09:51:53.
+     */
+    public static final String TIME_PATTERN = "HH:mm:ss";
+
+    /**
+     * 显示年月日时分秒(无符号),例如 20150811095153.
+     */
+    public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";
+    /**
+     * 显示年月日时分秒(无符号) 扩展1,例如 201508110951.
+     */
+    public static final String UNSIGNED_DATETIME_PATTERN_EXT1 = "yyyyMMddHHmm";
+
+    /**
+     * 仅显示年月日(无符号),例如 20150811.
+     */
+    public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
+
+
+    /**
+     * 获取当前日期和时间字符串.
+     *
+     * @return String 日期时间字符串,例如 2015-08-11 09:51:53
+     */
+    public static String getLocalDateTimeStr() {
+        return format(LocalDateTime.now(), DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取当前日期字符串.
+     *
+     * @return String 日期字符串,例如2015-08-11
+     */
+    public static String getLocalDateStr() {
+        return format(LocalDate.now(), DATE_PATTERN);
+    }
+
+    /**
+     * 获取当前时间字符串.
+     *
+     * @return String 时间字符串,例如 09:51:53
+     */
+    public static String getLocalTimeStr() {
+        return format(LocalTime.now(), TIME_PATTERN);
+    }
+
+    /**
+     * 获取当前星期字符串.
+     *
+     * @return String 当前星期字符串,例如 星期二
+     */
+    public static String getDayOfWeekStr() {
+        return format(LocalDate.now(), "E");
+    }
+
+
+    /**
+     * 获取日期时间字符串
+     *
+     * @param temporal 需要转化的日期时间
+     * @param pattern  时间格式
+     * @return String 日期时间字符串,例如 2015-08-11 09:51:53
+     */
+    public static String format(TemporalAccessor temporal, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return dateTimeFormatter.format(temporal);
+    }
+
+    /**
+     * 日期时间字符串转换为日期时间(java.time.LocalDateTime)
+     *
+     * @param localDateTimeStr 日期时间字符串
+     * @param pattern          日期时间格式 例如DATETIME_PATTERN
+     * @return LocalDateTime 日期时间
+     */
+    public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter);
+    }
+
+    /**
+     * 日期字符串转换为日期(java.time.LocalDate)
+     *
+     * @param localDateStr 日期字符串
+     * @param pattern      日期格式 例如DATE_PATTERN
+     * @return LocalDate 日期
+     */
+    public static LocalDate parseLocalDate(String localDateStr, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return LocalDate.parse(localDateStr, dateTimeFormatter);
+    }
+
+    /**
+     * 日期字符串转换为 日期字符串
+     *
+     * @param localDateStr 日期字符串
+     * @param pattern      日期格式 例如DATE_PATTERN
+     * @return String 日期
+     */
+    public static String parseLocalDateToString(String localDateStr, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        return LocalDate.parse(localDateStr, dateTimeFormatter).toString();
+    }
+
+
+    /**
+     * 日期字符串转换为 日期字符串  前一天
+     *
+     * @param localDateStr 日期字符串
+     * @param pattern      日期格式 例如DATE_PATTERN
+     * @return String 日期
+     */
+    public static String parseLocalDateToStringFrontOne(String localDateStr, String pattern) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+        LocalDate date = LocalDate.parse(localDateStr,dateTimeFormatter);
+        LocalDate yesterday = date.plusDays(-1);
+        return yesterday.toString();
+    }
+
+
+    /**
+     * 获取指定日期时间加上指定数量日期时间单位之后的日期时间.
+     *
+     * @param localDateTime 日期时间
+     * @param num           数量
+     * @param chronoUnit    日期时间单位
+     * @return LocalDateTime 新的日期时间
+     */
+    public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
+        return localDateTime.plus(num, chronoUnit);
+    }
+
+    /**
+     * 获取指定日期时间减去指定数量日期时间单位之后的日期时间.
+     *
+     * @param localDateTime 日期时间
+     * @param num           数量
+     * @param chronoUnit    日期时间单位
+     * @return LocalDateTime 新的日期时间
+     */
+    public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
+        return localDateTime.minus(num, chronoUnit);
+    }
+
+    /**
+     * 根据ChronoUnit计算两个日期时间之间相隔日期时间
+     *
+     * @param start      开始日期时间
+     * @param end        结束日期时间
+     * @param chronoUnit 日期时间单位
+     * @return long 相隔日期时间
+     */
+    public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) {
+        return Math.abs(start.until(end, chronoUnit));
+    }
+
+    /**
+     * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数
+     *
+     * @param start      开始日期
+     * @param end        结束日期
+     * @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS)
+     * @return long 相隔年数或月数或天数
+     */
+    public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) {
+        return Math.abs(start.until(end, chronoUnit));
+    }
+
+    /**
+     * 获取本年第一天的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfYearStr() {
+        return getFirstDayOfYearStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取本年最后一天的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfYearStr() {
+        return getLastDayOfYearStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期当年第一天的日期字符串
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfYearStr(LocalDateTime localDateTime) {
+        return getFirstDayOfYearStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当年最后一天的日期字符串
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfYearStr(LocalDateTime localDateTime) {
+        return getLastDayOfYearStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当年第一天的日期字符串,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @param pattern       日期时间格式
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfYearStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期当年最后一天的日期字符串,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @param pattern       日期时间格式
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfYearStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+    /**
+     * 获取本月第一天的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfMonthStr() {
+        return getFirstDayOfMonthStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取本月最后一天的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfMonthStr() {
+        return getLastDayOfMonthStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期当月第一天的日期字符串
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getFirstDayOfMonthStr(LocalDateTime localDateTime) {
+        return getFirstDayOfMonthStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当月最后一天的日期字符串
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfMonthStr(LocalDateTime localDateTime) {
+        return getLastDayOfMonthStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当月第一天的日期字符串,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期当月最后一天的日期字符串,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @param pattern       日期时间格式
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+    /**
+     * 获取本周第一天的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfWeekStr() {
+        return getFirstDayOfWeekStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取本周最后一天的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfWeekStr() {
+        return getLastDayOfWeekStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期当周第一天的日期字符串,这里第一天为周一
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfWeekStr(LocalDateTime localDateTime) {
+        return getFirstDayOfWeekStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfWeekStr(LocalDateTime localDateTime) {
+        return getLastDayOfWeekStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期当周第一天的日期字符串,这里第一天为周一,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @param pattern       日期时间格式
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getFirstDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @param pattern       日期时间格式
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getLastDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+    /**
+     * 获取今天开始时间的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getStartTimeOfDayStr() {
+        return getStartTimeOfDayStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取今天结束时间的日期字符串
+     *
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getEndTimeOfDayStr() {
+        return getEndTimeOfDayStr(LocalDateTime.now());
+    }
+
+    /**
+     * 获取指定日期开始时间的日期字符串
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 00:00:00
+     */
+    public static String getStartTimeOfDayStr(LocalDateTime localDateTime) {
+        return getStartTimeOfDayStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期结束时间的日期字符串
+     *
+     * @param localDateTime 指定日期时间
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getEndTimeOfDayStr(LocalDateTime localDateTime) {
+        return getEndTimeOfDayStr(localDateTime, DATETIME_PATTERN);
+    }
+
+    /**
+     * 获取指定日期开始时间的日期字符串,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @param pattern       日期时间格式
+     * @return String 格式:yyyy-MM-dd HH:mm:ss
+     */
+    public static String getStartTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern);
+    }
+
+    /**
+     * 获取指定日期结束时间的日期字符串,带日期格式化参数
+     *
+     * @param localDateTime 指定日期时间
+     * @param pattern       日期时间格式
+     * @return String 格式:yyyy-MM-dd 23:59:59
+     */
+    public static String getEndTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
+        return format(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern);
+    }
+
+
+    /**
+     *  date1 是否大于 date2
+     * @param date1  格式yyyy-MM-dd HH:mm:ss
+     * @param date2  格式 yyyyMM 或 yyyy
+     *
+     * @author: lig
+     * @date: 2023年09月06日 0006
+     */
+    public static boolean dateIsAfter(String date1,String date2) {
+
+        if(StringUtils.isEmpty(date2)) return false;
+
+//        String dateStr = "2018-06-20 00:00:00";
+//        String dateStr2 = "201806";
+        if(date2.length() < 5)date2 = date2 + "0101";
+        if(date2.length() < 7)date2 = date2 +"01";
+
+
+        LocalDate lRegisterDate = DateTimeUtil.parseLocalDate(date1, DateTimeUtil.DATE_PATTERN);
+        LocalDate lVehicleYearDate = DateTimeUtil.parseLocalDate(date2, DateTimeUtil.UNSIGNED_DATE_PATTERN);
+
+//        System.err.println("注册日期:"+lRegisterDate);
+//        System.err.println("上市日期:"+lVehicleYearDate);
+        return lVehicleYearDate.isBefore(lRegisterDate);
+
+
+
+
+    }
+
+    /**
+     *  一天内  true 时间大于00:00:00   小于23:59:59
+     * @param dateTime
+     *
+     * @author: lig
+     * @date: 2023年09月11日 0011
+     */
+    public static boolean inOneDay(LocalDateTime dateTime){
+//        LocalDateTime sDateTime = parseLocalDateTime(dateTime,DATETIME_PATTERN);
+        LocalDateTime minTime = LocalDateTime.of(dateTime.toLocalDate(), LocalTime.MIN);
+        LocalDateTime maxTime = LocalDateTime.of(dateTime.toLocalDate(), LocalTime.MAX);
+        if(dateTime.isAfter(minTime) && dateTime.isBefore(maxTime)){
+//            System.err.println("时间大于0点 小于23.59:"+sDateTime.isAfter(minTime));
+            return true;
+        }
+        return false;
+    }
+
+
+
+    public static void main(String[] args) throws ParseException {
+
+        List list = null;
+        System.out.println(CollUtil.isEmpty(list));
+        System.out.println("222:"+list.isEmpty());
+
+        String dateStr = "2023-10-02 23:59:59";
+        LocalDateTime sDateTime = parseLocalDateTime(dateStr,DATETIME_PATTERN);
+        System.out.println("前一年:"+ DateTimeUtil.parseLocalDateToString(sDateTime.minusYears(1).toString(), DateTimeUtil.DATETIME_PATTERN));
+//        LocalDateTime one = ;
+
+
+
+
+//        String dateStr = "2018-06-20 23:59:59";
+//
+//        LocalDateTime sDateTime = parseLocalDateTime(dateStr,DATETIME_PATTERN);
+//
+//        LocalDateTime minTime = LocalDateTime.of(sDateTime.toLocalDate(), LocalTime.MIN);
+//
+//        LocalDateTime maxTime = LocalDateTime.of(sDateTime.toLocalDate(), LocalTime.MAX);
+//
+//        System.err.println("000:"+maxTime.toString());
+//
+//        System.err.println("2222:"+sDateTime.isBefore(maxTime));
+//
+//
+//        if(sDateTime.isAfter(minTime) && sDateTime.isBefore(maxTime)){
+//            System.err.println("时间大于0点 小于23.59:"+sDateTime.isAfter(minTime));
+//
+//        }
+
+//        String dateStr2 = "201806";
+//        if(dateStr2.length() < 7)dateStr2 = dateStr2 +"01";
+////        String aaa = DateTimeUtil.parseLocalDateToString(dateStr, DateTimeUtil.DATETIME_PATTERN);
+////        System.out.println("aaaa: " + aaa);
+//
+//
+//        LocalDate lRegisterDate = DateTimeUtil.parseLocalDate(dateStr, DateTimeUtil.DATETIME_PATTERN);
+//        LocalDate lVehicleYearDate = DateTimeUtil.parseLocalDate(dateStr2, DateTimeUtil.UNSIGNED_DATE_PATTERN);
+//
+//        if(lVehicleYearDate.isAfter(lRegisterDate)){
+//
+//        }
+//
+//        System.err.println("注册日期:"+lRegisterDate);
+//        System.err.println("上市日期:"+lVehicleYearDate);
+
+
+
+    }
+}

+ 280 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java

@@ -0,0 +1,280 @@
+package com.jzg.quotation.commons.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * 时间工具类
+ *
+ * @author MrBird
+ */
+public class DateUtil {
+
+    public static final String FULL_TIME_PATTERN = "yyyyMMddHHmmss";
+
+    public static final String FULL_TIME_SPLIT_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    public static final String CST_TIME_PATTERN = "EEE MMM dd HH:mm:ss zzz yyyy";
+
+    /**
+     * 格式化时间,格式为 yyyyMMddHHmmss
+     *
+     * @param localDateTime LocalDateTime
+     * @return 格式化后的字符串
+     */
+    public static String formatFullTime(LocalDateTime localDateTime) {
+        return formatFullTime(localDateTime, FULL_TIME_PATTERN);
+    }
+
+    /**
+     * 根据传入的格式,格式化时间
+     *
+     * @param localDateTime LocalDateTime
+     * @param format        格式
+     * @return 格式化后的字符串
+     */
+    public static String formatFullTime(LocalDateTime localDateTime, String format) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
+        return localDateTime.format(dateTimeFormatter);
+    }
+
+    /**
+     * 根据传入的格式,格式化时间
+     *
+     * @param date   Date
+     * @param format 格式
+     * @return 格式化后的字符串
+     */
+    public static String getDateFormat(Date date, String format) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format, Locale.CHINA);
+        return simpleDateFormat.format(date);
+    }
+
+    /**
+     * 格式化 CST类型的时间字符串
+     *
+     * @param date   CST类型的时间字符串
+     * @param format 格式
+     * @return 格式化后的字符串
+     * @throws ParseException 异常
+     */
+    public static String formatCSTTime(String date, String format) throws ParseException {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(CST_TIME_PATTERN, Locale.US);
+        Date usDate = simpleDateFormat.parse(date);
+        return getDateFormat(usDate, format);
+    }
+
+    /**
+     * 格式化 Instant
+     *
+     * @param instant Instant
+     * @param format  格式
+     * @return 格式化后的字符串
+     */
+    public static String formatInstant(Instant instant, String format) {
+        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+        return localDateTime.format(DateTimeFormatter.ofPattern(format));
+    }
+
+    /**
+     * 判断当前时间是否在指定时间范围
+     *
+     * @param from 开始时间
+     * @param to   结束时间
+     * @return 结果
+     */
+    public static boolean between(LocalTime from, LocalTime to) {
+        LocalTime now = LocalTime.now();
+        return now.isAfter(from) && now.isBefore(to);
+    }
+
+    /**
+     * 根据传入的时间,获取指定格式的字符串
+     *
+     * @param date Date
+     * @return 格式化后的字符串
+     */
+    public static String yyyyMMddHHmmss(Date date) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FULL_TIME_PATTERN);
+        return simpleDateFormat.format(date);
+    }
+
+    /**
+     * 根据传入的时间,获取当前年
+     *
+     * @param date Date
+     * @return 格式化后的字符串
+     */
+    public static String yyyy(Date date) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
+        return simpleDateFormat.format(date);
+    }
+
+
+    /**
+     * 根据传入的时间获取当前月份的最后一天
+     *
+     * @param date Date
+     * @return 格式化后的字符串
+     */
+    public static String dayOfMonthEnd(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//可以方便地修改日期格式
+        //获取当前月最后一天
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));//设置为1号,当前日期既为本月最后一天
+        String endDayOfMonth = sdf.format(c.getTime());
+        return endDayOfMonth;
+    }
+
+    /**
+     * 根据传入的时间获取当前月份的第一天
+     *
+     * @param date Date
+     * @return 格式化后的字符串
+     */
+    public static String dayOfMonthStart(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//可以方便地修改日期格式
+        //获取当前月第一天
+        Calendar c1 = Calendar.getInstance();
+        c1.setTime(date);
+        c1.add(Calendar.MONTH, 0);
+        c1.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
+        System.out.println(c1.getTime());
+        String startDayOfMonth = sdf.format(c1.getTime());
+        return startDayOfMonth;
+    }
+
+    /**
+     * 根据传入的时间获取上个月份第一天
+     *
+     * @param date Date
+     * @return 格式化后的字符串
+     */
+    public static String dayOfLastMonth(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//可以方便地修改日期格式
+        //获取当前月第一天
+        Calendar c1 = Calendar.getInstance();
+        c1.setTime(date);
+        c1.add(Calendar.MONTH, -1);
+        c1.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
+        System.out.println(c1.getTime());
+        String startDayOfMonth = sdf.format(c1.getTime());
+        return startDayOfMonth;
+    }
+
+    /**
+     * 时间比较,date1小于date2返回-1,date1大于date2返回1,相等返回0
+     *
+     * @param date1
+     * @param date2
+     * @return
+     */
+    public static int compareTo(String date1, String date2) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//可以方便地修改日期格式
+        Date parse1 = sdf.parse(date1);
+        Date parse2 = sdf.parse(date2);
+        return compareTo(parse1, parse2);
+    }
+
+    public static int compareTo(String date1, Date date2) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//可以方便地修改日期格式
+        Date parse1 = sdf.parse(date1);
+        return compareTo(parse1, date2);
+    }
+
+    public static int compareTo(Date date1, String date2) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//可以方便地修改日期格式
+        Date parse1 = sdf.parse(date2);
+        return compareTo(date1, parse1);
+    }
+
+    /**
+     * 时间比较,date1小于date2返回-1,date1大于date2返回1,相等返回0
+     *
+     * @param date1
+     * @param date2
+     * @return
+     */
+    public static int compareTo(Date date1, Date date2) throws ParseException {
+        return date1.compareTo(date2);
+    }
+
+    /**
+     * 传入字符串,返回时间格式
+     *
+     * @param date
+     * @return
+     */
+    public static Date StringToDate(String date) throws ParseException {
+        Date d = null;
+        try {
+            d = new SimpleDateFormat("yyyy-MM-dd").parse(date);
+        } catch (ParseException e) {
+            try {
+                d = new SimpleDateFormat("yyyy/MM/dd").parse(date);
+            } catch (ParseException ex) {
+                try {
+                    d = new SimpleDateFormat("yyyy-MM").parse(date);
+                } catch (ParseException ex1) {
+                    throw ex1;
+                }
+            }
+        }
+        return d;
+    }
+
+
+    /**
+     * 获取前一年 的前一个月
+     *
+     * @author: lig
+     * @date: 2023年05月11日 0011
+     */
+    public static LocalDate gainFrontOneYear(){
+        // 获取当前日期前一天的日期
+        LocalDate localDate = LocalDate.now().minusYears(1).minusMonths(1);//1代表提前多少天
+//        String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));//转为String类型
+        return localDate;
+    }
+
+    /**
+     *  获取指定日期月的第一天  默认当前日期
+     *
+     * @author: lig
+     * @date: 2023年05月11日 0011
+     */
+    public static String gainDateMonthFirstDay(LocalDate localDate){
+        LocalDate firstDayOfThisMonth = null;
+        if(null != localDate){
+            firstDayOfThisMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());
+        }else{
+            //获取本月的第一天
+            LocalDate now = LocalDate.now();
+            firstDayOfThisMonth = now.with(TemporalAdjusters.firstDayOfMonth());
+        }
+        String date = firstDayOfThisMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));//转为String类型
+        return date;
+
+    }
+
+
+
+    public static void main(String[] args) throws ParseException {
+
+//        System.out.println(dayOfLastMonth(new Date()));
+        System.err.println("前一年:"+gainFrontOneYear());
+
+
+        //获取本月的第一天
+        LocalDate now = LocalDate.now();
+        LocalDate firstDayOfThisMonth = now.with(TemporalAdjusters.firstDayOfMonth());
+        System.out.println("firstDayOfThisMonth = " + firstDayOfThisMonth);   //2018-09-01
+    }
+}

+ 125 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DuplicateInsuranceUtil.java

@@ -0,0 +1,125 @@
+package com.jzg.quotation.commons.utils;
+
+import com.jzg.commons.exception.SystemException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.ObjectUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DuplicateInsuranceUtil {
+
+    public static final String THE_FIRST_REGEX = "终保日期(.+?);";
+
+    public static final String THE_SECOND_REGEX = ".+终保日期(.+?);";
+
+    public static final String JQ = "交强险";
+
+    public static final String SY = "商业险";
+
+    protected static final Map<Integer, String> dateFormatMap;
+
+
+
+    static {
+        dateFormatMap = new HashMap<>();
+        dateFormatMap.put(8, "yyyyMMdd");
+        dateFormatMap.put(10, "yyyyMMddHH");
+        dateFormatMap.put(12, "yyyyMMddHHmm");
+        dateFormatMap.put(14, "yyyyMMddHHmmss");
+    }
+
+    /**
+     * 获取终保日期
+     *
+     * @param rtnMsg 返回信息
+     * @param regex  正则
+     * @return 终保日期
+     */
+    public static String getEndDate(String rtnMsg, String regex) {
+        String endDate = getTheExpiryDate(rtnMsg, regex);
+        if (!endDate.isEmpty()) {
+            return endDate;
+        }
+        return "";
+    }
+
+    public static String getTimelyEndDate(String rtnMsg, String regex) {
+        String endDate = getTimelyTheExpiryDate(rtnMsg, regex);
+        if (!endDate.isEmpty()) {
+            return endDate;
+        }
+        return "";
+    }
+
+    /**
+     * 获取终保日期
+     *
+     * @param message 重复投保返回信息
+     * @param regex   正则内容
+     * @return
+     */
+    public static String getTheExpiryDate(String message, String regex) {
+        Pattern pattern = Pattern.compile(regex);
+        String replace = message.replace("\r", ";").replace("\n", ";").replace(" ", "");
+        Matcher m = pattern.matcher(replace);
+
+        boolean b = m.find();
+        if (b) {
+            try {
+                String group = m.group(1);
+                String startDate = group.replace(":", "").replace(":", "").replace("-", "").replace(" ", "");
+                String string = dateFormatMap.get(startDate.length());
+                SimpleDateFormat dateFormat = new SimpleDateFormat(string);
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                Date parse = dateFormat.parse(startDate);
+
+                return simpleDateFormat.format(parse);
+
+            } catch (Exception e) {
+                throw new SystemException(message);
+            }
+        }
+        return "";
+    }
+
+
+    public static String getTimelyTheExpiryDate(String message, String regex) {
+        Pattern pattern = Pattern.compile(regex);
+        String replace = message.replace("\r", ";").replace("\n", ";").replace(" ", "");
+        Matcher m = pattern.matcher(replace);
+
+        boolean b = m.find();
+        if (b) {
+            try {
+                String startDate = "";
+                String group = m.group(2);
+                String groupRegex = "终保日期(\\d{4}-\\d{2}-\\d{2})";
+                Pattern groupPattern = Pattern.compile(groupRegex);
+                Matcher groupMatcher = groupPattern.matcher(group);
+                if(groupMatcher.find()) {
+                    startDate = groupMatcher.group(1);
+                }else{
+                    return "";
+                }
+                String string = "yyyy-MM-dd";
+                SimpleDateFormat dateFormat = new SimpleDateFormat(string);
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                Date parse = dateFormat.parse(startDate);
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(parse);
+                calendar.add(Calendar.DAY_OF_MONTH, 1); // 加一天
+                // 获取增加一天后的日期
+                Date newDate = calendar.getTime();
+                return simpleDateFormat.format(newDate);
+
+            } catch (Exception e) {
+                throw new SystemException(message);
+            }
+        }
+        return "";
+    }
+
+}

+ 23 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/client/SysAreaClient.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.yongcheng.api.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.vo.PersonAreaVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(name="jzg-org",url = "http://localhost:8083/")
+public interface SysAreaClient {
+
+
+    /**
+     * 根据id获取保险公司信息
+     * @param address
+     * @param idCard
+     * @return
+     */
+    @GetMapping("/area/queryByAddress")
+    public HttpResult<PersonAreaVo> queryByAddress(@RequestParam String address, @RequestParam String idCard);
+
+}

+ 238 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/components/YcRequestApiComponents.java

@@ -0,0 +1,238 @@
+package com.jzg.quotation.yongcheng.api.components;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.yongcheng.api.constants.RequestUrl;
+import com.jzg.quotation.yongcheng.api.entity.YcBuildData;
+import com.jzg.quotation.yongcheng.api.entity.request.AuditRequest;
+import com.jzg.quotation.yongcheng.api.entity.request.ModelsQueryRequest;
+import com.jzg.quotation.yongcheng.api.entity.request.PriceDiscountRatioRequest;
+import com.jzg.quotation.yongcheng.api.entity.request.QuoteRequest;
+import com.jzg.quotation.yongcheng.api.entity.response.AuditResponse;
+import com.jzg.quotation.yongcheng.api.entity.response.ModelsQueryResponse;
+import com.jzg.quotation.yongcheng.api.entity.response.PriceDiscountRatioResponse;
+import com.jzg.quotation.yongcheng.api.entity.response.QuoteResponse;
+import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.client.WebClient;
+
+@Component
+public class YcRequestApiComponents {
+
+
+    private final YcApiConfigurationProperties apiComponents;
+
+    public YcRequestApiComponents(YcApiConfigurationProperties apiComponents) {
+        this.apiComponents = apiComponents;
+    }
+
+    private ObjectMapper gainXmlMapper() {
+        ObjectMapper xmlMapper = new XmlMapper();
+        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        xmlMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
+        xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
+        xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
+        xmlMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
+        return xmlMapper;
+    }
+
+
+    /**
+     * @param q      请求参数
+     * @param tClass 响应类型
+     * @param <Q>    Request 请求体
+     * @param <S>    Response 响应体
+     * @return <S>
+     */
+    private <Q, S> S post(Q q, RequestUrl requestUrl, Class<S> tClass) throws JsonProcessingException {
+        String url = apiComponents.getUrl() + requestUrl.getUri();
+
+        WebClient webClient = WebClient.builder()
+                .baseUrl(url)
+                .defaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")
+                .defaultHeader("Content-Type", "text/xml;charset=UTF-8")
+                .build();
+
+        String xmlString = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tns=\"http://newWS.front.app.echannel.ebiz.alltrust.com/\">"
+                + "<soapenv:Body>"
+                + gainXmlMapper().writeValueAsString(q)
+                + "</soapenv:Body>\n</soapenv:Envelope>";
+
+        String responseStringMsg = webClient.post()
+                .contentType(MediaType.APPLICATION_XML)
+                .bodyValue(xmlString)
+                .retrieve()
+                .bodyToMono(String.class)
+                .block(); // 阻塞等待返回结果
+
+        String cleanStr = YcBuildData.cleanResponseStr(responseStringMsg);
+        if (!cleanStr.contains("<")) {
+            return (S) cleanStr;
+        }
+
+        S bean = gainXmlMapper().readValue(cleanStr, tClass);
+        if (ObjectUtils.isEmpty(bean)) {
+            throw new SystemException("请求失败");
+        }
+
+        return bean;
+    }
+
+    private <Q, S> S post1(Q q, RequestUrl requestUrl, Class<S> tClass) throws JsonProcessingException {
+        String url = apiComponents.getUrl() + requestUrl.getUri();
+
+        WebClient webClient = WebClient.builder()
+                .baseUrl(url)
+                .defaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")
+                .defaultHeader("Content-Type", "text/xml;charset=UTF-8")
+                .build();
+
+        String xmlString = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:new=\"http://newWS.front" +
+                ".app.echannel.ebiz.alltrust.com/\">" +
+                "<soapenv:Header/>" +
+                "<soapenv:Body>" +
+                gainXmlMapper().writeValueAsString(q) +
+                "</soapenv:Body>" +
+                "</soapenv:Envelope>";
+
+        // 发送请求
+        String responseStringMsg = webClient.post()
+                .bodyValue(xmlString)
+                .retrieve()
+                .bodyToMono(String.class)
+                .block(); // block() 会阻塞获取响应,若是异步环境可使用 Mono 处理
+
+        // 解析响应
+        String cleanStr = YcBuildData.cleanResponseStr(responseStringMsg);
+        if (!cleanStr.contains("<")) {
+            return (S) cleanStr;
+        }
+
+        S bean = gainXmlMapper().readValue(cleanStr, tClass);
+        if (ObjectUtils.isEmpty(bean)) {
+            throw new SystemException("请求失败");
+        }
+
+        return bean;
+    }
+
+    /**
+     * 车型查询
+     *
+     * @param modelsQueryRequest 车型查询 入参实体
+     * @return 出参实体
+     */
+    public ModelsQueryResponse newQueryVehicleTypes(ModelsQueryRequest modelsQueryRequest) throws JsonProcessingException {
+        return post(modelsQueryRequest, RequestUrl.API_MODEL, ModelsQueryResponse.class);
+    }
+
+    /**
+     * 保费计算
+     *
+     * @param quoteRequest 报价 入参实体
+     * @return 出参实体
+     */
+    public QuoteResponse newPremiumXnyCalculation(QuoteRequest quoteRequest) throws JsonProcessingException {
+        return post(quoteRequest, RequestUrl.API_QUOTE, QuoteResponse.class);
+    }
+
+    /**
+     * 核保
+     *
+     * @param auditRequest 核保 入参实体
+     * @return 出参实体
+     */
+    public AuditResponse newXnyUnderwritingService(AuditRequest auditRequest) throws JsonProcessingException {
+        return post(auditRequest, RequestUrl.API_AUDIT, AuditResponse.class);
+    }
+
+    /**
+     * 核保
+     *
+     * @param audit 核保 入参实体
+     * @return 出参实体
+     */
+//    public ImageUpResponse newImageUp(ImageUp audit) throws JsonProcessingException {
+//        return post(audit, RequestUrl.API_UPLOAD, ImageUpResponse.class);
+//    }
+//
+//
+//    /**
+//     * 支付链接
+//     *
+//     * @param pay 支付链接 入参实体
+//     * @return 出参实体
+//     */
+//    public PayResponse newGetPayNo(Pay pay) throws JsonProcessingException {
+//        return post(pay, RequestUrl.API_PAY, PayResponse.class);
+//    }
+//
+//
+//    /**
+//     * 意外险
+//     *
+//     * @param accident 意外险 入参实体
+//     * @return 出参实体
+//     */
+//    public AccidentResponse newQueryYwCvrgWeb(Accident accident) throws JsonProcessingException {
+//        return post(accident, RequestUrl.API_ACCIDENT, AccidentResponse.class);
+//    }
+//
+//    /**
+//     * 投保单打回接口
+//     *
+//     * @param accident 投保单打回 入参实体
+//     * @return 出参实体
+//     */
+//    public AccidentResponse returnAppPolicyWebService(ProposalPolicyReturnRequest accident) throws JsonProcessingException {
+//        return post(accident, RequestUrl.API_UNDERWRITING_RETURNS, AccidentResponse.class);
+//    }
+//
+//    /**
+//     * 补传回调及订单信息查询接口
+//     *
+//     * @param callbackAnOrder 补传回调及订单信息查询接口 入参实体
+//     * @return 出参实体
+//     */
+//    public String payCallback(CallbackAnOrder callbackAnOrder) throws JsonProcessingException {
+//        return post(callbackAnOrder, RequestUrl.API_ORDER_QUERY, String.class);
+//    }
+//
+//    /**
+//     * 意外险确保接口
+//     *
+//     * @param accidentUnderwritingRequest 意外险确保 请求参数
+//     * @return 意外险响应参数
+//     * @throws JsonProcessingException 序列化失败
+//     */
+//    public AccidentUnderwritingResponse submitPolicy(AccidentUnderwritingRequest accidentUnderwritingRequest) throws JsonProcessingException {
+//        return post(accidentUnderwritingRequest, RequestUrl.API_SUBMIT_POLICY, AccidentUnderwritingResponse.class);
+//    }
+//
+//    /**
+//     * 电子保单
+//     *
+//     * @param policy 电子保单 入参实体
+//     * @return 出参实体
+//     */
+//    public PolicyResponse dzbdWeb(Policy policy) throws JsonProcessingException {
+//        return post(policy, RequestUrl.API_GUARANTEE_SLIP, PolicyResponse.class);
+//    }
+
+    /**
+     * 获取协商价折扣比例
+     *
+     * @param priceDiscountRatioRequest 获取协商价折扣比例 入参实体
+     * @return 出参实体
+     */
+    public PriceDiscountRatioResponse priceDiscount(PriceDiscountRatioRequest priceDiscountRatioRequest) throws JsonProcessingException {
+        return post1(priceDiscountRatioRequest, RequestUrl.API_PRICE_DISCOUNT_RATIO, PriceDiscountRatioResponse.class);
+    }
+}

+ 18 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/constants/Constants.java

@@ -0,0 +1,18 @@
+package com.jzg.quotation.yongcheng.api.constants;
+
+import lombok.Data;
+
+@Data
+public class Constants {
+    public static final String JQ_REGEX = "交强险.+?(?:保险止期|终保日期)[是::\\s]*?([0-9\\-:]+)";
+    public static final String JQ_GUOHU_AND_JISHI_REGEX = "重复投保提示:.*?投保确认码\\s*[\\w\\d]+.*?起保日期\\s*[0-9\\-: ]+;.*?终保日期\\s*([0-9\\-: ]+);";
+    public static final String JQ_RULE = "机动车交通事故强制险";
+    public static final String SY_RULE = "机动车综合商业保险";
+    public static final String REGEX_ALONE = "(?:保险止期|终保日期)[是::\\s]*?([0-9\\-:]+)";
+    public static final String SY_REGEX = "(?:商业险|商业保险).+?(?:保险止期|终保日期)[是::\\s]*?([0-9\\-:]+)";
+    public static final String END_TIME = "23:59:59";
+
+    public static final String REDIS_YONGCHENG_QUERY_CODE_JQ = "REDIS_YONGCHENG_QUERY_CODE_JQ:";
+    public static final String REDIS_YONGCHENG_QUERY_CODE_SY = "REDIS_YONGCHENG_QUERY_CODE_SY:";
+
+}

+ 23 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/constants/RequestUrl.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.yongcheng.api.constants;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum RequestUrl {
+    API_MODEL("newQueryVehicleTypesService", "车型查询"),
+    API_QUOTE("NewPremiumXnyCalculationService", "报价"),
+    API_AUDIT("NewXnyUnderwritingService", "核保"),
+    API_UPLOAD("newImageUpService", "影像上传"),
+    API_PAY("newGetPayNoService", "支付"),
+    API_GUARANTEE_SLIP("DzbdWebService", "电子保单"),
+    API_ORDER_QUERY("payCallback", "补传回调及订单信息查询接口"),
+    API_UNDERWRITING_RETURNS("returnAppPolicyWebService", "投保单打回接口"),
+    API_ACCIDENT("NewQueryYwCvrgWebService", "意外险"),
+    API_SUBMIT_POLICY("SubmitpolicyWebService", "意外险确保接口"),
+    API_PRICE_DISCOUNT_RATIO("PriceDiscountService", "获取协商价浮动比例接口");
+    private final String uri;
+    private final String desc;
+}

+ 360 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/YcBuildData.java

@@ -0,0 +1,360 @@
+package com.jzg.quotation.yongcheng.api.entity;
+
+import cn.hutool.core.util.ArrayUtil;
+import com.jzg.quotation.commons.entity.vo.quote.KindInfoVo;
+import com.jzg.quotation.yongcheng.api.entity.request.QuoteRequest;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 永诚构造数据
+ *
+ * @author: lig
+ * @date: 2023年02月16日 0016
+ */
+@Data
+@Component
+public class YcBuildData {
+
+    //身份证有效期   长期可传:2099-12-30
+    public static final String ID_CARD_INDATE = "2099-12-30";
+    //接口 车型查询
+    public static final String API_MODEL = "newQueryVehicleTypesService";
+    //接口 报价
+    public static final String API_QUOTE = "NewPremiumXnyCalculationService";
+    //接口 核保
+    public static final String API_AUDIT = "NewXnyUnderwritingService";
+    //接口 影像上传
+    public static final String API_UPLOAD = "newImageUpService";
+    //接口 支付
+    public static final String API_PAY = "newGetPayNoService";
+    //接口 电子保单
+    public static final String API_GUARANTEE_SLIP = "DzbdWebService";
+    //接口 补传回调及订单信息查询接口
+    public static final String API_ORDER_QUERY = "payCallback";
+    //接口 意外险
+    public static final String API_ACCIDENT = "NewQueryYwCvrgWebService";
+    // 驾意险确保
+    public static final String API_SUBMIT_POLICY = "SubmitpolicyWebService";
+
+    /**
+     * 构造 商业险数据  通过报价 响应数据
+     *
+     * @author: lig
+     * @date: 2023年02月16日 0016
+     */
+//    public static List<QuoteKindRespVo> buildQuoteKindList(RuoteResponse rd) {
+//
+//        if (null == rd.getCvrgListSY() || null == rd.getCvrgListSY().getCvrgSY()) {
+//            return Collections.emptyList();
+//        }
+//
+//        List<QuoteKindRespVo> kindList = new ArrayList<>();
+//
+//        rd.getCvrgListSY().getCvrgSY().forEach(a -> {
+//
+//            String kindcode = a.getCCvrgNo();
+//            int i = ArrayUtil.indexOf(InsuranceTypeCorrespondence.getYongchengConnectInsuranceType(), kindcode);
+//            InsurKind insurKind = Enum.valueOf(InsurKind.class, InsuranceTypeCorrespondence.getJinZhangGuiType()[i]);
+//
+//            double premium = StringUtils.parseDouble(a.getNPrm());
+//            double amount = StringUtils.parseDouble(a.getNPerAmt());
+//            QuoteKindRespVo kind;
+//            kind = new QuoteKindRespVo();
+//            kind.setKindCode(insurKind.getCode());
+//            kind.setKindName(insurKind.getDesc());
+//            kind.setAmount(amount);
+//            kind.setCoveragePremium(premium);
+//
+//            // 司机
+//            if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getDriver(), insurKind.getCode()) >= 0) {
+//                kind.setUnitAmount(amount);
+//                kind.setQuantity("1");
+//            }
+//            // 乘客
+//            if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getPassenger(), insurKind.getCode()) >= 0) {
+//                int seat = Integer.parseInt(rd.getVhl().getNSeatNum()) - 1;
+//                kind.setUnitAmount(amount);
+//                kind.setQuantity(String.valueOf(seat));
+//            }
+//            // 增值服务
+//            if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getSpecialContractClause(), insurKind.getCode()) >= 0) {
+//                kind.setServiceTimes(a.getNLiabDaysLmt());
+//            }
+//
+//            kindList.add(kind);
+//
+//        });
+//
+//        return kindList;
+//    }
+
+
+    /**
+     * 构造 响应 QuoteRespVo  永诚API方式
+     *
+     * @author: lig
+     * @date: 2023年02月16日 0016
+     */
+//    public static QuoteRespVo buildQuoteRespVo(InsOrders insOrder, RuoteResponse rd, YaQuoteInfoVo yaQuoteInfoVo) {
+//
+//        //交强保费 含税
+//        double jqPremium = 0;
+//        if (StringUtils.isNotEmpty(rd.getBase().getNBefTaxPrmJQ())) {
+//            jqPremium =
+//                    StringUtils.toDouble(new BigDecimal(rd.getBase().getNBefTaxPrmJQ()).add(new BigDecimal(rd.getBase().getNAppTaxAmtJQ())).toString());
+//        }
+//        //商业保费 含税
+//        double syPremium = 0;
+//        if (StringUtils.isNotEmpty(rd.getBase().getNBefTaxPrmSY())) {
+//            syPremium =
+//                    StringUtils.toDouble(new BigDecimal(rd.getBase().getNBefTaxPrmSY()).add(new BigDecimal(rd.getBase().getNAppTaxAmtSY())).toString());
+//        }
+//        double jyPremium = 0;
+//
+//        QuoteRespVo quoteRespVo = new QuoteRespVo();
+//        List<QuoteRiskRespVo> riskList1 = new ArrayList<>();
+//        List<QuoteKindRespVo> kindList1 = new ArrayList<>();
+//        List<RiskInfoVo> riskList = yaQuoteInfoVo.getRiskList();
+//        for (RiskInfoVo riskInfoVo : riskList) {
+//            if ("0507".equals(riskInfoVo.getRiskCode()) && jqPremium != 0) {
+//                QuoteRiskRespVo risk = new QuoteRiskRespVo();
+//                risk.setRiskCode("0507");
+//                risk.setRiskName("机动车交通事故责任强制保险");
+//                risk.setPremium(jqPremium);
+//                risk.setStartDate(riskInfoVo.getStartDate());
+//                risk.setEndDate(riskInfoVo.getEndDate());
+//                riskList1.add(risk);
+//            }
+//            if ("0510".equals(riskInfoVo.getRiskCode()) && syPremium != 0) {
+//                QuoteRiskRespVo risk = new QuoteRiskRespVo();
+//                risk.setRiskCode("0510");
+//                risk.setRiskName("机动车商业保险");
+//                risk.setPremium(syPremium);
+//                risk.setStartDate(riskInfoVo.getStartDate());
+//                risk.setEndDate(riskInfoVo.getEndDate());
+//                riskList1.add(risk);
+//            }
+//
+//        }
+//
+//
+//        kindList1 = YcBuildData.buildQuoteKindList(rd);
+//
+//        quoteRespVo.setRiskList(riskList1);
+//        quoteRespVo.setKindList(kindList1);
+//
+//        //车船税
+//        double sumTax = 0;
+//        if (null != rd.getTax()) {
+//            sumTax = StringUtils.toDouble(rd.getTax().getSumUpTax());
+//        }
+//        //意外险
+//        if (null != rd.getProposal()) {
+//            jyPremium = StringUtils.toDouble(rd.getProposal().getPremium());
+//        }
+//        quoteRespVo.setJyPremium(jyPremium);
+//
+//        //保费合计
+//        double sumPermium = StringUtils.toDouble(rd.getBase().getNPrm());
+//
+//        quoteRespVo.setCiSumPermium(BigDecimal.valueOf(jqPremium).add(BigDecimal.valueOf(sumTax)).doubleValue());//交强险和车船税合计
+//        quoteRespVo.setSumPermium(BigDecimal.valueOf(sumPermium).add(BigDecimal.valueOf(sumTax)).add(BigDecimal.valueOf(jyPremium)).doubleValue());//保费合计
+//        quoteRespVo.setTaxAmount(BigDecimal.valueOf(sumTax).doubleValue());//车船税
+//        if (null != rd.getPrmCoef()) {
+//            quoteRespVo.setTotalAdjustRate(StringUtils.toDouble(rd.getPrmCoef().getNTotDisc()));
+//        }
+//        quoteRespVo.setILogPreUdwMess(rd.getBase().getCWeRisk());//评分
+//        quoteRespVo.setOrderno(insOrder.getOrderno()); //订单号
+//        quoteRespVo.setJqPremium(jqPremium);
+//        quoteRespVo.setSyPremium(syPremium);
+//
+//        //起保日期
+//        quoteRespVo.setStartDateJq(StringUtils.toString(rd.getBase().getTInsrncBgnTmJQ()));
+//        quoteRespVo.setEndDateJq(StringUtils.toString(rd.getBase().getTInsrncEndTmJQ()));
+//
+//        quoteRespVo.setStartDateSy(StringUtils.toString(rd.getBase().getTInsrncBgnTmSY()));
+//        quoteRespVo.setEndDateSy(StringUtils.toString(rd.getBase().getTInsrncEndTmSY()));
+//
+//        // 交强出险次数
+//        String jqClaims = Optional.ofNullable(rd.getBase()).map(BaseResponse::getAccidentNum).orElse(null);
+//        quoteRespVo.setJqClaims(jqClaims);
+//        // 商业出险次数
+//        String syClaims = Optional.ofNullable(rd.getPrmCoef()).map(PrmCoefResponse::getNClaimTimes).orElse(null);
+//        quoteRespVo.setSyClaims(syClaims);
+//
+//        //欠税信息
+//        if (null != rd.getTax()) {
+//            List<TaxArrears> taxArrearsList = new ArrayList<>();
+//            TaxArrears taxArrear = new TaxArrears();
+//
+//            taxArrear.setYears(rd.getTax().getTaxEndDateCurrentYear());
+//            taxArrear.setTaxDefault(StringUtils.toDouble(rd.getTax().getFormerTax()));
+//            taxArrear.setLateFee(StringUtils.toDouble(rd.getTax().getLateFee()));
+//            taxArrearsList.add(taxArrear);
+//            quoteRespVo.setTaxArrears(taxArrearsList);
+//        }
+//
+//        //平台返回信息
+//        if (null != rd.getTfiWarnList()) {
+//            //排空
+//            List<TfiWarnListResponse.TfiWarnData> tfiWarnData =
+//                    rd.getTfiWarnList().getTfiWarnData().stream().filter(Objects::nonNull).filter(item -> StringUtils.isNotEmpty(item.getWarnMessage())).collect(Collectors.toList());
+//            List<String> warnMessageList = new ArrayList<>();
+//            tfiWarnData.forEach(a -> warnMessageList.add(a.getWarnMessage()));
+//            quoteRespVo.setWarnMessageList(warnMessageList);
+//        }
+//
+//        return quoteRespVo;
+//    }
+
+
+    /**
+     * @param vehiclePrice 车辆购置价
+     * @param fstRegDate   初登日期
+     * @param startDate    起保日期
+     * @return 折旧价
+     * 永诚提供
+     */
+    public static String getDefValue(final BigDecimal vehiclePrice,
+                                     final String fstRegDate, final String startDate) {
+        int monthDiff = 0;
+        monthDiff = getMonthDiffSub(fstRegDate, startDate);
+        BigDecimal depreciationRate = new BigDecimal("0.006");
+        ;  //月折旧率
+        final BigDecimal rate = new BigDecimal(1).subtract(depreciationRate
+                .multiply(new BigDecimal(monthDiff))); //折旧率
+        final BigDecimal calcResult = vehiclePrice.multiply(rate).setScale(0, BigDecimal.ROUND_HALF_UP);  //折旧后的价格
+        // 当折旧金额超过新车购置价80%时,保额默认为新车购置价的20%
+        final BigDecimal lowestPrice = vehiclePrice.multiply(new BigDecimal("0.8")).setScale(0, BigDecimal.ROUND_HALF_UP);
+        final BigDecimal lowestPrice2 = vehiclePrice.multiply(new BigDecimal("0.2")).setScale(0, BigDecimal.ROUND_HALF_UP);
+        final BigDecimal defValue = vehiclePrice.subtract(calcResult).floatValue() > lowestPrice.floatValue()
+                ? lowestPrice2 : calcResult;
+        return defValue.toString();
+    }
+
+    /**
+     * 计算两个日期间相差月份(yyyy-MM-dd)   不足一月不计算
+     *
+     * @param date1 起期(初登日期)
+     * @param date2 止期(保险起期)
+     * @return 相差月份数
+     * @author 梅俊原 2011-1-5 下午02:55:32
+     * 永诚提供
+     */
+    private static int getMonthDiffSub(final String date1, final String date2) {
+        final String[] startDateArray = date1.split("-");
+        final String[] endDateArray = date2.split("-");
+        int startYear = Integer.parseInt(startDateArray[0]);
+        int startMonth = Integer.parseInt(startDateArray[1]);
+        int startDay = Integer.parseInt(startDateArray[2]);
+
+        int endYear = Integer.parseInt(endDateArray[0]);
+        int endMonth = Integer.parseInt(endDateArray[1]);
+        int endDay = Integer.parseInt(endDateArray[2]);
+
+        int subMonth = (endYear - startYear) * 12;
+        if (startDay > endDay) { //如果止期日  比 起期日小  则不足一月
+            subMonth = subMonth + endMonth - startMonth - 1;
+        } else {
+            subMonth = subMonth + endMonth - startMonth;
+        }
+        return subMonth;
+    }
+
+
+    /**
+     * 构造投保组合
+     * DJ	单交
+     * DSDS	单商单三
+     * DS	单商
+     * JSGBZX	交商共保主险
+     * JSGBDS	交商共保单三
+     * Z	其他
+     *
+     * @Return 组合编码
+     */
+    public static String buildInsureGroup(boolean jqFlag, boolean syFlag) {
+        String groupStr = "";
+        if (jqFlag && syFlag) {
+            groupStr = "JSGBZX";
+        } else if (jqFlag && !syFlag) {
+            groupStr = "DJ";
+        } else if (!jqFlag && syFlag) {
+            groupStr = "DS";
+        } else {
+            //其他
+            groupStr = "Z";
+        }
+        return groupStr;
+    }
+
+
+    /**
+     * @description: 清洗返回数据
+     * @author: lig
+     * @date: 2023年02月07日 0007
+     */
+    public static String cleanResponseStr(String responseData) {
+        String rStr = "";
+        String str = "";
+        if (responseData.indexOf("<response>") > 0) {
+            rStr = responseData.substring(responseData.indexOf("<response>") + 10, responseData.indexOf("</response>"));
+        } else if (responseData.indexOf("<return>") > 0) {
+            rStr = responseData.substring(responseData.indexOf("<return>") + 8, responseData.indexOf("</return>"));
+        }
+        if (StringUtils.isEmpty(rStr)) {
+            rStr = responseData.substring(responseData.indexOf("<response>") + 10, responseData.indexOf("</response>"));
+        }
+        String lRStr = rStr.replaceAll("&lt;", "<");
+        str = lRStr.replaceAll("&gt;", ">");
+
+        return str.trim();
+    }
+
+
+    /**
+     * 获取单位保额
+     *
+     * @author: lig
+     * @date: 2023年03月27日 0027
+     */
+//    public static String gainNPerAmt(KindInfoVo a) {
+//
+//        if (a.getUnitAmount() > 0) {
+//            return (int) a.getUnitAmount() + "";
+//        } else {
+//            return (int) a.getAmount() + "";
+//        }
+//    }
+
+
+    /**
+     * 获取折旧价
+     *
+     * @param depreciationValue 折旧价
+     * @param vhl               车辆信息
+     * @return
+     */
+    public static String getNegotiateThePrice(String depreciationValue, QuoteRequest.Condition.Vhl vhl, String startTime) {
+        if (!("32773001".equals(vhl.getFuelType()) && Integer.parseInt(vhl.getNResvNum1()) < 10 )) {
+            return depreciationValue;
+        }
+
+        int monthDiff = getMonthDiffSub(vhl.getCFstRegYm(), startTime);
+        if (monthDiff > 9 && monthDiff < 96) {
+            return new BigDecimal(depreciationValue).multiply(new BigDecimal("0.3")).toString();
+        } else if ("1".equals(vhl.getCChgOwnerFlag()) || monthDiff >= 96) {
+            return new BigDecimal(depreciationValue).multiply(new BigDecimal("0.5")).toString();
+        }
+
+        return depreciationValue;
+    }
+
+
+}

+ 21 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/dto/CarInsDateDto.java

@@ -0,0 +1,21 @@
+package com.jzg.quotation.yongcheng.api.entity.dto;
+
+import lombok.Data;
+
+/**
+ *  车险日期
+ *
+ * @author: lig
+ * @date: 2023-10-16
+ */
+@Data
+public class CarInsDateDto {
+
+    private String startDate;
+
+    private String endDate;
+
+    //是即时起保
+    private boolean isForthwith = false;
+
+}

+ 440 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/AuditRequest.java

@@ -0,0 +1,440 @@
+package com.jzg.quotation.yongcheng.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import com.jzg.commons.util.IDCardUtils;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
+import com.jzg.quotation.yongcheng.api.entity.YcBuildData;
+import com.jzg.quotation.yongcheng.api.properties.AuthorityDataXml;
+import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+
+import java.math.BigDecimal;
+import java.util.Objects;
+
+
+/**
+ * 核保 请求参数
+ */
+@Data
+@JacksonXmlRootElement(localName = "tns:underwriteXnyVehiclePolicyService")
+public class AuditRequest {
+
+    @JacksonXmlProperty(isAttribute = false, localName = "request")
+    private RequestLabel requestLabel;
+
+
+    @Data
+    public static class RequestLabel {
+        /**
+         * authorityData
+         */
+        @Valid
+        @JacksonXmlProperty(isAttribute = false, localName = "authorityData")
+        private AuthorityDataXml authorityData;
+
+        @JacksonXmlProperty(isAttribute = false, localName = "condition")
+        private Condition condition;
+    }
+
+    @Data
+    public static class Condition {
+
+        /**
+         * 机构编码
+         * 如上海网电销业务部:0376代理或经济业务必传
+         */
+        @JacksonXmlProperty(localName = "deptCode")
+        private String deptCode;
+
+        /**
+         * 是否投保交强
+         * 是否投保交强险(1 是 0 否)
+         */
+        @JacksonXmlProperty(localName = "jqFlag")
+        private String jqFlag;
+
+        /**
+         * 是否投保商业
+         * 是否投保商业险(1 是 0 否)
+         */
+        @JacksonXmlProperty(localName = "syFlag")
+        private String syFlag;
+
+        /**
+         * 手续费比例
+         * 默认传 0
+         */
+        @JacksonXmlProperty(localName = "commissionPercentage")
+        private String commissionPercentage;
+
+        /**
+         * 缴费方式
+         * 缴费方式默认传002018
+         */
+        @JacksonXmlProperty(localName = "paymode")
+        private String paymode;
+
+        /**
+         * 总牵引质量(kg)
+         */
+        @JacksonXmlProperty(localName = "ngo")
+        private String ngo;
+
+        /**
+         * 发证日期
+         */
+        @JacksonXmlProperty(localName = "TResvTm")
+        private String TResvTm;
+
+        /**
+         * 四川平台车辆使用性质
+         */
+        @JsonProperty("cScsyxz")
+        @JacksonXmlProperty(localName = "cScsyxz")
+        private String cScsyxz;
+
+
+        /**
+         * 商业险产品号
+         */
+        @JsonProperty("cProdNoSY")
+        @JacksonXmlProperty(localName = "cProdNoSY")
+        private String cProdNoSY;
+
+        /**
+         * 交强险产品号
+         */
+        @JsonProperty("cProdNoJQ")
+        @JacksonXmlProperty(localName = "cProdNoJQ")
+        private String cProdNoJQ;
+
+
+        /**
+         * 交强投保查询码
+         * 投保交强险必传
+         */
+        @JacksonXmlProperty(localName = "querySequenceNoJq")
+        private String querySequenceNoJq;
+
+        /**
+         * 商业投保查询码
+         * 投保商业险必传
+         */
+        @JacksonXmlProperty(localName = "querySequenceNoSy")
+        private String querySequenceNoSy;
+
+        /**
+         * 是否意外险
+         */
+        @JacksonXmlProperty(localName = "ywFlag")
+        private String ywFlag;
+
+
+        @Data
+        @NoArgsConstructor
+        @AllArgsConstructor
+        public static class Customer {
+
+            /**
+             * 受益人客户分类
+             * 代码表,广东必传
+             */
+            @JacksonXmlProperty(localName = "benefitCustType")
+            private String benefitCustType;
+
+            /**
+             * 受益人证件类型
+             * 代码表,广东必传
+             */
+            @JacksonXmlProperty(localName = "benefitCertiType")
+            private String benefitCertiType;
+
+            /**
+             * 受益人证件号
+             * 广东必传
+             */
+            @JacksonXmlProperty(localName = "benefitCertiCode")
+            private String benefitCertiCode;
+
+            /**
+             * 受益人出生日期
+             * YYYY-MM-DD,广东必传
+             */
+            @JacksonXmlProperty(localName = "benefitAge")
+            private String benefitAge;
+
+            /**
+             * 受益人性别
+             * 代码表,广东必传
+             */
+            @JacksonXmlProperty(localName = "benefitSex")
+            private String benefitSex;
+
+            /**
+             * 受益人名称
+             * 广东必传
+             */
+            @JacksonXmlProperty(localName = "benefitName")
+            private String benefitName;
+
+            /**
+             * 受益人证件有效期
+             * YYYY-MM-DD长期可传:2099-12-30
+             */
+            @JacksonXmlProperty(localName = "bnfctcertfclsvalidate")
+            private String bnfctcertfclsvalidate;
+
+            /**
+             * 车主通讯地址
+             */
+            @JacksonXmlProperty(localName = "ownerAddress")
+            private String ownerAddress;
+
+            /**
+             * 投保人年收入
+             * 代码表,可不传,默认为0
+             */
+            @JacksonXmlProperty(localName = "appcIncome")
+            private String appcIncome;
+
+            /**
+             * 被保人年收入
+             * 代码表,可不传,默认为0
+             */
+            @JacksonXmlProperty(localName = "insuredcIncome")
+            private String insuredcIncome;
+
+            /**
+             * 投保人证件有效起期
+             */
+            @JacksonXmlProperty(localName = "appCertfClsStart")
+            private String appCertfClsStart;
+
+            /**
+             * 被保人证件有效起期
+             */
+            @JacksonXmlProperty(localName = "insuredCertfClsStart")
+            private String insuredCertfClsStart;
+
+            /**
+             * 受益人所在省
+             * 受益人所在省
+             */
+            @JsonProperty("cProvince")
+            @JacksonXmlProperty()
+            private String CProvince;
+
+            /**
+             * 受益人所在市
+             * 受益人所在市
+             */
+            @JsonProperty("cCity")
+            @JacksonXmlProperty()
+            private String CCity;
+
+            /**
+             * 受益人所在县
+             * 受益人所在县
+             */
+            @JacksonXmlProperty(localName = "CCounty")
+            private String CCounty;
+
+        }
+
+            /**
+         * 客户信息 customer
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "customer")
+        private Customer customer;
+
+
+        @Data
+        @NoArgsConstructor
+        @AllArgsConstructor
+        public static class TaxATion {
+
+
+            /**
+             * 纳税人名称
+             * 默认投保人 根据纳税人类型取值
+             */
+            @JacksonXmlProperty(localName = "taxName")
+            private String taxName;
+
+            /**
+             * 纳税人身份
+             * 参见代码表
+             */
+            @JacksonXmlProperty(localName = "clntMark")
+            private String clntMark;
+
+            /**
+             * 纳税人识别号
+             * 纳税人身份为1时必传
+             */
+            @JacksonXmlProperty(localName = "taxpayerComid")
+            private String taxpayerComid;
+
+            /**
+             * 地址
+             * 纳税人身份为1时必传
+             */
+            @JacksonXmlProperty(localName = "clntAddress")
+            private String clntAddress;
+
+            /**
+             * 纳税人电话
+             * 纳税人身份为1时必传
+             */
+            @JacksonXmlProperty(localName = "mobile")
+            private String mobile;
+
+            /**
+             * 开户行名称
+             * 纳税人身份为1时必传
+             */
+            @JacksonXmlProperty(localName = "bankName")
+            private String bankName;
+
+            /**
+             * 银行账号
+             * 纳税人身份为1时必传
+             */
+            @JacksonXmlProperty(localName = "acctNo")
+            private String acctNo;
+
+            /**
+             * 纳税人类型
+             * 参见代码表
+             */
+            @JsonProperty("CTaxType")
+            @JacksonXmlProperty(localName = "cTaxType")
+            private String cTaxType;
+
+        }
+
+        /**
+         * 税务信息 taxATion
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "taxATion")
+        private TaxATion taxATion;
+
+
+    }
+
+
+    /**
+     * 构造 核保 请求参数
+     *
+     * @author: lig
+     * @date: 2023-02-15
+     */
+    public static AuditRequest buildAuditParam(QuoteVo quoteVo,CustomerInfoVo ownerInfo, CustomerInfoVo insureInfo, CustomerInfoVo applyInfo, YcApiConfigurationProperties ycConfigureParameters) {
+//    public static Audit buildAuditParam(InsOrders order, AuthorityDataXml authorityDataXml,InsAreaCompany iac) {
+
+//        //车主
+//        CustomerInfoVo ownerInfo = JSONObject.parseObject(order.getOwnerinfo().toJSONString(), CustomerInfoVo.class);
+//        //被保人
+//        CustomerInfoVo insureInfo = JSONObject.parseObject(order.getInsureinfo().toJSONString(), CustomerInfoVo.class);
+//        //投保人
+//        CustomerInfoVo applyInfo = JSONObject.parseObject(order.getApplyinfo().toJSONString(), CustomerInfoVo.class);
+
+        AuditRequest auditRequest = new AuditRequest();
+
+        RequestLabel r = new RequestLabel();
+
+        Condition condition = new Condition();
+
+        //<condition>  "14A4"
+        condition.setDeptCode(ycConfigureParameters.getDptCde());
+
+        condition.setJqFlag(Objects.isNull(quoteVo.getCiRiskInfoVo()) ? "0" : "1");
+        condition.setSyFlag(Objects.isNull(quoteVo.getBiRiskInfoVo()) ? "0" : "1");
+        condition.setCommissionPercentage("0");
+        condition.setPaymode("002018");
+        condition.setNgo("");
+        condition.setTResvTm("");
+        condition.setCScsyxz("");
+
+        if(iac.getJypremium().compareTo(new BigDecimal(0)) > 0){
+            condition.setYwFlag("1");
+        }
+
+        condition.setCProdNoSY(condition.getSyFlag().equals("1") ? "0364" : "");
+        condition.setCProdNoJQ(condition.getJqFlag().equals("1") ? "0326" : "");
+
+        condition.setQuerySequenceNoSy(iac.getSyapplyno());
+        condition.setQuerySequenceNoJq(iac.getJqapplyno());
+
+        //<condition>
+        Condition.Customer customer = new Condition.Customer();
+        customer.setOwnerAddress(ownerInfo.getAddr());
+        customer.setAppcIncome("0");
+        customer.setInsuredcIncome("0");
+        String property1 = insureInfo.getProperty();
+        if (StringUtils.isNotEmpty(property1) && "0".equals(property1)) {
+            customer.setBenefitCustType("0");
+            customer.setBenefitCertiType("110004");
+            customer.setBenefitCertiCode(insureInfo.getOrganizationCode());
+            customer.setBenefitName(insureInfo.getName());
+        }else {
+
+            customer.setBenefitCustType("1");
+            customer.setBenefitCertiType("120001");
+            customer.setBenefitCertiCode(insureInfo.getIdentifyNumber());
+            customer.setBenefitAge(IDCardUtils.GetBirthday(insureInfo.getIdentifyNumber()));
+            customer.setBenefitSex(IDCardUtils.GetYcSex(insureInfo.getIdentifyNumber()));
+            customer.setBenefitName(insureInfo.getName());
+        }
+        customer.setBnfctcertfclsvalidate(YcBuildData.ID_CARD_INDATE);
+//        customer.setCProvince(Province.buildProvince(insureInfo.getAddr()));
+//        customer.setCCity(City.buildCity(insureInfo.getAddr()));
+//        customer.setCCounty();
+
+
+        //<taxATion>
+        Condition.TaxATion taxATion = new Condition.TaxATion();
+        //0:法人 1个人
+        String property = applyInfo.getProperty();
+        if (StringUtils.isNotEmpty(property) && "0".equals(property)) {
+            taxATion.setCTaxType("338003");
+            taxATion.setTaxpayerComid(applyInfo.getOrganizationCode());
+        }else {
+            taxATion.setCTaxType("338001");
+            taxATion.setTaxpayerComid(applyInfo.getIdentifyNumber());
+        }
+        //ceshi
+//        taxATion.setCTaxType("338001");
+//        taxATion.setClntMark("1");
+        taxATion.setClntMark("3");
+//        taxATion.setTaxpayerComid(applyInfo.getIdentifyNumber());
+        taxATion.setTaxName(applyInfo.getName());
+        taxATion.setClntAddress(applyInfo.getAddr());
+        taxATion.setMobile(applyInfo.getMobile());
+
+        //@TODO 无法获取,输入无效内容
+        taxATion.setBankName("山西省太原市");
+        taxATion.setAcctNo("999999");
+
+        condition.setCustomer(customer);
+        condition.setTaxATion(taxATion);
+
+        r.setAuthorityData(ycConfigureParameters.gainAuthorityDataXml());
+        r.setCondition(condition);
+
+
+        auditRequest.setRequestLabel(r);
+
+
+        return auditRequest;
+    }
+
+}

+ 77 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/ModelsQueryRequest.java

@@ -0,0 +1,77 @@
+package com.jzg.quotation.yongcheng.api.entity.request;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.yongcheng.api.properties.AuthorityDataXml;
+import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+import lombok.Data;
+
+import java.util.Objects;
+
+
+/**
+ * @description: 车型查询接口
+ * @author: lig
+ * @date: 2023年02月03日 0003
+ */
+@Data
+@JacksonXmlRootElement(localName = "tns:queryVehicleTypesService")
+public class ModelsQueryRequest {
+
+    @JacksonXmlProperty(isAttribute = false, localName = "request")
+    private RequestLabel requestLabel;
+
+
+    @Data
+    public static class RequestLabel {
+        /**
+         * authorityData
+         */
+//        @Valid
+        @JacksonXmlProperty(isAttribute = false, localName = "authorityData")
+        private AuthorityDataXml authorityData;
+
+        @JacksonXmlProperty(localName = "searchKeyword")
+//        @JacksonXmlCData
+        private String searchKeyword;
+
+        //发动机号  使用精准服务查询时必传
+        @JacksonXmlProperty(localName = "engineNo")
+        private String engineNo;
+
+        //车架号/VIN码  使用精准服务查询时必传
+        @JacksonXmlProperty(localName = "vid")
+        private String vid;
+
+        //机构代码
+        @JacksonXmlProperty(localName = "dptCde")
+        private String dptCde;
+
+        //产品代码  使用精准服务查询时必传
+        @JacksonXmlProperty(localName = "prono")
+        private String prono;
+
+        //车辆种类  使用精准服务查询时必传 代码表3.35
+        @JacksonXmlProperty(localName = "motorTypeCode")
+        private String motorTypeCode;
+
+        //初登日期  使用精准服务查询时必传 精确到天:yyyyMMdd
+        @JacksonXmlProperty(localName = "cFstRegYm")
+        private String cFstRegYm;
+    }
+
+    public ModelsQueryRequest(CarInfoVo carInfoVo, YcApiConfigurationProperties ycConfigureParameters) {
+        ModelsQueryRequest.RequestLabel requestLabel = new ModelsQueryRequest.RequestLabel();
+        requestLabel.setSearchKeyword(carInfoVo.getVinNo().substring(0, 8));
+        requestLabel.setVid(carInfoVo.getVinNo());
+        requestLabel.setEngineNo(carInfoVo.getEngineNo());
+        requestLabel.setDptCde(ycConfigureParameters.getDptCde());
+        requestLabel.setProno("0326");
+        requestLabel.setMotorTypeCode("11");
+        requestLabel.setCFstRegYm(carInfoVo.getRegisterDate().replace("-", ""));
+        requestLabel.setAuthorityData(ycConfigureParameters.gainAuthorityDataXml(ycConfigureParameters));
+        this.requestLabel = requestLabel;
+    }
+
+}

+ 117 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/PriceDiscountRatioRequest.java

@@ -0,0 +1,117 @@
+package com.jzg.quotation.yongcheng.api.entity.request;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import com.jzg.quotation.commons.constant.enums.quote.KindCode;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.KindInfoVo;
+import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/1/9 17:55
+ */
+
+@Data
+@JacksonXmlRootElement(localName = "new:GtePriceDiscountService")
+public class PriceDiscountRatioRequest implements Serializable {
+    @JacksonXmlProperty(localName = "request")
+    private RequestDTO request;
+
+    public PriceDiscountRatioRequest(YcApiConfigurationProperties ycConfigureParameters, CarInfoVo carInfoVo, List<KindInfoVo> kindInfoVoList, String startTime) {
+        this.request = new RequestDTO(ycConfigureParameters.getPassword(),
+                ycConfigureParameters.getUserName(),
+                carInfoVo,
+                kindInfoVoList,
+                startTime,
+                ycConfigureParameters.getDptCde());
+    }
+
+    @Data
+    private static class RequestDTO implements Serializable {
+
+        @JacksonXmlProperty(localName = "authorityData")
+        private AuthorityDataDTO authorityData;
+
+        @JacksonXmlProperty(localName = "body")
+        private BodyDTO body;
+
+        public RequestDTO(String password, String username,CarInfoVo carInfoVo, List<KindInfoVo> kindInfoVoList, String startTime, String CDptCde) {
+            this.authorityData = new AuthorityDataDTO(username,password);
+            this.body = new BodyDTO(carInfoVo, kindInfoVoList, startTime, CDptCde);
+        }
+
+        @Data
+        @AllArgsConstructor
+        private static class AuthorityDataDTO implements Serializable {
+            /**
+             * 用户名
+             */
+            @JacksonXmlProperty(localName = "userName")
+            private String userName;
+            /**
+             * 密码
+             */
+            @JacksonXmlProperty(localName = "password")
+            private String password;
+        }
+
+
+        @Data
+        @AllArgsConstructor
+        private static class BodyDTO implements Serializable {
+            /**
+             * 机构
+             */
+            private String CDptCde;
+            /**
+             * 产品号 0364商业 0326交强
+             */
+            private String CProdNo;
+            /**
+             * 初登日期
+             */
+            private String CFstRegYm;
+            /**
+             * 保险起期
+             */
+            private String TInsrncBgnTm;
+            /**
+             * 是否含车损险
+             */
+            private String IsContainDamage;
+            /**
+             * 车架号
+             */
+            private String CFrmNo;
+            /**
+             * 是否过户车标志
+             */
+            private String CChgOwnerFlag;
+
+            public BodyDTO(CarInfoVo carInfoVo, List<KindInfoVo> kindInfoVoList, String startTime, String CDptCde){
+                this.CDptCde = CDptCde;
+                this.CFstRegYm = carInfoVo.getRegisterDate();
+                this.TInsrncBgnTm = startTime;
+                this.IsContainDamage = "1";
+                if (!kindInfoVoList.isEmpty()) {
+                    this.CProdNo = "0364";
+                    kindInfoVoList.forEach(kindInfoVo -> {
+                            if (kindInfoVo.getKindCode().equals(KindCode.A.getCode())) {
+                                this.IsContainDamage = "0";
+                            }
+                    });
+                } else {
+                    this.CProdNo = "0326";
+                }
+                this.CFrmNo = carInfoVo.getVinNo();
+                this.CChgOwnerFlag = carInfoVo.isTransfer() ? "1" : "0";
+            }
+        }
+    }
+}

+ 2284 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/QuoteRequest.java

@@ -0,0 +1,2284 @@
+package com.jzg.quotation.yongcheng.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import com.jzg.commons.constants.InsuranceRisk;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.IDCardUtils;
+import com.jzg.quotation.commons.constant.enums.quote.EnergyTypeCode;
+import com.jzg.quotation.commons.constant.enums.quote.VehicleUseCode;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.quote.AccidentalDrivingVo;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
+import com.jzg.quotation.commons.utils.DateTimeUtil;
+import com.jzg.quotation.commons.utils.DateUtil;
+import com.jzg.quotation.summary.converter.QuoteInfoConverter;
+import com.jzg.quotation.yongcheng.api.entity.YcBuildData;
+import com.jzg.quotation.yongcheng.api.entity.dto.CarInsDateDto;
+import com.jzg.quotation.yongcheng.api.properties.AuthorityDataXml;
+import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+import com.jzg.quotation.yongcheng.api.properties.YcConfigureParameters;
+import jakarta.validation.Valid;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+
+/**
+ * @description: 报价 请求参数
+ * @author: lig
+ * @date: 2023年02月03日 0003
+ */
+@Data
+@JacksonXmlRootElement(localName = "tns:queryVehicleXnyQuotationService")
+public class QuoteRequest {
+
+    @JacksonXmlProperty(isAttribute = false, localName = "request")
+    private RequestLabel requestLabel;
+
+
+    @Data
+    public static class RequestLabel {
+        /**
+         * authorityData
+         */
+        @Valid
+        @JacksonXmlProperty(isAttribute = false, localName = "authorityData")
+        private AuthorityDataXml authorityData;
+
+        @JacksonXmlProperty(isAttribute = false, localName = "condition")
+        private Condition condition;
+    }
+
+    @Data
+    public static class Condition {
+
+        /**
+         * 基本信息 base
+         */
+        @Data
+        public static class Base{
+            /**
+             * 产品号-商业险
+             * 商业险产品号,燃油机动车:0364,新能源:0369
+             */
+            @JacksonXmlProperty(localName = "CProdNoSY")
+            private String CProdNoSY;
+
+            /**
+             * 产品号-交强险
+             * 交强险产品号:0326
+             */
+            @JacksonXmlProperty(localName = "CProdNoJQ")
+            private String CProdNoJQ;
+
+            /**
+             * 机构编码
+             *  四位机构代码
+             */
+            @JacksonXmlProperty(localName = "CDptCde")
+            private String CDptCde;
+
+            /**
+             * 商业险保险起期
+             * YYYY-MM-DD HH24:MI:SS
+             */
+            @JacksonXmlProperty(localName = "TInsrncBgnTmSY")
+            private String TInsrncBgnTmSY;
+
+            /**
+             * 商业险保险止期
+             * YYYY-MM-DD HH24:MI:SS
+             */
+            @JacksonXmlProperty(localName = "TInsrncEndTmSY")
+            private String TInsrncEndTmSY;
+
+            /**
+             * 交强险保险起期
+             * YYYY-MM-DD HH24:MI:SS
+             */
+            @JacksonXmlProperty(localName = "TInsrncBgnTmJQ")
+            private String TInsrncBgnTmJQ;
+
+            /**
+             * 交强险保险止期
+             * YYYY-MM-DD HH24:MI:SS
+             */
+            @JacksonXmlProperty(localName = "TInsrncEndTmJQ")
+            private String TInsrncEndTmJQ;
+
+
+
+
+            /**
+             * 短期费率方式
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CRatioTyp")
+            private String CRatioTyp;
+
+            /**
+             * 短期系数
+             * 保险期限1年,默认为 1.000000
+             */
+            @JacksonXmlProperty(localName = "NRatioCoef")
+            private String NRatioCoef;
+
+            /**
+             * 汇率
+             * 默认1
+             */
+            @JacksonXmlProperty(localName = "NPrmRmbExch")
+            private String NPrmRmbExch;
+
+            /**
+             * 保额币种
+             * 目前只支持01人民币
+             */
+            @JacksonXmlProperty(localName = "CAmtCur")
+            private String CAmtCur;
+
+            /**
+             * 保费币种
+             * 目前只支持01人民币
+             */
+            @JacksonXmlProperty(localName = "CPrmCur")
+            private String CPrmCur;
+
+            /**
+             * 签单日期
+             * 当前日期YYYY-MM-DD
+             */
+            @JacksonXmlProperty(localName = "TIssueTm")
+            private String TIssueTm;
+
+            /**
+             * 操作人代码
+             */
+            @JacksonXmlProperty(localName = "COprCde")
+            private String COprCde;
+
+            /**
+             * 新业务来源
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CChaType")
+            private String CChaType;
+
+            /**
+             * 代理人/经纪人
+             * 业务来源为代理业务、经济业务时该项必传
+             */
+            @JacksonXmlProperty(localName = "CBrkrCde")
+            private String CBrkrCde;
+
+            /**
+             * 业务员代码
+             */
+            @JacksonXmlProperty(localName = "CSlsCde")
+            private String CSlsCde;
+
+            /**
+             * 是否投保交强
+             * 若投保交强则该字段必传Y:是  N:否 默认产品:0326
+             */
+            @JacksonXmlProperty(localName = "CAppJqFlag")
+            private String CAppJqFlag;
+
+            /**
+             * 是否及时生效
+             * 1:即时生效  0:非即时生效
+             */
+            @JacksonXmlProperty(localName = "CImmeffMrk")
+            private String CImmeffMrk;
+
+            /**
+             * 内外网用户标志
+             * 0 外网用户 1 内网用户
+             */
+            @JacksonXmlProperty(localName = "CUserType")
+            private String CUserType;
+
+            /**
+             * 续保标志(交强)
+             * 0 非续保   1 续保
+             */
+            @JacksonXmlProperty(localName = "RenewalFlagJQ")
+            private String RenewalFlagJQ;
+
+            /**
+             * 续保标志(商业)
+             * 0 非续保   1 续保
+             */
+            @JacksonXmlProperty(localName = "RenewalFlagSY")
+            private String RenewalFlagSY;
+
+
+            /**
+             * 录入人
+             */
+            @JacksonXmlProperty(localName = "OperatorCode")
+            private String OperatorCode;
+
+            /**
+             * 车船税标志
+             */
+            @JacksonXmlProperty(localName = "TaxFlag")
+            private String TaxFlag;
+
+            /**
+             * 录单日期
+             * 取当前时间
+             */
+            @JacksonXmlProperty(localName = "OperateDate")
+            private String OperateDate;
+
+            /**
+             * 被保险人姓名
+             */
+            @JacksonXmlProperty(localName = "InsuredName")
+            private String InsuredName;
+
+            /**
+             * 内外网用户标志
+             * 0 外网用户1 内网用户
+             */
+            @JacksonXmlProperty(localName = "UserType")
+            private String UserType;
+
+            /**
+             * 客户名称
+             * 费用跟单计算要素
+             */
+            @JacksonXmlProperty(localName = "CustomerName")
+            private String CustomerName;
+
+            /**
+             * 投保人姓名
+             * 费用跟单计算要素
+             */
+            @JacksonXmlProperty(localName = "AppName")
+            private String AppName;
+
+
+            /**
+             * 投保人联系人
+             * 费用跟单计算要素
+             */
+            @JacksonXmlProperty(localName = "AppContact")
+            private String AppContact;
+
+            /**
+             * 是否投保商业
+             * Y:是  N:否
+             */
+            @JacksonXmlProperty(localName = "AppSYFlag")
+            private String AppSYFlag;
+
+            /**
+             * 是否投保意外
+             * Y:是  N:否
+             */
+            @JacksonXmlProperty(localName = "AppYWFlag")
+            private String AppYWFlag;
+
+            //    /**
+//     *  业务来源
+//     *  代理:19002,,直销:19008
+//     */
+            @JacksonXmlProperty(localName = "CBsnsTyp")
+            private String CBsnsTyp;
+
+            /**
+             * 意外险保险起期
+             */
+            @JacksonXmlProperty(localName = "TInsrncBgnTmYW ")
+            private String tInsrncBgnTmYW;
+
+            /**
+             * 意外险保险止期
+             */
+            @JacksonXmlProperty(localName = "TInsrncEndTmYW ")
+            private String tInsrncEndTmYW;
+
+
+            public static Base buildBase(CarInfoVo carInfo,CustomerInfoVo policyHolderInfo, CustomerInfoVo insuredPersonInfo, List<RiskInfoVo> riskList, YcApiConfigurationProperties ycConfigureParameters) {
+                Base base = new Base();
+
+                base.setCDptCde(ycConfigureParameters.getDptCde());
+//        base.setCDptCde("14A4");
+                //  340001	按日计算(D)  340002	按月计算(M)
+                base.setCRatioTyp("340001");
+                base.setNRatioCoef("1");
+                base.setNPrmRmbExch("1");
+                base.setCAmtCur("01");
+                base.setCPrmCur("01");
+                base.setCOprCde(ycConfigureParameters.getCOprcde());
+                base.setCUserType("0");
+                base.setUserType("0");
+                //续保标志(交强)  0 非续保   1 续保
+                base.setRenewalFlagJQ("0");
+                //续保标志(商业)  0 非续保   1 续保
+                base.setRenewalFlagSY("0");
+                base.setOperateDate(DateUtil.getDateFormat(new Date(), DateUtil.FULL_TIME_SPLIT_PATTERN));
+                base.setCBsnsTyp("19002");
+                base.setInsuredName(insuredPersonInfo.getName());
+                base.setTaxFlag("1");
+                base.setRenewalFlagJQ("0");
+                base.setRenewalFlagSY("0");
+                base.setCSlsCde(ycConfigureParameters.getSalesmanNo());
+                base.setOperatorCode(ycConfigureParameters.getOperatorCode());
+                base.setTIssueTm(DateUtil.getDateFormat(new Date(), "yyyy-MM-dd"));
+                base.setCChaType("191010");
+
+
+                base.setCProdNoSY("");
+                base.setCProdNoJQ("");
+                base.setAppSYFlag("N");
+                base.setCAppJqFlag("N");
+
+                base.setAppName(policyHolderInfo.getName());
+                base.setCustomerName(policyHolderInfo.getName());
+                base.setAppContact(policyHolderInfo.getName());
+                base.setAppYWFlag("N");
+
+
+                //是否及时生效
+                base.setCImmeffMrk("0");
+                //交强
+                RiskInfoVo ciRiskInfo = riskList.stream().filter(x -> x.getRiskCode().equals(InsuranceRisk.TRAFFIC.getCode())).findFirst().orElse(null);
+                //商业
+                RiskInfoVo biRiskInfo = riskList.stream().filter(x -> x.getRiskCode().equals(InsuranceRisk.BUSINESS.getCode())).findFirst().orElse(null);
+
+
+                if (null != ciRiskInfo) {
+                    CarInsDateDto cidd = buildInsDate(ciRiskInfo.getStartDate(), ciRiskInfo.getEndDate());
+                    base.setTInsrncBgnTmJQ(cidd.getStartDate());
+                    base.setTInsrncEndTmJQ(cidd.getEndDate());
+                    base.setCAppJqFlag("Y");
+                    base.setCProdNoJQ("0326");
+                    base.setCImmeffMrk(cidd.isForthwith() == true ? "1" : "0");
+
+//
+//            if(base.isNowToTodayEnd(ciRiskInfo.getStartDate()))base.setCImmeffMrk("1");
+//            base.setTInsrncBgnTmJQ(ciRiskInfo.getStartDate());
+//            base.setTInsrncEndTmJQ(ciRiskInfo.getEndDate());
+//            base.setCAppJqFlag("Y");
+//            base.setCProdNoJQ("0326");
+                }
+
+                if (null != biRiskInfo) {
+                    CarInsDateDto bidd = buildInsDate(biRiskInfo.getStartDate(), biRiskInfo.getEndDate());
+                    base.setTInsrncBgnTmSY(bidd.getStartDate());
+                    base.setTInsrncEndTmSY(bidd.getEndDate());
+
+                    base.setAppSYFlag("Y");
+                    if("1,2,3,".contains(carInfo.getEnergyTypeCode())){
+                        //新能源险种拼装
+                        base.setCProdNoSY("0369");
+                    }else{
+                        //机动车险种拼装
+                        base.setCProdNoSY("0364");
+                    }
+
+                }
+
+                return base;
+            }
+
+
+            public static boolean isNowToTodayEnd(String dateTime) {
+                LocalDateTime now = LocalDateTime.now();
+                LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+                LocalDateTime startDateTime = DateTimeUtil.parseLocalDateTime(dateTime, DateTimeUtil.DATETIME_PATTERN);
+
+                return startDateTime.isAfter(now) && startDateTime.isBefore(todayEnd);
+            }
+
+
+            public static CarInsDateDto buildInsDate(String startDate, String endDate) {
+                CarInsDateDto cidd = new CarInsDateDto();
+                if (isNowToTodayEnd(startDate)) {
+                    cidd.setForthwith(true);
+                }
+
+                cidd.setStartDate(startDate);
+                cidd.setEndDate(endDate);
+                return cidd;
+
+            }
+
+
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "base")
+        private Base base;
+
+        /**
+         * 车辆信息
+         */
+        @Data
+        public static class Vhl{
+            /**
+             * 行业车型编码
+             */
+            @JacksonXmlProperty(localName = "CPlateModelCde")
+            private String CPlateModelCde;
+            /**
+             * 精友车型代码
+             */
+            @JacksonXmlProperty(localName = "CModelCde")
+            private String CModelCde;
+            /**
+             * 行驶证车主
+             */
+            @JacksonXmlProperty(localName = "CRegOwner")
+            private String CRegOwner;
+            /**
+             * 车牌号码
+             */
+            @JacksonXmlProperty(localName = "CPlateNo")
+            private String CPlateNo;
+            /**
+             * 发动机号
+             */
+            @JacksonXmlProperty(localName = "CEngNo")
+            private String CEngNo;
+            /**
+             * 车架号
+             */
+            @JacksonXmlProperty(localName = "CFrmNo")
+            private String CFrmNo;
+            /**
+             * 车款名称
+             */
+            @JacksonXmlProperty(localName = "CModelNme")
+            private String CModelNme;
+            /**
+             * 初次登记日期
+             */
+            @JacksonXmlProperty(localName = "CFstRegYm")
+            private String CFstRegYm;
+            /**
+             * 号牌种类
+             */
+            @JacksonXmlProperty(localName = "CPlateTyp")
+            private String CPlateTyp;
+            /**
+             * 使用性质
+             * 336001	非营业
+             * 336002	营业
+             * 336002001	营业出租、租赁
+             * 336002002	营业城市公交
+             * 336002003	营业公路客运
+             */
+            @JacksonXmlProperty(localName = "CUsageCde")
+            private String CUsageCde;
+            /**
+             * 所属性质
+             */
+            @JacksonXmlProperty(localName = "CBizMrk")
+            private String CBizMrk;
+            /**
+             * 车辆种类
+             * 337001	6座以下客车
+             * 337002	6-10座客车
+             */
+            @JacksonXmlProperty(localName = "CVhlTyp")
+            private String CVhlTyp;
+            /**
+             * 核定载客数
+             */
+            @JacksonXmlProperty(localName = "NSeatNum")
+            private String NSeatNum;
+            /**
+             * 座位数
+             */
+            @JacksonXmlProperty(localName = "NResvNum1")
+            private String NResvNum1;
+            /**
+             * 排气量
+             */
+            @JacksonXmlProperty(localName = "NDisplacement")
+            private String NDisplacement;
+            /**
+             * 新旧车标志
+             */
+            @JacksonXmlProperty(localName = "CNewMrk")
+            private String CNewMrk;
+            /**
+             * 使用年限
+             */
+            @JacksonXmlProperty(localName = "CUseYear")
+            private String CUseYear;
+            /**
+             * 玻璃类型
+             */
+            @JacksonXmlProperty(localName = "CGlassTyp")
+            private String CGlassTyp;
+            /**
+             * 行驶证车辆类型
+             */
+            @JacksonXmlProperty(localName = "CRegVhlTyp")
+            private String CRegVhlTyp;
+
+            /**
+             * 功率
+             */
+            @JacksonXmlProperty(localName = "CDisplacementLvl")
+            private String CDisplacementLvl;
+
+            /**
+             * 是否外地车
+             * <p>
+             * 本地0,省内异地1,省外异地2
+             */
+            @JacksonXmlProperty(localName = "CEcdemicMrk")
+            private String CEcdemicMrk;
+
+            /**
+             * 过户标志
+             */
+            @JacksonXmlProperty(localName = "CChgOwnerFlag")
+            private String CChgOwnerFlag;
+            /**
+             * 转移登记日期   过户车必输 YYYY-MM-DD
+             */
+            @JacksonXmlProperty(localName = "TTransferDate")
+            private String TTransferDate;
+
+            /**
+             * 查询码-商业   转保业务,第二次请求必传
+             */
+            @JacksonXmlProperty(localName = "CQryCdeSY")
+            private String CQryCdeSY;
+            /**
+             * 查询码-交强   转保业务,第二次请求必传
+             */
+            @JacksonXmlProperty(localName = "CQryCdeJQ")
+            private String CQryCdeJQ;
+            /**
+             * 业务类型
+             * 0:新保 1:续保 2:转保
+             */
+            @JacksonXmlProperty(localName = "CBusType")
+            private String CBusType;
+            /**
+             * 是否按揭车
+             */
+            @JacksonXmlProperty(localName = "CMortgageMrk")
+            private String CMortgageMrk;
+
+            /**
+             * 整备质量
+             */
+            @JacksonXmlProperty(localName = "NPoWeight")
+            private String NPoWeight;
+            /**
+             * 折旧价
+             */
+            @JacksonXmlProperty(localName = "NActualValue")
+            private String NActualValue;
+            /**
+             * 协商价
+             */
+            @JacksonXmlProperty(localName = "NNewPurchaseValue")
+            private String NNewPurchaseValue;
+            /**
+             * 新车购置价
+             */
+            @JacksonXmlProperty(localName = "NNewPriceValue")
+            private String NNewPriceValue;
+
+            /**
+             * 验车情况
+             */
+            @JacksonXmlProperty(localName = "CInspectionCde")
+            private String CInspectionCde;
+
+            /**
+             * 是否租赁车    1:是 0:否
+             */
+            @JacksonXmlProperty(localName = "CDevice8Mrk")
+            private String CDevice8Mrk;
+
+            /**
+             * 月折旧率
+             */
+            @JacksonXmlProperty(localName = "NMonDespRate")
+            private String NMonDespRate;
+
+            /**
+             * 发证日期
+             */
+            @JacksonXmlProperty(localName = "TResvTm3")
+            private String TResvTm3;
+            /**
+             * 转保校验码-商业
+             */
+            @JacksonXmlProperty(localName = "CCheckCodeSY")
+            private String CCheckCodeSY;
+            /**
+             * 转保校验码-交强
+             */
+            @JacksonXmlProperty(localName = "CCheckCodeJQ")
+            private String CCheckCodeJQ;
+            /**
+             * 系统默认排气量
+             */
+            @JacksonXmlProperty(localName = "NDefDisplacement")
+            private String NDefDisplacement;
+            /**
+             * 特殊申明原因
+             * 默认为空,过户传,目前核心支持枚举(33901/33903/33904/33908/33909)
+             */
+            @JacksonXmlProperty(localName = "SpecialDeclareReason")
+            private String SpecialDeclareReason;
+            /**
+             * 能源类型
+             */
+            @JacksonXmlProperty(localName = "FuelType")
+            private String FuelType;
+            /**
+             * 机动车能源类型
+             */
+            @JacksonXmlProperty(localName = "CPmFuelType")
+            private String CPmFuelType;
+            /**
+             * 纯电续航里程(公里)
+             */
+            @JacksonXmlProperty(localName = "NPureRange")
+            private String NPureRange;
+
+            /**
+             * UBI数据采集
+             */
+            @JacksonXmlProperty(localName = "CChdUbiData")
+            private String CChdUbiData;
+
+
+            public static Vhl buildVhl(CarInfoVo carInfo, CustomerInfoVo ownerInfo,String cQryCdeJQ,String cQryCdeSY) {
+                Vhl vhl = new Vhl();
+
+                //        //3 车辆信息
+//        CarInfoVo carInfo = yaQuoteInfoVo.getCarInfo();
+//
+//        //2.2车主
+//        CustomerInfoVo ownerInfo = yaQuoteInfoVo.getOwnerInfo();
+
+                vhl.setCPlateModelCde(carInfo.getCarKindCode());
+                vhl.setCModelCde(carInfo.getBrandName());
+                vhl.setCRegOwner(ownerInfo.getName());
+                vhl.setCPlateNo(carInfo.getLicenseNo());
+//      <CModelNme>威志CA7150BUE5S轿车</CModelNme>
+                vhl.setCModelNme(carInfo.getBrandName());
+
+                LocalDate lDate = LocalDate.parse(carInfo.getRegisterDate());
+                LocalDate newlDate = LocalDate.now();
+                int years = newlDate.getYear() - lDate.getYear();
+                vhl.setCUseYear(years + "");
+                //玻璃类型 303011001	国产   303011002	进口
+                vhl.setCGlassTyp("303011001");
+                vhl.setCEcdemicMrk("1");
+                //过户
+                if (carInfo.isTransfer()) {
+                    //必传。过户车传1;非过户车传0
+                    vhl.setCChgOwnerFlag("1");
+                    vhl.setTTransferDate(carInfo.getTransferDate());
+                    vhl.setTResvTm3(carInfo.getTransferDate());
+                    vhl.setSpecialDeclareReason("33908");
+                } else {
+                    vhl.setCChgOwnerFlag("0");
+
+                }
+                //0:新保 1:续保 2:转保
+                vhl.setCBusType("0");
+                vhl.setCMortgageMrk("0");
+                vhl.setNPoWeight(carInfo.getCompleteKerbMass());
+                //305005001:未验 305005002:已验车 305005003:免验车 305005004:需验车
+                vhl.setCInspectionCde("305005003");
+                vhl.setCDevice8Mrk("0");
+                vhl.setNDisplacement(EnergyTypeCode.getEnergyTypeDesc(carInfo.getEnergyTypeCode()));
+                vhl.setNDefDisplacement(EnergyTypeCode.getEnergyTypeDesc(carInfo.getEnergyTypeCode()));
+                String fullType = "32773001";//默认燃油
+                if ("0".equals(carInfo.getEnergyTypeCode())) {
+                    fullType = "32773001";  //燃油
+                } else if ("1".equals(carInfo.getEnergyTypeCode())) {
+                    fullType = "32773002";  //纯电动
+                } else if ("2".equals(carInfo.getEnergyTypeCode())) {
+                    fullType = "32773003";  //燃料电池
+                } else if ("3".equals(carInfo.getEnergyTypeCode())) {
+                    fullType = "32773004";  //插电式混合动力
+                } else if ("4".equals(carInfo.getEnergyTypeCode())) {
+                    fullType = "32773005";  //其他混合动力
+                } else if ("5".equals(carInfo.getEnergyTypeCode())) {
+                    fullType = "32773006";  //其他
+                }
+                vhl.setFuelType(fullType);
+//        vhl.setNActualValue(String.valueOf((Double.parseDouble(carInfo.getPurchasePrice()) * 0.9)));
+//        vhl.setNNewPurchaseValue(String.valueOf((Double.parseDouble(carInfo.getPurchasePrice()) * 0.9)));
+                vhl.setNPureRange("0.0");
+                vhl.setCDisplacementLvl(String.valueOf(carInfo.getPowerScale()));
+//        vhl.setCDisplacementLvl("67");
+                vhl.setCFstRegYm(carInfo.getRegisterDate());
+                vhl.setNNewPriceValue(carInfo.getPurchasePrice());
+//
+                vhl.setCEngNo(carInfo.getEngineNo());
+                vhl.setCFrmNo(carInfo.getVinNo());
+                vhl.setCPlateTyp(carInfo.getLicenseKindCode());
+                if (carInfo.getCarNatureCode().equals("01")) {
+                    vhl.setCUsageCde("336002");
+                } else if (carInfo.getCarNatureCode().equals("02")) {
+                    vhl.setCUsageCde("336001");
+                }
+                //vhl.setCUsageCde("336001");
+                //所属性质(1个人 2企业 3机关)
+                if (carInfo.getPropertyCode().equals("1")) {
+                    vhl.setCBizMrk("338001");
+                } else if (carInfo.getPropertyCode().equals("2")) {
+                    vhl.setCBizMrk("338003");
+                } else if (carInfo.getPropertyCode().equals("3")) {
+                    vhl.setCBizMrk("338002");
+                }
+
+                //座位数	NResvNum1	数值(10,0)	N	默认核定载客数-1
+                vhl.setNResvNum1(String.valueOf(Integer.parseInt(carInfo.getSeatCount()) - 1));
+                //核定载客数   取的座位数
+                vhl.setNSeatNum(carInfo.getSeatCount());
+
+                //车辆用于是否是 营业  非营业货运
+                if(carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_04.getCode()) ||
+                        carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_08.getCode())){
+                    //货车
+                    //2吨以下
+                    if(Integer.parseInt(carInfo.getLimitLoad()) < 2000){
+                        vhl.setCVhlTyp("337006");
+                    }
+                    //2-5吨
+                    if(Integer.parseInt(carInfo.getLimitLoad()) >= 2000 && Integer.parseInt(carInfo.getLimitLoad()) < 5000){
+                        vhl.setCVhlTyp("337007");
+                    }
+                    //5-10吨
+                    if(Integer.parseInt(carInfo.getLimitLoad()) >= 5000 && Integer.parseInt(carInfo.getLimitLoad()) < 10000){
+                        vhl.setCVhlTyp("337008");
+                    }
+                    //10吨以上
+                    if(Integer.parseInt(carInfo.getLimitLoad()) >= 10000){
+                        vhl.setCVhlTyp("337009");
+                    }
+                }else{
+                    //客车
+                    vhl.setCVhlTyp(Integer.parseInt(vhl.getNSeatNum()) < 6 ? "337001" : "337002");
+                }
+
+//        //新旧车标志  0 新车,1 旧车
+                vhl.setCNewMrk("1");
+                //轿车
+                vhl.setCRegVhlTyp(carInfo.getCarTypeCode());
+
+                vhl.setCQryCdeJQ(cQryCdeJQ);
+                vhl.setCQryCdeSY(cQryCdeSY);
+                return vhl;
+            }
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "vhl")
+        private Vhl vhl;
+
+
+        /**
+         * 车主信息
+         */
+        @Data
+        public static class Vhlowner {
+
+
+            /**
+             * 车主名称
+             */
+            @JacksonXmlProperty(localName = "COwnerNme")
+            private String COwnerNme;
+
+            /**
+             * 车主出生日期
+             * YYYY-MM-DD车主类型个人时必传
+             */
+            @JacksonXmlProperty(localName = "TBirthday")
+            private String TBirthday;
+
+            /**
+             * 车主性别
+             * 车主类型个人时必传
+             */
+            @JacksonXmlProperty(localName = "CSex")
+            private String CSex;
+
+            /**
+             * 车主类型
+             * 0法人 1个人(中国籍) 2个人(非中国籍)
+             */
+            @JacksonXmlProperty(localName = "COwnerCls")
+            private String COwnerCls;
+
+            /**
+             * 车主证件号码
+             */
+            @JacksonXmlProperty(localName = "DrvOwnerCertiCode")
+            private String DrvOwnerCertiCode;
+
+            /**
+             * 车主证件类型
+             * 代码表(1.1.72)
+             */
+            @JacksonXmlProperty(localName = "DrvOwnerCeritType")
+            private String DrvOwnerCeritType;
+
+            /**
+             * 车主国家/地区
+             * 中国:103132
+             */
+            @JacksonXmlProperty(localName = "CAreaCde")
+            private String CAreaCde = "103132";
+
+            /**
+             * 车主移动电话
+             */
+            @JacksonXmlProperty(localName = "CMobile")
+            private String CMobile;
+
+            /**
+             * 车主所在省
+             * 查看代码表
+             */
+            @JacksonXmlProperty(localName = "CProvince")
+            private String CProvince;
+
+            /**
+             * 车主所在市
+             * 查看代码表
+             */
+            @JacksonXmlProperty(localName = "CCity")
+            private String CCity;
+
+            /**
+             * 车主所在县
+             * 查看代码表
+             */
+            @JacksonXmlProperty(localName = "CCounty")
+            private String CCounty;
+
+            /**
+             * 单位性质
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CWorkdptKind")
+            private String CWorkdptKind;
+
+            /**
+             * 地址   xml不转换
+             */
+            private String cWaddress;
+
+            public Vhlowner(CustomerInfoVo ownerInfo) {
+                this.setCOwnerNme(ownerInfo.getName());
+                //0:法人 1:个人(中国籍) 2: 个人(非中国籍)
+                String property = ownerInfo.getProperty() ;
+                if ("0".equals(property)) {
+                    this.setDrvOwnerCeritType("110004");
+                    this.setDrvOwnerCertiCode(ownerInfo.getOrganizationCode());
+                    if (StringUtils.isEmpty(ownerInfo.getProvince()) || StringUtils.isEmpty(ownerInfo.getCity()) || StringUtils.isEmpty(ownerInfo.getCounty())) {
+                        throw new SystemException("企业车省市区必填");
+                    }
+                    this.setCProvince(ownerInfo.getProvince());
+                    this.setCCity(ownerInfo.getCity());
+                    this.setCCounty(ownerInfo.getCounty());
+                    this.setCOwnerCls("0");
+                }else{
+                    this.setTBirthday(IDCardUtils.GetBirthday(ownerInfo.getIdentifyNumber()));
+                    this.setCSex(IDCardUtils.GetYcSex(ownerInfo.getIdentifyNumber()));
+                    this.setDrvOwnerCeritType("120001");
+                    this.setDrvOwnerCertiCode(ownerInfo.getIdentifyNumber());
+                    this.setCOwnerCls("1");
+                }
+                //this.setDrvOwnerCeritType("120001");
+                this.setCAreaCde("103132");
+                this.setCMobile(ownerInfo.getMobile());
+                this.setCWorkdptKind("900");
+                //地址  自建
+                this.setCWaddress(ownerInfo.getAddr());
+            }
+
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "vhlowner")
+        private Vhlowner vhlowner;
+
+        /**
+         * 商业险险别
+         */
+        @Data
+        public class CvrgListSY {
+
+
+            @JsonProperty("CvrgSY")
+            @JacksonXmlElementWrapper(useWrapping = false)
+            @JacksonXmlProperty(localName = "CvrgSY")
+            private List<CvrgSY> CvrgSY;
+
+
+            @Data
+            public static class CvrgSY {
+                /**
+                 * 险种代码
+                 */
+                @JacksonXmlProperty(localName = "CCvrgNo")
+                private String CCvrgNo;
+
+                /**
+                 * 单位保额
+                 */
+                @JacksonXmlProperty(localName = "NPerAmt")
+                private String NPerAmt;
+
+                /**
+                 * 绝对免赔率
+                 * 若险种代码“030022-附加绝对免赔率特约险(IACJQL0101)”,则校验“绝对免赔率”必传;
+                 * “绝对免赔率”取值范围为5%、10%、15%、20%。 “绝对免赔率”取值标准:绝对免赔率为 10%,应传送0.1。
+                 */
+                @JacksonXmlProperty(localName = "CResvTxt4")
+                private String CResvTxt4;
+
+                /**
+                 * 车损免赔额
+                 * 当险别为【030226新能源汽车损失保险】时,该字段必传。参见代码
+                 */
+                @JacksonXmlProperty(localName = "CResvTxt2")
+                private String CResvTxt2;
+
+                /**
+                 * 单位(责任天数/人数)
+                 * 1,当险别为【030151修理期间费用补偿险】时,该字段表征为【天数】;
+                 * 2,当险别为【030228新能源汽车车上人员责任保险(乘客)】时,该字段表征为投保该险别的乘客数。
+                 * 备注:投保以上两险别时该字段必传且不能为0。其他险别不传。
+                 */
+                @JacksonXmlProperty(localName = "NLiabDaysLmt")
+                private String NLiabDaysLmt;
+            }
+        }
+
+        @JacksonXmlProperty(localName = "cvrgListSY")
+        private CvrgListSY cvrgListSY;
+
+        /**
+         * 商业险系数
+         */
+        @Data
+        public static class PrmCoef {
+
+
+            /**
+             * 自主核保系数
+             * 默认是传1
+             */
+            @JacksonXmlProperty(localName = "NAutonomyAdjust")
+            private String NAutonomyAdjust;
+
+            /**
+             * 自主渠道系数
+             * 默认是传1
+             */
+            @JacksonXmlProperty(localName = "NChannelAdjust")
+            private String NChannelAdjust;
+
+            /**
+             * 期望折扣
+             * 当期望折扣标志为1时,必传
+             */
+            @JacksonXmlProperty(localName = "NResvNum4")
+            private String NResvNum4;
+
+            /**
+             * 期望折扣标志
+             * 没有期望折扣传0,否则传1
+             */
+            @JacksonXmlProperty(localName = "CResvTxt1")
+            private String CResvTxt1;
+
+            /**
+             * 投保组合
+             * 默认 Z
+             * DJ	单交
+             * DSDS	单商单三
+             * DS	单商
+             * JSGBZX	交商共保主险
+             * JSGBDS	交商共保单三
+             * Z	其他
+             */
+            @JacksonXmlProperty(localName = "CInsuranceGroup")
+            private String CInsuranceGroup;
+
+
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "prmCoef")
+        private PrmCoef prmCoef;
+
+        /**
+         * 新增设备明细(商业险)
+         */
+        @Data
+        public class MachineList {
+
+            @JacksonXmlProperty(localName = "Machine")
+            private Machine Machine;
+
+
+            @Data
+            public static class Machine {
+                /**
+                 * 设备名称
+                 */
+                @JacksonXmlProperty(localName = "CMachineNme")
+                private String CMachineNme;
+
+                /**
+                 * 设备数量
+                 */
+                @JacksonXmlProperty(localName = "NNum")
+                private String NNum;
+
+                /**
+                 * 购置日期
+                 * YYYY-MM-DD
+                 */
+                @JacksonXmlProperty(localName = "TBuyTm")
+                private String TBuyTm;
+
+                /**
+                 * 购置价格(元)
+                 */
+                @JacksonXmlProperty(localName = "NBuyPrice")
+                private String NBuyPrice;
+
+                /**
+                 * 实际价格(元)
+                 */
+                @JacksonXmlProperty(localName = "NActualPrice")
+                private String NActualPrice;
+            }
+        }
+
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "machineList")
+        private List<MachineList> machineList;
+
+        /**
+         * 交强险险别
+         */
+        @Data
+        public static class CoverageListJQ {
+
+
+            @JsonProperty("CvrgJQ")
+            @JacksonXmlElementWrapper(useWrapping = false)
+            @JacksonXmlProperty(localName = "CvrgJQ")
+            private List<CvrgJQ> CvrgJQ;
+
+            @Data
+            public static class CvrgJQ {
+                /**
+                 * 险种序号
+                 */
+                @JacksonXmlProperty(localName = "CoverageSeq")
+                private String CoverageSeq;
+
+                /**
+                 * 险种代码(投保险别)
+                 * 保额
+                 */
+                @JacksonXmlProperty(localName = "CoverageCode")
+                private String CoverageCode;
+
+                /**
+                 * 赔偿限额/保额
+                 * 天数:意外险住院津贴保障有天数/车险
+                 * 人数:针对车上人员责任险(分司机和乘客)
+                 */
+                @JacksonXmlProperty(localName = "CoverageAmount")
+                private String CoverageAmount;
+
+                /**
+                 * 保障天数/人数
+                 */
+                @JacksonXmlProperty(localName = "CoverageNumber")
+                private String CoverageNumber;
+            }
+
+            public CoverageListJQ(RiskInfoVo riskInfoVo) {
+                List<CoverageListJQ.CvrgJQ> jqList = new ArrayList<>();
+                /**
+                 * 交强
+                 */
+                CoverageListJQ.CvrgJQ bean = new CoverageListJQ.CvrgJQ();
+                if (riskInfoVo.getRiskCode().equals("0507")) {
+                    bean.setCoverageCode("030050");
+                    bean.setCoverageSeq("1");
+                    bean.setCoverageAmount("200000");
+                    jqList.add(bean);
+                }
+                this.setCvrgJQ(jqList);
+            }
+        }
+        @JacksonXmlProperty(localName = "coverageListJQ")
+        private CoverageListJQ coverageListJQ;
+
+        /**
+         * 交强险车船税
+         */
+        @Data
+        public static class Tax {
+
+            /**
+             * 收费方式
+             */
+            @JacksonXmlProperty(localName = "TaxCurrentType")
+            private String TaxCurrentType;
+            /**
+             * 车辆类型
+             */
+            @JacksonXmlProperty(localName = "VehicleCategory")
+            private String VehicleCategory;
+            /**
+             * 纳税人名称
+             */
+            @JacksonXmlProperty(localName = "TaxPayerName")
+            private String TaxPayerName;
+            /**
+             * 补交上年
+             */
+            @JacksonXmlProperty(localName = "PayLastYear")
+            private String PayLastYear;
+            /**
+             * 当年缴税起期
+             */
+            @JacksonXmlProperty(localName = "TaxBeginDateCurrentYear")
+            private String TaxBeginDateCurrentYear;
+            /**
+             * 证照类型
+             */
+            @JacksonXmlProperty(localName = "IdType")
+            private String IdType;
+            /**
+             * 当年缴税止期
+             */
+            @JacksonXmlProperty(localName = "TaxEndDateCurrentYear")
+            private String TaxEndDateCurrentYear;
+            /**
+             * 计算类型
+             */
+            @JacksonXmlProperty(localName = "CalculatedType")
+            private String CalculatedType;
+            /**
+             * 车辆细分
+             */
+            @JacksonXmlProperty(localName = "VehecleTypeDetail")
+            private String VehecleTypeDetail;
+            /**
+             * 整备质量
+             */
+            @JacksonXmlProperty(localName = "VehicleQuality")
+            private String VehicleQuality;
+            /**
+             * 纳税人识别号
+             */
+            @JacksonXmlProperty(localName = "TaxpayerNO")
+            private String TaxpayerNO;
+            /**
+             * 缴税日期
+             */
+            @JacksonXmlProperty(localName = "TaxPaidDate")
+            private String TaxPaidDate;
+            /**
+             * 纳税人地址
+             */
+            @JacksonXmlProperty(localName = "TaxpayerAddress")
+            private String TaxpayerAddress;
+            /**
+             * 车辆分类
+             */
+            @JacksonXmlProperty(localName = "VehicleType")
+            private String VehicleType;
+            /**
+             * 邮政编码
+             */
+            @JacksonXmlProperty(localName = "Zip")
+            private String Zip;
+            /**
+             * 纳税人类别
+             */
+            @JacksonXmlProperty(localName = "TaxpayerType")
+            private String TaxpayerType;
+            /**
+             * 居住地址
+             */
+            @JacksonXmlProperty(localName = "Address")
+            private String Address;
+            /**
+             * 纳税人国籍
+             */
+            @JacksonXmlProperty(localName = "Conruty")
+            private String Conruty;
+            /**
+             * 纳税人电话
+             */
+            @JacksonXmlProperty(localName = "Tel")
+            private String Tel;
+            /**
+             * 车牌号
+             */
+            @JacksonXmlProperty(localName = "VehicleNo")
+            private String VehicleNo;
+            /**
+             * 排气量
+             */
+            @JacksonXmlProperty(localName = "Exhaust")
+            private String Exhaust;
+
+            public static Tax buildTax(CustomerInfoVo policyHolderInfo, CarInfoVo carInfo) {
+                Tax tax = new Tax();
+                tax.setTaxCurrentType("349002001");
+                tax.setVehicleCategory("K33");
+                tax.setTaxPayerName(policyHolderInfo.getName());
+                //补交上年
+                tax.setPayLastYear("0");
+                //0:法人 1:个人(中国籍) 2: 个人(非中国籍)
+                String property = policyHolderInfo.getProperty();
+                if (property.equals("0")) {
+                    tax.setIdType("110004");
+                    tax.setTaxpayerType("338003");
+                    tax.setTaxpayerNO(policyHolderInfo.getOrganizationCode());
+                }else {
+                    tax.setIdType("120001");
+                    tax.setTaxpayerType("338001");
+                    //纳税人识别号 =  投保人身份证号
+                    tax.setTaxpayerNO(policyHolderInfo.getIdentifyNumber());
+                }
+//        tax.setIdType("120001");
+                tax.setCalculatedType("349003001");
+                tax.setVehecleTypeDetail("3490010013");
+                tax.setTaxpayerAddress(policyHolderInfo.getAddr());
+                tax.setVehicleQuality(extracted(carInfo.getCompleteKerbMass()));
+                //纳税人识别号 =  投保人身份证号
+//        tax.setTaxpayerNO(policyHolderInfo.getIdentifyNumber());
+
+                tax.setVehicleType("349001001");
+//        tax.setTaxpayerType("338001");
+                tax.setConruty("156");
+                tax.setTel(policyHolderInfo.getMobile());
+                tax.setExhaust(carInfo.getEnergyTypeCode());
+
+
+                return tax;
+            }
+
+            private static String extracted(String completeKerbMass) {
+                AssertionUtils.isFail(StringUtils.isEmpty(completeKerbMass), "整备质量为空");
+                BigDecimal bigDecimal = new BigDecimal(completeKerbMass);
+                BigDecimal divide = bigDecimal.divide(new BigDecimal(1000));
+                return divide.toString();
+            }
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "tax")
+        private Tax tax;
+
+        /**
+         * 渠道及费用信息
+         */
+        @Data
+        public static class Agent {
+
+            /**
+             * 渠道编码
+             * 同Base下” 代理人/经纪人”或“代理人”
+             */
+            @JacksonXmlProperty(localName = "AgentCode")
+            private String AgentCode;
+
+            /**
+             * 协议编码
+             * 代理经纪业务必传同Base下” 代理协议号”或“代理/合作协议”
+             */
+            @JacksonXmlProperty(localName = "ConferCode")
+            private String ConferCode;
+
+            /**
+             * 渠道分类
+             * 同Base下“新销售渠道”
+             */
+            @JacksonXmlProperty(localName = "AgentType")
+            private String AgentType;
+
+            /**
+             * 渠道人员职业证号
+             * 同Base下“代理职业证号”
+             */
+            @JacksonXmlProperty(localName = "AgentProfId")
+            private String AgentProfId;
+
+            /**
+             * 代理人名称
+             */
+            @JacksonXmlProperty(localName = "AgentNme")
+            private String AgentNme;
+
+            /**
+             * 销售渠道名称
+             */
+            @JacksonXmlProperty(localName = "AgentSaleNme")
+            private String AgentSaleNme;
+
+            /**
+             * 客户性质
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CustNature")
+            private String CustNature;
+
+            /**
+             * 协议序号
+             * 代理经纪业务必传
+             */
+            @JacksonXmlProperty(localName = "SubCoNo")
+            private String SubCoNo;
+//
+            /**
+             * 代理人资格证号
+             */
+            @JacksonXmlProperty(localName = "QlftNo")
+            private String QlftNo;
+
+            /**
+             * 业务类型
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "AgentStockMrk")
+            private String AgentStockMrk;
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "agent")
+        private Agent agent;
+
+        /**
+         * 驾驶员信息
+         */
+        @Data
+        public static class VhlDrvList {
+
+            @JacksonXmlProperty(localName = "VlhDrv")
+            private VlhDrv VlhDrv;
+
+            @Data
+            public static class VlhDrv {
+                /**
+                 * 驾驶人序号
+                 */
+                @JacksonXmlProperty(localName = "NSeqNo")
+                private String NSeqNo;
+
+                /**
+                 * 驾驶人名称
+                 */
+                @JacksonXmlProperty(localName = "CDrvNme")
+                private String CDrvNme;
+
+                /**
+                 * 性别
+                 * 代码表
+                 */
+                @JacksonXmlProperty(localName = "CGendorCde")
+                private String CGendorCde;
+
+                /**
+                 * 证件类型
+                 * 代码表
+                 */
+                @JacksonXmlProperty(localName = "CResvTxt4")
+                private String CResvTxt4;
+
+                /**
+                 * 驾驶证号码
+                 */
+                @JacksonXmlProperty(localName = "CDrvLcnNo")
+                private String CDrvLcnNo;
+
+                /**
+                 * 驾龄
+                 */
+                @JacksonXmlProperty(localName = "NDriverAge")
+                private String NDriverAge;
+
+                /**
+                 * 年龄
+                 */
+                @JacksonXmlProperty(localName = "NAge")
+                private String NAge;
+
+                /**
+                 * 婚姻状况
+                 * 代码表
+                 */
+                @JacksonXmlProperty(localName = "CMariSts")
+                private String CMariSts;
+
+                /**
+                 * 发照日期
+                 * YYYY-MM-DD交强险无
+                 */
+                @JacksonXmlProperty(localName = "TLicenseDate")
+                private String TLicenseDate;
+
+                /**
+                 * 准架车型
+                 * 代码表
+                 */
+                @JacksonXmlProperty(localName = "CAllowedVhlTyp")
+                private String CAllowedVhlTyp;
+
+                /**
+                 * 主副驾驶员标记
+                 * 代码表
+                 */
+                @JacksonXmlProperty(localName = "CMainDrvMrk")
+                private String CMainDrvMrk;
+
+                /**
+                 * 驾驶证状态
+                 * 代码表
+                 */
+                @JacksonXmlProperty(localName = "CLicenseStatusCode")
+                private String CLicenseStatusCode;
+            }
+        }
+
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "vhlDrvList")
+        private List<VhlDrvList> vhlDrvList;
+
+        /**
+         * 投保人信息
+         */
+        @Data
+        public static class Applicant {
+
+
+            /**
+             * 投保人姓名
+             */
+            @JacksonXmlProperty(localName = "CAppNme")
+            private String CAppNme;
+
+            /**
+             * 投保人地址
+             */
+            @JacksonXmlProperty(localName = "CClntAddr")
+            private String CClntAddr;
+
+            /**
+             * 投保人客户分类
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CClntMrk")
+            private String CClntMrk;
+
+            /**
+             * 投保人证件类型
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CCertfCls")
+            private String CCertfCls;
+
+            /**
+             * 投保人证件号
+             */
+            @JacksonXmlProperty(localName = "CCertfCde")
+            private String CCertfCde;
+
+            /**
+             * 投保人出生日期
+             * YYYY-MM-DD
+             */
+            @JacksonXmlProperty(localName = "TBirthday")
+            private String TBirthday;
+
+            /**
+             * 投保人性别
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CSex")
+            private String CSex;
+
+            /**
+             * 投保人固定电话
+             */
+            @JacksonXmlProperty(localName = "CTel")
+            private String CTel;
+
+            /**
+             * 投保人手机号码
+             */
+            @JacksonXmlProperty(localName = "CMobile")
+            private String CMobile;
+
+            /**
+             * 投保人联系人
+             * 中文且≤5个字
+             */
+            @JacksonXmlProperty(localName = "CCntrNme")
+            private String CCntrNme;
+
+            /**
+             * 证件有效止期
+             * 必传字段若长期证件则为:9999-12-31
+             */
+            @JacksonXmlProperty(localName = "TCertfClsValiDate")
+            private String TCertfClsValiDate;
+
+            /**
+             * 与被保人关系
+             * 投保人与被保人关系,代码表
+             */
+            @JacksonXmlProperty(localName = "CRelCde")
+            private String CRelCde;
+
+            /**
+             * 职业
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CResvTxt5")
+            private String CResvTxt5;
+
+            /**
+             * 单位性质
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CWorkDpt")
+            private String CWorkDpt;
+
+            /**
+             * 行业
+             * 法人场景,代码表
+             */
+            @JacksonXmlProperty(localName = "CTrdCde")
+            private String CTrdCde;
+
+            /**
+             * 经营范围
+             * 法人场景
+             */
+            @JacksonXmlProperty(localName = "COccupation")
+            private String COccupation;
+
+            /**
+             * 注册资本金
+             * 单位万元/法人场景
+             */
+            @JacksonXmlProperty(localName = "NResvNum3")
+            private String NResvNum3;
+
+            /**
+             * 所在省
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CProvince")
+            private String CProvince;
+
+            /**
+             * 所在市
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CCity")
+            private String CCity;
+
+            /**
+             * 所在县
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CCounty")
+            private String CCounty;
+
+            /**
+             * 注册资本金币种
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "NResvNum3Cur")
+            private String NResvNum3Cur;
+
+            /**
+             * 国家/地区
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CAreaCde")
+            private String CAreaCde;
+
+            /**
+             * 团车标志
+             */
+            @JacksonXmlProperty(localName = "CMassCarMrk")
+            private String CMassCarMrk;
+
+            public Applicant(CustomerInfoVo ownerInfo, CustomerInfoVo policyHolderInfo) {
+
+                //投保人类型: 0:法人 1:个人(中国籍) 2: 个人(非中国籍)
+                String property = policyHolderInfo.getProperty();
+                String name;
+                if ("0".equals(property)) {
+                    //投保人证件类型
+                    this.setCCertfCls("110004");
+                    //投保人证件号
+                    this.setCCertfCde(policyHolderInfo.getOrganizationCode());
+                    this.setCClntAddr(policyHolderInfo.getAddr());
+                    if (StringUtils.isEmpty(ownerInfo.getProvince()) || StringUtils.isEmpty(ownerInfo.getCity()) || StringUtils.isEmpty(ownerInfo.getCounty())) {
+                        throw new SystemException("企业车省市区必填");
+                    }
+                    this.setCProvince(policyHolderInfo.getProvince());
+                    this.setCCity(policyHolderInfo.getCity());
+                    this.setCCounty(policyHolderInfo.getCounty());
+                    //行业
+                    this.setCTrdCde("201799");
+//            applicant.setCOccupation(policyHolderInfo.getScope());
+                    this.setNResvNum3(policyHolderInfo.getRegisteredCapital());
+                    this.setNResvNum3Cur("01");
+                    this.setCWorkDpt("900");
+                    //联系人
+                    this.setCCntrNme(policyHolderInfo.getLegalPerson());
+                    name = policyHolderInfo.getName();
+                    if (name.contains("(") || name.contains("(")) {
+                        name=name.replace("(","");
+                        name=name.replace(")","");
+                    }
+                    this.setCClntMrk("0");
+                }else{
+                    this.setCClntAddr(policyHolderInfo.getAddr());
+                    this.setCCertfCde(policyHolderInfo.getIdentifyNumber());
+                    this.setCCertfCls("120001");
+                    this.setTBirthday(IDCardUtils.GetBirthday(policyHolderInfo.getIdentifyNumber()));
+                    this.setCSex(IDCardUtils.GetYcSex(policyHolderInfo.getIdentifyNumber()));
+                    this.setCCntrNme(policyHolderInfo.getName());
+                    // 增加团车标志
+//                    applicant.setCMassCarMrk(ycConfigureParameters.getCCntrNme());
+                    name = policyHolderInfo.getName();
+                    //投保人客户分类
+                    this.setCClntMrk("1");
+                }
+
+                this.setCResvTxt5("000");
+                this.setCMobile(policyHolderInfo.getMobile());
+                this.setCAreaCde("103132");
+
+                //投保人姓名
+                this.setCAppNme(name);
+
+                if(StringUtils.isNotEmpty(this.getCCntrNme())){
+                    this.setCCntrNme(policyHolderInfo.getName());
+                }
+                this.setCRelCde(ownerInfo.getName().equals(policyHolderInfo.getName()) ? "601005" : "601008");
+                this.setTCertfClsValiDate(policyHolderInfo.getIdentifyValidEndDate());
+            }
+
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "applicant")
+        private Applicant applicant;
+
+        /**
+         * 被保人信息
+         */
+        @Data
+        public static class Insured {
+
+            /**
+             * 被保人姓名
+             */
+            @JacksonXmlProperty(localName = "CInsuredNme")
+            private String CInsuredNme;
+
+            /**
+             * 被保人地址
+             */
+            @JacksonXmlProperty(localName = "CClntAddr")
+            private String CClntAddr;
+
+            /**
+             * 被保人客户分类
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CClntMrk")
+            private String CClntMrk;
+
+            /**
+             * 被保人证件类型
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CCertfCls")
+            private String CCertfCls;
+
+            /**
+             * 被保人证件号
+             */
+            @JacksonXmlProperty(localName = "CCertfCde")
+            private String CCertfCde;
+
+            /**
+             * 被保人出生日期
+             * YYYY-MM-DD
+             */
+            @JacksonXmlProperty(localName = "TBirthday")
+            private String TBirthday;
+
+            /**
+             * 被保人性别
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CSex")
+            private String CSex;
+
+            /**
+             * 被保人固定电话
+             */
+            @JacksonXmlProperty(localName = "CTel")
+            private String CTel;
+
+            /**
+             * 被保人手机号码
+             */
+            @JacksonXmlProperty(localName = "CMobile")
+            private String CMobile;
+
+            /**
+             * 被保人邮编
+             */
+            @JacksonXmlProperty(localName = "CZipCde")
+            private String CZipCde;
+
+            /**
+             * 被保人Email
+             * 投保电子保单必传
+             */
+            @JacksonXmlProperty(localName = "CEmail")
+            private String CEmail;
+
+            /**
+             * 被保人QQ/微信号
+             */
+            @JacksonXmlProperty(localName = "CInsuredClntQQ")
+            private String CInsuredClntQQ;
+
+            /**
+             * 被保人证件/学校名称
+             */
+            @JacksonXmlProperty(localName = "CInsuredSchoolName")
+            private String CInsuredSchoolName;
+
+            /**
+             * 被保人编码
+             */
+            @JacksonXmlProperty(localName = "CInsuredCde")
+            private String CInsuredCde;
+
+            /**
+             * 被保人联系人
+             */
+            @JacksonXmlProperty(localName = "CCntrNme")
+            private String CCntrNme;
+
+            /**
+             * 被保人证件类型(法人)
+             */
+            @JacksonXmlProperty(localName = "CInsuredLegalCType")
+            private String CInsuredLegalCType;
+
+            /**
+             * 验证标志
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CMsgFlag")
+            private String CMsgFlag;
+
+            /**
+             * 证件有效止期
+             * 必填字段若长期证件则为:9999-12-31
+             */
+            @JacksonXmlProperty(localName = "TCertfClsValiDate")
+            private String TCertfClsValiDate;
+
+            /**
+             * 被保人手机实际持有人姓名
+             * 上海机构专用,当被保人填写的手机号码非本人实名认证的手机号码时,填写其相应的手机实际持有人姓名
+             */
+            @JacksonXmlProperty(localName = "InMobHolderName")
+            private String InMobHolderName;
+
+            /**
+             * 被保人手机实际持有人证件类型
+             * 上海机构专用,代码表(1.1.72),被保人人手机实际持有人证件类型只能为“身份证”
+             */
+            @JacksonXmlProperty(localName = "InMobHolderType")
+            private String InMobHolderType;
+
+            /**
+             * 被保人手机实际持有人证件号码
+             * 上海机构专用,当被保人填写的手机号码非本人实名认证的手机号码时,填写其相应的手机实际持有人证件号码
+             */
+            @JacksonXmlProperty(localName = "InMobHolderCode")
+            private String InMobHolderCode;
+
+            /**
+             * 单位性质
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CWorkDpt")
+            private String CWorkDpt;
+
+            /**
+             * 民族
+             * 民族
+             */
+            @JacksonXmlProperty(localName = "CNation")
+            private String CNation;
+
+            /**
+             * 颁发机构
+             * 颁发机构
+             */
+            @JacksonXmlProperty(localName = "CIssuedAt")
+            private String CIssuedAt;
+
+            /**
+             * 有效起期
+             * 身份证有效起期
+             */
+            @JacksonXmlProperty(localName = "TEffectedDate")
+            private String TEffectedDate;
+
+            /**
+             * 职业
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CResvTxt5")
+            private String CResvTxt5;
+
+            /**
+             * 与投保人关系
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CRelCdes")
+            private String CRelCdes;
+
+            /**
+             * 国家/地区
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CAreaCde")
+            private String CAreaCde;
+
+            /**
+             * 经营范围
+             * 法人场景
+             */
+            @JacksonXmlProperty(localName = "CWorkCtt")
+            private String CWorkCtt;
+
+            /**
+             * 注册资本金
+             * 万元/法人场景
+             */
+            @JacksonXmlProperty(localName = "NResvNum3")
+            private String NResvNum3;
+
+            /**
+             * 注册资本金币种
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "NResvNum3Cur")
+            private String NResvNum3Cur;
+
+            /**
+             * 所在省
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CProvince")
+            private String CProvince;
+
+            /**
+             * 所在市
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CCity")
+            private String CCity;
+
+            /**
+             * 所在县
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CCounty")
+            private String CCounty;
+
+            /**
+             * 与投保人关系描述
+             * 被保人是个人,且与保人关系是近亲属和非亲属时,必填
+             */
+            @JacksonXmlProperty(localName = "CRelApplicantDesc")
+            private String CRelApplicantDesc;
+
+            /**
+             * 行业
+             * 法人场景,代码表
+             */
+            @JacksonXmlProperty(localName = "CTrdCde")
+            private String CTrdCde;
+
+            public Insured(CustomerInfoVo ownerInfo, CustomerInfoVo insuredPersonInfo) {
+
+                //被保人类型: 0:法人 1:个人(中国籍) 2: 个人(非中国籍)
+                String property = insuredPersonInfo.getProperty();
+                if ("0".equals(property)) {
+                    this.setCCertfCls("110004");
+                    this.setCCertfCde(insuredPersonInfo.getOrganizationCode());
+                    if (StringUtils.isEmpty(ownerInfo.getProvince()) || StringUtils.isEmpty(ownerInfo.getCity()) || StringUtils.isEmpty(ownerInfo.getCounty())) {
+                        throw new SystemException("企业车省市区必填");
+                    }
+                    this.setCProvince(insuredPersonInfo.getProvince());
+                    this.setCCity(insuredPersonInfo.getCity());
+                    this.setCCounty(insuredPersonInfo.getCounty());
+                    //经营范围
+//            insured.setCWorkCtt(insuredPersonInfo.getScope());
+                    this.setNResvNum3(insuredPersonInfo.getRegisteredCapital());
+                    this.setNResvNum3Cur("01");
+                    this.setCCntrNme(insuredPersonInfo.getLegalPerson());
+                    this.setCClntMrk("0");
+                } else {
+                    this.setCCertfCls("120001");
+                    this.setCCertfCde(insuredPersonInfo.getIdentifyNumber());
+                    this.setTBirthday(IDCardUtils.GetBirthday(insuredPersonInfo.getIdentifyNumber()));
+                    this.setCSex(IDCardUtils.GetYcSex(insuredPersonInfo.getIdentifyNumber()));
+                    this.setCCntrNme(insuredPersonInfo.getName());
+                    this.setCClntMrk("1");
+                }
+
+                this.setCWorkDpt("900");
+                this.setCTrdCde("201799");
+                this.setCResvTxt5("000");
+                this.setCInsuredNme(insuredPersonInfo.getName());
+                this.setCClntAddr(insuredPersonInfo.getAddr());
+                this.setCMobile(insuredPersonInfo.getMobile());
+                this.setCAreaCde("103132");
+
+                this.setTCertfClsValiDate(insuredPersonInfo.getIdentifyValidEndDate());
+//        insured.setCCntrNme(insuredPersonInfo.getName());
+                this.setCRelCdes(ownerInfo.getName().equals(insuredPersonInfo.getName()) ? "601005" : "601008");
+
+            }
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "insured")
+        private Insured insured;
+
+
+        /**
+         * 交强险费率信息
+         */
+        @Data
+        public static class VehicleAdjust {
+            /**
+             * 二级机构
+             * 机构编码
+             */
+            @JacksonXmlProperty(localName = "SecondaryOrganization")
+            private String SecondaryOrganization;
+
+            /**
+             * 投保组合
+             * 默认为“Z”
+             */
+            @JacksonXmlProperty(localName = "CInsuranceGroup")
+            private String CInsuranceGroup;
+
+
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "vehicleAdjust")
+        private VehicleAdjust vehicleAdjust;
+
+        /**
+         * 意外险信息方案
+         */
+        @Data
+        public static class CvrgYW {
+            /**
+             * 意外险类型代码
+             */
+            @JacksonXmlProperty(localName = "CInsuranceCode")
+            @JsonProperty("CInsuranceCode")
+            private String cInsuranceCode;
+
+            /**
+             * 份数
+             */
+            @JacksonXmlProperty(localName = "NInsuranceQuantity")
+            @JsonProperty("NInsuranceQuantity")
+            private String nInsuranceQuantity;
+
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "cvrgYW")
+        private CvrgYW cvrgYW;
+
+        /**
+         * 意健险被保人信息
+         */
+        @Data
+        public class VhlAddInsured {
+
+
+            /**
+             * 被保人名称
+             */
+            @JacksonXmlProperty(localName = "CInsuredNme")
+            @JsonProperty("CInsuredNme")
+            private String cInsuredNme;
+
+            /**
+             * 证件类型
+             */
+            @JacksonXmlProperty(localName = "CCertfCls")
+            @JsonProperty("CCertfCls")
+            private String cCertfCls;
+
+            /**
+             * 证件号码
+             */
+            @JacksonXmlProperty(localName = "CCertfCde")
+            @JsonProperty("CCertfCde")
+            private String cCertfCde;
+
+            /**
+             * 性别
+             */
+            @JacksonXmlProperty(localName = "CSex")
+            @JsonProperty("CSex")
+            private String cSex;
+
+            /**
+             * 出生日期
+             */
+            @JacksonXmlProperty(localName = "TBirthday")
+            @JsonProperty("TBirthday")
+            private String tBirthday;
+
+            /**
+             * 与投保人关系
+             */
+            @JacksonXmlProperty(localName = "CRelCdes")
+            @JsonProperty("CRelCdes")
+            private String cRelCdes;
+        }
+
+        @JacksonXmlProperty(isAttribute = false, localName = "VHlADDINSURED")
+        private VhlAddInsured vhlAddInsured;
+
+    }
+
+    /**
+     * @description:构造报价请求参数
+     * @author: lig
+     * @date: 2023年02月08日 0008
+     */
+    public static QuoteRequest buildQuoteParam(QuoteVo quoteVo, YcApiConfigurationProperties ycApiConfigurationProperties,
+                                        List<AccidentalDrivingVo> adVo, String cQryCdeJQ, String cQryCdeSY, String negotiatedPrice) {
+
+        QuoteRequest m = new QuoteRequest();
+        QuoteRequest.RequestLabel requestLabel = new QuoteRequest.RequestLabel();
+        QuoteRequest.Condition condition = new QuoteRequest.Condition();
+
+        //投保人信息
+        CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
+        //被保人信息
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
+        //车主
+        CustomerInfoVo ownerInfo = quoteVo.getOwnersInfo();
+        CarInfoVo carInfo = quoteVo.getCarInfoVo();
+        List<RiskInfoVo> risks = new ArrayList<>();
+        if(Objects.nonNull(quoteVo.getCiRiskInfoVo())){
+            risks.add(quoteVo.getCiRiskInfoVo());
+        }
+        if(Objects.nonNull(quoteVo.getBiRiskInfoVo())){
+            risks.add(quoteVo.getBiRiskInfoVo());
+        }
+        /**
+         * 基本信息 base
+         */
+        Condition.Base base = Condition.Base.buildBase(carInfo, policyHolderInfo, insuredPersonInfo, risks, ycApiConfigurationProperties);
+        condition.setBase(base);
+
+        /**
+         * 车辆信息
+         * 代码:vhl
+         */
+        Condition.Vhl vhl = Condition.Vhl.buildVhl(carInfo, ownerInfo,cQryCdeJQ,cQryCdeSY);
+
+        String startTime = StringUtils.isNotEmpty(base.getTInsrncBgnTmJQ()) ? base.getTInsrncBgnTmJQ() : base.getTInsrncBgnTmSY();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Date d = sdf.parse(startTime);
+            startTime = sdf2.format(d);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+        //折旧价
+        String defValue = YcBuildData.getDefValue(new BigDecimal(vhl.getNNewPriceValue()), vhl.getCFstRegYm(), startTime);
+        vhl.setNActualValue(defValue);
+        if (negotiatedPrice.equals("0")) {
+            String negotiateThePrice = YcBuildData.getNegotiateThePrice(defValue,  vhl, startTime);
+            vhl.setNNewPurchaseValue(negotiateThePrice);
+        } else {
+            vhl.setNNewPurchaseValue(negotiatedPrice);
+        }
+
+        condition.setVhl(vhl);
+        /**
+         * 车主信息
+         * 代码:vhlowner
+         */
+        Condition.Vhlowner vhlowner = new Condition.Vhlowner(ownerInfo);
+        condition.setVhlowner(vhlowner);
+
+        /**
+         * 交强险险别
+         * 代码:cvrgListJQ/CvrgJQ
+         */
+        Condition.CoverageListJQ coverageListJQ = new Condition.CoverageListJQ(quoteVo.getCiRiskInfoVo());
+        condition.setCoverageListJQ(coverageListJQ);
+
+        String jqFlag = base.getCAppJqFlag();
+        String syFlag = base.getAppSYFlag();
+
+        /**
+         * 商业险险别
+         * 代码:cvrgListSY/CvrgSY
+         */
+
+//        Condition.CvrgListSY cvrgListSY = QuoteInfoConverter.converterKindInfoVo(quoteVo.getKindInfoVo(), vhl);
+//        condition.setCvrgListSY(cvrgListSY);
+
+        /**
+         * 交强险费率信息
+         * 费率调整系数表vehicleAdjust
+         */
+        Condition.VehicleAdjust vehicleAdjust = new Condition.VehicleAdjust();
+        vehicleAdjust.setSecondaryOrganization("");
+
+        //投保组合
+        String groupStr = YcBuildData.buildInsureGroup(jqFlag.equals("Y"), syFlag.equals("Y"));
+        vehicleAdjust.setCInsuranceGroup(groupStr);
+        condition.setVehicleAdjust(vehicleAdjust);
+
+        //商业险
+        if (base.getAppSYFlag().equals("Y")) {
+
+            /**
+             * 商业险系数
+             * 代码:prmCoef
+             *
+             */
+            Condition.PrmCoef prmCoef = new Condition.PrmCoef();
+            prmCoef.setNAutonomyAdjust("1");
+            prmCoef.setNChannelAdjust("1");
+            prmCoef.setCResvTxt1("0");
+            prmCoef.setCInsuranceGroup(groupStr);
+            condition.setPrmCoef(prmCoef);
+        }
+
+        /**
+         * 交强险车船税
+         * 车船税tax
+         */
+        condition.setTax(Condition.Tax.buildTax(policyHolderInfo, carInfo));
+
+        /**
+         * 渠道及费用信息
+         * 渠道及费用信息agent
+         */
+        condition.setAgent(ycApiConfigurationProperties.gainAgent());
+
+        /**
+         * 投保人信息
+         * 代码:applicant
+         */
+        Condition.Applicant applicant = new Condition.Applicant(ownerInfo,policyHolderInfo);
+        condition.setApplicant(applicant);
+
+        /**
+         * 被保人信息
+         * 代码:insured
+         */
+        Condition.Insured insured = new Condition.Insured(ownerInfo, insuredPersonInfo);
+        condition.setInsured(insured);
+
+        /**
+         * 意外险信息方案
+         * 代码:cvrgYW
+         */
+        if (null != adVo && !adVo.isEmpty()) {
+            adVo.forEach(vo->{
+                if(StringUtils.isNotEmpty(vo.getRiskCode()) && vo.getQuantity() > 0)
+                {
+                    Condition.CvrgYW cvrgYW = new Condition.CvrgYW();
+                    cvrgYW.setCInsuranceCode(vo.getRiskCode());
+                    cvrgYW.setNInsuranceQuantity(vo.getQuantity() + "");
+                    condition.setCvrgYW(cvrgYW);
+                }
+            });
+
+            base.setAppYWFlag("Y");
+
+            if (base.getAppSYFlag().equals("Y")) {
+                base.setTInsrncBgnTmYW(base.getTInsrncBgnTmSY());
+                base.setTInsrncEndTmYW(base.getTInsrncEndTmSY());
+
+            } else {
+                base.setTInsrncBgnTmYW(base.getTInsrncBgnTmJQ());
+                base.setTInsrncEndTmYW(base.getTInsrncEndTmJQ());
+            }
+
+        }
+
+        requestLabel.setAuthorityData(ycApiConfigurationProperties.gainAuthorityDataXml());
+        requestLabel.setCondition(condition);
+
+
+        m.setRequestLabel(requestLabel);
+
+        return m;
+    }
+
+
+}

+ 29 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/RecognitionRequest.java

@@ -0,0 +1,29 @@
+package com.jzg.quotation.yongcheng.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @description: 验证码识别请求
+ */
+@Data
+public class RecognitionRequest implements Serializable {
+
+    private static final long serialVersionUID = 6961550851143654920L;
+
+    /**
+     * 交强影像
+     */
+    @JsonProperty("jgImage")
+    private String jgImage;
+
+    /**
+     * 商业影像
+     */
+    @JsonProperty("syImage")
+    private String syImage;
+
+
+}

+ 121 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/AuditResponse.java

@@ -0,0 +1,121 @@
+package com.jzg.quotation.yongcheng.api.entity.response;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.Data;
+
+
+/**
+ * 核保  响应
+ */
+@Data
+@JacksonXmlRootElement(localName = "newUnderwritingResponse")
+public class AuditResponse {
+
+
+    @JacksonXmlProperty(localName = "responseHead")
+    private ResponseHead responseHead;
+
+    @JacksonXmlProperty(localName = "ciResponseMessagedate")
+    private CiResponseMessagedate ciResponseMessagedate;
+
+    @JacksonXmlProperty(localName = "sailResponseMessagedate")
+    private SailResponseMessagedate sailResponseMessagedate;
+
+
+    /**
+     * 交强险核保标志
+     * 0:待核保;1:已核保;3:退回修改;9:已核保未缴费;
+     */
+    @JacksonXmlProperty(localName = "statusJQ")
+    private String statusJq;
+
+    /**
+     * 商业险核保标志
+     * 0:待核保;1:已核保;3:退回修改;9:已核保未缴费;
+     */
+    @JacksonXmlProperty(localName = "statusSY")
+    private String statusSY;
+
+    /**
+     * 交强险投保单号
+     */
+    @JacksonXmlProperty(localName = "policyAppNoJQ")
+    private String policyAppNoJQ;
+
+    /**
+     * 商业险投保单号
+     */
+    @JacksonXmlProperty(localName = "policyAppNoSY")
+    private String policyAppNoSY;
+
+    /**
+     * 交强投保查询码
+     */
+    @JacksonXmlProperty(localName = "querySequenceNoJQ")
+    private String querySequenceNoJQ;
+
+    /**
+     * 商业投保查询码
+     */
+    @JacksonXmlProperty(localName = "querySequenceNoSY")
+    private String querySequenceNoSY;
+
+    /**
+     * 订单号
+     */
+    @JacksonXmlProperty(localName = "orderCode")
+    private String orderCode;
+
+
+    @Data
+    public static class ResponseHead {
+
+        @JacksonXmlProperty(localName = "returnCode")
+        private String returnCode;
+
+        @JacksonXmlProperty(localName = "returnMessage")
+        private String returnMessage;
+
+    }
+
+
+    /**
+     * 商业提示信息(ciResponseMessagedate)
+     */
+    @Data
+    public static class CiResponseMessagedate {
+        /**
+         * 信息名称
+         */
+        @JacksonXmlProperty(localName = "CMessageName")
+        private String CMessageName;
+
+        /**
+         * 提示内容
+         */
+        @JacksonXmlProperty(localName = "CMessage")
+        private String CMessage;
+
+    }
+
+    /**
+     * 交强提示信息(sailResponseMessagedate)
+     */
+    @Data
+    public static class SailResponseMessagedate {
+        /**
+         * 信息名称
+         */
+        @JacksonXmlProperty(localName = "CMessageName")
+        private String CMessageName;
+
+        /**
+         * 提示内容
+         */
+        @JacksonXmlProperty(localName = "CMessage")
+        private String CMessage;
+
+    }
+
+}

+ 45 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/CoreModelsResponse.java

@@ -0,0 +1,45 @@
+package com.jzg.quotation.yongcheng.api.entity.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: 保司核心返回车型
+ * @author: wenks
+ * @date: 2024/2/22 10:29
+ **/
+@EqualsAndHashCode(callSuper = false)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CoreModelsResponse {
+
+    private String modelCode;
+
+    private String modelName;
+
+    private String seatCount;
+
+    private String carYear;
+
+    private String power;
+
+    private String enginedesc;
+
+    private String purchasePrice;
+
+    public CoreModelsResponse() {
+    }
+
+    public CoreModelsResponse(String modelCode, String modelName, String seatCount, String carYear, String power, String enginedesc, String purchasePrice) {
+        this.modelCode = modelCode;
+        this.modelName = modelName;
+        this.seatCount = seatCount;
+        this.carYear = carYear;
+        this.power = power;
+        this.enginedesc = enginedesc;
+        this.purchasePrice = purchasePrice;
+    }
+}

+ 292 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/ModelsQueryResponse.java

@@ -0,0 +1,292 @@
+package com.jzg.quotation.yongcheng.api.entity.response;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * @description:车型查询 响应
+ * @author: lig
+ * @date: 2023年02月07日 0007
+ */
+@Data
+@JacksonXmlRootElement(localName = "queryVehicleTypesResponse")
+public class ModelsQueryResponse {
+
+
+    @JacksonXmlProperty(localName = "msg")
+    private String msg;
+
+    @JacksonXmlProperty(localName = "returnCode")
+    private String returnCode;
+
+    @JacksonXmlProperty(localName = "searchKeyword")
+    private String searchKeyword;
+
+
+    @JacksonXmlElementWrapper(useWrapping = false)
+    @JacksonXmlProperty(localName = "vehicleInfo")
+    private List<VehicleInfo> vehicleInfoList;
+
+//    @JacksonXmlElementWrapper
+//    @JacksonXmlProperty(localName = "S:Body")
+//    private Object body;
+
+    @Data
+    public static class VehicleInfo {
+        /**
+         * 车型唯一编码
+         */
+        @JacksonXmlProperty(localName = "vehicleId")
+        private String vehicleId;
+
+        /**
+         * 车型正式名称
+         */
+        @JacksonXmlProperty(localName = "vehicleName")
+        private String vehicleName;
+
+        /**
+         * 车型种类编码
+         */
+        @JacksonXmlProperty(localName = "vehicleClass")
+        private String vehicleClass;
+
+        /**
+         * 永诚车型种类编码
+         */
+        @JacksonXmlProperty(localName = "ycVehicleClass")
+        private String ycVehicleClass;
+
+        /**
+         * 进口车/国产车
+         */
+        @JacksonXmlProperty(localName = "vehicleType")
+        private String vehicleType;
+
+        /**
+         * 厂商ID
+         */
+        @JacksonXmlProperty(localName = "factoryId")
+        private String factoryId;
+
+        /**
+         * 生产厂家
+         */
+        @JacksonXmlProperty(localName = "VehicleMaker")
+        private String VehicleMaker;
+
+        /**
+         * 品牌
+         */
+        @JacksonXmlProperty(localName = "vehicleBrand")
+        private String vehicleBrand;
+
+        /**
+         * 品牌ID
+         */
+        @JacksonXmlProperty(localName = "brandID")
+        private String brandID;
+
+        /**
+         * 车型系列
+         */
+        @JacksonXmlProperty(localName = "vehicleSeries")
+        private String vehicleSeries;
+
+        /**
+         * 车型ID
+         */
+        @JacksonXmlProperty(localName = "familiyId")
+        private String familiyId;
+
+        /**
+         * 查询简码
+         */
+        @JacksonXmlProperty(localName = "searchCode")
+        private String searchCode;
+
+        /**
+         * 型号编码
+         */
+        @JacksonXmlProperty(localName = "modelCode")
+        private String modelCode;
+
+        /**
+         * 核定载客(人)
+         */
+        @JacksonXmlProperty(localName = "vehicleSeat")
+        private String vehicleSeat;
+
+        /**
+         * 排气量
+         */
+        @JacksonXmlProperty(localName = "vehicleDisplacement")
+        private String vehicleDisplacement;
+
+        /**
+         * 上市年份
+         */
+        @JacksonXmlProperty(localName = "vehicleYear")
+        private String vehicleYear;
+
+        /**
+         * 精友新车购置价
+         */
+        @JacksonXmlProperty(localName = "vehiclePrice")
+        private String vehiclePrice;
+
+        /**
+         * 备注
+         */
+        @JacksonXmlProperty(localName = "vehicleRemark")
+        private String vehicleRemark;
+
+        /**
+         * 变速器类型
+         */
+        @JacksonXmlProperty(localName = "transmissionType")
+        private String transmissionType;
+
+        /**
+         * 生产状态
+         */
+        @JacksonXmlProperty(localName = "productStatus")
+        private String productStatus;
+
+        /**
+         * 风险类型
+         */
+        @JacksonXmlProperty(localName = "riskType")
+        private String riskType;
+
+        /**
+         * ABS装置
+         */
+        @JacksonXmlProperty(localName = "absFlag")
+        private String absFlag;
+
+        /**
+         * 防盗装置
+         */
+        @JacksonXmlProperty(localName = "thefiProof")
+        private String thefiProof;
+
+        /**
+         * 安全气囊数量
+         */
+        @JacksonXmlProperty(localName = "airbagCount")
+        private String airbagCount;
+
+        /**
+         * 最小整备质量
+         */
+        @JacksonXmlProperty(localName = "curbWeightMin")
+        private String curbWeightMin;
+
+        /**
+         * 最大整备质量
+         */
+        @JacksonXmlProperty(localName = "curbWeightMax")
+        private String curbWeightMax;
+
+        /**
+         * 类比车型价格(含税)
+         */
+        @JacksonXmlProperty(localName = "xhKindPrice")
+        private String xhKindPrice;
+
+        /**
+         * 浙江协会类比税前价格
+         */
+        @JacksonXmlProperty(localName = "nXhKindpriceWithouttax")
+        private String nXhKindpriceWithouttax;
+
+        /**
+         * 发动机功率
+         */
+        @JacksonXmlProperty(localName = "vehiclePower")
+        private String vehiclePower;
+
+        /**
+         * 精友新车购置价(含税)
+         */
+        @JacksonXmlProperty(localName = "szxhTaxedPrice")
+        private String szxhTaxedPrice;
+
+        /**
+         * 商业险车型分类
+         */
+        @JacksonXmlProperty(localName = "syxClassid")
+        private String syxClassid;
+
+        /**
+         * 商业险车型名称
+         */
+        @JacksonXmlProperty(localName = "syxClassname")
+        private String syxClassname;
+
+        /**
+         * 交强险车型分类
+         */
+        @JacksonXmlProperty(localName = "jqxClassid")
+        private String jqxClassid;
+
+        /**
+         * 交强险车型名称
+         */
+        @JacksonXmlProperty(localName = "jqxClassname")
+        private String jqxClassname;
+
+        /**
+         * VIN码
+         */
+        @JacksonXmlProperty(localName = "vinCode")
+        private String vinCode;
+
+        /**
+         * 创建日期
+         */
+        @JacksonXmlProperty(localName = "dateCreated")
+        private String dateCreated;
+
+        /**
+         * 更新日期
+         */
+        @JacksonXmlProperty(localName = "dateUpdated")
+        private String dateUpdated;
+
+        /**
+         * 精友车型分类
+         */
+        @JacksonXmlProperty(localName = "jyClassid")
+        private String jyClassid;
+
+        /**
+         * 吨位
+         */
+        @JacksonXmlProperty(localName = "vehicleTonnage")
+        private String vehicleTonnage;
+
+
+
+//        public CoreModelsVo toCoreModelsVo(){
+//            CoreModelsVo coreModelsVo = new CoreModelsVo();
+//            coreModelsVo.setModelCode(this.vehicleId);
+//            coreModelsVo.setModelName(this.vehicleName);
+//            coreModelsVo.setCarYear(this.vehicleYear);
+//            coreModelsVo.setPower(this.vehiclePower);
+//            coreModelsVo.setEnginedesc(this.vehicleDisplacement);
+//            coreModelsVo.setPurchasePrice(this.vehiclePrice);
+//            coreModelsVo.setSeatCount(this.vehicleSeat);
+//            return coreModelsVo;
+//        }
+
+
+    }
+
+}

+ 29 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/PriceDiscountRatioResponse.java

@@ -0,0 +1,29 @@
+package com.jzg.quotation.yongcheng.api.entity.response;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/1/9 18:06
+ */
+
+@Data
+@JacksonXmlRootElement(localName = "ns2:GtePriceDiscountServiceResponse")
+public class PriceDiscountRatioResponse {
+    /**
+     *  返回消息码  E0001失败  E0000成功
+     */
+    private String code;
+
+    /**
+     *  返回信息
+     */
+    private String msg;
+
+    /**
+     * 协商价折扣比例
+     */
+    private String val;
+
+}

+ 3100 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/QuoteResponse.java

@@ -0,0 +1,3100 @@
+package com.jzg.quotation.yongcheng.api.entity.response;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 报价响应
+ */
+@Data
+@JacksonXmlRootElement(localName = "responseMessage")
+public class QuoteResponse {
+
+    @JacksonXmlProperty(localName = "Head")
+    private Head Head;
+
+    @JacksonXmlProperty(localName = "TfiWarnList")
+    private TfiWarnListResponse tfiWarnList;
+
+    @Data
+    public static class TfiWarnListResponse {
+
+
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "tfiWarnData")
+        private List<TfiWarnData> tfiWarnData;
+
+
+        @Data
+        public static class TfiWarnData {
+            @JacksonXmlProperty(localName = "warnDate")
+            private String warnName;
+            @JacksonXmlProperty(localName = "warnMessage")
+            private String warnMessage;
+            @JacksonXmlProperty(localName = "warnName")
+            private String warnDate;
+
+        }
+
+
+    }
+
+    @JacksonXmlProperty(localName = "Base")
+    private BaseResponse base;
+
+    @Data
+    public static class BaseResponse {
+
+
+        /**
+         * 产品号-商业险
+         * 商业险产品号
+         */
+        @JacksonXmlProperty(localName = "CProdNoSY")
+        private String CProdNoSY;
+        /**
+         * 产品号-交强险
+         * 交强险产品号
+         */
+        @JacksonXmlProperty(localName = "CProdNoJQ")
+        private String CProdNoJQ;
+        /**
+         * 机构编码
+         */
+        @JacksonXmlProperty(localName = "CDptCde")
+        private String CDptCde;
+        /**
+         * 商业险保险起期
+         * YYYY-MM-DD HH24:MI:SS
+         */
+        @JacksonXmlProperty(localName = "TInsrncBgnTmSY")
+        private String TInsrncBgnTmSY;
+        /**
+         * 商业险保险止期
+         * YYYY-MM-DD HH24:MI:SS
+         */
+        @JacksonXmlProperty(localName = "TInsrncEndTmSY")
+        private String TInsrncEndTmSY;
+        /**
+         * 交强险保险起期
+         * YYYY-MM-DD HH24:MI:SS
+         */
+        @JacksonXmlProperty(localName = "TInsrncBgnTmJQ")
+        private String TInsrncBgnTmJQ;
+        /**
+         * 交强险保险止期
+         * YYYY-MM-DD HH24:MI:SS
+         */
+        @JacksonXmlProperty(localName = "TInsrncEndTmJQ")
+        private String TInsrncEndTmJQ;
+        /**
+         * 系数类型
+         * 月或日费率短期费率类型
+         */
+        @JacksonXmlProperty(localName = "CRatioTyp")
+        private String CRatioTyp;
+        /**
+         * 短期系数
+         * 保险期限1年  为 1.000000
+         */
+        @JacksonXmlProperty(localName = "NRatioCoef")
+        private String NRatioCoef;
+        /**
+         * 汇率
+         */
+        @JacksonXmlProperty(localName = "NprmRmbExch")
+        private String NprmRmbExch;
+        /**
+         * 保额合计
+         */
+        @JacksonXmlProperty(localName = "Namt")
+        private String Namt;
+        /**
+         * 保费合计
+         */
+        @JacksonXmlProperty(localName = "NPrm")
+        private String NPrm;
+        /**
+         * 总体折扣
+         */
+        @JacksonXmlProperty(localName = "NdiscRate")
+        private String NdiscRate;
+        /**
+         * 保额币种
+         * 目前只支持01人民币
+         */
+        @JacksonXmlProperty(localName = "CamtCur")
+        private String CamtCur;
+        /**
+         * 保费币种
+         * 目前只支持01人民币
+         */
+        @JacksonXmlProperty(localName = "CprmCur")
+        private String CprmCur;
+        /**
+         * 商业险续保标志
+         * 0 非续保   1 续保
+         */
+        @JacksonXmlProperty(localName = "CrenewMrkSY")
+        private String CrenewMrkSY;
+        /**
+         * 交强险续保标志
+         * 0 非续保   1 续保
+         */
+        @JacksonXmlProperty(localName = "CrenewMrkJQ")
+        private String CrenewMrkJQ;
+        /**
+         * 商业险续保单号
+         * 续保时必传
+         */
+        @JacksonXmlProperty(localName = "CorigPlyNoSY")
+        private String CorigPlyNoSY;
+        /**
+         * 交强险续保单号
+         * 续保时必传
+         */
+        @JacksonXmlProperty(localName = "CorigPlyNoJQ")
+        private String CorigPlyNoJQ;
+        /**
+         * 业务来源
+         * 业务来源
+         */
+        @JacksonXmlProperty(localName = "CbsnsTyp")
+        private String CbsnsTyp;
+        /**
+         * 签单日期
+         * 出单日期,当前日期YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "TissueTm")
+        private String TissueTm;
+        /**
+         * 业务员代码
+         */
+        @JacksonXmlProperty(localName = "CslsId")
+        private String CslsId;
+        /**
+         * 行业
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CsubTrdCde")
+        private String CsubTrdCde;
+        /**
+         * 涉农类型
+         */
+        @JacksonXmlProperty(localName = "CagriMrk")
+        private String CagriMrk;
+        /**
+         * 风险等级
+         */
+        @JacksonXmlProperty(localName = "CriskLvlCde")
+        private String CriskLvlCde;
+        /**
+         * 争议解决方式
+         * 争议解决方式
+         */
+        @JacksonXmlProperty(localName = "CdisptSttlCde")
+        private String CdisptSttlCde;
+        /**
+         * 特别约定
+         */
+        @JacksonXmlProperty(localName = "CunfixSpcIlog")
+        private String CunfixSpcIlog;
+        /**
+         * 告知
+         */
+        @JacksonXmlProperty(localName = "Cremark")
+        private String Cremark;
+        /**
+         * 录入人
+         */
+        @JacksonXmlProperty(localName = "CoprCde")
+        private String CoprCde;
+        /**
+         * 录单日期
+         * YYYY-MM-DD HH24:MI:SS
+         */
+        @JacksonXmlProperty(localName = "TappTm")
+        private String TappTm;
+        /**
+         * 保单生成
+         */
+        @JacksonXmlProperty(localName = "CoprTyp")
+        private String CoprTyp;
+        /**
+         * 缴费方式
+         */
+        @JacksonXmlProperty(localName = "CfinTyp")
+        private String CfinTyp;
+        /**
+         * 保险天数
+         */
+        @JacksonXmlProperty(localName = "CtmSysCde")
+        private String CtmSysCde;
+        /**
+         * 操作日期
+         * 取当前时间,录单时间YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "ToprTm")
+        private String ToprTm;
+        /**
+         * 任务类型
+         * 0:呼入 1呼出
+         */
+        @JacksonXmlProperty(localName = "CtaskType")
+        private String CtaskType;
+        /**
+         * 业务模式
+         * 0:电销 1:网销 2:网转电
+         */
+        @JacksonXmlProperty(localName = "CbusinessMode")
+        private String CbusinessMode;
+        /**
+         * 订单号
+         */
+        @JacksonXmlProperty(localName = "CresvTxt6")
+        private String CresvTxt6;
+        /**
+         * 代理人
+         * 代理业务时传
+         */
+        @JacksonXmlProperty(localName = "CbrkrCde")
+        private String CbrkrCde;
+        /**
+         * 代理协议号(商业代理协议)
+         * 代理经纪业务必传
+         */
+        @JacksonXmlProperty(localName = "CagtAgrNo")
+        private String CagtAgrNo;
+        /**
+         * 代理职业证号
+         */
+        @JacksonXmlProperty(localName = "CcertfNo")
+        private String CcertfNo;
+        /**
+         * 中介机构销售人员名称
+         */
+        @JacksonXmlProperty(localName = "CbrkSlsName")
+        private String CbrkSlsName;
+        /**
+         * 仲裁机构
+         * 争议解决方式为仲裁时为必输。
+         */
+        @JacksonXmlProperty(localName = "CdisptSttlOrg")
+        private String CdisptSttlOrg;
+        /**
+         * 销售渠道(渠道分类)
+         */
+        @JacksonXmlProperty(localName = "CchaType")
+        private String CchaType;
+        /**
+         * 代理人名称
+         */
+        @JacksonXmlProperty(localName = "CBrkrNme")
+        private String CBrkrNme;
+        /**
+         * 销售团队
+         */
+        @JacksonXmlProperty(localName = "CSalegrpCde")
+        private String CSalegrpCde;
+        /**
+         * 业务员电话
+         */
+        @JacksonXmlProperty(localName = "CSlsTel")
+        private String CSlsTel;
+        /**
+         * 协议序号
+         */
+        @JacksonXmlProperty(localName = "CAgtAgrSeqNO")
+        private String CAgtAgrSeqNO;
+        /**
+         * 缴费人情况
+         */
+        @JacksonXmlProperty(localName = "CResvTxt4")
+        private String CResvTxt4;
+        /**
+         * 预约协议
+         */
+        @JacksonXmlProperty(localName = "COpenCoverNo")
+        private String COpenCoverNo;
+        /**
+         * 业务类型
+         */
+        @JacksonXmlProperty(localName = "CSlsTyp")
+        private String CSlsTyp;
+        /**
+         * 股东业务类型
+         */
+        @JacksonXmlProperty(localName = "CShareSlsTyp")
+        private String CShareSlsTyp;
+        /**
+         * 银行编码
+         */
+        @JacksonXmlProperty(localName = "CBankCde")
+        private String CBankCde;
+        /**
+         * 数据来源
+         */
+        @JacksonXmlProperty(localName = "CDataSrc")
+        private String CDataSrc;
+        /**
+         * 业务合作来源
+         */
+        @JacksonXmlProperty(localName = "CAgrSlsBsns")
+        private String CAgrSlsBsns;
+        /**
+         * 代理人资格证号
+         */
+        @JacksonXmlProperty(localName = "CAgtZgNo")
+        private String CAgtZgNo;
+        /**
+         * 渠道大类
+         */
+        @JacksonXmlProperty(localName = "CChaClassCde")
+        private String CChaClassCde;
+        /**
+         * 渠道大类名称
+         */
+        @JacksonXmlProperty(localName = "CChaClassNme")
+        private String CChaClassNme;
+        /**
+         * 销售渠道名称
+         */
+        @JacksonXmlProperty(localName = "CChaNme")
+        private String CChaNme;
+        /**
+         * 专业渠道类型
+         */
+        @JacksonXmlProperty(localName = "CChaSpecail")
+        private String CChaSpecail;
+        /**
+         * 客户性质
+         */
+        @JacksonXmlProperty(localName = "CClientQuality")
+        private String CClientQuality;
+        /**
+         * 业务员岗位代码
+         */
+        @JacksonXmlProperty(localName = "CDutyCde")
+        private String CDutyCde;
+        /**
+         * 业务员岗位名称
+         */
+        @JacksonXmlProperty(localName = "CDutyNme")
+        private String CDutyNme;
+        /**
+         * 企业代码
+         */
+        @JacksonXmlProperty(localName = "CEnterpriseCde")
+        private String CEnterpriseCde;
+        /**
+         * 企业类别
+         */
+        @JacksonXmlProperty(localName = "CEnterpriseClass")
+        private String CEnterpriseClass;
+        /**
+         * 企业分级
+         */
+        @JacksonXmlProperty(localName = "CEnterpriseLvl")
+        private String CEnterpriseLvl;
+        /**
+         * 企业名称
+         */
+        @JacksonXmlProperty(localName = "CEnterpriseNme")
+        private String CEnterpriseNme;
+        /**
+         * 配套服务提供商
+         */
+        @JacksonXmlProperty(localName = "CServiceProvider")
+        private String CServiceProvider;
+        /**
+         * 商业成本保费
+         * 自动报价才有值
+         */
+        @JacksonXmlProperty(localName = "NResvNum1")
+        private String NResvNum1;
+        /**
+         * 交强成本保费
+         * 自动报价才有值
+         */
+        @JacksonXmlProperty(localName = "NResvNum2")
+        private String NResvNum2;
+        /**
+         * 商业手续费比例
+         * 代理经纪业务才有
+         */
+        @JacksonXmlProperty(localName = "NCommRateSY")
+        private String NCommRateSY;
+        /**
+         * 交强手续费比例
+         * 代理经纪业务才有
+         */
+        @JacksonXmlProperty(localName = "NCommRateJQ")
+        private String NCommRateJQ;
+        /**
+         * 商业手续费比例上限
+         * 代理经纪业务才有
+         */
+        @JacksonXmlProperty(localName = "NCommissionRateUpperSY")
+        private String NCommissionRateUpperSY;
+        /**
+         * 交强手续费比例上限
+         * 代理经纪业务才有
+         */
+        @JacksonXmlProperty(localName = "NCommissionRateUpperJQ")
+        private String NCommissionRateUpperJQ;
+        /**
+         * 光博业务分类
+         */
+        @JacksonXmlProperty(localName = "CWeRisk")
+        private String CWeRisk;
+        /**
+         * 商业险税款金额
+         */
+        @JacksonXmlProperty(localName = "NAppTaxAmtSY")
+        private String NAppTaxAmtSY;
+        /**
+         * 交强险税款金额
+         */
+        @JacksonXmlProperty(localName = "NAppTaxAmtJQ")
+        private String NAppTaxAmtJQ;
+        /**
+         * 商业险税前保费
+         * 不含税保费
+         */
+        @JacksonXmlProperty(localName = "NBefTaxPrmSY")
+        private String NBefTaxPrmSY;
+        /**
+         * 交强险税前保费
+         * 不含税保费
+         */
+        @JacksonXmlProperty(localName = "NBefTaxPrmJQ")
+        private String NBefTaxPrmJQ;
+        /**
+         * 出险次数
+         */
+        @JacksonXmlProperty(localName = "AccidentNum")
+        private String AccidentNum;
+    }
+
+    @JacksonXmlProperty(localName = "Vhl")
+    private VhlResponse Vhl;
+
+    @Data
+    public static class VhlResponse {
+
+
+        /**
+         * 行业车型编码
+         * 核心调精友服务获取行业车型编码
+         */
+        @JacksonXmlProperty(localName = "CPlateModelCde")
+        private String CPlateModelCde;
+
+        /**
+         * 精友车型代码
+         */
+        @JacksonXmlProperty(localName = "CModelCde")
+        private String CModelCde;
+
+        /**
+         * 行驶证车主
+         * 必须提供
+         */
+        @JacksonXmlProperty(localName = "CRegOwner")
+        private String CRegOwner;
+
+        /**
+         * 车牌号码
+         */
+        @JacksonXmlProperty(localName = "CPlateNo")
+        private String CPlateNo;
+
+        /**
+         * 发动机号
+         */
+        @JacksonXmlProperty(localName = "CEngNo")
+        private String CEngNo;
+
+        /**
+         * 车架号
+         */
+        @JacksonXmlProperty(localName = "CFrmNo")
+        private String CFrmNo;
+
+        /**
+         * 车款名称
+         * 核心调精友服务获取行业车款名称
+         */
+        @JacksonXmlProperty(localName = "CModelNme")
+        private String CModelNme;
+
+        /**
+         * 初次登记日期
+         *  YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "CFstRegYm")
+        private String CFstRegYm;
+
+        /**
+         * 号牌种类
+         */
+        @JacksonXmlProperty(localName = "CPlateTyp")
+        private String CPlateTyp;
+
+        /**
+         * 使用性质
+         */
+        @JacksonXmlProperty(localName = "CUsageCde")
+        private String CUsageCde;
+
+        /**
+         * 所属性质
+         */
+        @JacksonXmlProperty(localName = "CBizMrk")
+        private String CBizMrk;
+
+        /**
+         * 车辆种类
+         */
+        @JacksonXmlProperty(localName = "CVhlTyp")
+        private String CVhlTyp;
+
+        /**
+         * 核定载客数
+         * 根据车型代码
+         */
+        @JacksonXmlProperty(localName = "NSeatNum")
+        private String NSeatNum;
+
+        /**
+         * 座位数
+         * 根据车型代码
+         */
+        @JacksonXmlProperty(localName = "NResvNum1")
+        private String NResvNum1;
+
+        /**
+         * 排气量
+         * 根据车型代码
+         */
+        @JacksonXmlProperty(localName = "NDisplacement")
+        private String NDisplacement;
+
+        /**
+         * 新旧车标志
+         * 0 新车,1 旧车
+         */
+        @JacksonXmlProperty(localName = "CNewMrk")
+        private String CNewMrk;
+
+        /**
+         * 使用年限
+         */
+        @JacksonXmlProperty(localName = "CUseYear")
+        private String CUseYear;
+
+        /**
+         * 玻璃类型
+         */
+        @JacksonXmlProperty(localName = "CGlassTyp")
+        private String CGlassTyp;
+
+        /**
+         * 行驶证车辆类型
+         */
+        @JacksonXmlProperty(localName = "CRegVhlTyp")
+        private String CRegVhlTyp;
+
+        /**
+         * 吨位
+         */
+        @JacksonXmlProperty(localName = "NTonage")
+        private String NTonage;
+
+        /**
+         * 功率
+         * 根据车型代码
+         */
+        @JacksonXmlProperty(localName = "CDisplacementLvl")
+        private String CDisplacementLvl;
+
+        /**
+         * 转籍时间年月
+         * 外地车必输YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "TTransferTm")
+        private String TTransferTm;
+
+        /**
+         * 是否外地车
+         * 本地0,省内异地1,省外异地2
+         */
+        @JacksonXmlProperty(localName = "CEcdemicMrk")
+        private String CEcdemicMrk;
+
+        /**
+         * 团车合同号
+         * 申报团车业务,确认是否需要,否则需要弹出
+         */
+        @JacksonXmlProperty(localName = "CGrpBuyContractNo")
+        private String CGrpBuyContractNo;
+
+        /**
+         * 过户标志
+         * 必传。过户车传1;非过户车传0
+         */
+        @JacksonXmlProperty(localName = "CChgOwnerFlag")
+        private String CChgOwnerFlag;
+
+        /**
+         * 转移登记日期
+         * 过户车必输YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "TTransferDate")
+        private String TTransferDate;
+
+        /**
+         * 续保单号(往年(续/转)保单号)
+         * 如果续保则和续保单号相同如果转保则需要提供其他保险公司的保单号
+         */
+        @JacksonXmlProperty(localName = "CResvTxt7")
+        private String CResvTxt7;
+
+        /**
+         * 商业险查询码
+         * 平台返回的投保查询码
+         */
+        @JacksonXmlProperty(localName = "CQryCdeSY")
+        private String CQryCdeSY;
+
+        /**
+         * 交强险查询码
+         * 平台返回的投保查询码
+         */
+        @JacksonXmlProperty(localName = "CQryCdeJQ")
+        private String CQryCdeJQ;
+
+        /**
+         * 业务类型
+         * 0:新保  1:续保2:转保
+         */
+        @JacksonXmlProperty(localName = "CBusType")
+        private String CBusType;
+
+        /**
+         * 是否按揭车
+         */
+        @JacksonXmlProperty(localName = "CMortgageMrk")
+        private String CMortgageMrk;
+
+        /**
+         * 车损确定方式
+         */
+        @JacksonXmlProperty(localName = "CResvTxt2")
+        private String CResvTxt2;
+
+        /**
+         * 整备质量
+         */
+        @JacksonXmlProperty(localName = "NPoWeight")
+        private String NPoWeight;
+
+        /**
+         * 指定查询地区查询无赔系数
+         */
+        @JacksonXmlProperty(localName = "CAppointAreaCode")
+        private String CAppointAreaCode;
+
+        /**
+         * 折旧价
+         */
+        @JacksonXmlProperty(localName = "NActualValue")
+        private String NActualValue;
+
+        /**
+         * 协商价
+         */
+        @JacksonXmlProperty(localName = "NNewPurchaseValue")
+        private String NNewPurchaseValue;
+
+        /**
+         * 新车购置价
+         */
+        @JacksonXmlProperty(localName = "NNewPriceValue")
+        private String NNewPriceValue;
+
+        /**
+         * 公告型号
+         * 当车辆为国产车、合资车时,要求保险公司传送公告型号。
+         */
+        @JacksonXmlProperty(localName = "NoticeType")
+        private String NoticeType;
+
+        /**
+         * 车牌颜色
+         */
+        @JacksonXmlProperty(localName = "CPlateColor")
+        private String CPlateColor;
+
+        /**
+         * 验车情况
+         * 305005001:未验305005002:已验车305005003:免验车305005004:需验车
+         */
+        @JacksonXmlProperty(localName = "CInspectionCde")
+        private String CInspectionCde;
+
+        /**
+         * 验车人
+         * 当验车情况是已验车必传
+         */
+        @JacksonXmlProperty(localName = "CInspectorNme")
+        private String CInspectorNme;
+
+        /**
+         * 验车记录
+         * 当验车情况是已验车必传
+         */
+        @JacksonXmlProperty(localName = "CInspectRec")
+        private String CInspectRec;
+
+        /**
+         * 验车时间
+         * 当验车情况是已验车必传YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "CInspectTm")
+        private String CInspectTm;
+
+        /**
+         * 是否租赁车
+         * 1:是0:否
+         */
+        @JacksonXmlProperty(localName = "CDevice8Mrk")
+        private String CDevice8Mrk;
+
+        /**
+         * 承租人
+         * 当是否租赁车为1时,必传
+         */
+        @JacksonXmlProperty(localName = "CResvTxt11")
+        private String CResvTxt11;
+
+        /**
+         * 校验问题-商业险
+         * 平台转保业务,第一次请求时返回
+         */
+        @JacksonXmlProperty(localName = "CQuestionSY")
+        private String CQuestionSY;
+
+        /**
+         * 校验问题-交强险
+         * 平台转保业务,第一次请求时返回
+         */
+        @JacksonXmlProperty(localName = "CQuestionJQ")
+        private String CQuestionJQ;
+
+        /**
+         * 月折旧率
+         * 折旧率*折旧月份
+         */
+        @JacksonXmlProperty(localName = "NMonDespRate")
+        private String NMonDespRate;
+
+        /**
+         * 是否验车
+         * 0:否,1是
+         */
+        @JacksonXmlProperty(localName = "CVhlCheck")
+        private String CVhlCheck;
+
+
+        /**
+         * 商业转保校验码图片串
+         * 为转保业务时,该节点和校验问题节点,必有一个不为空
+         */
+        @JacksonXmlProperty(localName = "CCheckCodeSY")
+        private String CCheckCodeSY;
+
+        /**
+         * 广东交管平台车辆校验码
+         * 广东车辆校验接口返回的车辆校验码,广东上平台产品必传
+         */
+        @JacksonXmlProperty(localName = "CvhlCheckCode")
+        private String CvhlCheckCode;
+
+        /**
+         * 广东交管平台整备质量
+         * 广东车辆查询接口返回的整备质量,广东上平台产品必传
+         */
+        @JacksonXmlProperty(localName = "WholeWeight")
+        private String WholeWeight;
+
+        /**
+         * 四川车辆信息校验码
+         * 四川车辆信息一致性校验接口返回,接口暂时关闭,为以后预留
+         */
+        @JacksonXmlProperty(localName = "Cjym")
+        private String Cjym;
+
+        /**
+         * 交强转保校验码图片串
+         * 为转保业务时,该节点和校验问题节点,必有一个不为空
+         */
+        @JacksonXmlProperty(localName = "CCheckCodeJQ")
+        private String CCheckCodeJQ;
+
+        /**
+         * 投保类型
+         */
+        @JacksonXmlProperty(localName = "AppType")
+        private String AppType;
+
+        /**
+         * 发证日期
+         */
+        @JacksonXmlProperty(localName = "CertDate")
+        private String CertDate;
+
+        /**
+         * 平台车型代码
+         */
+        @JacksonXmlProperty(localName = "PlatformVehicleModel")
+        private String PlatformVehicleModel;
+
+        /**
+         * 能源类型
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "FuelType")
+        private String FuelType;
+
+        /**
+         * 车价浮动比例
+         * 计算返回
+         */
+        @JacksonXmlProperty(localName = "VhlPriceRate")
+        private String VhlPriceRate;
+
+        /**
+         * 纯电续航里程(公里)
+         */
+        @JacksonXmlProperty(localName = "NPureRange")
+        private String NPureRange;
+
+        /**
+         * 其他燃料(能源)种类描述
+         * 当“能源类型”为“9-其他”时,“其他燃料(能源)种类描述”字段必传。
+         */
+        @JacksonXmlProperty(localName = "COtherEnergyTypeDesc")
+        private String COtherEnergyTypeDesc;
+
+        /**
+         * UBI数据采集
+         * 客户是否同意进行UBI数据核心业务代码表:1.1.27
+         */
+        @JacksonXmlProperty(localName = "CChdUbiData")
+        private String CChdUbiData;
+
+        /**
+         * 睿控评分
+         */
+        @JacksonXmlProperty(localName = "CRkScore")
+        private String CRkScore;
+
+    }
+
+
+    @JacksonXmlProperty(localName = "CarModel")
+    private CarModelResponse CarModel;
+
+    @Data
+    public static class CarModelResponse {
+
+
+        /**
+         * 行业车型编码
+         */
+        @JacksonXmlProperty(localName = "CModelCode")
+        private String CModelCode;
+
+        /**
+         * 车型识别编码
+         */
+        @JacksonXmlProperty(localName = "CModelIDCode")
+        private String CModelIDCode;
+
+        /**
+         * 厂商名称
+         */
+        @JacksonXmlProperty(localName = "CTradeName")
+        private String CTradeName;
+
+        /**
+         * 厂商编码
+         */
+        @JacksonXmlProperty(localName = "CTradeCode")
+        private String CTradeCode;
+
+        /**
+         * 品牌名称
+         */
+        @JacksonXmlProperty(localName = "CBrand")
+        private String CBrand;
+
+        /**
+         * 品牌编码
+         */
+        @JacksonXmlProperty(localName = "CBrandCode")
+        private String CBrandCode;
+
+        /**
+         * 车系名称
+         */
+        @JacksonXmlProperty(localName = "CSeries")
+        private String CSeries;
+
+        /**
+         * 车系编码
+         */
+        @JacksonXmlProperty(localName = "CSeriesCode")
+        private String CSeriesCode;
+
+        /**
+         * 车款名称
+         */
+        @JacksonXmlProperty(localName = "CCarName")
+        private String CCarName;
+
+        /**
+         * 公告型号
+         */
+        @JacksonXmlProperty(localName = "CNoticeType")
+        private String CNoticeType;
+
+        /**
+         * 配置款型编码
+         */
+        @JacksonXmlProperty(localName = "CConfigType")
+        private String CConfigType;
+
+        /**
+         * 类别名称
+         */
+        @JacksonXmlProperty(localName = "CCategoryName")
+        private String CCategoryName;
+
+        /**
+         * 类别编码
+         */
+        @JacksonXmlProperty(localName = "CCategoryCode")
+        private String CCategoryCode;
+
+        /**
+         * 系别名称
+         */
+        @JacksonXmlProperty(localName = "CDeptName")
+        private String CDeptName;
+
+        /**
+         * 系别名称编码
+         */
+        @JacksonXmlProperty(localName = "CDeptCode")
+        private String CDeptCode;
+
+
+    }
+
+    @JacksonXmlProperty(localName = "Vhlowner")
+    private VhlownerResponse Vhlowner;
+
+    @Data
+    public static class VhlownerResponse {
+
+
+        /**
+         * 车主名称
+         */
+        @JacksonXmlProperty(localName = "COwnerNme")
+        private String COwnerNme;
+
+        /**
+         * 车主出生日期
+         * YYYY-MM-DD车主类型个人时必传
+         */
+        @JacksonXmlProperty(localName = "TBirthday")
+        private String TBirthday;
+
+        /**
+         * 车主性别
+         * 车主类型个人时必传
+         */
+        @JacksonXmlProperty(localName = "CSex")
+        private String CSex;
+
+        /**
+         * 车主类型
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "COwnerCls")
+        private String COwnerCls;
+
+        /**
+         * 车主证件号码
+         */
+        @JacksonXmlProperty(localName = "DrvOwnerCertiCode")
+        private String DrvOwnerCertiCode;
+
+        /**
+         * 车主证件类型
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "DrvOwnerCeritType")
+        private String DrvOwnerCeritType;
+
+        /**
+         * 车主国家/地区
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CAreaCde")
+        private String CAreaCde;
+
+        /**
+         * 车主移动电话
+         */
+        @JacksonXmlProperty(localName = "CMobile")
+        private String CMobile;
+
+        /**
+         * 车主所在省
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CProvince")
+        private String CProvince;
+
+        /**
+         * 车主所在市
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CCity")
+        private String CCity;
+
+        /**
+         * 车主所在县
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CCounty")
+        private String CCounty;
+
+        /**
+         * 单位性质
+         */
+        @JacksonXmlProperty(localName = "CWorkdptKind")
+        private String CWorkdptKind;
+
+
+    }
+
+
+    @JacksonXmlProperty(localName = "CvrgListSY")
+    private CvrgListSYResponse CvrgListSY;
+
+    @Data
+    public static class CvrgListSYResponse {
+
+
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "cvrgSY")
+        private List<CvrgSY> cvrgSY;
+
+        @Data
+        public static class CvrgSY {
+
+            /**
+             * 险种代码
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CCvrgNo")
+            private String CCvrgNo;
+
+            /**
+             * 单位保额
+             */
+            @JacksonXmlProperty(localName = "NPerAmt")
+            private String NPerAmt;
+
+            /**
+             * 单位(责任天数/人数/服务次数)
+             * 1,当险别为【030151修理期间费用补偿险】时,该字段表征为【天数】;2,当险别为【030102机动车车上人员责任保险(乘客)】时,该字段表征为投保该险别的乘客数。3,当险别为【030211,030212,030213,030214】时,该字段表征为投保该险别的服务次数。备注:投保以上险别时该字段必传且不能为0。其他险别不传。
+             */
+            @JacksonXmlProperty(localName = "NLiabDaysLmt")
+            private String NLiabDaysLmt;
+
+            /**
+             * 车损免赔额
+             * 当险别为【030006或者030020机动车损失保险】时,该字段必传。参见代码
+             */
+            @JacksonXmlProperty(localName = "CResvTxt2")
+            private String CResvTxt2;
+
+            /**
+             * 应缴保费(元)
+             */
+            @JacksonXmlProperty(localName = "NPrm")
+            private String NPrm;
+
+            /**
+             * 基本保费(元)
+             */
+            @JacksonXmlProperty(localName = "NBasePrm")
+            private String NBasePrm;
+
+            /**
+             * 折前保费(元)
+             * 保单投保的输入参数
+             */
+            @JacksonXmlProperty(localName = "NBefPrm")
+            private String NBefPrm;
+
+            /**
+             * 折前年标准保费
+             * 保单投保的输入参数
+             */
+            @JacksonXmlProperty(localName = "NBefAnnPrm")
+            private String NBefAnnPrm;
+
+            /**
+             * 折后年标准保费
+             * 保单投保的输入参数
+             */
+            @JacksonXmlProperty(localName = "NCalcAnnPrm")
+            private String NCalcAnnPrm;
+
+            /**
+             * 原始应缴保费
+             * 保单投保的输入参数
+             */
+            @JacksonXmlProperty(localName = "NOriginalPremium")
+            private String NOriginalPremium;
+
+            /**
+             * 纯风险保费
+             * 目前只有车损返回
+             */
+            @JacksonXmlProperty(localName = "NPureRiskPremiun")
+            private String NPureRiskPremiun;
+
+            /**
+             * 纯风险保费标志
+             * 纯风险保费标志(新增)
+             */
+            @JacksonXmlProperty(localName = "CPureRiskPremiumFlag")
+            private String CPureRiskPremiumFlag;
+
+            /**
+             * 险别成本保费
+             * 自动报价返回
+             */
+            @JacksonXmlProperty(localName = "NResvNum2")
+            private String NResvNum2;
+
+            /**
+             * 费率
+             */
+            @JacksonXmlProperty(localName = "NRate")
+            private String NRate;
+
+            /**
+             * 税款金额
+             */
+            @JacksonXmlProperty(localName = "NAppTaxAmt")
+            private String NAppTaxAmt;
+
+            /**
+             * 税率
+             */
+            @JacksonXmlProperty(localName = "NCvrgTaxRate")
+            private String NCvrgTaxRate;
+
+            /**
+             * 不含税保费
+             */
+            @JacksonXmlProperty(localName = "NBefTaxPrm")
+            private String NBefTaxPrm;
+
+            /**
+             * 免税标志
+             * 0:免税,1:应税
+             */
+            @JacksonXmlProperty(localName = "CTaxFree")
+            private String CTaxFree;
+
+            /**
+             * 金额/比例最小值
+             */
+            @JacksonXmlProperty(localName = "NMinAmount")
+            private String NMinAmount;
+
+            /**
+             * 金额/比例最大值
+             */
+            @JacksonXmlProperty(localName = "NMaxAmount")
+            private String NMaxAmount;
+
+            /**
+             * 是否必保
+             * 返回格式0第一位主险投保情况:0 可保;1 必保险别信息不为空时候,必须传
+             */
+            @JacksonXmlProperty(localName = "CIsMust")
+            private String CIsMust;
+
+            /**
+             * 绝对免赔率
+             * 若险种代码“030213,030214,030215,030216”,则校验“绝对免赔率”必传;“绝对免赔率”取值范围为5%、10%、15%、20%。 “绝对免赔率”取值标准:绝对免赔率为 10%,应传送0.1。
+             */
+            @JacksonXmlProperty(localName = "CResvTxt4")
+            private String CResvTxt4;
+
+        }
+
+
+    }
+
+    @JacksonXmlProperty(localName = "PrmCoef")
+    private PrmCoefResponse PrmCoef;
+
+    @Data
+    public static class PrmCoefResponse {
+
+        /**
+         * 无赔款优待系数
+         */
+        @JacksonXmlProperty(localName = "NAgoClmRecQuick")
+        private String NAgoClmRecQuick;
+
+        /**
+         * 交通违法
+         */
+        @JacksonXmlProperty(localName = "NPeccancyAdjustValue(商业)")
+        private String NPeccancyAdjustValue;
+
+        /**
+         * 无赔优浮动原因代码
+         * 无赔优浮动原因代码
+         */
+        @JacksonXmlProperty(localName = "CClaimAdjustReason(商业)")
+        private String CClaimAdjustReason;
+
+        /**
+         * 自主核保系数
+         * 默认为1
+         */
+        @JacksonXmlProperty(localName = "NAutonomyAdjust")
+        private String NAutonomyAdjust;
+
+        /**
+         * 自主渠道系数
+         * 默认为1
+         */
+        @JacksonXmlProperty(localName = "NChannelAdjust")
+        private String NChannelAdjust;
+
+        /**
+         * 无赔优不浮动原因代码
+         * 无赔优不浮动原因代码
+         */
+        @JacksonXmlProperty(localName = "CNoClaimAdjustReason")
+        private String CNoClaimAdjustReason;
+
+        /**
+         * 交通违法浮动原因
+         */
+        @JacksonXmlProperty(localName = "CTraSafFloRate(商业)")
+        private String CTraSafFloRate;
+
+        /**
+         * 成本折扣
+         */
+        @JacksonXmlProperty(localName = "NResvNum3")
+        private String NResvNum3;
+
+        /**
+         * 建议折扣
+         */
+        @JacksonXmlProperty(localName = "NResvNum5")
+        private String NResvNum5;
+
+        /**
+         * 总体折扣
+         */
+        @JacksonXmlProperty(localName = "NTotDisc")
+        private String NTotDisc;
+
+        /**
+         * 附加费用率
+         */
+        @JacksonXmlProperty(localName = "NAdditionalCostRate")
+        private String NAdditionalCostRate;
+
+        /**
+         * 绝对免赔额费率折扣系数
+         * 车损险有绝对免赔额时返回
+         */
+        @JacksonXmlProperty(localName = "NabsoDedu")
+        private String NabsoDedu;
+
+        /**
+         * 微营销费折联动建议折扣
+         * 仅微营销使用
+         */
+        @JacksonXmlProperty(localName = "NWeDiscount")
+        private String NWeDiscount;
+
+        /**
+         * 核保折扣
+         */
+        @JacksonXmlProperty(localName = "NUwdisc")
+        private String NUwdisc;
+
+        /**
+         * 投保组合
+         */
+        @JacksonXmlProperty(localName = "CInsuranceGroup")
+        private String CInsuranceGroup;
+
+        /**
+         * 连续承保年数
+         */
+        @JacksonXmlProperty(localName = "NInsureYears")
+        private String NInsureYears;
+
+        /**
+         * 连续承保期间出险次数
+         */
+        @JacksonXmlProperty(localName = "NClaimTimes")
+        private String NClaimTimes;
+
+        /**
+         * 无赔优系数级别
+         */
+        @JacksonXmlProperty(localName = "CClaimAdjustLevel")
+        private String CClaimAdjustLevel;
+
+        /**
+         * 自主定价系数
+         */
+        @JacksonXmlProperty(localName = "NPricingAdjustValue")
+        private String NPricingAdjustValue;
+
+    }
+
+    @JacksonXmlProperty(localName = "FeeListSY")
+    private FeeListSYResponse FeeListSY;
+
+    @Data
+    public static class FeeListSYResponse {
+
+
+        //    @JsonProperty("FeeSY")
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "feeSY")
+        private List<FeeSY> feeSY;
+
+
+        @Data
+        public static class FeeSY {
+
+
+            /**
+             * 申请单号
+             */
+            @JacksonXmlProperty(localName = "CAppNo")
+            private String CAppNo;
+
+            /**
+             * 费用类型
+             */
+            @JacksonXmlProperty(localName = "CFeetypCde")
+            private String CFeetypCde;
+
+            /**
+             * 费用比例
+             */
+            @JacksonXmlProperty(localName = "NFeeProp")
+            private String NFeeProp;
+
+            /**
+             * 费用
+             */
+            @JacksonXmlProperty(localName = "NFee")
+            private String NFee;
+
+            /**
+             * 实收保费
+             */
+            @JacksonXmlProperty(localName = "NGotPrm")
+            private String NGotPrm;
+
+            /**
+             * 业务类型
+             */
+            @JacksonXmlProperty(localName = "CSellfeeBusicls")
+            private String CSellfeeBusicls;
+
+        }
+
+
+    }
+
+
+    @JacksonXmlProperty(localName = "CvrgListJQ")
+    private CvrgListJQResponse CvrgListJQ;
+
+    @Data
+    public static class CvrgListJQResponse {
+
+
+        //    @JsonProperty("cvrgJQ")
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "cvrgJQ")
+        private List<CvrgJQ> cvrgJQ;
+
+
+        @Data
+        public static class CvrgJQ {
+
+
+            /**
+             * 序号
+             */
+            @JacksonXmlProperty(localName = "CoverageSeq")
+            private String CoverageSeq;
+
+            /**
+             * 险别代码
+             */
+            @JacksonXmlProperty(localName = "CoverageCode")
+            private String CoverageCode;
+
+            /**
+             * 赔偿限额(元)
+             */
+            @JacksonXmlProperty(localName = "CoverageAmount")
+            private String CoverageAmount;
+
+            /**
+             * 保障天数/人数
+             */
+            @JacksonXmlProperty(localName = "CoverageNumber")
+            private String CoverageNumber;
+
+            /**
+             * 费率(‰)
+             */
+            @JacksonXmlProperty(localName = "CoverageRate")
+            private String CoverageRate;
+
+            /**
+             * 应缴保费(元)
+             */
+            @JacksonXmlProperty(localName = "CoveragePremium")
+            private String CoveragePremium;
+
+            /**
+             * 基本保费(元)
+             */
+            @JacksonXmlProperty(localName = "BasicPremium")
+            private String BasicPremium;
+
+            /**
+             * 折前保费(元)
+             */
+            @JacksonXmlProperty(localName = "BeforeDiscountPremium")
+            private String BeforeDiscountPremium;
+
+            /**
+             * 折前年标准保费
+             */
+            @JacksonXmlProperty(localName = "BeforeDiscountYearPremium")
+            private String BeforeDiscountYearPremium;
+
+            /**
+             * 折后年标准保费
+             */
+            @JacksonXmlProperty(localName = "AfterDiscountYearPremium")
+            private String AfterDiscountYearPremium;
+
+            /**
+             * 原始应缴保费
+             */
+            @JacksonXmlProperty(localName = "OriginalPremium")
+            private String OriginalPremium;
+
+            /**
+             * 税款金额
+             */
+            @JacksonXmlProperty(localName = "AppTaxAmt")
+            private String AppTaxAmt;
+
+            /**
+             * 税率
+             */
+            @JacksonXmlProperty(localName = "CvrgTaxRate")
+            private String CvrgTaxRate;
+
+            /**
+             * 不含税保费
+             */
+            @JacksonXmlProperty(localName = "BefTaxPrm")
+            private String BefTaxPrm;
+
+            /**
+             * 免税标志
+             * 0:免税,1:应税
+             */
+            @JacksonXmlProperty(localName = "TaxFree")
+            private String TaxFree;
+
+            /**
+             * 金额/比例最小值
+             */
+            @JacksonXmlProperty(localName = "MinAmount")
+            private String MinAmount;
+
+            /**
+             * 金额/比例最大值
+             */
+            @JacksonXmlProperty(localName = "MaxAmount")
+            private String MaxAmount;
+
+
+        }
+
+
+    }
+
+    @JacksonXmlProperty(localName = "Tax")
+    private TaxResponse Tax;
+
+    @Data
+    public static class TaxResponse {
+
+
+        /**
+         * 收费方式
+         */
+        @JacksonXmlProperty(localName = "taxCurrentType")
+        private String taxCurrentType;
+        /**
+         * 滞纳金
+         * 平台返回
+         */
+        @JacksonXmlProperty(localName = "lateFee")
+        private String lateFee;
+        /**
+         * 当年应缴
+         * 平台返回
+         */
+        @JacksonXmlProperty(localName = "currentTax")
+        private String currentTax;
+        /**
+         * 上年应缴
+         * 平台返回
+         */
+        @JacksonXmlProperty(localName = "formerTax")
+        private String formerTax;
+        /**
+         * 合计应缴
+         * 平台返回
+         */
+        @JacksonXmlProperty(localName = "sumUpTax")
+        private String sumUpTax;
+        /**
+         * 车辆类型
+         */
+        @JacksonXmlProperty(localName = "vehicleCategory")
+        private String vehicleCategory;
+        /**
+         * 纳税人名称
+         */
+        @JacksonXmlProperty(localName = "taxPayerName")
+        private String taxPayerName;
+        /**
+         * 补交上年
+         */
+        @JacksonXmlProperty(localName = "payLastYear")
+        private String payLastYear;
+        /**
+         * 当年缴税起期
+         */
+        @JacksonXmlProperty(localName = "taxBeginDateCurrentYear")
+        private String taxBeginDateCurrentYear;
+        /**
+         * 证照类型
+         */
+        @JacksonXmlProperty(localName = "idType")
+        private String idType;
+        /**
+         * 上年计算类型
+         */
+        @JacksonXmlProperty(localName = "calculatedTypeLastYear")
+        private String calculatedTypeLastYear;
+        /**
+         * 当年缴税止期
+         */
+        @JacksonXmlProperty(localName = "taxEndDateCurrentYear")
+        private String taxEndDateCurrentYear;
+        /**
+         * 计算类型
+         * 年缴:001
+         */
+        @JacksonXmlProperty(localName = "calculatedType")
+        private String calculatedType;
+        /**
+         * 车辆细分
+         */
+        @JacksonXmlProperty(localName = "vehecleTypeDetail")
+        private String vehecleTypeDetail;
+        /**
+         * 上年缴税止期
+         */
+        @JacksonXmlProperty(localName = "taxEndDateLastYear")
+        private String taxEndDateLastYear;
+        /**
+         * 牌照类型
+         */
+        @JacksonXmlProperty(localName = "licenceType")
+        private String licenceType;
+        /**
+         * 整备质量
+         */
+        @JacksonXmlProperty(localName = "vehicleQuality")
+        private String vehicleQuality;
+        /**
+         * 上年缴税起期
+         */
+        @JacksonXmlProperty(localName = "taxBeginDateLastYear")
+        private String taxBeginDateLastYear;
+        /**
+         * 纳税人识别号
+         */
+        @JacksonXmlProperty(localName = "taxpayerNo")
+        private String taxpayerNo;
+        /**
+         * 缴税日期
+         */
+        @JacksonXmlProperty(localName = "taxPaidDate")
+        private String taxPaidDate;
+        /**
+         * 上次缴税年度
+         */
+        @JacksonXmlProperty(localName = "lastPaidYear")
+        private String lastPaidYear;
+        /**
+         * 税款所属期
+         */
+        @JacksonXmlProperty(localName = "taxPeriod")
+        private String taxPeriod;
+        /**
+         * 座落区县
+         */
+        @JacksonXmlProperty(localName = "positionCode")
+        private String positionCode;
+        /**
+         * 上年保险起期
+         */
+        @JacksonXmlProperty(localName = "startDateLastYear")
+        private String startDateLastYear;
+        /**
+         * 上年保险止期
+         */
+        @JacksonXmlProperty(localName = "endDateLastYear")
+        private String endDateLastYear;
+        /**
+         * 完税凭证字轨号
+         */
+        @JacksonXmlProperty(localName = "payEvidenceNo")
+        private String payEvidenceNo;
+        /**
+         * 税务机关名称
+         */
+        @JacksonXmlProperty(localName = "taxDepartmentName")
+        private String taxDepartmentName;
+        /**
+         * 税票号码类型
+         */
+        @JacksonXmlProperty(localName = "taxBillType")
+        private String taxBillType;
+        /**
+         * 完税凭证号
+         */
+        @JacksonXmlProperty(localName = "payNo")
+        private String payNo;
+        /**
+         * 减税凭证号
+         */
+        @JacksonXmlProperty(localName = "reduceNo")
+        private String reduceNo;
+        /**
+         * 开具税务机关
+         */
+        @JacksonXmlProperty(localName = "department")
+        private String department;
+        /**
+         * 未税单号
+         */
+        @JacksonXmlProperty(localName = "untaxedPolicyNo")
+        private String untaxedPolicyNo;
+        /**
+         * 上年应缴现值
+         */
+        @JacksonXmlProperty(localName = "payValueLastYear")
+        private String payValueLastYear;
+        /**
+         * 使用状态
+         */
+        @JacksonXmlProperty(localName = "useStatus")
+        private String useStatus;
+        /**
+         * 免征税额
+         */
+        @JacksonXmlProperty(localName = "taxFreeAmount")
+        private String taxFreeAmount;
+        /**
+         * 计税标准
+         */
+        @JacksonXmlProperty(localName = "TaxStandard")
+        private String TaxStandard;
+        /**
+         * 纳税人地址
+         */
+        @JacksonXmlProperty(localName = "TaxpayerAddress")
+        private String TaxpayerAddress;
+        /**
+         * 微机编码
+         */
+        @JacksonXmlProperty(localName = "PcCode")
+        private String PcCode;
+        /**
+         * 税票号
+         */
+        @JacksonXmlProperty(localName = "TaxBillingNo")
+        private String TaxBillingNo;
+        /**
+         * 车辆分类
+         */
+        @JacksonXmlProperty(localName = "VehicleType")
+        private String VehicleType;
+        /**
+         * 滞纳金现值
+         */
+        @JacksonXmlProperty(localName = "LateFeeValue")
+        private String LateFeeValue;
+        /**
+         * 合计车船税现值
+         */
+        @JacksonXmlProperty(localName = "TotalTaxValue")
+        private String TotalTaxValue;
+        /**
+         * 邮政编码
+         */
+        @JacksonXmlProperty(localName = "Zip")
+        private String Zip;
+        /**
+         * 当年应缴变化
+         */
+        @JacksonXmlProperty(localName = "PayChange")
+        private String PayChange;
+        /**
+         * 纳税人类别
+         */
+        @JacksonXmlProperty(localName = "TaxpayerType")
+        private String TaxpayerType;
+        /**
+         * 是否退保车船税
+         */
+        @JacksonXmlProperty(localName = "ReturnTaxFlag")
+        private String ReturnTaxFlag;
+        /**
+         * 票证类型
+         */
+        @JacksonXmlProperty(localName = "TicketType")
+        private String TicketType;
+        /**
+         * 居住地址
+         */
+        @JacksonXmlProperty(localName = "Address")
+        private String Address;
+        /**
+         * 纳税人国籍
+         */
+        @JacksonXmlProperty(localName = "Conruty")
+        private String Conruty;
+        /**
+         * 纳税人电话
+         */
+        @JacksonXmlProperty(localName = "Tel")
+        private String Tel;
+        /**
+         * 滞纳金变化
+         */
+        @JacksonXmlProperty(localName = "LateFeeChange")
+        private String LateFeeChange;
+        /**
+         * 车牌号
+         */
+        @JacksonXmlProperty(localName = "VehicleNo")
+        private String VehicleNo;
+        /**
+         * 上年承保公司
+         */
+        @JacksonXmlProperty(localName = "LastCompany")
+        private String LastCompany;
+        /**
+         * 行驶证车辆类型
+         * 上海地区用户选择,默认100
+         */
+        @JacksonXmlProperty(localName = "PoCategory")
+        private String PoCategory;
+        /**
+         * 当年应缴现值
+         */
+        @JacksonXmlProperty(localName = "PayValueCurrent")
+        private String PayValueCurrent;
+        /**
+         * 上年应缴变化
+         */
+        @JacksonXmlProperty(localName = "PayChangeLastYear")
+        private String PayChangeLastYear;
+        /**
+         * 合计车船税变化
+         */
+        @JacksonXmlProperty(localName = "TotalChange")
+        private String TotalChange;
+        /**
+         * 备注
+         */
+        @JacksonXmlProperty(localName = "Remark")
+        private String Remark;
+        /**
+         * 纳税地区代码
+         */
+        @JacksonXmlProperty(localName = "LocationCode")
+        private String LocationCode;
+        /**
+         * 计税单位代码
+         */
+        @JacksonXmlProperty(localName = "UnittypeCde")
+        private String UnittypeCde;
+        /**
+         * 单位计税金额
+         */
+        @JacksonXmlProperty(localName = "UnitRate")
+        private String UnitRate;
+        /**
+         * 当期年单位税额
+         */
+        @JacksonXmlProperty(localName = "AnnualTaxamt")
+        private String AnnualTaxamt;
+        /**
+         * 车船税申报状态
+         */
+        @JacksonXmlProperty(localName = "DecStatus")
+        private String DecStatus;
+        /**
+         * 算税标识
+         */
+        @JacksonXmlProperty(localName = "CalcFlag")
+        private String CalcFlag;
+        /**
+         * 车船税打印码
+         * (暂重庆用)
+         */
+        @JacksonXmlProperty(localName = "TaxPrintNo")
+        private String TaxPrintNo;
+        /**
+         * 申报日期
+         */
+        @JacksonXmlProperty(localName = "DeclareDate")
+        private String DeclareDate;
+        /**
+         * 纳税人编码
+         * (暂重庆用)
+         */
+        @JacksonXmlProperty(localName = "TaxerCode")
+        private String TaxerCode;
+        /**
+         * 排气量
+         * (暂重庆用)
+         */
+        @JacksonXmlProperty(localName = "Exhaust")
+        private String Exhaust;
+        /**
+         * 减免方案
+         * 平台返回
+         */
+        @JacksonXmlProperty(localName = "TaxReduceType")
+        private String TaxReduceType;
+        /**
+         * 减免原因
+         * 平台返回
+         */
+        @JacksonXmlProperty(localName = "TaxReduceRsn")
+        private String TaxReduceRsn;
+        /**
+         * 减免比例
+         * 平台返回
+         */
+        @JacksonXmlProperty(localName = "TaxReduceProp")
+        private String TaxReduceProp;
+        /**
+         * 完税凭证填发日期
+         */
+        @JacksonXmlProperty(localName = "TaxDocumentDate")
+        private String TaxDocumentDate;
+        /**
+         * 开具完税凭证地区代码
+         */
+        @JacksonXmlProperty(localName = "TaxPaidAreaCode")
+        private String TaxPaidAreaCode;
+
+
+    }
+
+
+    @JacksonXmlProperty(localName = "Agent")
+    private AgentResponse Agent;
+
+    @Data
+    public static class AgentResponse {
+
+
+        /**
+         * 渠道编码
+         * 同Base下” 代理人/经纪人”或“代理人”
+         */
+        @JacksonXmlProperty(localName = "AgentCode")
+        private String AgentCode;
+
+        /**
+         * 协议编码
+         * 代理经纪业务必传同Base下” 代理协议号”或“代理/合作协议”
+         */
+        @JacksonXmlProperty(localName = "ConferCode")
+        private String ConferCode;
+
+        /**
+         * 渠道分类
+         * 同Base下“新销售渠道”
+         */
+        @JacksonXmlProperty(localName = "AgentType")
+        private String AgentType;
+
+        /**
+         * 渠道大类
+         * 可为空
+         */
+        @JacksonXmlProperty(localName = "AgentCategory")
+        private String AgentCategory;
+
+        /**
+         * 手续费比例
+         * 同Base下“手续费比例”
+         */
+        @JacksonXmlProperty(localName = "CommissionProprortion")
+        private String CommissionProprortion;
+
+        /**
+         * 渠道人员职业证号
+         * 同Base下“代理职业证号”
+         */
+        @JacksonXmlProperty(localName = "AgentProfId")
+        private String AgentProfId;
+
+        /**
+         * 渠道人员名称
+         * 同Base下“中介机构销售人员名称”
+         */
+        @JacksonXmlProperty(localName = "AgentStaffNme")
+        private String AgentStaffNme;
+
+        /**
+         * 代理人名称
+         */
+        @JacksonXmlProperty(localName = "AgentNme")
+        private String AgentNme;
+
+        /**
+         * 销售渠道名称
+         */
+        @JacksonXmlProperty(localName = "AgentSaleNme")
+        private String AgentSaleNme;
+
+        /**
+         * 渠道大类名称
+         */
+        @JacksonXmlProperty(localName = "AgentCategoryNme")
+        private String AgentCategoryNme;
+
+        /**
+         * 专业渠道类型
+         */
+        @JacksonXmlProperty(localName = "AgentMajorType")
+        private String AgentMajorType;
+
+        /**
+         * 客户性质
+         * 代码表1.1.63
+         */
+        @JacksonXmlProperty(localName = "CustNature")
+        private String CustNature;
+
+        /**
+         * 协议序号
+         * 代理经纪业务必传
+         */
+        @JacksonXmlProperty(localName = "SubCoNo")
+        private String SubCoNo;
+
+        /**
+         * 代理人资格证号
+         */
+        @JacksonXmlProperty(localName = "QlftNo")
+        private String QlftNo;
+
+        /**
+         * 业务合作来源
+         */
+        @JacksonXmlProperty(localName = "FromCde")
+        private String FromCde;
+
+        /**
+         * 企业代码
+         */
+        @JacksonXmlProperty(localName = "EnterpriseCde")
+        private String EnterpriseCde;
+
+        /**
+         * 企业名称
+         */
+        @JacksonXmlProperty(localName = "EnterpriseNme")
+        private String EnterpriseNme;
+
+        /**
+         * 企业分级
+         */
+        @JacksonXmlProperty(localName = "EnterpriseLvl")
+        private String EnterpriseLvl;
+
+        /**
+         * 客户分级
+         */
+        @JacksonXmlProperty(localName = "CusLvl")
+        private String CusLvl;
+
+        /**
+         * 企业类别
+         */
+        @JacksonXmlProperty(localName = "EnterpriseClass")
+        private String EnterpriseClass;
+
+        /**
+         * 配套服务提供商
+         */
+        @JacksonXmlProperty(localName = "SupportServiceProvider")
+        private String SupportServiceProvider;
+
+        /**
+         * 配套服务套餐
+         */
+        @JacksonXmlProperty(localName = "SupportServicePacket")
+        private String SupportServicePacket;
+
+        /**
+         * 业务类型
+         */
+        @JacksonXmlProperty(localName = "AgentStockMrk")
+        private String AgentStockMrk;
+
+        /**
+         * 银行编码
+         */
+        @JacksonXmlProperty(localName = "AgentBankType")
+        private String AgentBankType;
+
+        /**
+         * 业务员岗位代码
+         */
+        @JacksonXmlProperty(localName = "DutyCde")
+        private String DutyCde;
+
+        /**
+         * 业务员岗位名称
+         */
+        @JacksonXmlProperty(localName = "DutyCnm")
+        private String DutyCnm;
+
+        /**
+         * 股东业务类型
+         */
+        @JacksonXmlProperty(localName = "AgentStockType")
+        private String AgentStockType;
+
+        /**
+         * 自拓比例
+         */
+        @JacksonXmlProperty(localName = "ExtProp")
+        private String ExtProp;
+
+        /**
+         * 自拓保费
+         */
+        @JacksonXmlProperty(localName = "ExtPrm")
+        private String ExtPrm;
+
+        /**
+         * 防灾防损费比例
+         */
+        @JacksonXmlProperty(localName = "PreventRate")
+        private String PreventRate;
+
+        /**
+         * 培训费比例
+         */
+        @JacksonXmlProperty(localName = "TrainRate")
+        private String TrainRate;
+
+
+    }
+
+
+    @JacksonXmlProperty(localName = "VehicleAdjust")
+    private VehicleAdjustResponse VehicleAdjust;
+
+    @Data
+    public static class VehicleAdjustResponse {
+
+
+        /**
+         * 与道路交通事故相联系的浮动比率
+         * 核心计算返回
+         */
+        @JacksonXmlProperty(localName = "RoadAccidentFloatingRate")
+        private String RoadAccidentFloatingRate;
+
+        /**
+         * 酒后驾驶违法行为费率浮动比例
+         */
+        @JacksonXmlProperty(localName = "DrunkDrivingFloatingRate")
+        private String DrunkDrivingFloatingRate;
+
+        /**
+         * 上一个年度每次违反道路交通信号灯
+         */
+        @JacksonXmlProperty(localName = "VoilateRoadSignLastYear")
+        private String VoilateRoadSignLastYear;
+
+        /**
+         * 上一个年度发生驾驶与准驾车型不符的
+         */
+        @JacksonXmlProperty(localName = "TypeMismatchLastYear")
+        private String TypeMismatchLastYear;
+
+        /**
+         * 上一个年度发生饮酒(含醉酒)后驾驶机动车的
+         */
+        @JacksonXmlProperty(localName = "DrunkDrivingLastYear")
+        private String DrunkDrivingLastYear;
+
+        /**
+         * 上年度发生各类道路交通违法行为五次(含)以上的
+         */
+        @JacksonXmlProperty(localName = "OverCommitmentLastYear")
+        private String OverCommitmentLastYear;
+
+        /**
+         * 跨省首年投保未出险证明的年数
+         */
+        @JacksonXmlProperty(localName = "OtherFirstNoProveYear")
+        private String OtherFirstNoProveYear;
+
+        /**
+         * 与道路交通安全违法行为相联系的浮动M
+         */
+        @JacksonXmlProperty(localName = "RelatedOffensesFloating")
+        private String RelatedOffensesFloating;
+
+        /**
+         * 总体浮动系数
+         */
+        @JacksonXmlProperty(localName = "OverallFloatingCoefficient")
+        private String OverallFloatingCoefficient;
+
+        /**
+         * 已处理饮酒驾驶违法行为次数
+         */
+        @JacksonXmlProperty(localName = "DrinkDrivingDealTime")
+        private String DrinkDrivingDealTime;
+
+        /**
+         * 未处理饮酒驾驶违法行为次数
+         */
+        @JacksonXmlProperty(localName = "DrinkDrivingNonDealTime")
+        private String DrinkDrivingNonDealTime;
+
+        /**
+         * 已处理醉酒驾驶违法行为次数
+         */
+        @JacksonXmlProperty(localName = "DrunkDrivingDealTime")
+        private String DrunkDrivingDealTime;
+
+        /**
+         * 未处理醉酒驾驶违法行为次数
+         */
+        @JacksonXmlProperty(localName = "DrunkDrivingNonDealTime")
+        private String DrunkDrivingNonDealTime;
+
+        /**
+         * 饮酒驾驶违法行为次数
+         */
+        @JacksonXmlProperty(localName = "DrinkDrivingTime")
+        private String DrinkDrivingTime;
+
+        /**
+         * 醉酒驾驶违法行为次数
+         */
+        @JacksonXmlProperty(localName = "DrunkDrivingTime")
+        private String DrunkDrivingTime;
+
+        /**
+         * 二级机构
+         */
+        @JacksonXmlProperty(localName = "SecondaryOrganization")
+        private String SecondaryOrganization;
+
+        /**
+         * 上一保险年度道路交通安全违章行为记录浮动比例
+         */
+        @JacksonXmlProperty(localName = "RoadViolatFloatingRate")
+        private String RoadViolatFloatingRate;
+
+        /**
+         * 上一保险年度有责交通故事或有责任赔款记录浮动比例
+         */
+        @JacksonXmlProperty(localName = "DutyReparFloatingRate")
+        private String DutyReparFloatingRate;
+
+        /**
+         * 与道路交通事故相联系的浮动比率(%)
+         * 核心计算返回
+         */
+        @JacksonXmlProperty(localName = "RoadAccidentFloatingRateValue")
+        private String RoadAccidentFloatingRateValue;
+
+        /**
+         * 车船税减免系数
+         * 核心计算返回
+         */
+        @JacksonXmlProperty(localName = "TaxDiscount")
+        private String TaxDiscount;
+
+        /**
+         * 建议折扣
+         * 计算返回
+         */
+        @JacksonXmlProperty(localName = "RecDiscount")
+        private String RecDiscount;
+
+        /**
+         * 交强险过往出险记录
+         */
+        @JacksonXmlProperty(localName = "JQRecordDanger")
+        private String JQRecordDanger;
+
+        /**
+         * 交强险不浮动原因
+         */
+        @JacksonXmlProperty(localName = "RateFloatFlag")
+        private String RateFloatFlag;
+
+        /**
+         * 投保组合
+         */
+        @JacksonXmlProperty(localName = "CInsuranceGroup")
+        private String CInsuranceGroup;
+
+
+    }
+
+
+    @JacksonXmlProperty(localName = "FeeListJQ")
+    private FeeListJQResponse FeeListJQ;
+
+    @Data
+    public static class FeeListJQResponse {
+
+
+        //    @JsonProperty("FeeJQ")
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "feeJQ")
+        private List<FeeJQ> FeeJQ;
+
+
+        @Data
+        public static class FeeJQ {
+
+            /**
+             * 申请单号
+             */
+            @JacksonXmlProperty(localName = "CAppNo")
+            private String CAppNo;
+
+            /**
+             * 费用类型
+             */
+            @JacksonXmlProperty(localName = "CFeetypCde")
+            private String CFeetypCde;
+
+            /**
+             * 费用比例
+             */
+            @JacksonXmlProperty(localName = "NFeeProp")
+            private String NFeeProp;
+
+            /**
+             * 费用
+             */
+            @JacksonXmlProperty(localName = "NFee")
+            private String NFee;
+
+            /**
+             * 实收保费
+             */
+            @JacksonXmlProperty(localName = "NGotPrm")
+            private String NGotPrm;
+
+            /**
+             * 业务类型
+             */
+            @JacksonXmlProperty(localName = "CSellfeeBusicls")
+            private String CSellfeeBusicls;
+
+        }
+
+
+    }
+
+
+    @JacksonXmlProperty(localName = "VhlDrvList")
+    private VhlDrvListResponse VhlDrvList;
+
+    @Data
+    public static class VhlDrvListResponse {
+
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(localName = "VlhDrv")
+        private List<VlhDrv> VlhDrv;
+
+
+        @Data
+        public static class VlhDrv {
+            /**
+             * 驾驶人序号
+             */
+            @JacksonXmlProperty(localName = "NSeqNo")
+            private String NSeqNo;
+
+            /**
+             * 驾驶人名称
+             */
+            @JacksonXmlProperty(localName = "CDrvNme")
+            private String CDrvNme;
+
+            /**
+             * 性别
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CGendorCde")
+            private String CGendorCde;
+
+            /**
+             * 证件类型
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CResvTxt4")
+            private String CResvTxt4;
+
+            /**
+             * 驾驶证号码
+             */
+            @JacksonXmlProperty(localName = "CDrvLcnNo")
+            private String CDrvLcnNo;
+
+            /**
+             * 驾龄
+             */
+            @JacksonXmlProperty(localName = "NDriverAge")
+            private String NDriverAge;
+
+            /**
+             * 年龄
+             */
+            @JacksonXmlProperty(localName = "NAge")
+            private String NAge;
+
+            /**
+             * 婚姻状况
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CMariSts")
+            private String CMariSts;
+
+            /**
+             * 发照日期
+             * YYYY-MM-DD交强险无
+             */
+            @JacksonXmlProperty(localName = "TLicenseDate")
+            private String TLicenseDate;
+
+            /**
+             * 准架车型
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CAllowedVhlTyp")
+            private String CAllowedVhlTyp;
+
+            /**
+             * 主副驾驶员标记
+             * 代码表
+             */
+            @JacksonXmlProperty(localName = "CMainDrvMrk")
+            private String CMainDrvMrk;
+
+            /**
+             * 驾驶证状态
+             */
+            @JacksonXmlProperty(localName = "CLicenseStatusCode")
+            private String CLicenseStatusCode;
+        }
+
+
+    }
+
+
+    @JacksonXmlProperty(localName = "Applicant")
+    private ApplicantResponse Applicant;
+
+    @Data
+    public static class ApplicantResponse {
+
+
+        /**
+         * 投保人姓名
+         */
+        @JacksonXmlProperty(localName = "CAppNme")
+        private String CAppNme;
+
+        /**
+         * 投保人地址
+         */
+        @JacksonXmlProperty(localName = "CClntAddr")
+        private String CClntAddr;
+
+        /**
+         * 投保人客户分类
+         */
+        @JacksonXmlProperty(localName = "CClntMrk")
+        private String CClntMrk;
+
+        /**
+         * 投保人证件类型
+         */
+        @JacksonXmlProperty(localName = "CCertfCls")
+        private String CCertfCls;
+
+        /**
+         * 投保人证件号
+         */
+        @JacksonXmlProperty(localName = "CCertfCde")
+        private String CCertfCde;
+
+        /**
+         * 投保人出生日期
+         */
+        @JacksonXmlProperty(localName = "TBirthday")
+        private String TBirthday;
+
+        /**
+         * 投保人性别
+         */
+        @JacksonXmlProperty(localName = "CSex")
+        private String CSex;
+
+        /**
+         * 投保人固定电话
+         */
+        @JacksonXmlProperty(localName = "CTel")
+        private String CTel;
+
+        /**
+         * 投保人手机号码
+         */
+        @JacksonXmlProperty(localName = "CMobile")
+        private String CMobile;
+
+        /**
+         * 投保人邮编
+         */
+        @JacksonXmlProperty(localName = "CZipCde")
+        private String CZipCde;
+
+        /**
+         * 投保人Email
+         * 投保电子保单必传
+         */
+        @JacksonXmlProperty(localName = "CEmail")
+        private String CEmail;
+
+        /**
+         * 投保人QQ/微信号
+         */
+        @JacksonXmlProperty(localName = "CAppClntQQ")
+        private String CAppClntQQ;
+
+        /**
+         * 投保人证件/学校名称
+         */
+        @JacksonXmlProperty(localName = "CAppSchoolName")
+        private String CAppSchoolName;
+
+        /**
+         * 投保人编码
+         */
+        @JacksonXmlProperty(localName = "CAppCde")
+        private String CAppCde;
+
+        /**
+         * 投保人联系人
+         * 中文且≤5个字
+         */
+        @JacksonXmlProperty(localName = "CCntrNme")
+        private String CCntrNme;
+
+        /**
+         * 证件有效止期
+         * 必传字段若长期证件则为:9999-12-31
+         */
+        @JacksonXmlProperty(localName = "TCertfClsValiDate")
+        private String TCertfClsValiDate;
+
+        /**
+         * 企业经办人姓名
+         * 企业经办人信息,上海机构专用,当投,被保人客户分类都为法人(0)时,必传。
+         */
+        @JacksonXmlProperty(localName = "OperatorName")
+        private String OperatorName;
+
+        /**
+         * 企业业务经办人类别
+         * 企业经办人信息,上海机构专用,当投,被保人客户分类都为法人(0)时,必传。代码表1.1.144
+         */
+        @JacksonXmlProperty(localName = "OperatorType")
+        private String OperatorType;
+
+        /**
+         * 企业业务经办人证件类型
+         * 企业经办人信息,上海机构专用,当投,被保人客户分类都为法人(0)时,必传。代码表1.1.72.1
+         */
+        @JacksonXmlProperty(localName = "OpCeritType")
+        private String OpCeritType;
+
+        /**
+         * 企业业务经办人证件号码
+         * 企业经办人信息,上海机构专用,当投,被保人客户分类都为法人(0)时,必传。
+         */
+        @JacksonXmlProperty(localName = "OpCeritCde")
+        private String OpCeritCde;
+
+        /**
+         * 企业业务经办人联系电话
+         * 企业经办人信息,上海机构专用,当投,被保人客户分类都为法人(0)时,必传。11位有效手机号码
+         */
+        @JacksonXmlProperty(localName = "OperatorPhoneNo")
+        private String OperatorPhoneNo;
+
+        /**
+         * 企业业务经办人邮箱
+         * 企业经办人信息,上海机构专用,当投,被保人客户分类都为法人(0)时,必传。
+         */
+        @JacksonXmlProperty(localName = "OperatorEmail")
+        private String OperatorEmail;
+
+        /**
+         * 投保手机持有人名称
+         * 上海机构专用,当投保人填写的联系方式非本人实名认证的手机号码时,填写其相应的手机实际持有人姓名
+         */
+        @JacksonXmlProperty(localName = "AppMobHolderName")
+        private String AppMobHolderName;
+
+        /**
+         * 投保手机实际持有证件类型
+         * 上海机构专用,代码表(1.1.72),投保手机实际持有人证件类型只能为“身份证”
+         */
+        @JacksonXmlProperty(localName = "AppMobHolderType")
+        private String AppMobHolderType;
+
+        /**
+         * 投保手机持有人证件号码
+         * 上海机构专用,当投保人填写的联系方式非本人实名认证的手机号码时,填写其相应的手机实际持有人证件号码
+         */
+        @JacksonXmlProperty(localName = "AppMobHolderCode")
+        private String AppMobHolderCode;
+
+        /**
+         * 经办手机实际持有人名称
+         * 上海机构专用,只有填写了企业经办人信息,且经办人手机号码非本人实名认证的手机号,才传值该信息,
+         */
+        @JacksonXmlProperty(localName = "OperMobHolderName")
+        private String OperMobHolderName;
+
+        /**
+         * 经办手机实际持有人证件类型
+         * 上海机构专用,代码表(1.1.72),企业经办人人手机实际持有人证件类型只能为“身份证”
+         */
+        @JacksonXmlProperty(localName = "OperMobHolderType")
+        private String OperMobHolderType;
+
+        /**
+         * 经办手机实际持有人证件号码
+         * 上海机构专用,只有填写了企业经办人信息,当企业经办人填写的手机号码非本人实名认证的手机号码时,填写其相应的手机实际持有人证件号码
+         */
+        @JacksonXmlProperty(localName = "OperMobHolderCode")
+        private String OperMobHolderCode;
+
+        /**
+         * 与被保人关系
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CRelCde")
+        private String CRelCde;
+
+        /**
+         * 职业
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CResvTxt5")
+        private String CResvTxt5;
+
+        /**
+         * 单位性质
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CWorkDpt")
+        private String CWorkDpt;
+
+        /**
+         * 民族
+         * 民族
+         */
+        @JacksonXmlProperty(localName = "CNation")
+        private String CNation;
+
+        /**
+         * 颁发机构
+         * 颁发机构
+         */
+        @JacksonXmlProperty(localName = "CIssuedAt")
+        private String CIssuedAt;
+
+        /**
+         * 有效起期
+         * YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "TEffectedDate")
+        private String TEffectedDate;
+
+        /**
+         * 行业
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CTrdCde")
+        private String CTrdCde;
+
+        /**
+         * 经营范围
+         * 法人场景
+         */
+        @JacksonXmlProperty(localName = "COccupation")
+        private String COccupation;
+
+        /**
+         * 注册资本金
+         * 单位万元/法人场景
+         */
+        @JacksonXmlProperty(localName = "NResvNum3")
+        private String NResvNum3;
+
+        /**
+         * 所在省
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CProvince")
+        private String CProvince;
+
+        /**
+         * 所在市
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CCity")
+        private String CCity;
+
+        /**
+         * 所在县
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CCounty")
+        private String CCounty;
+
+        /**
+         * 注册资本金币种
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "NResvNum3Cur")
+        private String NResvNum3Cur;
+
+        /**
+         * 国家/地区
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CAreaCde")
+        private String CAreaCde;
+
+        /**
+         * 团车标志
+         */
+        @JacksonXmlProperty(localName = "CMassCarMrk")
+        private String CMassCarMrk;
+
+        /**
+         * 投保人反洗钱客户风险等级
+         * 风险等级(1-低,2-较低,3-中,4-较高,5-高)
+         */
+        @JacksonXmlProperty(localName = "CAppCustRiskRank")
+        private String CAppCustRiskRank;
+
+        /**
+         * 投保人反洗钱风险高或较高的原因
+         * 反洗钱风险等级较高或者高时返回(需要弹出提示)
+         */
+        @JacksonXmlProperty(localName = "CAppHighRiskReason")
+        private String CAppHighRiskReason;
+
+
+    }
+
+
+
+    @JacksonXmlProperty(localName = "Insured")
+    private InsuredResponse Insured;
+
+    @Data
+    public static class InsuredResponse {
+
+
+        /**
+         * 被保人姓名
+         */
+        @JacksonXmlProperty(localName = "CInsuredNme")
+        private String CInsuredNme;
+
+        /**
+         * 被保人地址
+         */
+        @JacksonXmlProperty(localName = "CClntAddr")
+        private String CClntAddr;
+
+        /**
+         * 被保人客户分类
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CClntMrk")
+        private String CClntMrk;
+
+        /**
+         * 被保人证件类型
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CCertfCls")
+        private String CCertfCls;
+
+        /**
+         * 被保人证件号
+         */
+        @JacksonXmlProperty(localName = "CCertfCde")
+        private String CCertfCde;
+
+        /**
+         * 被保人出生日期
+         * YYYY-MM-DD
+         */
+        @JacksonXmlProperty(localName = "TBirthday")
+        private String TBirthday;
+
+        /**
+         * 被保人性别
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CSex")
+        private String CSex;
+
+        /**
+         * 被保人固定电话
+         */
+        @JacksonXmlProperty(localName = "CTel")
+        private String CTel;
+
+        /**
+         * 被保人手机号码
+         */
+        @JacksonXmlProperty(localName = "CMobile")
+        private String CMobile;
+
+        /**
+         * 被保人邮编
+         */
+        @JacksonXmlProperty(localName = "CZipCde")
+        private String CZipCde;
+
+        /**
+         * 被保人Email
+         * 投保电子保单必传
+         */
+        @JacksonXmlProperty(localName = "CEmail")
+        private String CEmail;
+
+        /**
+         * 被保人QQ/微信号
+         */
+        @JacksonXmlProperty(localName = "CInsuredClntQQ")
+        private String CInsuredClntQQ;
+
+        /**
+         * 被保人证件/学校名称
+         */
+        @JacksonXmlProperty(localName = "CInsuredSchoolName")
+        private String CInsuredSchoolName;
+
+        /**
+         * 被保人编码
+         */
+        @JacksonXmlProperty(localName = "CInsuredCde")
+        private String CInsuredCde;
+
+        /**
+         * 被保人联系人
+         */
+        @JacksonXmlProperty(localName = "CCntrNme")
+        private String CCntrNme;
+
+        /**
+         * 被保人证件类型(法人)
+         */
+        @JacksonXmlProperty(localName = "CInsuredLegalCType")
+        private String CInsuredLegalCType;
+
+        /**
+         * 验证标志
+         * 参见代码
+         */
+        @JacksonXmlProperty(localName = "CMsgFlag")
+        private String CMsgFlag;
+
+        /**
+         * 证件有效止期
+         * 必填字段若长期证件则为:9999-12-31
+         */
+        @JacksonXmlProperty(localName = "TCertfClsValiDate")
+        private String TCertfClsValiDate;
+
+        /**
+         * 被保人手机实际持有人姓名
+         * 上海机构专用,当被保人填写的手机号码非本人实名认证的手机号码时,填写其相应的手机实际持有人姓名
+         */
+        @JacksonXmlProperty(localName = "InMobHolderName")
+        private String InMobHolderName;
+
+        /**
+         * 被保人手机实际持有人证件类型
+         * 上海机构专用,代码表,被保人人手机实际持有人证件类型只能为“身份证”
+         */
+        @JacksonXmlProperty(localName = "InMobHolderType")
+        private String InMobHolderType;
+
+        /**
+         * 被保人手机实际持有人证件号码
+         * 上海机构专用,当被保人填写的手机号码非本人实名认证的手机号码时,填写其相应的手机实际持有人证件号码
+         */
+        @JacksonXmlProperty(localName = "InMobHolderCode")
+        private String InMobHolderCode;
+
+        /**
+         * 单位性质
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CWorkDpt")
+        private String CWorkDpt;
+
+        /**
+         * 民族
+         * 民族
+         */
+        @JacksonXmlProperty(localName = "CNation")
+        private String CNation;
+
+        /**
+         * 颁发机构
+         * 颁发机构
+         */
+        @JacksonXmlProperty(localName = "CIssuedAt")
+        private String CIssuedAt;
+
+        /**
+         * 有效起期
+         * 身份证有效起期
+         */
+        @JacksonXmlProperty(localName = "TEffectedDate")
+        private String TEffectedDate;
+
+        /**
+         * 职业
+         * 职业《公用代码》1.1.148
+         */
+        @JacksonXmlProperty(localName = "CResvTxt5")
+        private String CResvTxt5;
+
+        /**
+         * 与投保人关系
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CRelCdes")
+        private String CRelCdes;
+
+        /**
+         * 国家/地区
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CAreaCde")
+        private String CAreaCde;
+
+        /**
+         * 经营范围
+         * 法人场景
+         */
+        @JacksonXmlProperty(localName = "CWorkCtt")
+        private String CWorkCtt;
+
+        /**
+         * 注册资本金
+         * 万元/法人场景
+         */
+        @JacksonXmlProperty(localName = "NResvNum3")
+        private String NResvNum3;
+
+        /**
+         * 注册资本金币种
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "NResvNum3Cur")
+        private String NResvNum3Cur;
+
+        /**
+         * 所在省
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CProvince")
+        private String CProvince;
+
+        /**
+         * 所在市
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CCity")
+        private String CCity;
+
+        /**
+         * 所在县
+         * 代码表
+         */
+        @JacksonXmlProperty(localName = "CCounty")
+        private String CCounty;
+
+        /**
+         * 被保人反洗钱客户风险等级
+         * 风险等级(1-低,2-较低,3-中,4-较高,5-高)
+         */
+        @JacksonXmlProperty(localName = "CInsuredCustRiskRank")
+        private String CInsuredCustRiskRank;
+
+        /**
+         * 被保人反洗钱风险高或较高的原因
+         * 反洗钱风险等级较高或者高时返回(需要弹出提示,如果被保人信息同投保人信息,则只返回投保人风险原因字段)
+         */
+        @JacksonXmlProperty(localName = "CInsuredHighRiskReason")
+        private String CInsuredHighRiskReason;
+
+
+    }
+
+
+
+    @JacksonXmlProperty(localName = "proposal")
+    private ProposalResponse proposal;
+
+    @Data
+    public static class ProposalResponse {
+
+
+        /**
+         * 保额
+         */
+        @JacksonXmlProperty(localName = "amount")
+        private String amount;
+
+        /**
+         * 保险止期
+         */
+        @JacksonXmlProperty(localName = "endDate")
+        private String endDate;
+
+        /**
+         * 保费
+         */
+        @JacksonXmlProperty(localName = "premium")
+        private String premium;
+
+        /**
+         * 投保单号
+         */
+        @JacksonXmlProperty(localName = "proposalno")
+        private String proposalno;
+
+        /**
+         * 保险起期
+         */
+        @JacksonXmlProperty(localName = "startDate")
+        private String startDate;
+
+    }
+
+    @Data
+    public static class Head {
+        @JacksonXmlProperty(localName = "errorCode")
+        private String errorCode;
+        @JacksonXmlProperty(localName = "errorMessage")
+        private String errorMessage;
+
+    }
+
+}

+ 63 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/response/RecognitionResponse.java

@@ -0,0 +1,63 @@
+package com.jzg.quotation.yongcheng.api.entity.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 验证码识别响应参数
+ */
+@Data
+public class RecognitionResponse implements Serializable {
+
+    private static final long serialVersionUID = 9056060624107609678L;
+
+    /**
+     * 状态码
+     */
+    @JsonProperty("code")
+    private Integer code;
+    /**
+     * 返回信息
+     */
+    @JsonProperty("message")
+    private String message;
+
+    @JsonProperty("url")
+    private String url;
+
+    @JsonProperty("data")
+    private Code data;
+
+    @Setter
+    public static class Code implements Serializable {
+
+        private static final long serialVersionUID = 794225022248404083L;
+        /**
+         * 交强识别返回
+         */
+        @JsonProperty(value = "jqImageCode")
+        private String jqImageCode;
+
+        /**
+         * 商业识别返回
+         */
+        @JsonProperty(value = "syImageCode")
+        private String syImageCode;
+
+
+        public String getJqImageCode() {
+            return jqImageCode;
+        }
+
+        public String getSyImageCode() {
+            return syImageCode;
+        }
+    }
+
+
+}

+ 24 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/vo/TimeEntity.java

@@ -0,0 +1,24 @@
+package com.jzg.quotation.yongcheng.api.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class TimeEntity {
+
+    private String coverageEndDate;
+
+    /**
+     * 开始时间
+     */
+    private String newStartDate;
+
+    /**
+     * 结束时间
+     */
+    private String newEndDate;
+
+}

+ 28 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/AuthorityDataXml.java

@@ -0,0 +1,28 @@
+package com.jzg.quotation.yongcheng.api.properties;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+
+
+/**
+ * @description: 授权参数
+ * @author: lig
+ * @date: 2023年02月03日 0003
+ */
+@Data
+public class AuthorityDataXml {
+
+
+    //用户名   永诚所提供的接口权限账号
+    @JacksonXmlProperty(localName = "userName")
+    @Value("${yc.api.userName}")
+    private String userName;
+
+    //密码    永诚所提供的接口权限密码
+    @Value("${yc.api.password}")
+    @JacksonXmlProperty(localName = "password")
+    private String password;
+
+
+}

+ 75 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/YcApiConfigurationProperties.java

@@ -0,0 +1,75 @@
+package com.jzg.quotation.yongcheng.api.properties;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import com.jzg.quotation.yongcheng.api.entity.request.QuoteRequest;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "yc.api")
+public class YcApiConfigurationProperties implements ConfigureParameters {
+
+    // 回调地址
+    private String payCallBack;
+    // 请求地址
+    private String url;
+
+    //机构代码(dptCde)
+    private String dptCde;
+    //渠道编码(agentCode)
+    private String agentCode;
+    //协议编码(conferCode)
+    private String conferCode;
+    //渠道分类(agentType)
+    private String agentType;
+    //代理人名称(agentNme)
+    private String agentNme;
+    //代理人资格证号(qlftNo)
+    private String qlftNo;
+    //录入人(operatorCode)
+    private String operatorCode;
+    //业务员代码(salesmanNo)
+    private String salesmanNo;
+    //新业务来源(CChaType)
+    private String CChaType;
+    //客户性质(custNature)
+    private String custNature;
+    //操作人员代码(cOprcde)
+    private String cOprcde;
+    //业务来源(cBsnsTyp)
+    private String cBsnsTyp;
+    //用户名
+    private String userName;
+    //密码
+    private String password;
+    //投保联系人  ≤5个字
+    private String cCntrNme;
+
+    public QuoteRequest.Condition.Agent gainAgent() {
+        QuoteRequest.Condition.Agent agent = new QuoteRequest.Condition.Agent();
+        agent.setAgentCode(agentCode);
+        agent.setConferCode(conferCode);
+        agent.setAgentType(agentType);
+        agent.setAgentNme(agentNme);
+        agent.setQlftNo(qlftNo);
+        agent.setCustNature(custNature);
+        agent.setAgentProfId(qlftNo);
+        agent.setSubCoNo(conferCode);
+        return agent;
+    }
+
+    public AuthorityDataXml gainAuthorityDataXml() {
+        AuthorityDataXml authorityDataXml = new AuthorityDataXml();
+        authorityDataXml.setUserName(getUserName());
+        authorityDataXml.setPassword(getPassword());
+        return authorityDataXml;
+    }
+    public AuthorityDataXml gainAuthorityDataXml(YcApiConfigurationProperties ycConfigureParamete) {
+        AuthorityDataXml authorityDataXml = new AuthorityDataXml();
+        authorityDataXml.setUserName(ycConfigureParamete.getUserName());
+        authorityDataXml.setPassword(ycConfigureParamete.getPassword());
+        return authorityDataXml;
+    }
+}

+ 11 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/YongChengApiRequest.java

@@ -0,0 +1,11 @@
+package com.jzg.quotation.yongcheng.api.service;
+
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.service.QuotationBaseService;
+import com.jzg.quotation.yongcheng.api.entity.response.ModelsQueryResponse;
+import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+
+public interface YongChengApiRequest extends QuotationBaseService {
+
+    public ModelsQueryResponse.VehicleInfo gainVehicleModel(YcApiConfigurationProperties ycConfigureParameters, CarInfoVo carInfo);
+}

+ 675 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java

@@ -0,0 +1,675 @@
+package com.jzg.quotation.yongcheng.api.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.entity.vo.PersonAreaVo;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
+import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.entity.vo.quote.AccidentalDrivingVo;
+import com.jzg.quotation.commons.entity.vo.quote.AttributionInformationVo;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quotation.commons.utils.DateTimeUtil;
+import com.jzg.quotation.summary.service.QuoteRuleMappingService;
+import com.jzg.quotation.commons.utils.DuplicateInsuranceUtil;
+import com.jzg.quotation.yongcheng.api.client.SysAreaClient;
+import com.jzg.quotation.yongcheng.api.components.YcRequestApiComponents;
+import com.jzg.quotation.yongcheng.api.constants.Constants;
+import com.jzg.quotation.yongcheng.api.entity.YcBuildData;
+import com.jzg.quotation.yongcheng.api.entity.dto.CarInsDateDto;
+import com.jzg.quotation.yongcheng.api.entity.request.ModelsQueryRequest;
+import com.jzg.quotation.yongcheng.api.entity.request.PriceDiscountRatioRequest;
+import com.jzg.quotation.yongcheng.api.entity.request.QuoteRequest;
+import com.jzg.quotation.yongcheng.api.entity.request.RecognitionRequest;
+import com.jzg.quotation.yongcheng.api.entity.response.ModelsQueryResponse;
+import com.jzg.quotation.yongcheng.api.entity.response.PriceDiscountRatioResponse;
+import com.jzg.quotation.yongcheng.api.entity.response.QuoteResponse;
+import com.jzg.quotation.yongcheng.api.entity.response.RecognitionResponse;
+import com.jzg.quotation.yongcheng.api.entity.vo.TimeEntity;
+import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+import com.jzg.quotation.yongcheng.api.service.YongChengApiRequest;
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class YongChengApiRequestImpl implements YongChengApiRequest {
+
+    @Autowired
+    private YcRequestApiComponents ycRequestApiComponents;
+
+    @Autowired
+    private QuoteRuleMappingService quoteRuleMappingService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private SysAreaClient sysAreaClient;
+
+
+//    private SysAreaService sysAreaService;
+
+
+    /**
+     * 车型获取
+     * @param ycConfigureParameters
+     * @param carInfo
+     * @return
+     */
+    @Override
+    public ModelsQueryResponse.VehicleInfo gainVehicleModel(YcApiConfigurationProperties ycConfigureParameters, CarInfoVo carInfo) {
+
+        ModelsQueryRequest m = new ModelsQueryRequest(carInfo, ycConfigureParameters);
+        ModelsQueryResponse rd;
+
+        try {
+            rd = ycRequestApiComponents.newQueryVehicleTypes(m);
+        } catch (IOException e) {
+            throw new SystemException("车型查询接口异常,请联系管理。");
+        }
+
+        // 使用ModelName 查询车型
+        if (CollUtil.isEmpty(rd.getVehicleInfoList())) {
+            try {
+                m.getRequestLabel().setSearchKeyword(carInfo.getBrandName());
+                rd = ycRequestApiComponents.newQueryVehicleTypes(m);
+            } catch (IOException e) {
+                throw new SystemException("车型查询接口异常,请联系管理。");
+            }
+        }
+
+        if (CollUtil.isEmpty(rd.getVehicleInfoList())) {
+            throw new SystemException("永诚车型库查找失败");
+        }
+
+        //车辆年款不能超过注册日期
+        List<ModelsQueryResponse.VehicleInfo> vehicleInfoList = rd.getVehicleInfoList().stream().filter(a -> DateTimeUtil.dateIsAfter(carInfo.getRegisterDate(), a.getVehicleYear())).sorted(Comparator.comparing(ModelsQueryResponse.VehicleInfo::getVehiclePrice)).collect(Collectors.toList());
+
+        //匹配的车辆信息数据  为空
+        if (CollUtil.isEmpty(vehicleInfoList)) {
+
+            //匹配金额
+            vehicleInfoList = rd.getVehicleInfoList().stream().filter(a -> a.getVehiclePrice().equals(carInfo.getPurchasePrice())).collect(Collectors.toList());
+
+            if (CollUtil.isNotEmpty(vehicleInfoList)) {
+//                buildCarInfo(carInfo, vehicleInfoList.get(0), coreModelsVo);
+                return vehicleInfoList.get(0);
+            }
+
+            //金额升序
+            vehicleInfoList = rd.getVehicleInfoList().stream().sorted(Comparator.comparing(ModelsQueryResponse.VehicleInfo::getVehiclePrice)).collect(Collectors.toList());
+
+//            buildCarInfo(carInfo, vehicleInfoList.get(0), coreModelsVo);
+            return vehicleInfoList.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+        OrderBase order = quoteVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+
+        //1.车型获取
+        YcApiConfigurationProperties configurationProperties = ConfigureParametersConversion.conversionEntity(YcApiConfigurationProperties.class, attributionInformationVo.getConfigInfo());
+        ModelsQueryResponse.VehicleInfo vehicleInfo = gainVehicleModel(configurationProperties, quoteVo.getCarInfoVo());
+
+        //2.协商价折扣比例
+        BigDecimal depreciationPrice = null;
+        try {
+            depreciationPrice = getDepreciationPrice(quoteVo);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+        PriceDiscountRatioRequest priceDiscountRatioRequest = new PriceDiscountRatioRequest(
+                configurationProperties,
+                quoteVo.getCarInfoVo(),
+                quoteVo.getKindInfoVo(),
+                getAttachStartDate(quoteVo));
+        PriceDiscountRatioResponse priceDiscountRatioResponse = ycRequestApiComponents.priceDiscount(priceDiscountRatioRequest);
+        BigDecimal negotiatedPrice = null;
+        try {
+            negotiatedPrice = getNegotiatedPrice(priceDiscountRatioResponse,depreciationPrice);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+        //build参数
+        List<String> requestInfoList = new ArrayList<>();
+        QuoteRequest quoteRequest = this.builderParams(configurationProperties, quoteVo, vehicleInfo, negotiatedPrice.toString());
+        QuoteResponse quoteResponse = this.getResponse(quoteRequest,quoteVo, requestInfoList);
+        return null;
+    }
+
+    private QuoteResponse getResponse(QuoteRequest quoteRequest, QuoteVo quoteVo, List<String> requestInfoList) throws JsonProcessingException {
+        QuoteResponse quoteResponse = ycRequestApiComponents.newPremiumXnyCalculation(quoteRequest);
+        //存储 报价返回的查询码  交强和商业
+        if (quoteResponse.getVhl() != null) {
+            if (quoteResponse.getVhl().getCQryCdeJQ() != null) {
+//                redisTemplate.opsForValue().set(REDIS_YONGCHENG_QUERY_CODE_JQ + yaQuoteInfoVo.getUserId() + yaQuoteInfoVo.getCarInfo().getVinNo() + yaQuoteInfoVo.getCarInfo().getLicenseNo(), rr.getVhl().getCQryCdeJQ(), REDIS_YONGCHENG_QUERY_CODE_EXPIRE, TimeUnit.DAYS);
+            }
+            if (quoteResponse.getVhl().getCQryCdeSY() != null) {
+//                redisTemplate.opsForValue().set(REDIS_YONGCHENG_QUERY_CODE_SY + yaQuoteInfoVo.getUserId() + yaQuoteInfoVo.getCarInfo().getVinNo() + yaQuoteInfoVo.getCarInfo().getLicenseNo(), rr.getVhl().getCQryCdeSY(), REDIS_YONGCHENG_QUERY_CODE_EXPIRE, TimeUnit.DAYS);
+            }
+        }
+
+        //重新设置 请求的查询码
+        //读取缓存的查询码
+        String cQryCdeJQ = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get().toString();
+        String cQryCdeSY = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get().toString();
+        //交强
+        quoteResponse.getVhl().setCCheckCodeJQ("");
+        quoteResponse.getVhl().setCQryCdeJQ(cQryCdeJQ);
+        //商业
+        quoteResponse.getVhl().setCCheckCodeSY("");
+        quoteResponse.getVhl().setCQryCdeSY(cQryCdeSY);
+
+        if ("009999".equals(quoteResponse.getHead().getErrorCode()) &&
+                (quoteResponse.getHead().getErrorMessage().contains("车主") ||
+                        quoteResponse.getHead().getErrorMessage().contains("投保人") ||
+                        quoteResponse.getHead().getErrorMessage().contains("被保人"))) {
+            return quoteResponse;
+        }
+
+
+        String errorMsg = quoteResponse.getHead().getErrorMessage();
+
+
+        if (quoteResponse.getHead().getErrorCode().equals("009999") && errorMsg.contains("重复投保")) {
+            // 商业险
+            boolean appSYFlag = "Y".equals(quoteRequest.getRequestLabel().getCondition().getBase().getAppSYFlag());
+
+            // 交强险
+            boolean cAppJqFlag = "Y".equals(quoteRequest.getRequestLabel().getCondition().getBase().getCAppJqFlag());
+            if (quoteResponse.getVhl() != null) {
+                quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeJQ(quoteResponse.getVhl().getCQryCdeJQ());
+                quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeSY(quoteResponse.getVhl().getCQryCdeSY());
+            } else {
+                quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeJQ("");
+                quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeSY("");
+            }
+
+            //处理返回信息
+            //1、交强险重复投保处理
+            String jq = ciRepetitionInsure(quoteResponse, quoteRequest, requestInfoList, cAppJqFlag);
+            //1、商业险重复投保处理
+            String sy = commerceRepetitionInsure(quoteResponse, quoteRequest, requestInfoList, appSYFlag);
+
+            if (!jq.isEmpty() || !sy.isEmpty()) {
+//                InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 重复投保处理", vinNo);
+//                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+//                        QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+//                sysQuoteRecords.add(sysQuoteRecord);
+//                if(maxQuoteNum <= 0){
+//                    return rr;
+//                }
+                return this.getResponse(quoteRequest,quoteVo, requestInfoList);
+            }
+
+        }
+
+        boolean boo = false;
+
+        //2、转保处理
+        boo = reinsurance(quoteResponse, quoteRequest);
+        if (!boo) {
+//            InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 转保处理", vinNo);
+//            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+//                    QuoteNumberConstant.QuoteAction.TRANSFER_INSRUANCE.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+//            sysQuoteRecords.add(sysQuoteRecord);
+//            if(maxQuoteNum <= 0){
+//                return rr;
+//            }
+            return this.getResponse(quoteRequest,quoteVo, requestInfoList);
+        }
+
+        //3、商业险日期处理
+        boo = biRepetitionInsure(quoteResponse, quoteRequest, requestInfoList);
+        if (!boo) {
+//            InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 商业险日期处理", vinNo);
+//            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+//                    QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+//            sysQuoteRecords.add(sysQuoteRecord);
+//            if(maxQuoteNum <= 0){
+//                return rr;
+//            }
+            return this.getResponse(quoteRequest,quoteVo, requestInfoList);
+        }
+
+        // 转保验证码
+        boo = reinsuranceCodeError(quoteResponse, quoteRequest);
+        if (!boo) {
+//            InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 转保处理", vinNo);
+//            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+//                    QuoteNumberConstant.QuoteAction.TRANSFER_INSRUANCE.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+//            sysQuoteRecords.add(sysQuoteRecord);
+//            if(maxQuoteNum <= 0){
+//                return rr;
+//            }
+            return this.getResponse(quoteRequest,quoteVo, requestInfoList);
+        }
+        return quoteResponse;
+    }
+
+    /**
+     * 转保业务处理
+     * @param quoteResponse
+     * @param quoteRequest
+     * @return
+     */
+    public boolean reinsurance(QuoteResponse quoteResponse, QuoteRequest quoteRequest) {
+
+        if (quoteResponse.getHead().getErrorCode().equals("000000")) {
+            String cCheckCodeJQ = quoteResponse.getVhl().getCCheckCodeJQ();
+            String cCheckCodeSY = quoteResponse.getVhl().getCCheckCodeSY();
+
+            //转保调用自动识别转保码
+            if (StringUtils.isNotEmpty(cCheckCodeJQ) || StringUtils.isNotEmpty(cCheckCodeSY)) {
+//                log.info("永诚API方式 - xml请求 报价,车牌号《{}》 ->   转保业务处理----------------", m.getRequestLabel().getCondition().getVhl().getCPlateNo());
+                //调用python ocr
+                RecognitionRequest recognitionRequest = new RecognitionRequest();
+
+                if (StringUtils.isNotEmpty(cCheckCodeJQ)) {
+                    recognitionRequest.setJgImage(cCheckCodeJQ);
+                }
+
+                if (StringUtils.isNotEmpty(cCheckCodeSY)) {
+                    recognitionRequest.setSyImage(cCheckCodeSY);
+                }
+//                RecognitionResponse recognition = verificationCodeIdentification.recognition(recognitionRequest);
+//                quoteRequest.getRequestLabel().getCondition().getVhl().setCBusType("2");
+//                RecognitionResponse.Code data = recognition.getData();
+//                //交强
+//                if (StringUtils.isNotEmpty(cCheckCodeJQ)) {
+//                    quoteRequest.getRequestLabel().getCondition().getVhl().setCCheckCodeJQ(data.getJqImageCode());
+//                    quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeJQ(quoteResponse.getVhl().getCQryCdeJQ());
+//                }
+//                //商业
+//                if (StringUtils.isNotEmpty(cCheckCodeSY)) {
+//                    quoteRequest.getRequestLabel().getCondition().getVhl().setCCheckCodeSY(data.getSyImageCode());
+//                    quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeSY(quoteResponse.getVhl().getCQryCdeSY());
+//                }
+                return false;
+
+            }
+        }
+        return true;
+
+    }
+
+
+    /**
+     * 报价  商业险 重复 投保业务处理
+     */
+    public boolean biRepetitionInsure(QuoteResponse quoteResponse, QuoteRequest quoteRequest, List<String> requestInfoList) {
+
+        if (quoteResponse.getHead().getErrorCode().equals("000000") && null != quoteResponse.getTfiWarnList() && CollUtil.isNotEmpty(quoteResponse.getTfiWarnList().getTfiWarnData())) {
+
+            QuoteResponse.TfiWarnListResponse.TfiWarnData tfiWarnData = quoteResponse.getTfiWarnList().getTfiWarnData().stream().filter(Objects::nonNull).filter(item -> StringUtils.isNotEmpty(item.getWarnMessage())).filter(item -> item.getWarnMessage().contains("终保日期")).findFirst().orElse(null);
+
+            if (null == tfiWarnData)
+            {
+                return true;
+            }
+
+            //截取0 到 机动车交通事故强制险
+            String ciMsg = tfiWarnData.getWarnMessage();
+            requestInfoList.add(ciMsg);
+            if (ciMsg.contains("终保日期: 以上为所有结果信息")) {
+                throw new SystemException("商业险平台返回:" + ciMsg);
+            }
+
+            //终保日期
+            TimeEntity timeEntity = getRepeatStartEndTime(ciMsg, Constants.SY_REGEX, "");
+
+            if (StringUtils.isEmpty(timeEntity.getCoverageEndDate())) {
+                throw new SystemException(ciMsg);
+            }
+
+            System.err.println("商业新起:" + timeEntity.getNewStartDate());
+            System.err.println("商业新止:" + timeEntity.getNewEndDate());
+
+            quoteRequest.getRequestLabel().getCondition().getBase().setTInsrncBgnTmSY(timeEntity.getNewStartDate());
+            quoteRequest.getRequestLabel().getCondition().getBase().setTInsrncEndTmSY(timeEntity.getNewEndDate());
+
+            //转保信息清空  重新报价
+            quoteRequest.getRequestLabel().getCondition().getVhl().setCBusType("0");
+
+            return false;
+        }
+        return true;
+    }
+
+
+    /**
+     * 报价  转保校验码有误
+     */
+    public boolean reinsuranceCodeError(QuoteResponse quoteResponse, QuoteRequest quoteRequest) {
+
+        if (quoteResponse.getHead().getErrorMessage().contains("录入的校验码有误")) {
+            //转保信息清空  重新报价
+            quoteRequest.getRequestLabel().getCondition().getVhl().setCBusType("0");
+            quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeJQ("");
+            quoteRequest.getRequestLabel().getCondition().getVhl().setCQryCdeSY("");
+            quoteRequest.getRequestLabel().getCondition().getVhl().setCCheckCodeJQ("");
+            quoteRequest.getRequestLabel().getCondition().getVhl().setCCheckCodeSY("");
+            return false;
+        }
+        return true;
+
+    }
+
+    public String ciRepetitionInsure(QuoteResponse quoteResponse, QuoteRequest quoteRequest, List<String> requestInfoList, boolean cAppJqFlag) {
+        String errorMsg = quoteResponse.getHead().getErrorMessage();
+
+        if (cAppJqFlag) {
+            requestInfoList.add(errorMsg);
+//            log.info("永诚API方式 - xml请求 ------------报价 ->   交强重复投保----------------");
+
+            TimeEntity timeEntity = getRepeatStartEndTime(errorMsg, Constants.JQ_REGEX, Constants.JQ_RULE);
+
+            if (StringUtils.isEmpty(timeEntity.getCoverageEndDate())) {
+                //重试第二种过户 及时起保的错误
+                TimeEntity repeatStartEndTime = getRepeatStartEndTime(errorMsg, Constants.JQ_GUOHU_AND_JISHI_REGEX, "");
+                if(StringUtils.isEmpty(repeatStartEndTime.getCoverageEndDate())) {
+                    return "";
+                }else{
+                    //如果是及时起保的则 终保日期 + 1天
+                    // 定义时间格式
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    // 解析原始时间
+                    LocalDateTime dateTime = LocalDateTime.parse(repeatStartEndTime.getCoverageEndDate(), formatter);
+                    LocalDateTime tomorrowMidnight = dateTime;
+                    //判断是否是整点  如果是整点则不进行明天的零点操作
+                    if(dateTime.getHour() != 0 || dateTime.getMinute() != 0 || dateTime.getSecond() != 0)
+                    {
+                        tomorrowMidnight = dateTime.toLocalDate().plusDays(1).atStartOfDay();
+                    }
+
+                    timeEntity.setCoverageEndDate(tomorrowMidnight.format(formatter));
+                    LocalDateTime end = tomorrowMidnight.plusYears(1L);
+                    timeEntity.setNewStartDate(DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN));
+                    LocalDateTime localDateTime = end.minusSeconds(1L);
+                    timeEntity.setNewEndDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
+                }
+            }
+
+//            log.error("新起:{}", timeEntity.getNewStartDate());
+//            log.error("新止:{}", timeEntity.getNewEndDate());
+            CarInsDateDto cidd = QuoteRequest.Condition.Base.buildInsDate(timeEntity.getNewStartDate(), timeEntity.getNewEndDate());
+            quoteRequest.getRequestLabel().getCondition().getBase().setTInsrncBgnTmJQ(cidd.getStartDate());
+            quoteRequest.getRequestLabel().getCondition().getBase().setTInsrncEndTmJQ(cidd.getEndDate());
+            quoteRequest.getRequestLabel().getCondition().getBase().setCImmeffMrk(cidd.isForthwith() ? "1" : "0");
+            return timeEntity.getCoverageEndDate();
+        }
+        return "";
+    }
+
+    public String commerceRepetitionInsure(QuoteResponse quoteResponse, QuoteRequest quoteRequest, List<String> requestInfoList, boolean appSYFlag) {
+        String errorMsg = quoteResponse.getHead().getErrorMessage();
+
+        if (appSYFlag) {
+            requestInfoList.add(errorMsg);
+//            log.info("永诚API方式 - xml请求 ------------报价 ->   商业险重复投保----------------");
+            TimeEntity timeEntity = getRepeatStartEndTime(errorMsg, Constants.SY_REGEX, Constants.SY_RULE);
+
+            if (StringUtils.isEmpty(timeEntity.getCoverageEndDate())) {
+                return "";
+            }
+
+//            log.error("商业新起:{}", timeEntity.getNewStartDate());
+//            log.error("商业新止:{}", timeEntity.getNewEndDate());
+
+            quoteRequest.getRequestLabel().getCondition().getBase().setTInsrncBgnTmSY(timeEntity.getNewStartDate());
+            quoteRequest.getRequestLabel().getCondition().getBase().setTInsrncEndTmSY(timeEntity.getNewEndDate());
+            //转保信息清空  重新报价
+            quoteRequest.getRequestLabel().getCondition().getVhl().setCBusType("0");
+            return timeEntity.getCoverageEndDate();
+        }
+        return "";
+    }
+
+    private static TimeEntity getRepeatStartEndTime(String errorMsg, String regex, String rule) {
+        String coverageEndDate = processingTime(errorMsg, regex, rule);
+        TimeEntity timeEntity = new TimeEntity();
+
+        if (coverageEndDate.isEmpty()) {
+            return timeEntity;
+        }
+
+        timeEntity.setCoverageEndDate(coverageEndDate);
+        LocalDateTime start;
+        if (coverageEndDate.contains(Constants.END_TIME)) {
+            start = DateTimeUtil.parseLocalDateTime(coverageEndDate, DateTimeUtil.DATETIME_PATTERN).plusSeconds(1);
+            LocalDateTime end = start.plusYears(1L).minusDays(1L);
+            timeEntity.setNewStartDate(DateTimeUtil.getStartTimeOfDayStr(start, DateTimeUtil.DATETIME_PATTERN));
+            timeEntity.setNewEndDate(DateTimeUtil.getEndTimeOfDayStr(end, DateTimeUtil.DATETIME_PATTERN));
+        } else {
+            start = DateTimeUtil.parseLocalDateTime(coverageEndDate, DateTimeUtil.DATETIME_PATTERN);
+            LocalDateTime end = start.plusYears(1L);
+            timeEntity.setNewStartDate(DateTimeUtil.format(start, DateTimeUtil.DATETIME_PATTERN));
+            LocalDateTime localDateTime = end.minusSeconds(1L);
+            timeEntity.setNewEndDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
+        }
+
+        return timeEntity;
+    }
+
+    private static String processingTime(String errorMsg, String regex, String rule) {
+        String coverageEndDate = DuplicateInsuranceUtil.getEndDate(errorMsg, regex);
+
+        if (coverageEndDate.isEmpty() && errorMsg.contains(rule)) {
+            coverageEndDate = DuplicateInsuranceUtil.getEndDate(errorMsg, Constants.REGEX_ALONE);
+        }
+        return coverageEndDate;
+    }
+
+    private QuoteRequest builderParams(YcApiConfigurationProperties configurationProperties, QuoteVo quoteVo, ModelsQueryResponse.VehicleInfo coreModelsVo, String negotiatedPrice) {
+        // 获取协议配置信息
+//        YcConfigureParameters ycConfigureParameters = gainYcConfigParams(quoteVo.getAgreementId());
+        CarInfoVo carInfo = quoteVo.getCarInfoVo();
+
+        //构造车辆信息
+//        gainVehicleModel(ycConfigureParameters, carInfo, coreModelsVo);
+        List<AccidentalDrivingVo> adVos = quoteVo.getAccidentalDrivings();
+
+        //获取查询码
+        String cQryCdeJQ = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get().toString();
+        String cQryCdeSY = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get().toString();
+
+        //组装参数
+        QuoteRequest m = QuoteRequest.buildQuoteParam(quoteVo, configurationProperties, adVos, cQryCdeJQ, cQryCdeSY,negotiatedPrice);
+        //企业车不构建地区
+        String property = quoteVo.getOwnersInfo().getProperty();
+        if (!"2".equals(property)) {
+            //构造地区
+            buildRegion(m, quoteVo);
+        }else {
+            //车主
+            CustomerInfoVo owner = quoteVo.getOwnersInfo();
+            if (!"0".equals(owner.getProperty())) {
+                PersonAreaVo ownerPersonAreaVo = sysAreaClient.queryByAddress(owner.getAddr(), owner.getIdentifyNumber()).getData();
+                if (!Objects.isNull(ownerPersonAreaVo)) {
+                    m.getRequestLabel().getCondition().getVhlowner().setCProvince(ownerPersonAreaVo.getProvinceCode());
+                    m.getRequestLabel().getCondition().getVhlowner().setCCity(ownerPersonAreaVo.getCityCode());
+                    m.getRequestLabel().getCondition().getVhlowner().setCCounty(ownerPersonAreaVo.getCountyCode());
+                }
+
+            }
+            //投保人
+            CustomerInfoVo applicant = quoteVo.getPolicyHolderInfo();
+            if (!"0".equals(applicant.getProperty())) {
+                PersonAreaVo applicantPersonAreaVo = sysAreaClient.queryByAddress(applicant.getAddr(), applicant.getIdentifyNumber()).getData();
+                if (!Objects.isNull(applicantPersonAreaVo)) {
+                    m.getRequestLabel().getCondition().getApplicant().setCProvince(applicantPersonAreaVo.getProvinceCode());
+                    m.getRequestLabel().getCondition().getApplicant().setCCity(applicantPersonAreaVo.getCityCode());
+                    m.getRequestLabel().getCondition().getApplicant().setCCounty(applicantPersonAreaVo.getCountyCode());
+                }
+
+            }
+            //被保人
+            CustomerInfoVo insured = quoteVo.getInsuredPersonInfo();
+            if (!"0".equals(insured.getProperty())) {
+                PersonAreaVo insuredPersonAreaVo = sysAreaClient.queryByAddress(insured.getAddr(), insured.getIdentifyNumber()).getData();
+                if (!Objects.isNull(insuredPersonAreaVo)) {
+                    m.getRequestLabel().getCondition().getInsured().setCProvince(insuredPersonAreaVo.getProvinceCode());
+                    m.getRequestLabel().getCondition().getInsured().setCCity(insuredPersonAreaVo.getCityCode());
+                    m.getRequestLabel().getCondition().getInsured().setCCounty(insuredPersonAreaVo.getCountyCode());
+                }
+            }
+
+        }
+
+        return m;
+    }
+
+    /**
+     * 构造地区信息
+     * @param quoteRequest
+     * @param quoteVo
+     */
+    private void buildRegion(QuoteRequest quoteRequest, QuoteVo quoteVo) {
+        //车主
+        CustomerInfoVo owner = quoteVo.getOwnersInfo();
+        //被保人
+        CustomerInfoVo insured = quoteVo.getInsuredPersonInfo();
+        //投保人
+        CustomerInfoVo applicant = quoteVo.getPolicyHolderInfo();
+
+        //车主地区信息
+        PersonAreaVo ownerPersonAreaVo = sysAreaClient.queryByAddress(owner.getAddr(), owner.getIdentifyNumber()).getData();
+        PersonAreaVo insuredPersonAreaVo;
+        PersonAreaVo applicantPersonAreaVo;
+
+        //车主是否与投保人相同
+        if (owner.getIdentifyNumber().equals(insured.getIdentifyNumber())) {
+            insuredPersonAreaVo = ownerPersonAreaVo;
+        } else {
+            //投保人地区信息
+            insuredPersonAreaVo = sysAreaClient.queryByAddress(insured.getAddr(), insured.getIdentifyNumber()).getData();
+        }
+
+        //车主是否与被保人相同
+        if (owner.getIdentifyNumber().equals(applicant.getIdentifyNumber())) {
+            applicantPersonAreaVo = ownerPersonAreaVo;
+        } else  //投保人是否与被保人相同
+            if (insured.getIdentifyNumber().equals(applicant.getIdentifyNumber())) {
+                applicantPersonAreaVo = insuredPersonAreaVo;
+            } else {
+                applicantPersonAreaVo = sysAreaClient.queryByAddress(applicant.getAddr(), applicant.getIdentifyNumber()).getData();
+            }
+
+        if (!Objects.isNull(ownerPersonAreaVo)) {
+            quoteVo.getOwnersInfo().setProvinceCode(ownerPersonAreaVo.getProvinceCode());
+            quoteVo.getOwnersInfo().setCityCode(ownerPersonAreaVo.getCityCode());
+            quoteVo.getOwnersInfo().setCountyCode(ownerPersonAreaVo.getCountyCode());
+        }
+
+        if (!Objects.isNull(insuredPersonAreaVo)) {
+            quoteVo.getInsuredPersonInfo().setProvinceCode(insuredPersonAreaVo.getProvinceCode());
+            quoteVo.getInsuredPersonInfo().setCityCode(insuredPersonAreaVo.getCityCode());
+            quoteVo.getInsuredPersonInfo().setCountyCode(insuredPersonAreaVo.getCountyCode());
+        }
+
+        if (!Objects.isNull(applicantPersonAreaVo)) {
+            quoteVo.getPolicyHolderInfo().setProvinceCode(applicantPersonAreaVo.getProvinceCode());
+            quoteVo.getPolicyHolderInfo().setCityCode(applicantPersonAreaVo.getCityCode());
+            quoteVo.getPolicyHolderInfo().setCountyCode(applicantPersonAreaVo.getCountyCode());
+        }
+
+    }
+
+    /**
+     * 获取协商价折扣比例
+     * @param priceDiscountRatioResponse
+     * @param depreciationPrice
+     * @return
+     * @throws ParseException
+     */
+    private BigDecimal getNegotiatedPrice(PriceDiscountRatioResponse priceDiscountRatioResponse,BigDecimal depreciationPrice) throws ParseException {
+        BigDecimal negotiatedPrice = BigDecimal.ZERO; // 协商价
+        if (priceDiscountRatioResponse.getCode().equals("E0000")) {
+            if (priceDiscountRatioResponse.getVal() != null) {
+                // 协商价 = 折旧价 * 返回的协商价浮动比例
+                negotiatedPrice = depreciationPrice.multiply(new BigDecimal(priceDiscountRatioResponse.getVal())) ;
+            }
+        }
+        return negotiatedPrice;
+    }
+
+    /**
+     * 获取起保日期
+     * @param quoteVo
+     * @return
+     */
+    private String getAttachStartDate(QuoteVo quoteVo){
+        String startDate; // 起保日期
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            startDate = quoteVo.getBiRiskInfoVo().getStartDate();
+        } else {
+            startDate = quoteVo.getCiRiskInfoVo().getStartDate();
+        }
+        return startDate;
+    }
+
+    /**
+     * 获取折旧价
+     */
+    private BigDecimal getDepreciationPrice(QuoteVo quoteVo) throws ParseException {
+        String startDate; // 起保日期
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            startDate = quoteVo.getBiRiskInfoVo().getStartDate();
+        } else {
+            startDate = quoteVo.getCiRiskInfoVo().getStartDate();
+        }
+        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date startDateAsDate = inputFormat.parse(startDate);
+        String formattedStartDate = outputFormat.format(startDateAsDate);
+        BigDecimal depreciationPrice = new BigDecimal(YcBuildData.getDefValue(
+                new BigDecimal(quoteVo.getCarInfoVo().getPurchasePrice()),
+                quoteVo.getCarInfoVo().getRegisterDate(), formattedStartDate)); // 折旧价
+        return depreciationPrice;
+    }
+
+    @Override
+    public void underwriting(UnderwritingVo underwritingVo) {
+
+    }
+
+    @Override
+    public String getPaymentLink(OrderBase orderBase) {
+        return null;
+    }
+
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+
+    }
+
+    @Override
+    public void downloadPolicy(OrderBase orderBase) {
+
+    }
+
+    @Override
+    public void queryOrderState(OrderBase orderBase) {
+
+    }
+}

+ 1 - 0
tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java

@@ -18,4 +18,5 @@ public interface EsmInsCompanyClient {
      */
     @GetMapping("/esmInsCompany/findById")
     public HttpResult<EsmInsCompany> findById(@RequestParam String id);
+
 }

+ 4 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/PosterController.java

@@ -44,6 +44,10 @@ public class PosterController {
     @Schema(description = "保存广告位")
     @PostMapping("/save")
     public HttpResult save(@RequestBody PosterAdd  posterAdd) {
+        if(posterService.count() >= 5){
+            List<SysPoster> list = posterService.list(new LambdaQueryWrapper<SysPoster>().orderByAsc(SysPoster::getCreateTime));
+            posterService.removeById(list.get(0).getId());
+        }
         SysPoster sysPoster = BeanUtil.copyProperties(posterAdd, SysPoster.class);
         boolean save = posterService.save(sysPoster);
         if (save && !CollectionUtils.isEmpty(posterAdd.getLevelOrgIds())){

+ 2 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java

@@ -17,4 +17,6 @@ public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
 
     Page<SysUserJzgInfoDto> getUserInfoList(Page page, @Param("sysUserInfoListVo") SysUserInfoListVo sysUserInfoListVo);
 
+    SysUserJzgInfo getUserByMobile(String mobile);
+
 }

+ 2 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysAreaService.java

@@ -2,6 +2,7 @@ package com.jzg.organization.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.entity.po.SysArea;
+import com.jzg.commons.entity.vo.PersonAreaVo;
 import com.jzg.commons.entity.vo.SysAreaVo;
 
 
@@ -40,4 +41,5 @@ public interface SysAreaService extends IService<SysArea> {
     List<SysArea> queryAllByAreaCode(List<String> areaCodes);
 
 
+    PersonAreaVo queryByAddress(String address, String idcard);
 }

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoService.java

@@ -18,4 +18,11 @@ public interface SysUserJzgInfoService extends IService<SysUserJzgInfo> {
 
     SysUserJzgInfo getUserById(String userId);
 
+    /**
+     * 通过手机号获取晋掌柜用户信息
+     * @param mobile
+     * @return
+     */
+    SysUserJzgInfo getUserByMobile(String mobile);
+
 }

+ 2 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/PosterServiceImpl.java

@@ -24,8 +24,8 @@ public class PosterServiceImpl extends ServiceImpl<PosterMapper, SysPoster> impl
     @Override
     public HttpResult queryPage(PosterParam posterParam) {
         QueryWrapper<SysPoster> queryWrapper = new QueryWrapper<>();
-        queryWrapper.like(StringUtils.isNotEmpty(posterParam.getTitle()), "p.title", posterParam.getTitle());
-        queryWrapper.like(StringUtils.isNotEmpty(posterParam.getOrgName()), "orgName", posterParam.getOrgName());
+        queryWrapper.like(StringUtils.isNotEmpty(posterParam.getSearchValue()), "p.title", posterParam.getSearchValue());
+        queryWrapper.like(StringUtils.isNotEmpty(posterParam.getSendDeptId()), "orgName", posterParam.getSendDeptId());
         queryWrapper.eq("p.is_delete", Constants.NOT_DELETED);
         queryWrapper.orderByDesc("p.create_time");
         Page<SysPosterVo> page = baseMapper.queryPage(posterParam.getPage(), queryWrapper);

+ 51 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAreaServiceImpl.java

@@ -3,6 +3,7 @@ package com.jzg.organization.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.entity.po.SysArea;
+import com.jzg.commons.entity.vo.PersonAreaVo;
 import com.jzg.commons.entity.vo.SysAreaVo;
 import com.jzg.organization.mapper.SysAreaMapper;
 import com.jzg.organization.service.SysAreaService;
@@ -56,6 +57,56 @@ public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysArea> impl
         return sysAreas;
     }
 
+    @Override
+    public PersonAreaVo queryByAddress(String address, String idcard) {
+        PersonAreaVo personAreaVo = new PersonAreaVo();
+        //获取县级全部区划数据
+        List<SysArea> sysAreaVos = this.queryByLevel(3);
+        //被保人 赛选出的地址条件
+        List<SysArea> collect = sysAreaVos.stream().filter(item -> address.contains(item.getAreaCname())).toList();
+        //截取身份证的省级代码
+        String provincesCode;
+        provincesCode = idcard.substring(0, 4);
+        //获取省级的区划
+        if (!collect.isEmpty()) {
+            List<SysArea> provincesArea = collect.stream()
+                    .filter(item -> item.getAreaCode().substring(0, 4).equals(provincesCode))
+                     .collect(Collectors.toList());
+
+            //如果查不出来默认使用赛选出的第一个
+            if (provincesArea.isEmpty()) {
+                provincesArea.add(collect.get(0));
+            }
+            List<SysArea> sysAreas = this.queryAllParent(provincesArea.get(0));
+            //如果等于2 说明是直辖市
+            if (sysAreas.size() >= 2) {
+                if (sysAreas.size() == 2) {
+                    personAreaVo.setCountyCode(sysAreas.get(0).getAreaCode());
+                    personAreaVo.setCountyName(sysAreas.get(0).getAreaCname());
+                    personAreaVo.setCityCode(sysAreas.get(0).getAreaCode());
+                    personAreaVo.setCityName(sysAreas.get(0).getAreaCname());
+                    personAreaVo.setProvinceCode(sysAreas.get(1).getAreaCode());
+                    personAreaVo.setProvinceName(sysAreas.get(1).getAreaCname());
+                } else {
+                    personAreaVo.setCountyCode(sysAreas.get(0).getAreaCode());
+                    personAreaVo.setCountyName(sysAreas.get(0).getAreaCname());
+                    personAreaVo.setCityCode(sysAreas.get(1).getAreaCode());
+                    personAreaVo.setCityName(sysAreas.get(1).getAreaCname());
+                    personAreaVo.setProvinceCode(sysAreas.get(2).getAreaCode());
+                    personAreaVo.setProvinceName(sysAreas.get(2).getAreaCname());
+                }
+                return personAreaVo;
+            }
+        }
+        personAreaVo.setProvinceCode(idcard.substring(0, 2) + "0000");
+        personAreaVo.setCityCode(idcard.substring(0, 4) + "00");
+        personAreaVo.setCountyCode(idcard.substring(0, 6));
+
+
+        return personAreaVo;
+    }
+
 }
 
 
+

+ 5 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoServiceImpl.java

@@ -33,4 +33,9 @@ public class SysUserJzgInfoServiceImpl extends ServiceImpl<SysUserJzgInfoMapper,
         return baseMapper.selectOne(new LambdaQueryWrapper<SysUserJzgInfo>()
                 .eq(SysUserJzgInfo::getId, id));
     }
+
+    @Override
+    public SysUserJzgInfo getUserByMobile(String mobile) {
+        return baseMapper.getUserByMobile(mobile);
+    }
 }

+ 8 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java

@@ -11,6 +11,7 @@ import com.jzg.commons.entity.dto.SysUserJzgInfoDto;
 import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.exception.ValidateException;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.commons.util.idgen.IdGenerate;
@@ -253,7 +254,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         SysUser sysUser = baseMapper.getUserByMobile(sysUserVo.getMobile());
         String sysUserJzgInfoId = "",sysUserId = "";
         if (!Objects.isNull(sysUser)) {
-            verifyUser(sysUserVo.getTypeAttr(),sysUserVo.getDeptId(),sysUserVo.getIdentity(),sysUser.getId(),sysUserVo.getLeaderId(),sysUserVo.getReferrerId());
+            verifyUser(sysUserVo.getTypeAttr(),sysUserVo.getDeptId(),sysUserVo.getIdentity(),sysUser.getId(),sysUserVo.getLeaderId(),sysUserVo.getReferrerId(),sysUserVo.getMobile());
             SysUserJzgInfo sysUserJzgInfo = new SysUserJzgInfo();
             BeanUtils.copyProperties(sysUserVo, sysUserJzgInfo);
             sysUserJzgInfo.setUserId(sysUser.getId());
@@ -519,7 +520,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     }
 
 
-    public void verifyUser(String typeAttr,String deptId,String identity,String userId,String leaderId,String referrerId){
+    public void verifyUser(String typeAttr,String deptId,String identity,String userId,String leaderId,String referrerId,String mobile){
         SysDept sysDept = sysDeptService.getById(deptId);
 
         List<SysUserJzgInfo> sysUserJzgInfos  = sysUserJzgInfoService.getUserInfoByIdentity(identity, userId);
@@ -527,6 +528,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 (new LambdaQueryWrapper<SysUserJzgInfo>().eq(SysUserJzgInfo::getId,leaderId).eq(SysUserJzgInfo::getIsDelete,0));
         SysUserJzgInfo sysUserJzgInfoByReferrerId = sysUserJzgInfoService.getOne
                 (new LambdaQueryWrapper<SysUserJzgInfo>().eq(SysUserJzgInfo::getId,referrerId).eq(SysUserJzgInfo::getIsDelete,0));
+        SysUserJzgInfo userByMobile = sysUserJzgInfoService.getUserByMobile(mobile);
+
         if (sysUserJzgInfos.size() > 0) {
             throw new SystemException("该身份证号已存在,请检查");
         }
@@ -541,6 +544,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 throw new SystemException("所选推荐人不存在");
             }
         }
+        if(Objects.nonNull(userByMobile)){
+            throw new ValidateException("手机号已存在无法添加");
+        }
     }
 
     public void saveOrganization(String organizationId, String jzgUserInfoId) {

+ 9 - 0
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -109,4 +109,13 @@
         group by suji.id, soul.organization_id, so.name
         order by suji.create_time desc
     </select>
+
+    <select id="getUserByMobile" resultType="com.jzg.commons.entity.po.SysUserJzgInfo">
+        SELECT
+            *
+        FROM
+            sys_user_jzg_info suji
+                LEFT JOIN sys_user su ON suji.user_id = su.id
+        where su.mobile = #{mobile}
+    </select>
 </mapper>