Bläddra i källkod

Merge branch 'master' into dadi

liub 3 månader sedan
förälder
incheckning
0d5ff12136
100 ändrade filer med 2105 tillägg och 543 borttagningar
  1. 35 0
      commons/src/main/java/com/jzg/commons/config/LocalDateTimeDefiner.java
  2. 10 25
      commons/src/main/java/com/jzg/commons/core/page/HttpResult.java
  3. 4 0
      commons/src/main/java/com/jzg/commons/entity/agreement/po/PtlAgreementAttribution.java
  4. 8 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesAddParam.java
  5. 6 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java
  6. 19 0
      commons/src/main/java/com/jzg/commons/entity/dto/CostCalculateRespVO.java
  7. 3 1
      commons/src/main/java/com/jzg/commons/entity/dto/FeeAuditParam.java
  8. 18 0
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostCopyParam.java
  9. 6 3
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountPageParam.java
  10. 3 3
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountParam.java
  11. 3 1
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoBankCardDto.java
  12. 7 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/ExportSuperviseSettlementExcelDto.java
  13. 6 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/ReceiverSettlementReportDto.java
  14. 27 2
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  15. 13 1
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java
  16. 4 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceLink.java
  17. 12 2
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java
  18. 27 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeOrder.java
  19. 29 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeVO.java
  20. 25 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/AddReceivableVo.java
  21. 26 10
      commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java
  22. 304 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeExportVo.java
  23. 36 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeInvoiceVO.java
  24. 39 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceAndSettlementVo.java
  25. 5 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordQueryVo.java
  26. 17 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java
  27. 1 1
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoicingVo.java
  28. 22 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/PlatformSettlementVo.java
  29. 1 2
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java
  30. 7 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementVo.java
  31. 7 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsFeeAudit.java
  32. 4 2
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrderReadPdf.java
  33. 2 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrders.java
  34. 16 0
      commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java
  35. 6 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRules.java
  36. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRulesAttr.java
  37. 8 3
      commons/src/main/java/com/jzg/commons/entity/po/SysAmountAuditing.java
  38. 3 2
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  39. 4 0
      commons/src/main/java/com/jzg/commons/entity/scheme/po/PtlSchemeInfo.java
  40. 3 0
      commons/src/main/java/com/jzg/commons/entity/scheme/po/PtlSchemeRulesAttrLink.java
  41. 5 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlAgreementInsCompanyVo.java
  42. 35 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeCopyVo.java
  43. 9 0
      commons/src/main/java/com/jzg/commons/entity/vo/AgreementRulesVo.java
  44. 126 0
      commons/src/main/java/com/jzg/commons/util/BigDecimalUtil.java
  45. 1 1
      commons/src/main/java/com/jzg/commons/util/BuildDescUtils.java
  46. 1 0
      gateway/src/main/java/com/jzg/config/CorsConfig.java
  47. 1 1
      partner/src/main/java/com/jzg/utils/DistributionUtils.java
  48. 8 1
      platform/src/main/java/com/jzg/controller/AgreementAttributionController.java
  49. 13 0
      platform/src/main/java/com/jzg/controller/EsmInsCompanyController.java
  50. 10 1
      platform/src/main/java/com/jzg/service/EsmInsCompanyService.java
  51. 8 2
      platform/src/main/java/com/jzg/service/PtlAgreementAttributionService.java
  52. 20 0
      platform/src/main/java/com/jzg/service/impl/EsmInsCompanyServiceImpl.java
  53. 1 1
      platform/src/main/java/com/jzg/service/impl/PtlAgreementAttributionImpl.java
  54. 1 0
      platform/src/main/java/com/jzg/service/impl/PtlInsAttributionTemplateServiceImpl.java
  55. 0 1
      platform/src/main/resources/mapper/PtlAgreementAttributionMapper.xml
  56. 4 4
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerApplyApplicationRequestBuild.java
  57. 66 2
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java
  58. 1 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/constant/enums/RequestUrl.java
  59. 1 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerApplyApplicationRequest.java
  60. 14 17
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java
  61. 2 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerSearchVehicleByVinRequest.java
  62. 8 6
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  63. 1 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/build/BoHaiCrawlerQuoteResultsVoBuild.java
  64. 2 2
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerRequestComponent.java
  65. 7 7
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerQuotationRequest2.java
  66. 31 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust1.java
  67. 4 5
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerQuoteProcessServiceImpl.java
  68. 267 94
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java
  69. 2 2
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/PythonExecutor.java
  70. 3 3
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py
  71. 1 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  72. 5 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/DetectLoginRequest.java
  73. 10 2
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateTimeUtil.java
  74. 13 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java
  75. 6 4
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerGetCarPriceRequest.java
  76. 4 4
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  77. 58 10
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java
  78. 5 7
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  79. 1 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerCacheComponent.java
  80. 10 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/JiaYiXianProduct.java
  81. 3 3
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerQuotedPriceRequestRequest.java
  82. 2 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerGetTokenImpl.java
  83. 4 4
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java
  84. 2 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  85. 3 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java
  86. 47 25
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java
  87. 6 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java
  88. 6 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java
  89. 85 83
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  90. 17 8
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeAuditService.java
  91. 2 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java
  92. 11 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java
  93. 105 59
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  94. 74 31
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java
  95. 39 20
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersQrcodeServiceImpl.java
  96. 86 6
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  97. 5 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/listener/AuditStateListener.java
  98. 0 3
      tenant/insurance/quotation-summary/src/main/resources/application-prod.yaml
  99. 44 29
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml
  100. 20 18
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java

+ 35 - 0
commons/src/main/java/com/jzg/commons/config/LocalDateTimeDefiner.java

@@ -0,0 +1,35 @@
+package com.jzg.commons.config;
+
+import ch.qos.logback.classic.pattern.MessageConverter;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * 利用 SLF4J 的参数格式化机制,自定义一个全局的格式化器
+ *
+ * @author lipf
+ * @date 2026/5/28 14:21
+ */
+@Component
+public class LocalDateTimeDefiner extends MessageConverter {
+    // 定义你想要的统一格式
+    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    @Override
+    public String convert(ILoggingEvent event) {
+        Object[] argArray = event.getArgumentArray();
+        if (argArray != null) {
+            for (int i = 0; i < argArray.length; i++) {
+                // 如果参数是 LocalDateTime 类型,就按指定格式转换
+                if (argArray[i] instanceof LocalDateTime) {
+                    argArray[i] = FORMATTER.format((LocalDateTime) argArray[i]);
+                }
+            }
+        }
+        // 返回原本的日志消息(此时参数数组里的 LocalDateTime 已经被替换为格式化后的字符串)
+        return event.getMessage();
+    }
+}

+ 10 - 25
commons/src/main/java/com/jzg/commons/core/page/HttpResult.java

@@ -2,13 +2,14 @@ package com.jzg.commons.core.page;
 
 
 
+import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 
 /**
  * HTTP结果封装
  */
-
+@Data
 public class HttpResult<T> implements Serializable {
 
     @Serial
@@ -19,6 +20,14 @@ public class HttpResult<T> implements Serializable {
 
     private T data;
 
+    public boolean isSuccess(){
+        return 200 == this.code;
+    }
+
+    public boolean isFail(){
+        return 200 != this.code;
+    }
+
     public static <T> HttpResult<T> error() {
         return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
     }
@@ -74,30 +83,6 @@ public class HttpResult<T> implements Serializable {
         return new HttpResult<>();
     }
 
-    public int getCode() {
-        return code;
-    }
-
-    public void setCode(int code) {
-        this.code = code;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-
-    public T getData() {
-        return data;
-    }
-
-    public void setData(T data) {
-        this.data = data;
-    }
-
     @Override
     public String toString() {
         return "HttpResult{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}';

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/agreement/po/PtlAgreementAttribution.java

@@ -14,6 +14,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
+import java.io.Serial;
+
 /**
  * @author quchen
  * @date 2025/2/18 11:09
@@ -25,6 +27,8 @@ import lombok.NoArgsConstructor;
 @AllArgsConstructor
 @TableName(value = "ptl_agreement_attribution", autoResultMap = true)
 public class PtlAgreementAttribution extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = 772426849982494479L;
     @Schema(description = "id")
     @TableId(value = "id")
     private String id;

+ 8 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesAddParam.java

@@ -7,6 +7,8 @@ import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 
 @Schema(description = "承保规则新增dto")
@@ -17,6 +19,12 @@ public class AgreementRulesAddParam {
     @NotNull(message = "协议id不能为空")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效截止时间")
+    private String endTime;
+
     @Schema(description = "规则属性")
     @NotEmpty(message = "规则属性不能为空")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java

@@ -20,6 +20,12 @@ public class AgreementRulesEditParam {
     @NotNull(message = "协议id不能为空")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效截止时间")
+    private String endTime;
+
     @Schema(description = "规则属性")
     @NotEmpty(message = "规则属性不能为空")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;

+ 19 - 0
commons/src/main/java/com/jzg/commons/entity/dto/CostCalculateRespVO.java

@@ -0,0 +1,19 @@
+package com.jzg.commons.entity.dto;
+
+import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(description = "纯费用计算-出参")
+public class CostCalculateRespVO {
+
+    @Schema(description = "费用订单信息")
+    private InsFeeOrders insFeeOrders;
+
+    @Schema(description = "费用比例信息")
+    private PtlAgreementCostRatioVo costRatio;
+}

+ 3 - 1
commons/src/main/java/com/jzg/commons/entity/dto/FeeAuditParam.java

@@ -3,7 +3,6 @@ package com.jzg.commons.entity.dto;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.PageRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 import java.time.LocalDate;
@@ -109,4 +108,7 @@ public class FeeAuditParam extends PageRequest {
     @Schema(description = "系统code")
     private String systemCode;
 
+    @Schema(description = "订单来源 0 pc  1 app")
+    private String orderSource;
+
 }

+ 18 - 0
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostCopyParam.java

@@ -0,0 +1,18 @@
+package com.jzg.commons.entity.dto;
+
+
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Schema(description = "协议费用复制参数")
+public class PtlAgreementCostCopyParam extends PageRequest {
+
+    @Schema(description = "需要复制的费用id")
+    private String costId;
+
+
+}

+ 6 - 3
commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountPageParam.java

@@ -4,9 +4,12 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.PageRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
-import java.time.LocalDateTime;
+import java.time.LocalDate;
 
+
+@EqualsAndHashCode(callSuper = true)
 @Schema(description = "用户账户分页查询dto")
 @Data
 public class SysUserAccountPageParam extends PageRequest {
@@ -19,9 +22,9 @@ public class SysUserAccountPageParam extends PageRequest {
 
     @Schema(description = "统计日期开始")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDateTime createTimeStart;
+    private LocalDate createTimeStart;
 
     @Schema(description = "统计日期结束")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDateTime createTimeEnd;
+    private LocalDate createTimeEnd;
 }

+ 3 - 3
commons/src/main/java/com/jzg/commons/entity/dto/SysUserAccountParam.java

@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import java.time.LocalDateTime;
+import java.time.LocalDate;
 
 @Schema(description = "应付统计查询dto")
 @Data
@@ -18,10 +18,10 @@ public class SysUserAccountParam {
 
     @Schema(description = "统计日期开始")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDateTime createTimeStart;
+    private LocalDate createTimeStart;
 
     @Schema(description = "统计日期结束")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDateTime createTimeEnd;
+    private LocalDate createTimeEnd;
 
 }

+ 3 - 1
commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoBankCardDto.java

@@ -1,10 +1,10 @@
 package com.jzg.commons.entity.dto;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.jzg.commons.entity.po.SysUserJzgInfoBankCardRecord;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -16,6 +16,8 @@ import java.util.List;
 
 @Data
 public class SysUserJzgInfoBankCardDto implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 7617847507625451617L;
     @Schema(description = "id")
     private String id;
 

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/finance/dto/ExportSuperviseSettlementExcelDto.java

@@ -52,6 +52,10 @@ public class ExportSuperviseSettlementExcelDto {
     @ExcelProperty(value = "实收金额")
     private String actualReceivedAmount;
 
+    @Schema(description = "应收金额")
+    @ExcelProperty(value = "应收金额")
+    private String receivableSupervisePremium;
+
     @Schema(description = "收款日期")
     @ExcelProperty(value = "收款日期")
     private String receivePaymentDate;
@@ -74,4 +78,7 @@ public class ExportSuperviseSettlementExcelDto {
     @Schema(description = "附件url")
     private String fileUrl;
 
+    @Schema(description = "订单号")
+    private String orderNo;
+
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/finance/dto/ReceiverSettlementReportDto.java

@@ -16,6 +16,12 @@ public class ReceiverSettlementReportDto {
     @Schema(description = "保险公司")
     private String companyName;
 
+    @Schema(description = "保险公司id")
+    private String companyId;
+
+    @Schema(description = "保险公司名称及父级的名称")
+    private String companyALlName;
+
     @Schema(description = "应收总计")
     private String totalReceivable;
 

+ 27 - 2
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java

@@ -10,6 +10,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+import java.time.LocalDateTime;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
@@ -50,9 +51,9 @@ public class InsPlyIncome extends BaseModel {
     private String riskCode;
 
     @Schema(description = "签单时间")
-    @TableField(exist = false)
+    //@TableField(exist = false)
     @ExcelProperty("签单时间")
-    private String signingTime;
+    private LocalDateTime signingTime;
 
     @Schema(description = "签单年份")
     @TableField(exist = false)
@@ -206,6 +207,14 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("驾意跟单位是否已经结算")
     private String jyOtherSettlement;
 
+    @Schema(description = "平台协议车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议车险应收是否已经结算")
+    private String platformSuperviseSettlement;
+
+    @Schema(description = "平台协议非车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议非车险应收是否已经结算")
+    private String platformOtherSettlement;
+
     @Schema(description = "维护人工号")
     @ExcelProperty("维护人工号")
     private String leaderId;
@@ -218,6 +227,9 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("对接人")
     private String contactPerson;
 
+    @Schema(description = "对接人手机号")
+    private String contactPersonPhone;
+
     @Schema(description = "系统code")
     @ExcelProperty("系统code")
     private String systemCode;
@@ -231,6 +243,7 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("结算状态(编码)")
     private String settlementStatus="0";
 
+    @TableField(exist = false)
     @Schema(description = "结算状态(转义后)")
     @ExcelProperty("结算状态(转义后)")
     private String settlementStatusName;
@@ -278,4 +291,16 @@ public class InsPlyIncome extends BaseModel {
     @Schema(description = "订单费用表")
     private InsFeeOrders insFeeOrders;
 
+    @TableField(exist = false)
+    @Schema(description = "是否已经开票")
+    private String invoiceStatusName;
+
+    @TableField(exist = false)
+    @Schema(description = "订单关联的发票信息")
+    private String invoiceId;
+
+    @TableField(exist = false)
+    @Schema(description = "地区归属")
+    private String companyNameSimple;
+
 }

+ 13 - 1
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java

@@ -3,11 +3,14 @@ package com.jzg.commons.entity.finance.po;
 import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Objects;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @Schema(description = "财务应收开票表")
 public class InsPlyIncomeInvoice extends BaseModel {
@@ -34,16 +37,25 @@ public class InsPlyIncomeInvoice extends BaseModel {
         return Objects.requireNonNullElse(this.overinflatedAmount, BigDecimal.ZERO);
     }
 
-    @Schema(description = "应收费用")
+    @Schema(description = "应收费用/开票金额")
     private BigDecimal receivableSupervisePremium;
 
     public BigDecimal getReceivableSupervisePremium(){
         return Objects.requireNonNullElse(this.receivableSupervisePremium, BigDecimal.ZERO);
     }
 
+    @Schema(description = "差额原因")
+    private String paymentReason;
+
     @Schema(description = "税点")
     private String taxPoint;
 
+    @Schema(description = "开票号/发票号")
+    private String invoiceNo;
+
+    @Schema(description = "开票时间")
+    private LocalDateTime invoiceTime;
+
     @Schema(description = "状态")
     private String status;
 

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceLink.java

@@ -17,4 +17,8 @@ public class InsPlyIncomeInvoiceLink{
     @Schema(description = "应收表ID")
     private String incomeId;
 
+    // 开票类型 1:手续费 2:跟单费 3:驾意手续费 4::驾意跟单费
+    @Schema(description = "开票类型")
+    private String invoiceType;
+
 }

+ 12 - 2
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java

@@ -8,6 +8,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -23,11 +24,18 @@ public class InsPlyIncomeInvoiceSettlement extends BaseModel {
     private String invoiceId;
 
     @Schema(description = "实收金额")
-    private String actualReceivedAmount;
+    private BigDecimal actualReceivedAmount;
 
     @Schema(description = "收款日期")
     private Date receivePaymentDate;
 
+    @Schema(description = "回款差额")
+    private BigDecimal paymentDifference;
+
+    @Schema(description = "回款原因")
+    private String paymentReason;
+
+
     @TableField(exist = false)
     @Schema(description = "凭证")
     private List<String> voucherList;
@@ -36,11 +44,13 @@ public class InsPlyIncomeInvoiceSettlement extends BaseModel {
 
     }
 
-    public InsPlyIncomeInvoiceSettlement(String invoiceId, String actualReceivedAmount,Date receivePaymentDate){
+    public InsPlyIncomeInvoiceSettlement(String invoiceId, BigDecimal actualReceivedAmount,Date receivePaymentDate,BigDecimal paymentDifference,String paymentReason){
         this.id = IdGenerate.nextId();
         this.invoiceId = invoiceId;
         this.actualReceivedAmount = actualReceivedAmount;
         this.receivePaymentDate = receivePaymentDate;
+        this.paymentDifference = paymentDifference;
+        this.paymentReason = paymentReason;
     }
 
 }

+ 27 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeOrder.java

@@ -0,0 +1,27 @@
+package com.jzg.commons.entity.finance.po;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class InsPlyIncomeOrder implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5155333518962790214L;
+    /**
+     * 序号
+     */
+    private String id;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    public InsPlyIncomeOrder(String id, String orderNo) {
+        this.id = id;
+        this.orderNo = orderNo;
+    }
+}

+ 29 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeVO.java

@@ -0,0 +1,29 @@
+package com.jzg.commons.entity.finance.po;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class InsPlyIncomeVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -3412493517813402683L;
+    private Page insPlyIncomePage;
+
+    /**
+     * 未分页的满足条件的所有数据集的id和订单编号
+     *
+     * @date 2026/5/23 9:50
+     */
+    private List<InsPlyIncomeOrder> insPlyIncomeOrders;
+
+    public InsPlyIncomeVO(Page insPlyIncomePage, List<InsPlyIncomeOrder> insPlyIncomeOrders){
+        this.insPlyIncomePage = insPlyIncomePage;
+        this.insPlyIncomeOrders = insPlyIncomeOrders;
+    }
+
+}

+ 25 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/AddReceivableVo.java

@@ -0,0 +1,25 @@
+package com.jzg.commons.entity.finance.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author tz
+ * @description 应收查询VO
+ * @createDate 2024-06-26 10:49:31
+ */
+@Data
+public class AddReceivableVo {
+
+    @Schema(description = "订单编码")
+    private List<String> orderNo;
+
+    @Schema(description = "查询")
+    private String queryType;
+
+}

+ 26 - 10
commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.finance.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -9,6 +10,7 @@ import java.util.List;
 
 /**
  *  批量修改Vo
+ *
  */
 @Data
 @Schema(description = "批量修改Vo")
@@ -17,24 +19,38 @@ public class BatchModifyVo {
     @Schema(description = "应收订单id")
     private List<String> incomeIds;
 
+    @Schema(description = "车险订单的id")
+    private List<String> orderNos;
+
     @Schema(description = "交强手续费比例")
     private BigDecimal jqSuperviseCostsProportion;
 
     @Schema(description = "商业手续费比例")
     private BigDecimal sySuperviseCostsProportion;
 
-    @Schema(description = "驾意手续费比例")
-    private BigDecimal jySuperviseCostsProportion;
+//    @Schema(description = "驾意手续费比例")
+//    private BigDecimal jySuperviseCostsProportion;
+//
+//    @Schema(description = "交强跟单费比例")
+//    private BigDecimal jqOtherCostsProportion;
+//
+//    @Schema(description = "商业跟单费比例")
+//    private BigDecimal syOtherCostsProportion;
+//
+//    @Schema(description = "驾意跟单费比例")
+//    private BigDecimal jyOtherCostsProportion;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "签单时间")
+    private LocalDateTime signingTime;
 
-    @Schema(description = "交强跟单费比例")
-    private BigDecimal jqOtherCostsProportion;
+//    @Schema(description = "对接人")
+//    private String contactPerson;
 
-    @Schema(description = "商业跟单费比例")
-    private BigDecimal syOtherCostsProportion;
+    @Schema(description = "对接人姓名")
+    private String contractUserName;
 
-    @Schema(description = "驾意跟单费比例")
-    private BigDecimal jyOtherCostsProportion;
+    @Schema(description = "对接人手机号")
+    private String contractPhone;
 
-    @Schema(description = "签单时间")
-    private LocalDateTime signingTime;
 }

+ 304 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeExportVo.java

@@ -0,0 +1,304 @@
+package com.jzg.commons.entity.finance.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.jzg.commons.core.base.BaseModel;
+import com.jzg.commons.entity.po.InsFeeOrders;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "财务应收表")
+public class InsPlyIncomeExportVo extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = 6161862008963938376L;
+
+    @ExcelIgnore
+    private String id;
+
+    @Schema(description = "订单号")
+    @ExcelProperty("订单号")
+    private String orderNo;
+
+    @Schema(description = "协议类型")
+    @ExcelProperty("协议类型")
+    private String agreementType;
+
+    @Schema(description = "机构")
+    @ExcelProperty("机构id")
+    private String deptId;
+
+    @Schema(description = "机构名称")
+    @ExcelProperty("机构名称")
+    private String deptName;
+
+    @Schema(description = "产品id")
+    @ExcelProperty("产品id")
+    private String productId;
+
+    @Schema(description = "产品名称")
+    @ExcelProperty("产品名称")
+    private String productName;
+
+    @Schema(description = "险种")
+    @ExcelProperty("险种")
+    private String riskCode;
+
+    @Schema(description = "签单时间")
+    @TableField(exist = false)
+    @ExcelProperty("签单时间")
+    private String signingTime;
+
+    @Schema(description = "签单年份")
+    @TableField(exist = false)
+    private String signYear;
+
+    @Schema(description = "签单日期 yyyy-mm-dd 格式")
+    @TableField(exist = false)
+    private String signDate;
+
+    @Schema(description = "保司ID")
+    @ExcelProperty("保司ID")
+    private String companyId;
+
+    @Schema(description = "保司名称")
+    @TableField(exist = false)
+    @ExcelProperty("保司名称")
+    private String companyName;
+
+    @Schema(description = "协议Id")
+    @ExcelProperty("协议Id")
+    private String agreementId;
+
+    @Schema(description = "协议名称")
+    @ExcelProperty("协议名称")
+    private String agreementName;
+
+    @Schema(description = "被保人")
+    @ExcelProperty("被保人")
+    private String insuredPerson;
+
+    @Schema(description = "车牌号")
+    @ExcelProperty("车牌号")
+    private String licenseNo;
+
+    @Schema(description = "车船税")
+    @ExcelProperty("车船税")
+    private String taxPremium;
+
+    @Schema(description = "交强保单号")
+    @ExcelProperty("交强保单号")
+    private String jqPolicyNo;
+
+    @Schema(description = "商业保单号")
+    @ExcelProperty("商业保单号")
+    private String syPolicyNo;
+
+    @Schema(description = "驾意保单号")
+    @ExcelProperty("驾意保单号")
+    private String jyPolicyNo;
+
+    @Schema(description = "交强保费")
+    @ExcelProperty("交强保费")
+    private String jqPremium;
+
+    @Schema(description = "商业保费")
+    @ExcelProperty("商业保费")
+    private String syPremium;
+
+    @Schema(description = "驾意保费")
+    @ExcelProperty("驾意保费")
+    private String jyPremium;
+
+    @Schema(description = "交强手续费")
+    @ExcelProperty("交强手续费")
+    private String jqSuperviseCostsPremiums;
+
+    @Schema(description = "交强手续费比例")
+    @ExcelProperty("交强手续费比例")
+    private String jqSuperviseCostsProportion;
+
+    @Schema(description = "商业手续费")
+    @ExcelProperty("商业手续费")
+    private String sySuperviseCostsPremiums;
+
+    @Schema(description = "商业手续费比例")
+    @ExcelProperty("商业手续费比例")
+    private String sySuperviseCostsProportion;
+
+    @Schema(description = "驾意手续费")
+    @ExcelProperty("驾意手续费")
+    private String jySuperviseCostsPremiums;
+
+    @Schema(description = "驾意手续费比例")
+    @ExcelProperty("驾意手续费比例")
+    private String jySuperviseCostsProportion;
+
+    @TableField(exist = false)
+    @Schema(description = "应收手续费")
+    @ExcelProperty("应收手续费")
+    private String superviseCostsPremiums;
+
+    @TableField(exist = false)
+    @Schema(description = "应收跟单费")
+    @ExcelProperty("应收跟单费")
+    private String otherCostsPremiums;
+
+    @Schema(description = "交强跟单费比例")
+    @ExcelProperty("交强跟单费比例")
+    private String jqOtherCostsProportion;
+
+    @Schema(description = "交强跟单费")
+    @ExcelProperty("交强跟单费")
+    private String jqOtherCostsPremiums;
+
+    @Schema(description = "商业跟单费比例")
+    @ExcelProperty("商业跟单费比例")
+    private String syOtherCostsProportion;
+
+    @Schema(description = "商业跟单费")
+    @ExcelProperty("商业跟单费")
+    private String syOtherCostsPremiums;
+
+    @Schema(description = "驾意跟单费比例")
+    @ExcelProperty("驾意跟单费比例")
+    private String jyOtherCostsProportion;
+
+    @Schema(description = "驾意跟单费")
+    @ExcelProperty("驾意跟单费")
+    private String jyOtherCostsPremiums;
+
+    @Schema(description = "交强应收费用")
+    @ExcelProperty("交强应收费用")
+    private String jqReceivablePremium;
+
+    @Schema(description = "商业应收费用")
+    @ExcelProperty("商业应收费用")
+    private String syReceivablePremium;
+
+    @Schema(description = "驾意应收费用")
+    @ExcelProperty("驾意应收费用")
+    private String jyReceivablePremium;
+
+    @TableField(exist = false)
+    @Schema(description = "总应收金额")
+    @ExcelProperty("总应收金额")
+    private String receivableAmount;
+
+    @Schema(description = "手续费是否已经结算")
+    @ExcelProperty("手续费是否已经结算")
+    private String superviseSettlement;
+
+    @Schema(description = "跟单费是否已经结算")
+    @ExcelProperty("跟单费是否已经结算")
+    private String otherSettlement;
+
+    @Schema(description = "驾意险手续费是否已经结算")
+    @ExcelProperty("驾意险手续费是否已经结算")
+    private String jySuperviseSettlement;
+
+    @Schema(description = "驾意跟单位是否已经结算")
+    @ExcelProperty("驾意跟单位是否已经结算")
+    private String jyOtherSettlement;
+
+    @Schema(description = "平台协议车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议车险应收是否已经结算")
+    private String platformSuperviseSettlement;
+
+    @Schema(description = "平台协议非车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议非车险应收是否已经结算")
+    private String platformOtherSettlement;
+
+    @Schema(description = "维护人工号")
+    @ExcelProperty("维护人工号")
+    private String leaderId;
+
+    @Schema(description = "维护人名称")
+    @ExcelProperty("维护人名称")
+    private String leaderName;
+
+    @Schema(description = "对接人")
+    @ExcelProperty("对接人")
+    private String contactPerson;
+
+    @Schema(description = "对接人手机号")
+    private String contactPersonPhone;
+
+    @Schema(description = "系统code")
+    @ExcelProperty("系统code")
+    private String systemCode;
+
+    @Schema(description = "业务来源")
+    @ExcelProperty("业务来源")
+    private String businessSource;
+
+    // 设置初始值为0, 未结算
+    @Schema(description = "结算状态(编码)")
+    @ExcelProperty("结算状态(编码)")
+    private String settlementStatus="0";
+
+    @Schema(description = "结算状态(转义后)")
+    @ExcelProperty("结算状态(转义后)")
+    private String settlementStatusName;
+
+    @Schema(description = "增加类型")
+    @ExcelProperty("增加类型")
+    private String addType;
+
+    @TableField(exist = false)
+    @Schema(description = "交强起保日期")
+    @ExcelProperty("交强起保日期")
+    private String jqStartDate;
+
+    @TableField(exist = false)
+    @Schema(description = "商业起保日期")
+    @ExcelProperty("商业起保日期")
+    private String syStartDate;
+
+    @TableField(exist = false)
+    @Schema(description = "订单类型")
+    @ExcelProperty("订单类型")
+    private String orderType;
+
+    @TableField(exist = false)
+    @Schema(description = "订单类型(code)")
+    private String entryStatus;
+
+    @TableField(exist = false)
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttr;
+
+    @TableField(exist = false)
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttrName;
+
+    @TableField(exist = false)
+    @Schema(description = "实际签单用户手机号2")
+    private String realQuoteUserId;
+
+    @TableField(exist = false)
+    @Schema(description = "实际签单用户手机号")
+    private String realQuoteUserName;
+
+    @TableField(exist = false)
+    @Schema(description = "订单费用表")
+    private InsFeeOrders insFeeOrders;
+
+    @TableField(exist = false)
+    @Schema(description = "是否已经开票")
+    private String invoiceStatusName;
+
+    @TableField(exist = false)
+    @Schema(description = "订单关联的发票信息")
+    private String invoiceId;
+
+    @TableField(exist = false)
+    @Schema(description = "地区归属")
+    private String companyNameSimple;
+
+}

+ 36 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeInvoiceVO.java

@@ -0,0 +1,36 @@
+package com.jzg.commons.entity.finance.vo;
+
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoice;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "财务应收开票表")
+public class InsPlyIncomeInvoiceVO extends InsPlyIncomeInvoice {
+
+    @Serial
+    private static final long serialVersionUID = 6982290696670953095L;
+    @Schema(description = "是否能开票")
+    private boolean canInvoice;
+
+    @Schema(description = "不能开票的原因")
+    private String errMsg;
+
+    /**
+     * 发票对应的应收订单的序号
+     * @date 2026/5/26 11:35
+     */
+    private List<String> incomeIds;
+
+    /**
+     * 发票对应的应收订单的序号
+     * @date 2026/5/26 11:35
+     */
+    private List<String> orderNos;
+
+}

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceAndSettlementVo.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 结算Vo
+ */
+@Data
+@Schema(description = "结算Vo")
+public class InvoiceAndSettlementVo {
+
+    /**
+     * 开票的相关信息
+     */
+    private InsPlyIncomeInvoiceVO invoiceVO;
+
+    @Schema(description = "开票id")
+    private String invoicingId;
+
+    @Schema(description = "实收金额")
+    private BigDecimal actualReceivedAmount;
+
+    @Schema(description = "收款日期")
+    private String receivePaymentDate;
+
+    @Schema(description = "回款差额")
+    private BigDecimal paymentDifference;
+
+    @Schema(description = "差额原因")
+    private String paymentReason;
+
+    @Schema(description = "附加id")
+    private List<String> attachmentIds;
+}

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordQueryVo.java

@@ -49,5 +49,10 @@ public class InvoiceRecordQueryVo extends PageRequest {
      */
     private String invoiceDate;
 
+    /**
+     * 保险公司分支名称
+     */
+    private String companyNameSimple;
+
 
 }

+ 17 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java

@@ -2,9 +2,11 @@ package com.jzg.commons.entity.finance.vo;
 
 import com.jzg.commons.core.base.PageRequest;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class InvoiceRecordResult extends PageRequest {
 
@@ -23,6 +25,16 @@ public class InvoiceRecordResult extends PageRequest {
      */
     private String companyName;
 
+    /**
+     * 开票号/发票号
+     */
+    private String invoiceNo;
+
+    /**
+     * 保险公司分支名称
+     */
+    private String companyNameSimple;
+
     /**
      * 保险公司名称及父级的名称,例如
      */
@@ -38,6 +50,11 @@ public class InvoiceRecordResult extends PageRequest {
      */
     private BigDecimal overinflatedAmount;
 
+    /**
+     * 差额原因
+     */
+    private String paymentReason;
+
     /**
      * 应收项(转义)
      * 保留这个是为了兼容之前的功能

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoicingVo.java

@@ -21,7 +21,7 @@ public class InvoicingVo {
     @Schema(description = "开票的保司id")
     private String companyId;
 
-    // 开票类型 1:手续费 2:跟单费 3:驾意手续费 4::驾意跟单费
+    // 开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
     @Schema(description = "开票类型")
     private String invoiceType;
 

+ 22 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/PlatformSettlementVo.java

@@ -0,0 +1,22 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 结算Vo
+ */
+@Data
+@Schema(description = "平台结算Vo")
+public class PlatformSettlementVo {
+
+    @Schema(description = "结算Vo")
+    private SettlementVo settlementVo;
+
+    @Schema(description = "开票id")
+    private InvoicingVo invoicingVo;
+}

+ 1 - 2
commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java

@@ -10,9 +10,8 @@ import java.util.List;
 /**
  * @author tz
  * @description 应收查询VO
- * @createDate 2024-06-26 10:49:31
+ * @date 2024-06-26 10:49:31
  */
-
 @Data
 public class ReceivableQueryVo extends PageRequest {
 

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementVo.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import java.math.BigDecimal;
 import java.util.List;
 
+
 /**
  * 结算Vo
  */
@@ -22,6 +23,12 @@ public class SettlementVo {
     @Schema(description = "收款日期")
     private String receivePaymentDate;
 
+    @Schema(description = "回款差额")
+    private BigDecimal paymentDifference;
+
+    @Schema(description = "回款原因")
+    private String paymentReason;
+
     @Schema(description = "附加id")
     private List<String> attachmentIds;
 }

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsFeeAudit.java

@@ -44,6 +44,13 @@ public class InsFeeAudit extends BaseModel {
     @Schema(description = "是否是疑问订单 0.否 1.是")
     private Integer isProblem;
 
+    @Schema(description = "设为疑问单的原因")
+    private String problemReason;
+
+    @Schema(description = "设为疑问单的时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime problemTime;
+
     @Schema(description = "驳回原因")
     private String refuse;
 

+ 4 - 2
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrderReadPdf.java

@@ -1,7 +1,7 @@
 package com.jzg.commons.entity.orders.po;
 
-import java.io.Serializable;
-import java.util.Date;
+import java.io.Serial;
+
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -17,6 +17,8 @@ import lombok.Data;
 @Schema(description = "保单读取信息配置表")
 public class InsOrderReadPdf extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = -1427629070694065554L;
     @Schema(description = "主键")
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private String id;

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrders.java

@@ -6,10 +6,12 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.time.LocalDateTime;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @Schema(description = "保险订单表")
 public class InsOrders extends BaseModel {

+ 16 - 0
commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java

@@ -125,8 +125,24 @@ public class FeeAuditVo extends BaseModel {
     @Schema(description = "驳回原因")
     private String refuse;
 
+    @ExcelProperty("是否是疑问订单 0.否 1.是")
+    @Schema(description = "是否是疑问订单 0.否 1.是")
+    private String isProblem;
+
+    @ExcelProperty("订单来源 0 pc  1 app")
+    @Schema(description = "订单来源 0 pc  1 app")
+    private String orderSource;
+
     @ExcelProperty("权益金额")
     @Schema(description = "权益金额")
     private BigDecimal equityAmount;
 
+    @Schema(description = "是否是疑问单")
+    private int problem;
+
+    @Schema(description = "设置为疑问单的原因")
+    private String problemReason;
+
+    @Schema(description = "设为疑问单的时间")
+    private String problemTime;
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRules.java

@@ -23,6 +23,12 @@ public class PtlAgreementUndwrtRules extends BaseModel {
     @Schema(description = "协议id")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效结束时间")
+    private String endTime;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRulesAttr.java

@@ -8,6 +8,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serial;
 import java.util.List;
 
 /**
@@ -19,6 +20,8 @@ import java.util.List;
 @AllArgsConstructor
 public class PtlAgreementUndwrtRulesAttr extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = 2954853705582597212L;
     @TableId(value = "id", type = com.baomidou.mybatisplus.annotation.IdType.AUTO)
     private String id;
 

+ 8 - 3
commons/src/main/java/com/jzg/commons/entity/po/SysAmountAuditing.java

@@ -1,12 +1,10 @@
 package com.jzg.commons.entity.po;
 
-import java.io.Serializable;
+import java.io.Serial;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.BaseModel;
 import com.jzg.commons.entity.dto.ApplyWithdrawParam;
@@ -14,18 +12,22 @@ import com.jzg.commons.entity.dto.SysUserJzgInfoBankCardDto;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 /**
  * 提现申请表
  * @TableName sys_amount_auditing
  */
+@EqualsAndHashCode(callSuper = true)
 @Data
 @Schema(description = "提现申请表")
 @AllArgsConstructor
 @NoArgsConstructor
 public class SysAmountAuditing extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = -4444248789874668987L;
     @Schema(description = "主键")
     @TableId
     private String id;
@@ -97,6 +99,9 @@ public class SysAmountAuditing extends BaseModel {
     @Schema(description = "系统code")
     private String systemCode;
 
+    // 解决对应mapper报错的问题
+    private String bankNumber;
+
 
     /**
      * 构造提现

+ 3 - 2
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -135,7 +135,7 @@ public class QuoteEchoVo extends QuoteVo {
      * 费用信息
      */
     @Data
-    private static class OrdersCostsVo{
+    public static class OrdersCostsVo{
         @Schema(description = "交强险保费")
         private BigDecimal ciPremium;
 
@@ -434,7 +434,7 @@ public class QuoteEchoVo extends QuoteVo {
     }
 
 
-    public void setInsCompanyVo(EsmInsCompany esmInsCompany){
+    public void setInsCompanyVo(EsmInsCompany esmInsCompany, OrdersCostsVo costsVo){
         if(Objects.isNull(insCompanyVo)){
             this.insCompanyVo = new ArrayList<>();
         }
@@ -447,6 +447,7 @@ public class QuoteEchoVo extends QuoteVo {
         ptlAgreementInsCompanyVo.setCompanyCode(esmInsCompany.getCompanyCode());
         ptlAgreementInsCompanyVo.setNameSimple(esmInsCompany.getNameSimple());
         ptlAgreementInsCompanyVo.setCnName(esmInsCompany.getCode());
+        ptlAgreementInsCompanyVo.setCosts(costsVo);
         this.insCompanyVo.add(ptlAgreementInsCompanyVo);
 
     }

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/po/PtlSchemeInfo.java

@@ -6,9 +6,13 @@ import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
+
 @Data
 public class PtlSchemeInfo extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = 6506525156379399705L;
     @TableId(value = "id")
     private String id;
 

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/po/PtlSchemeRulesAttrLink.java

@@ -7,12 +7,15 @@ import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
 import java.util.ArrayList;
 import java.util.List;
 
 @Data
 public class PtlSchemeRulesAttrLink extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = 3487191741779052143L;
     @TableId(value = "id")
     private String id;
 

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlAgreementInsCompanyVo.java

@@ -2,6 +2,8 @@ package com.jzg.commons.entity.scheme.vo;
 
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.PtlAgreement;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -42,4 +44,7 @@ public class PtlAgreementInsCompanyVo extends EsmInsCompany implements Serializa
     @Schema(description = "投保指引")
     private String insGuide;
 
+    @Schema(description = "费用")
+    private QuoteEchoVo.OrdersCostsVo costs;
+
 }

+ 35 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeCopyVo.java

@@ -0,0 +1,35 @@
+package com.jzg.commons.entity.scheme.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.jzg.commons.constants.ProductsType;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesDictLabal;
+import com.jzg.commons.entity.scheme.po.*;
+import com.jzg.commons.exception.ValidateException;
+import com.jzg.commons.util.idgen.IdGenerate;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PtlSchemeCopyVo {
+
+    @Schema(description = "方案id")
+    private String schemeId;
+
+    @Schema(description = "险种code")
+    private String productCode;
+
+}

+ 9 - 0
commons/src/main/java/com/jzg/commons/entity/vo/AgreementRulesVo.java

@@ -5,12 +5,15 @@ import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
 import java.util.List;
 
 @Schema(description = "协议规则列表VO")
 @Data
 public class AgreementRulesVo extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = -5729790602450150534L;
     /** 主键 */
     @Schema(description = "主键")
     private String id;
@@ -19,6 +22,12 @@ public class AgreementRulesVo extends BaseModel {
     @Schema(description = "协议id")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效截止时间")
+    private String endTime;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

+ 126 - 0
commons/src/main/java/com/jzg/commons/util/BigDecimalUtil.java

@@ -0,0 +1,126 @@
+package com.jzg.commons.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+
+/**
+ * BigDecimal 高精度运算工具类(适用于金额计算)
+ */
+public class BigDecimalUtil {
+
+    /** 默认除法运算精度(保留小数点后几位) */
+    private static final int DEF_DIV_SCALE = 2;
+    /** 默认舍入模式:四舍五入 */
+    private static final RoundingMode DEF_ROUNDING_MODE = RoundingMode.HALF_UP;
+
+    // 私有构造器,防止被实例化
+    private BigDecimalUtil() {}
+
+    /**
+     * 提供精确的加法运算
+     * @param v1 被加数
+     * @param v2 加数
+     * @return 两个参数的和
+     */
+    public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
+        if (v1 == null) v1 = BigDecimal.ZERO;
+        if (v2 == null) v2 = BigDecimal.ZERO;
+        return v1.add(v2);
+    }
+
+    /**
+     * 提供精确的减法运算
+     * @param v1 被减数
+     * @param v2 减数
+     * @return 两个参数的差
+     */
+    public static BigDecimal subtract(BigDecimal v1, BigDecimal v2) {
+        if (v1 == null) v1 = BigDecimal.ZERO;
+        if (v2 == null) v2 = BigDecimal.ZERO;
+        return v1.subtract(v2);
+    }
+
+    /**
+     * 提供精确的乘法运算
+     * @param v1 被乘数
+     * @param v2 乘数
+     * @return 两个参数的积
+     */
+    public static BigDecimal multiply(BigDecimal v1, BigDecimal v2) {
+        if (v1 == null) v1 = BigDecimal.ZERO;
+        if (v2 == null) v2 = BigDecimal.ZERO;
+        return v1.multiply(v2);
+    }
+
+    /**
+     * 提供(相对)精确的除法运算。
+     * 当发生除不尽的情况时,默认精确到小数点以后2位,并四舍五入。
+     * @param v1 被除数
+     * @param v2 除数
+     * @return 两个参数的商
+     */
+    public static BigDecimal divide(BigDecimal v1, BigDecimal v2) {
+        return divide(v1, v2, DEF_DIV_SCALE);
+    }
+
+    /**
+     * 提供(相对)精确的除法运算。
+     * 当发生除不尽的情况时,由 scale 参数指定精度,并四舍五入。
+     * @param v1 被除数
+     * @param v2 除数
+     * @param scale 表示需要精确到小数点以后几位
+     * @return 两个参数的商
+     */
+    public static BigDecimal divide(BigDecimal v1, BigDecimal v2, int scale) {
+        if (v2 == null || v2.compareTo(BigDecimal.ZERO) == 0) {
+            throw new IllegalArgumentException("除数不能为0或null");
+        }
+        if (v1 == null) v1 = BigDecimal.ZERO;
+        return v1.divide(v2, scale, DEF_ROUNDING_MODE);
+    }
+
+    /**
+     * 对数值进行四舍五入(保留指定小数位)
+     * @param v 需要处理的数值
+     * @param scale 小数点后保留几位
+     * @return 处理后的结果
+     */
+    public static BigDecimal round(BigDecimal v, int scale) {
+        if (v == null) return BigDecimal.ZERO;
+        return v.setScale(scale, DEF_ROUNDING_MODE);
+    }
+
+    /**
+     * 比较两个数值的大小
+     * @param v1 第一个数
+     * @param v2 第二个数
+     * @return 如果 v1 > v2 返回 1;v1 < v2 返回 -1;相等返回 0
+     */
+    public static int compareTo(BigDecimal v1, BigDecimal v2) {
+        if (v1 == null) v1 = BigDecimal.ZERO;
+        if (v2 == null) v2 = BigDecimal.ZERO;
+        return v1.compareTo(v2);
+    }
+
+    /**
+     * 安全地将 double 转换为 BigDecimal(防止精度丢失)
+     * @param v 需要转换的 double 值
+     * @return 转换后的 BigDecimal 对象
+     */
+    public static BigDecimal valueOf(double v) {
+        return BigDecimal.valueOf(v);
+    }
+
+    /**
+     * 安全地将 String 转换为 BigDecimal
+     * @param v 需要转换的字符串
+     * @return 转换后的 BigDecimal 对象,若为 null 或空则返回 ZERO
+     */
+    public static BigDecimal valueOf(String v) {
+        if (v == null || v.trim().isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+        return new BigDecimal(v);
+    }
+}

+ 1 - 1
commons/src/main/java/com/jzg/commons/util/BuildDescUtils.java

@@ -36,7 +36,7 @@ public class BuildDescUtils {
                     desc.append(ptlAgreementUndwrtRulesAttr.getAttrName()).append("包含");
                     for (int k=0 ; k<link.getMinArray().length; k++){
                         PtlAgreementUndwrtRulesDictLabal ptlAgreementUndwrtRulesDictLabal = ptlAgreementUndwrtRulesAttr.getDictLabal().stream().filter(x -> Arrays.asList(link.getMinArray()).contains(x.getCode())).findFirst().orElse(null);
-                        desc.append(ptlAgreementUndwrtRulesDictLabal.getName()).append(",");
+                        desc.append(null != ptlAgreementUndwrtRulesDictLabal ? ptlAgreementUndwrtRulesDictLabal.getName() : "").append(",");
                     }
 
                 }else {

+ 1 - 0
gateway/src/main/java/com/jzg/config/CorsConfig.java

@@ -42,6 +42,7 @@ public class CorsConfig {
         corsConfiguration.addAllowedOrigin("http://192.168.0.20:81");
         corsConfiguration.addAllowedOrigin("http://192.168.0.59:9000");
         corsConfiguration.addAllowedOrigin("http://192.168.1.61:9000");
+        corsConfiguration.addAllowedOrigin("http://192.168.1.159:9000");
         // 允许的方法
         corsConfiguration.addAllowedMethod("*");
         // 允许的头信息

+ 1 - 1
partner/src/main/java/com/jzg/utils/DistributionUtils.java

@@ -67,7 +67,7 @@ public class DistributionUtils {
         }
         SysUserJzgInfo userInfoById = organizationClient.getPartUserInfoByMobile(insOrders.getRealQuoteUserId());
         if (Objects.isNull(userInfoById)){
-            log.info("当前出单员不是合伙人用户:{}");
+            log.info("当前出单员不是合伙人用户:{}",insOrders.getRealQuoteUserId());
         }
         String userId = userInfoById.getId();
         String userId3 = CalculateCommissionUtils.querySuperiorAndSubordinate(userId, GRADE_3);

+ 8 - 1
platform/src/main/java/com/jzg/controller/AgreementAttributionController.java

@@ -5,6 +5,7 @@ import com.jzg.commons.aop.OperatorTrajectory;
 import com.jzg.commons.constants.OperationTypeEnum;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
 import com.jzg.commons.entity.agreement.vo.PtlAgreementAttributionDeptVo;
 import com.jzg.commons.entity.agreement.vo.PtlAgreementAttributionQueryVo;
 import com.jzg.commons.entity.agreement.vo.PtlAgreementAttributionSaveVo;
@@ -45,7 +46,13 @@ public class AgreementAttributionController extends BaseController {
 
     @Operation(summary = "保险公司账号详情接口", description = "保险公司账号接口")
     @PostMapping(value = "/getAgreementAttribution")
-    public HttpResult<Object> getAgreementAttribution(@RequestSingleParam(value = "id") String id) {
+    public HttpResult<PtlAgreementAttribution> getAgreementAttribution(@RequestSingleParam(value = "id") String id) {
+        return agreementAttributionService.getAgreementAttribution(id);
+    }
+
+    @Operation(summary = "保险公司账号详情接口", description = "保险公司账号接口")
+    @PostMapping(value = "/getAgreementAttribution2")
+    public HttpResult<PtlAgreementAttribution> getAgreementAttribution2(@RequestParam(value = "id") String id) {
         return agreementAttributionService.getAgreementAttribution(id);
     }
 

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

@@ -465,4 +465,17 @@ public class EsmInsCompanyController extends BaseController {
     public Map<String, String> getAllCompanyHierarchyPaths(){
         return esmInsCompanyService.getAllCompanyHierarchyPaths();
     }
+
+    /**
+     * 获取所有保险公司的对应关系
+     *
+     * @return HttpResult<Map<String,EsmInsCompany>> key是保险公司id, value是保险公司对象实体
+     * @author lipf
+     * @date 2026年5月23日09:06:47
+     */
+    @Operation(summary = "获取所有保险公司的对应关系")
+    @GetMapping("queryAllCompanyMap")
+    public HttpResult<Map<String,EsmInsCompany>> queryAllCompanyMap(){
+        return HttpResult.ok(esmInsCompanyService.queryAllCompanyMap());
+    }
 }

+ 10 - 1
platform/src/main/java/com/jzg/service/EsmInsCompanyService.java

@@ -151,7 +151,16 @@ public interface EsmInsCompanyService extends IService<EsmInsCompany> {
      * Key: 公司ID
      * Value: 总公司/分公司/支公司
      */
-    public Map<String, String> getAllCompanyHierarchyPaths();
+    Map<String, String> getAllCompanyHierarchyPaths();
+
+    /**
+     * 获取所有保险公司的全路径名称
+     *
+     * @return Map<String,EsmInsCompany> value 表示保险公司信息
+     * @author lipf
+     * @date 2026/5/23 9:12
+     */
+    Map<String,EsmInsCompany> queryAllCompanyMap();
 }
 
 

+ 8 - 2
platform/src/main/java/com/jzg/service/PtlAgreementAttributionService.java

@@ -14,8 +14,14 @@ public interface PtlAgreementAttributionService extends IService<PtlAgreementAtt
 
     boolean addAgreementAttribution(PtlAgreementAttributionSaveVo ptlAgreementAttributionSaveVo);
 
-    HttpResult<Object> getAgreementAttribution(String id);
-
+    HttpResult<PtlAgreementAttribution> getAgreementAttribution(String id);
+
+    /**
+     * 查询保险公司账号列表接口
+     *
+     * @author lipf
+     * @date 2026/5/22 14:17
+     */
     Page<PtlAgreementAttribution> getAgreementAttributionList(Page page, PtlAgreementAttributionQueryVo ptlAgreementAttributionQueryVo);
 
     boolean updateAgreementAttribution(PtlAgreementAttributionSaveVo ptlAgreementAttributionSaveVo);

+ 20 - 0
platform/src/main/java/com/jzg/service/impl/EsmInsCompanyServiceImpl.java

@@ -1,6 +1,7 @@
 package com.jzg.service.impl;
 
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -387,6 +388,25 @@ public class EsmInsCompanyServiceImpl extends ServiceImpl<EsmInsCompanyMapper, E
         return pathCache;
     }
 
+    /**
+     * 获取所有保险公司的全路径名称
+     *
+     * @return Map<String,EsmInsCompany> value 表示保险公司信息
+     * @author lipf
+     * @date 2026/5/23 9:12
+     */
+    @Override
+    public Map<String,EsmInsCompany> queryAllCompanyMap(){
+        // 1. 查询所有未删除的保险公司(一次性加载,避免循环查库)
+        List<EsmInsCompany> allCompanies = baseMapper.selectList(null);
+        allCompanies = allCompanies.stream().filter(action->action.getIsDelete()==0).toList();
+        // 2. 将列表转换为 Map,以便通过 ID 快速查找对象 (ID -> Company Object)
+        Map<String, EsmInsCompany> companyMap = allCompanies.stream()
+                .collect(Collectors.toMap(EsmInsCompany::getId, c -> c));
+        log.debug("查询出[{}]个有效的保险公司", CollUtil.size(allCompanies));
+        return companyMap;
+    }
+
     /**
      * 递归构建单个公司的路径(带缓存优化,防止重复计算)
      */

+ 1 - 1
platform/src/main/java/com/jzg/service/impl/PtlAgreementAttributionImpl.java

@@ -65,7 +65,7 @@ public class PtlAgreementAttributionImpl extends ServiceImpl<PtlAgreementAttribu
     }
 
     @Override
-    public HttpResult<Object> getAgreementAttribution(String id) {
+    public HttpResult<PtlAgreementAttribution> getAgreementAttribution(String id) {
         PtlAgreementAttribution ptlAgreementAttribution = baseMapper.getAgreementAttribution(id);
         if (Objects.isNull(ptlAgreementAttribution)) {
             throw new RuntimeException("该保险公司账号不存在");

+ 1 - 0
platform/src/main/java/com/jzg/service/impl/PtlInsAttributionTemplateServiceImpl.java

@@ -143,6 +143,7 @@ public class PtlInsAttributionTemplateServiceImpl extends ServiceImpl<PtlInsAttr
 
     @Override
     public HttpResult<PtlAgreementAttribution> getAgreementAttribution(String agreementId) {
+        log.info("获取协议属性信息:agreementId=[{}]",agreementId);
         PtlAgreement ptlAgreement = ptlAgreementService.getById(agreementId);
         AssertionUtils.isEmpty(ptlAgreement, "协议不存在");
 

+ 0 - 1
platform/src/main/resources/mapper/PtlAgreementAttributionMapper.xml

@@ -37,7 +37,6 @@
         <if test="ptlAgreementAttributionQueryVo.username != null and ptlAgreementAttributionQueryVo.username != ''">
             and paa.username like concat('%',#{ptlAgreementAttributionQueryVo.username},'%')
             or paa.user_abbr like concat('%',#{ptlAgreementAttributionQueryVo.username},'%')
-            or eic.name_simple like concat('%',#{ptlAgreementAttributionQueryVo.username},'%')
         </if>
         <if test="ptlAgreementAttributionQueryVo.quoteStatus != null and ptlAgreementAttributionQueryVo.quoteStatus != ''">
             and paa.quote_status = #{ptlAgreementAttributionQueryVo.quoteStatus}

+ 4 - 4
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerApplyApplicationRequestBuild.java

@@ -25,7 +25,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
         throw new IllegalStateException("Utility class");
     }
 
-    public static AnShengCrawlerApplyApplicationRequest build(AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply, AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply, AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse, String compulsoryVersionNo) {
+    public static AnShengCrawlerApplyApplicationRequest build(AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply, AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply, AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse, String compulsoryVersionNo,String brand) {
         AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = new AnShengCrawlerApplyApplicationRequest();
         String jsonString = JSONObject.toJSONString(calculatePremiumApply);
         String personnelName = InfoExtractUtil.extractPersonnelName(jsonString);
@@ -59,7 +59,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
             //contractsDTO.setBrandAutoModel(brandAutoModelDTO);
             contractsDTO.setSaleChannelSource(new AnShengCrawlerApplyApplicationRequest.ContractsDTO.SaleChannelSourceDTO(""));
             contractsDTO.setUnderwriteInfos(List.of(new AnShengCrawlerApplyApplicationRequest.ContractsDTO.UnderwriteInfosDTO("1", "")));
-            AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO policyExtendDTO = buildPolicyExtend(insuranerName, personDTO.getMobileTelephone());
+            AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO policyExtendDTO = buildPolicyExtend(insuranerName, personDTO.getMobileTelephone(),brand);
             contractsDTO.setPolicyExtend(policyExtendDTO);
             // 险种信息
             List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyCoveragesDTO> policyCoveragesDTO = buildPolicyCoveragesList(responseContracts.getPolicyCoverages(), requestContracts.getPolicyCoverages());
@@ -539,7 +539,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
         return policySaleInfoDTO;
     }
 
-    private static AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO buildPolicyExtend(String insuranerName, String phone) {
+    private static AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO buildPolicyExtend(String insuranerName, String phone,String brand) {
         AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO policyExtend = new AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO();
         policyExtend.setOrderNumber("");
         policyExtend.setRiskSharingBusinessType("1");
@@ -549,7 +549,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
         policyExtend.setIssueChannel("5");
         policyExtend.setUsageAttributeCode("1");
         policyExtend.setRunRegionCode("");
-        policyExtend.setBrand("");
+        policyExtend.setBrand(brand);
         policyExtend.setInsuranceVehicleRelationship("1");
         policyExtend.setUsageAttributeCodePM("");
         policyExtend.setAvgMile("");

+ 66 - 2
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java

@@ -1,17 +1,24 @@
 package com.jzg.quotation.ansheng.crawler.build;
 
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.ansheng.crawler.constant.enums.DepartmentPlanCode;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerCalculatePremiumApplyResponse;
 import com.jzg.quotation.commons.component.ConversionOfQuoteInformation;
+import lombok.extern.slf4j.Slf4j;
 
+import java.math.BigDecimal;
 import java.util.List;
 
+
+@Slf4j
 public final class AnShengCrawlerQuoteResultsVoBuild {
 
     public AnShengCrawlerQuoteResultsVoBuild() {
@@ -56,12 +63,69 @@ public final class AnShengCrawlerQuoteResultsVoBuild {
                 buildKindInfo(quoteResultsVo.getKindInfoVo(), contract.getPolicyCoverages());
             }
         });
-
-
+        QuoteResultsVo.CostsVo costs = quoteResultsVo.getCosts();
+        BigDecimal bi = costs.getBiPremium() == null ? BigDecimal.ZERO : new BigDecimal(costs.getBiPremium());
+        BigDecimal ci = costs.getCiPremium() == null ? BigDecimal.ZERO : new BigDecimal(costs.getCiPremium());
+        BigDecimal vv = costs.getVvTax() == null ? BigDecimal.ZERO : new BigDecimal(costs.getVvTax());
+        BigDecimal total = bi.add(ci).add(vv);
+        String totalStr = total.toPlainString();
+        costs.setSumPremium(totalStr);
+        quoteResultsVo.setScoreVo(buildScoreVo(calculatePremiumApply));
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         return quoteResultsVo;
     }
 
+
+    private static QuoteResultsVo.ScoreVo buildScoreVo( AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply) {
+        QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
+        JSONArray scoreArray = new JSONArray();
+        AnShengCrawlerCalculatePremiumApplyResponse.DataDTO data = calculatePremiumApply.getData();
+        String basicstring = data.getBasicstring();
+        if (StringUtils.isNotEmpty(basicstring)){
+            String[] parts = basicstring.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",parts.length > 0 ? parts[0].trim() : "")
+                    .fluentPut("scoreKey","basicstring")
+                    .fluentPut("score",parts.length > 1 ? parts[1].trim() : ""));
+        }
+        String blackDivisor = data.getBlackDivisor();
+        if (StringUtils.isNotEmpty(blackDivisor)){
+            String[] black = blackDivisor.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",black.length > 0 ? black[0].trim() : "")
+                    .fluentPut("scoreKey","blackDivisor")
+                    .fluentPut("score",black.length > 0 ? black[1].trim() : ""));
+        }
+        String comprehensiveScoreStr = data.getComprehensiveScoreStr();
+        if (StringUtils.isNotEmpty(comprehensiveScoreStr)){
+            String[] comprehensiveScore = comprehensiveScoreStr.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",comprehensiveScore.length > 0 ? comprehensiveScore[0].trim() : "")
+                    .fluentPut("scoreKey","comprehensiveScoreStr")
+                    .fluentPut("score",comprehensiveScore.length > 0 ? comprehensiveScore[1].trim() : ""));
+        }
+        String riskScore = data.getRiskScore();
+        if (StringUtils.isNotEmpty(riskScore)){
+            String[] riskScoreStr = riskScore.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",riskScoreStr.length > 0 ? riskScoreStr[0].trim() : "")
+                    .fluentPut("scoreKey","riskScore")
+                    .fluentPut("score",riskScoreStr.length > 0 ? riskScoreStr[1].trim() : ""));
+        }
+        String unifiedScore = data.getUnifiedScore();
+        if (StringUtils.isNotEmpty(unifiedScore)){
+            String[] unifiedScoreStr = unifiedScore.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",unifiedScoreStr.length > 0 ? unifiedScoreStr[0].trim() : "")
+                    .fluentPut("scoreKey","unifiedScore")
+                    .fluentPut("score",unifiedScoreStr.length > 0 ? unifiedScoreStr[1].trim() : ""));
+        }
+        scoreVo.setScoreJson(scoreArray);
+        return scoreVo;
+    }
+
+
+
     /**
      * 构造交强商业时间信息
      *

+ 1 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/constant/enums/RequestUrl.java

@@ -23,6 +23,7 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     QUERY_AUTO_MATCH_PRICE_RATIO("portalapi/queryAutoMatchPriceRatio", ""),
     SEARCH_VEHICLE_BY_VIN("/portalapi/searchVehicleByVIN", "车架号查询"),
     CALCULATE_PREMIUM_APPLY("/portalapi/calculatePremiumApply", "保费计算"),
+    AUTORESETTIME("/portalapi/autoResetTime", "计算时间"),
     // 上传影像
     FILE_UPLOAD("/portalapi/fileUpload", "影像上传"),
     // 核保

+ 1 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerApplyApplicationRequest.java

@@ -1007,7 +1007,7 @@ public class AnShengCrawlerApplyApplicationRequest {
             private String vehicleTypeName;
             @JsonProperty("makeDate")
             @JSONField(name = "makeDate")
-            private Integer makeDate;
+            private String makeDate;
             @JsonProperty("detailDesc")
             @JSONField(name = "detailDesc")
             private String detailDesc;

+ 14 - 17
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java

@@ -13,7 +13,6 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -655,7 +654,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
             private String vehicleTypeName;
             @JsonProperty("makeDate")
             @JSONField(name = "makeDate")
-            private Integer makeDate;
+            private String makeDate;
             @JsonProperty("stopFlag")
             @JSONField(name = "stopFlag")
             private String stopFlag;
@@ -790,7 +789,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.seats = carInfoVo.getSeatCount();
                 this.rbCode = brandAutoModel.getRbCode();
                 this.otherEnergyTypeDesc = "";
-                this.madeDate = brandAutoModel.getMakeDate();
+                this.madeDate = dataDTO.getMadeDate();
                 this.exhaustCapability = brandAutoModel.getExhaustCapabilityString();
                 this.noDamageYears = "";
                 this.specialVehicleFlag = "";
@@ -840,12 +839,9 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.vehicleFgwCode = brandAutoModel.getAutoModelChnName();
                 this.vehicleFgwName = brandAutoModel.getBrandChnName();
                 this.vehicleModelType = "";
-                this.vehicleStyleDesc = "";
+                this.vehicleStyleDesc = "小型轿车";
                 this.vehicleTypeName = carInfoVo.getCarKindName();
-                if (StringUtils.hasLength(brandAutoModel.getMakeDate())) {
-                    this.makeDate = Integer.valueOf(brandAutoModel.getMakeDate());
-                }
-                this.stopFlag = brandAutoModel.getStopFlag();
+                this.makeDate = "";
                 this.detailDesc = brandAutoModel.getRemark();
                 this.vehicleCategory = "";
                 this.personnelName = personnelName;
@@ -861,7 +857,8 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.vehicleTonnages = "0";
                 this.power = brandAutoModel.getPower();
                 this.maxDesignSpeed = 0;
-                this.runCardCertificateDate = TimeProcessing.dateToDateTime(carInfoVo.getIssueDate());
+                //this.runCardCertificateDate = TimeProcessing.dateToDateTime(carInfoVo.getIssueDate());
+                this.runCardCertificateDate = "";
                 this.customerNegotiatePrice = customerNegotiatePrice;
                 this.originalCustomerNegotiatePrice = customerNegotiatePrice;
                 this.fleetNo = "";
@@ -1003,7 +1000,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 private String dbVehicleWeigth;
                 @JsonProperty("riskScore")
                 @JSONField(name = "riskScore")
-                private Integer riskScore;
+                private String riskScore;
                 @JsonProperty("riskScoreTwenty")
                 @JSONField(name = "riskScoreTwenty")
                 private String riskScoreTwenty;
@@ -1096,7 +1093,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 private String fdConfigId;
                 @JsonProperty("modelDiscount")
                 @JSONField(name = "modelDiscount")
-                private Double modelDiscount;
+                private String modelDiscount;
                 @JsonProperty("autoFloatHandingCost")
                 @JSONField(name = "autoFloatHandingCost")
                 private Integer autoFloatHandingCost;
@@ -1183,7 +1180,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                     this.ratioFluctuateType = "0";
                     this.repairFactory = "";
                     this.dbVehicleWeigth = brandAutoModel.getCurbWeightMin();
-                    this.riskScore = null;
+                    this.riskScore = "";
                     this.riskScoreTwenty = "";
                     this.algrId = "";
                     this.riskScoreColor = "";
@@ -1214,7 +1211,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                     this.autoFloatRatioOther = "";
                     this.appointAreaCode = "";
                     this.fdConfigId = "";
-                    this.modelDiscount = 0D;
+                    this.modelDiscount = "";
                     this.autoFloatHandingCost = 0;
                     this.modelrate = "";
                     this.advicediscount = "";
@@ -1809,17 +1806,17 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                         this.certificateType = customerInfoVo.getIdentifyType();
                         this.certificateNo = customerInfoVo.getIdentifyNumber();
                         this.sexCode = customerInfoVo.getGender();
-                        this.birthday = customerInfoVo.getBirthday();
-                        this.personnelAge = String.valueOf(customerInfoVo.getAge());
+                        this.birthday = customerInfoVo.getBirthday() + " 00:00:00";
+                        this.personnelAge = String.valueOf(customerInfoVo.getAge() + 1);
                         this.address = customerInfoVo.getAddr();
                         this.positionn = "";
                         this.mobileTelephone = customerInfoVo.getMobile();
                         this.email = "";
                         this.postcode = "030000";
                         this.vipMark = "1";
-                        this.effectedDate = customerInfoVo.getIdentifyValidDate();
+                        this.effectedDate = customerInfoVo.getIdentifyValidDate()  + " 00:00:00";
                         this.certType = "0";
-                        this.expiredDate = customerInfoVo.getIdentifyValidEndDate();
+                        this.expiredDate = customerInfoVo.getIdentifyValidEndDate() + " 00:00:00";
                         this.isRuralOrUrban = "";
                         this.idCardAddress = "";
                         this.nationalityType = "142";

+ 2 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerSearchVehicleByVinRequest.java

@@ -42,7 +42,7 @@ public class AnShengCrawlerSearchVehicleByVinRequest {
     @JsonProperty("customerSourceCode")
     private String customerSourceCode;
 
-    public AnShengCrawlerSearchVehicleByVinRequest(CarInfoVo carInfoVo, String departmentCode, String agentCode) {
+    public AnShengCrawlerSearchVehicleByVinRequest(CarInfoVo carInfoVo, String departmentCode, String agentCode,String realBusinessType) {
         this.vin = carInfoVo.getVinNo();
         this.priceType = "04";
         if(carInfoVo.isNewEnergyMark()){
@@ -56,5 +56,6 @@ public class AnShengCrawlerSearchVehicleByVinRequest {
         this.vehicleDBFlag = "1";
         this.vehicleType = carInfoVo.getCarKindCode();
         this.agentCode = agentCode;
+        this.realBusinessType = realBusinessType;
     }
 }

+ 8 - 6
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -30,10 +30,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -98,12 +95,16 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         String checkVehicleCodeSecretGenerate = CheckVehicleCodeSecretGenerateUtils.getCheckVehicleCodeSecretGenerate(checkVehicleCode, userDetailResponse.getUserId());
 
         // 车架号查询
-        AnShengCrawlerSearchVehicleByVinRequest anShengCrawlerSearchVehicleByVinRequest = new AnShengCrawlerSearchVehicleByVinRequest(quoteVo.getCarInfoVo(), userDetailResponse.getDepartmentCode(), userDetailResponse.getAgentCode());
+        AnShengCrawlerSearchVehicleByVinRequest anShengCrawlerSearchVehicleByVinRequest = new AnShengCrawlerSearchVehicleByVinRequest(quoteVo.getCarInfoVo(), userDetailResponse.getDepartmentCode(), userDetailResponse.getAgentCode(),userDetailResponse.getRealBusinessType());
         List<AnShengCrawlerSearchVehicleByVinResponse.DataDTO> dataDTOS = anShengCrawlerRequestComponent.searchVehicleByVin(anShengCrawlerSearchVehicleByVinRequest, httpHeaders);
+        if (Objects.isNull(dataDTOS)){
+            throw new SystemException("车型查询错误");
+        }
         AnShengCrawlerSearchVehicleByVinResponse.DataDTO dataDTO = CarModelsFilterUtils.to(dataDTOS, quoteVo.getCarInfoVo());
         // 报价
         AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply = new AnShengCrawlerCalculatePremiumApplyMessage(quoteVo, dataDTO, userDetailResponse, departmentPlanCode, checkVehicleCodeSecretGenerate);
         log.info("安盛报价参数:{}", JSONObject.toJSONString(crawlerCalculatePremiumApply));
+
         AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply = anShengCrawlerRequestComponent.calculatePremiumApply(crawlerCalculatePremiumApply, httpHeaders);
         // 处理重复投保
         if (calculatePremiumApply.getMessage().contains("重复投保")) {
@@ -127,7 +128,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
                 });
             });
             log.info("安盛报价返回数据:{}", JSONObject.toJSONString(calculatePremiumApply));
-            AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = AnShengCrawlerApplyApplicationRequestBuild.build(crawlerCalculatePremiumApply, calculatePremiumApply, userDetailResponse, compulsoryVersionNo);
+            AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = AnShengCrawlerApplyApplicationRequestBuild.build(crawlerCalculatePremiumApply, calculatePremiumApply, userDetailResponse, compulsoryVersionNo,dataDTO.getBrandAutoModel().getBrand());
             // 缓存数据
             anShengCrawlerCacheComponent.cacheQuoteRequest(ordersNo, autoSpecialPromiseRequest);
         }
@@ -200,6 +201,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
             }
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         }
+        underwritingResultsVo.setPaymentLink("");
         return underwritingResultsVo;
     }
 

+ 1 - 1
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/build/BoHaiCrawlerQuoteResultsVoBuild.java

@@ -125,7 +125,7 @@ public class BoHaiCrawlerQuoteResultsVoBuild {
         // 交易流水号
         quoteResultsVo.setCompanyOrderNo("");
         // 报价失败提示
-        quoteResultsVo.setErrorMessage("报价失败");
+        quoteResultsVo.setErrorMessage(boHaiQuoteResponse.getHead().getReturnMessage());
         //设置报价状态:
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
         return quoteResultsVo;

+ 2 - 2
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerRequestComponent.java

@@ -190,7 +190,7 @@ public class BoHaiCrawlerRequestComponent {
 
                     CrawlerRequestUrlStandard standard = (CrawlerRequestUrlStandard) urlOrStandard;
                     ResponseEntity<String> encryptedResponse = requestComponent.objectPost(
-                            standard.getRequestUrl(boHaiCrawlerProperties.getBaseUrl2()),
+                            standard.getRequestUrl(boHaiCrawlerProperties.getBaseUrl()),
                             boHaiCrawlerEncryptionRequest,
                             String.class,
                             headers
@@ -354,7 +354,7 @@ public class BoHaiCrawlerRequestComponent {
      * @return BoHaiCrawlerCarResponse 车型列表
      */
     public BoHaiCrawlerCarApiResponse car(BoHaiCrawlerCarRequest boHaiCrawlerCarRequest, HttpHeaders headers) {
-        return executeRequest(RequestType.ENCRYPTED, RequestUrl.CAR, boHaiCrawlerCarRequest, BoHaiCrawlerCarApiResponse.class, headers);
+        return executeRequest(RequestType.UNENCRYPTED, RequestUrl.CAR, boHaiCrawlerCarRequest, BoHaiCrawlerCarApiResponse.class, headers);
     }
 
     /**

+ 7 - 7
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerQuotationRequest2.java

@@ -63,7 +63,7 @@ public class BoHaiCrawlerQuotationRequest2 {
         @JSONField(ordinal = 3)
         private List<Insured> insuredList;
         /** 险种集合(商业险/交强险及其条款) */
-        @JSONField(ordinal = 4)
+        @JSONField(ordinal = 4, serialzeFeatures = {SerializerFeature.NotWriteDefaultValue})
         private List<Risk> riskList;
     }
 
@@ -313,7 +313,7 @@ public class BoHaiCrawlerQuotationRequest2 {
 
         /** 排量/功率(L/kW) */
         @JSONField(ordinal = 25)
-        private Double exhaustScale;
+        private String exhaustScale;
 
         /** 注册日期(初登) */
         @JSONField(ordinal = 26)
@@ -329,9 +329,9 @@ public class BoHaiCrawlerQuotationRequest2 {
 
         /** 使用年限 */
         @JSONField(ordinal = 29)
-        private String useYearsDI;
+        private Integer useYearsDI;
 
-        /** 过户标志 */
+        /** 过户标志 “0" 非过户 */
         @JSONField(ordinal = 30)
         private String chgOwnerFlag;
 
@@ -699,7 +699,7 @@ public class BoHaiCrawlerQuotationRequest2 {
         private String nation;
 
         /** 证件签发机关 */
-        @JSONField(ordinal = 25)
+        @JSONField(ordinal = 25,serialzeFeatures = SerializerFeature.WriteMapNullValue)
         private String identifyIssuer;
 
         /** 证件地址 */
@@ -749,7 +749,7 @@ public class BoHaiCrawlerQuotationRequest2 {
         /**
          * 驾驶人数量
          */
-        @JSONField(ordinal = 37)
+        @JSONField(name = "DInsuredCount", ordinal = 37)
         private String DInsuredCount;
 
         /** 是否指定受益人 */
@@ -1014,7 +1014,7 @@ public class BoHaiCrawlerQuotationRequest2 {
         @JSONField(ordinal = 49)
         private String expPricingAdjustValue;
         /** 不浮动费用率 */
-        @JSONField(ordinal = 50)
+        @JSONField(name = "NoneFluctuateFeeRate", ordinal = 50)
         private String NoneFluctuateFeeRate;
     }
     /**

+ 31 - 1
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust1.java

@@ -212,7 +212,7 @@ public class BoHaiCrawlerVehicleConfirmationReqeust1 implements Serializable {
          * 排气量
          */
         @JsonProperty("displacement")
-        private String displacement;
+        private Double displacement;
 
         /**
          * 功率
@@ -345,6 +345,36 @@ public class BoHaiCrawlerVehicleConfirmationReqeust1 implements Serializable {
          */
         @JsonProperty("PrecisePriceComCode")
         private Boolean precisePriceComCode;
+
+        /**
+         * 车主名称
+         */
+        @JsonProperty("ownerName")
+        private String ownerName;
+
+        /**
+         * 车主证件类型
+         */
+        @JsonProperty("ownerCertificateType")
+        private String ownerCertificateType;
+
+        /**
+         * 车主证件号码
+         */
+        @JsonProperty("ownerCertificateNum")
+        private String ownerCertificateNum;
+
+        /**
+         * 证件类型
+         */
+        @JsonProperty("certificateType")
+        private String certificateType;
+
+        /**
+         * 证件号码
+         */
+        @JsonProperty("certificateNo")
+        private String certificateNo;
     }
 
 

+ 4 - 5
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerQuoteProcessServiceImpl.java

@@ -45,12 +45,12 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
     /**
      * Python脚本路径
      */
-    private static final String PYTHON_SCRIPT_PATH = "e:/project/jzg/tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py";
+    private static final String PYTHON_SCRIPT_PATH = "E:/IdeaProjects/jzg/tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py";
 
     /**
      * Python解释器路径
      */
-    private static final String PYTHON_EXECUTABLE_PATH = "E:\\project\\memorize_backend\\venv\\Scripts\\python.exe";
+    private static final String PYTHON_EXECUTABLE_PATH = "C:/Users/Administrator/AppData/Local/Programs/Python/Python312/python.exe";
 
     /**
      * Python脚本执行超时时间(秒)
@@ -133,12 +133,11 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
         headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
         return headers;*/
         HttpHeaders httpHeaders = new HttpHeaders();
-        httpHeaders.set("Cookie", "HTTPOnly; skin-color=skin-db; Cookie=!uEW94o2278iwLg21yv2qnldjEk8Kb5RsZkOl0FDX8+Mqxb0EGroyfXXQVmrGlnxevDyUYDwsWh2B5iY=; JSESSIONID=0001TTPD95X9DLJB1il0R_O_NhM:3T0NUMVN3E");
+        httpHeaders.set("Cookie", "HTTPOnly; Cookie=!EGmfBaVL8vRhQVm1yv2qnldjEk8KbwtSAPXA04eIJoNmCDYPGJ9wrhISai6LJc/RzChzLWC1R3fADU8=; JSESSIONID=0003Q7K2MvYVNnSRpylGrMlbm0d:-B0CDG8:1RGHVQ8T50:1Q4PVUSPE8");
 
         // 从Redis获取sessionId
         String sessionId = getOrRefreshSessionId();
-
-        if (StringUtils.hasLength(sessionId)) {
+        if (!StringUtils.hasLength(sessionId)) {
             sessionId = getSessionId();
         }
         httpHeaders.set("sessionId", sessionId);

+ 267 - 94
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java

@@ -4,12 +4,10 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.zxing.NotFoundException;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
-import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
-import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
-import com.jzg.commons.entity.quote.vo.KindInfoVo;
-import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
+import com.jzg.commons.util.ObjectUtil;
 import com.jzg.quotation.bohai.api.constant.enums.ResponseCode;
 import com.jzg.quotation.bohai.api.entity.BoHaiConfigureParameters;
 import com.jzg.quotation.bohai.api.entity.request.ElectronicPolicyRequest;
@@ -19,6 +17,7 @@ import com.jzg.quotation.bohai.api.entity.request.StatusDocumentsRequest;
 import com.jzg.quotation.bohai.api.entity.response.ElectronicPolicyResponse;
 import com.jzg.quotation.bohai.api.entity.response.StatusDocumentsResponse;
 import com.jzg.quotation.bohai.api.entity.vo.PersonAreaVo;
+import com.jzg.quotation.bohai.api.util.StringSubStringUtils;
 import com.jzg.quotation.bohai.crawler.component.BoHaiCrawlerCacheComponent;
 import com.jzg.quotation.bohai.crawler.component.BoHaiBuildingAttributionInformation;
 import com.jzg.quotation.bohai.crawler.constant.enums.CertifyType;
@@ -40,14 +39,18 @@ import com.jzg.quotation.bohai.crawler.entity.response.*;
 import com.jzg.quotation.bohai.crawler.service.BoHaiCrawlerOrderService;
 import com.jzg.quotation.bohai.crawler.service.BoHaiCrawlerQuoteProcessService;
 import com.jzg.quotation.bohai.crawler.service.BoHaiCrawlerRequest;
+import com.jzg.quotation.commons.utils.DateTimeUtil;
+import com.jzg.quotation.commons.utils.DateUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
 import java.io.IOException;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 
@@ -83,8 +86,8 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      * 说明:E:\project\memorize_backend\venv\Scripts\python.exe   这是我本地的python解释器路径,这个需要修改为你本地的路径
      */
     private static final String TOKEN = PythonExecutor.executeAndGetToken(
-            "E:/project/jzg/tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py",
-            "E:\\project\\memorize_backend\\venv\\Scripts\\python.exe", 120);
+            "E:/IdeaProjects/jzg/tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py",
+            "C:/Users/Administrator/AppData/Local/Programs/Python/Python312/python.exe", 120);
 
     /**
      * 登录
@@ -110,37 +113,49 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
         try {
-            // 1.0 获取归属信息和配置参数
-            AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
-            HttpHeaders headers = boHaiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
-            String userCode = boHaiCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
-            log.info("userCode:{}", userCode);
-
-            BoHaiCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(
-                    BoHaiCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
-            log.info("parameters参数的值:{}", JSON.toJSONString(parameters));
-
-            // 2.0 车辆查询
-            BoHaiCrawlerCarApiResponse carApiResponse = queryCarInfo(quoteVo, parameters, userCode, headers);
-            log.info("[车辆查询]返回参数的值:{}", JSON.toJSONString(carApiResponse));
-            // 车辆确认
-            BoHaiCrawlerVehicleConfirmationResponse2 confirmationResponse = confirmVehicle(quoteVo, carApiResponse, parameters, headers);
-            log.info("[车辆确认]返回参数的值:{}", JSON.toJSONString(confirmationResponse));
-
-            // 3.0 构建报价请求并发起报价
-            BoHaiCrawlerQuotationRequest2 quotationRequest = buildQuotationRequest(quoteVo, carApiResponse, confirmationResponse);
-            log.info("[报价]请求参数的值:{}", JSON.toJSONString(quotationRequest));
-            BoHaiCrawlerQuotationResponse2 boHaiCrawlerQuotationResponse2 = boHaiCrawlerRequestComponent.quotation(quotationRequest, headers);
-            log.info("[报价]返回参数的值:{}", JSON.toJSONString(boHaiCrawlerQuotationResponse2));
-
-            // 4.0 处理报价结果
-            return handleQuotationResponse(quoteVo, boHaiCrawlerQuotationResponse2);
+            // 执行报价流程
+            return executeQuotation(quoteVo);
         } catch (Exception e) {
             log.error("报价异常", e);
             throw new RuntimeException(e);
         }
     }
 
+    /**
+     * 执行报价流程(通用方法,首次报价和重复报价共用)
+     *
+     * @param quoteVo 报价实体
+     * @return QuoteResultsVo
+     */
+    private QuoteResultsVo executeQuotation(QuoteVo quoteVo) {
+        // 1.0 获取归属信息和配置参数
+        AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
+        HttpHeaders headers = boHaiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        String userCode = boHaiCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
+        log.info("userCode:{}", userCode);
+
+        BoHaiCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(
+                BoHaiCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        log.info("parameters参数的值:{}", JSON.toJSONString(parameters));
+
+        // 2.0 车辆查询
+        BoHaiCrawlerCarApiResponse carApiResponse = queryCarInfo(quoteVo, parameters, userCode, headers);
+        log.info("[车辆查询]返回参数的值:{}", JSON.toJSONString(carApiResponse));
+        
+        // 车辆确认
+        BoHaiCrawlerVehicleConfirmationResponse2 confirmationResponse = confirmVehicle(quoteVo, carApiResponse, parameters, headers);
+        log.info("[车辆确认]返回参数的值:{}", JSON.toJSONString(confirmationResponse));
+
+        // 3.0 构建报价请求并发起报价
+        BoHaiCrawlerQuotationRequest2 quotationRequest = buildQuotationRequest(quoteVo, carApiResponse, confirmationResponse);
+        log.info("[报价]请求参数的值:{}", JSON.toJSONString(quotationRequest));
+        BoHaiCrawlerQuotationResponse2 boHaiCrawlerQuotationResponse2 = boHaiCrawlerRequestComponent.quotation(quotationRequest, headers);
+        log.info("[报价]返回参数的值:{}", JSON.toJSONString(boHaiCrawlerQuotationResponse2));
+
+        // 4.0 处理报价结果
+        return handleQuotationResponse(quoteVo, boHaiCrawlerQuotationResponse2);
+    }
+
     /**
      * 车辆查询
      *
@@ -175,7 +190,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      *
      * @param quoteVo
      * @param carApiResponse
-     * @param currentValue
+     * @param confirmationResponse
      * @return BoHaiCrawlerQuotationRequest2
      */
     private BoHaiCrawlerQuotationRequest2 buildQuotationRequest(QuoteVo quoteVo, BoHaiCrawlerCarApiResponse carApiResponse, BoHaiCrawlerVehicleConfirmationResponse2 confirmationResponse) {
@@ -206,7 +221,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      *
      * @param quoteVo
      * @param carApiResponse
-     * @param currentValue
+     * @param confirmationResponse
      * @return BoHaiCrawlerQuotationRequest2.BusinessData
      */
     private BoHaiCrawlerQuotationRequest2.BusinessData buildBusinessData(QuoteVo quoteVo, BoHaiCrawlerCarApiResponse carApiResponse, BoHaiCrawlerVehicleConfirmationResponse2 confirmationResponse) {
@@ -254,7 +269,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         mainInfo.setUnderUnit("");
         mainInfo.setIdentifyType("006");
         mainInfo.setIdentifyDetail("00001");
-        mainInfo.setIdentifyCode("");
+        mainInfo.setIdentifyCode(null);
         mainInfo.setIdentifyVip("");
         mainInfo.setComputerIp("");
         mainInfo.setMainCarKindBC("0");
@@ -281,7 +296,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      *
      * @param quoteVo
      * @param carApiResponse
-     * @param currentValue
+     * @param confirmationResponse
      * @return BoHaiCrawlerQuotationRequest2.CarInfo
      */
     private BoHaiCrawlerQuotationRequest2.CarInfo buildCarInfo(QuoteVo quoteVo, BoHaiCrawlerCarApiResponse carApiResponse, BoHaiCrawlerVehicleConfirmationResponse2 confirmationResponse) {
@@ -296,11 +311,11 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         item.setPureRange("");
         // 燃油类型:A=汽油
         item.setPmFuelType("A");
-        // 验车状态:4=已验
-        item.setCarCheckStatus("4");
-        item.setActualValue(currentValue);
+        // 验车状态: 1=已验
+        item.setCarCheckStatus("1");
+        item.setActualValue("");//设置有值会出现价格实际价格与系统计算价格不一致问题
         item.setOtherNature7BI("0");
-        item.setNegotiatedValue(currentValue);
+        item.setNegotiatedValue("");//设置有值会出现价格实际价格与系统计算价格不一致问题
         // 新车标志:0=非新车
         item.setNewVehicleFlag("0");
         item.setLicenseNo(quoteVo.getCarInfoVo().getLicenseNo());
@@ -309,7 +324,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         item.setVinNo(quoteVo.getCarInfoVo().getVinNo());
         item.setNoLicenseFlag("");
         item.setLicenseColorCode(carApiResponse.getData().getJyCarModelFill().getPlateNoColor());
-        item.setUseNatureCode(quoteVo.getCarInfoVo().getCarNatureCode());
+        item.setUseNatureCode("8A"); // 8A=非营运
         item.setMainCarKindCode("A");
         item.setCarKindCode("A0");
 
@@ -319,12 +334,12 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         // 新车购置价(元)
         item.setPurchasePrice(carApiResponse.getData().getPrpDCarModels().get(0).getPurchasePrice());
         item.setBasePurchasePrice(carApiResponse.getData().getPrpDCarModels().get(0).getPurchasePrice());
-        item.setExhaustScale(Double.parseDouble(carApiResponse.getData().getPrpDCarModels().get(0).getExhaustScale()));
+        item.setExhaustScale(carApiResponse.getData().getPrpDCarModels().get(0).getExhaustScale() == null ? "" : String.valueOf(carApiResponse.getData().getPrpDCarModels().get(0).getExhaustScale()));
         item.setEnrollDate(quoteVo.getCarInfoVo().getRegisterDate());
         item.setUseYearsBI("");
         item.setUseYearsCI(0);
-        item.setUseYearsDI("");
-        item.setChgOwnerFlag(quoteVo.getCarInfoVo().getChgOwnerFlag());
+        item.setUseYearsDI(0);
+        item.setChgOwnerFlag(ObjectUtils.isEmpty(quoteVo.getCarInfoVo().getChgOwnerFlag()) ? "0" : quoteVo.getCarInfoVo().getChgOwnerFlag());
         item.setChgTypeFlag("0");
         //转移登记日期
         item.setChgOwnerDate(quoteVo.getCarInfoVo().getIssueDate());
@@ -340,7 +355,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         item.setMakeDate("");
         // 车辆品牌
         item.setVehicleBrand(carApiResponse.getData().getPrpDCarModels().get(0).getCarBrand());
-        item.setCompleteKerbMass(Integer.parseInt(carApiResponse.getData().getPrpDCarModels().get(0).getCompleteKerbMass()));
+        item.setCompleteKerbMass(ObjectUtils.isEmpty(carApiResponse.getData().getPrpDCarModels().get(0).getCompleteKerbMass()) ? 0 :Integer.parseInt(carApiResponse.getData().getPrpDCarModels().get(0).getCompleteKerbMass()));
         item.setLicenseKindCode(quoteVo.getCarInfoVo().getLicenseKindCode());
         item.setLicenseCategory(quoteVo.getCarInfoVo().getCarTypeCode());
         // 商业险续保标志:0=非续保
@@ -440,12 +455,12 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
 
         // 被保险人
         insuredList.add(createInsured2("2", "", quoteVo.getInsuredPersonInfo().getIdentifyNumber(), "01", quoteVo.getInsuredPersonInfo().getName(),
-                "2", "1", "1", "3", "", quoteVo.getInsuredPersonInfo().getMobile(), quoteVo.getInsuredPersonInfo().getAddr(),
+                "1", "1", "1", "3", "", quoteVo.getInsuredPersonInfo().getMobile(), quoteVo.getInsuredPersonInfo().getAddr(),
                 quoteVo.getInsuredPersonInfo().getPostCode(), quoteVo.getInsuredPersonInfo().getPostAddress(), quoteVo.getInsuredPersonInfo().getOrganizationCode(),
                 quoteVo.getInsuredPersonInfo().getAge(), birthDate, "", "01", "008zg", quoteVo.getInsuredPersonInfo().getEmail(), "", "汉", null, quoteVo.getInsuredPersonInfo().getAddr(), null, null, "1", "", "",
                 "0", "", "", "", "1", "1", "0", "", "", "", ""));
         // 车主
-        insuredList.add(createInsured3("3", "", quoteVo.getOwnersInfo().getIdentifyNumber(), "01", quoteVo.getOwnersInfo().getName(), "2", "1", "1", "3", "",
+        insuredList.add(createInsured3("3", "", quoteVo.getOwnersInfo().getIdentifyNumber(), "01", quoteVo.getOwnersInfo().getName(), "3", "1", "1", "1", "",
                 quoteVo.getOwnersInfo().getMobile(), quoteVo.getOwnersInfo().getAddr(), quoteVo.getOwnersInfo().getPostCode(), quoteVo.getOwnersInfo().getPostAddress(), quoteVo.getOwnersInfo().getOrganizationCode(),
                 quoteVo.getOwnersInfo().getAge(), birthDate, "", "", "",
                 "", "", "", "", "", "", "", "", "", "", ""));
@@ -546,7 +561,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         insured.setEmail(email);
         insured.setBusinessLicenseType(businessLicenseType);
         insured.setNation(nation);
-        insured.setIdentifyIssuer(null);
+        insured.setIdentifyIssuer(identifyIssuer);
         //证件地址
         insured.setIdentifyAddress(identifyAddress);
         insured.setIdentifyStartDate(identifyStartDate);
@@ -599,7 +614,6 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      * @param carInsuredRelation
      * @param businessSort
      * @param linkerName
-     * @param isSpecialDInsured
      * @param specialDInsuredName
      * @param specialDInsuredIDType
      * @param specialDInsuredID
@@ -760,7 +774,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         insured.setIsIndividualBusi("");
         insured.setEmail(email);
         insured.setBusinessLicenseType(businessLicenseType);
-
+        insured.setIdentifyIssuer(null);
         insured.setNation(nation);
         //证件地址
         insured.setIdentifyAddress(identifyAddress);
@@ -1002,35 +1016,83 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      */
     private List<BoHaiCrawlerQuotationRequest2.ItemKind> buildSyItemKindList(QuoteVo quoteVo) {
         List<BoHaiCrawlerQuotationRequest2.ItemKind> itemKinds = new java.util.ArrayList<>();
+        // 构建商业险险种
+        buildSyItemKindList(quoteVo, itemKinds);
+        // 构建驾意险险种
+        buildJyItemKindList(quoteVo, itemKinds);
+        return itemKinds;
+    }
 
+    /**
+     * 构建商业险险种列表
+     * @param quoteVo
+     * @param itemKinds
+     */
+    private void buildSyItemKindList(QuoteVo quoteVo, List<BoHaiCrawlerQuotationRequest2.ItemKind> itemKinds) {
         List<KindInfoVo> kindInfoVo = quoteVo.getKindInfoVo();
-        for (int i = 0; i < kindInfoVo.size(); i++) {
-            BoHaiCrawlerQuotationRequest2.ItemKind item = new BoHaiCrawlerQuotationRequest2.ItemKind();
-            item.setItemKindNo((i + 1) + "");
-            item.setKindCode(kindInfoVo.get(i).getKindCode());
-            item.setKindName(kindInfoVo.get(i).getKindName());
-            item.setOperateType("");
-            item.setStartDate(kindInfoVo.get(i).getStartDate());
-            item.setStartHour("0");
-            item.setEndDate(kindInfoVo.get(i).getEndDate());
-            item.setEndHour("24");
-            item.setAmount(kindInfoVo.get(i).getAmount());
-            item.setUnitAmount("");
-            item.setQuantity("");
-            item.setModeCode("");
-            item.setModeName("");
-            item.setShortRateFlag("3");
-            item.setShortRate("");
-            item.setCalculateFlag("Y");
-            item.setRate("");
-            item.setNotDeductibleFlag("0");
-            item.setDeductibleRatio("");
-            item.setDiscount("");
-            item.setAdjustRate("");
-            item.setValue("");
-            itemKinds.add(item);
+        if (kindInfoVo != null) {
+            for (int i = 0; i < kindInfoVo.size(); i++) {
+                BoHaiCrawlerQuotationRequest2.ItemKind item = buildBaseItemKind(i + 1);
+                KindInfoVo kind = kindInfoVo.get(i);
+                item.setKindCode(kind.getKindCode());
+                item.setKindName(kind.getKindName());
+                item.setStartDate(kind.getStartDate());
+                item.setEndDate(kind.getEndDate());
+                item.setAmount(kind.getAmount());
+                itemKinds.add(item);
+            }
         }
-        return itemKinds;
+    }
+
+    /**
+     * 构建交驾意险险种列表
+     * @param quoteVo
+     * @param itemKinds
+     */
+    private void buildJyItemKindList(QuoteVo quoteVo, List<BoHaiCrawlerQuotationRequest2.ItemKind> itemKinds) {
+        List<AccidentalDrivingVo> accidentalDrivings = quoteVo.getAccidentalDrivings();
+        if (!CollectionUtils.isEmpty(accidentalDrivings)) {
+            int startIndex = itemKinds.size() + 1;
+            for (int i = 0; i < accidentalDrivings.size(); i++) {
+                BoHaiCrawlerQuotationRequest2.ItemKind item = buildBaseItemKind(startIndex + i);
+                AccidentalDrivingVo driving = accidentalDrivings.get(i);
+                item.setKindCode("O");
+                item.setKindName(driving.getProductName());
+                item.setStartDate(DateTimeUtil.parseLocalDateToString(quoteVo.getCiRiskInfoVo().getStartDate(), DateTimeUtil.DATE_PATTERN));
+                item.setEndDate(DateTimeUtil.parseLocalDateToString(quoteVo.getCiRiskInfoVo().getEndDate(), DateTimeUtil.DATE_PATTERN));
+                item.setAmount(driving.getSumAmount());
+                item.setUnitAmount("10000.00"); // 这个金额不能为空,暂时按最低保额写死
+                item.setQuantity(String.valueOf(driving.getQuantity()));
+                itemKinds.add(item);
+            }
+        }
+    }
+
+    /**
+     * 构建 商业险险种 and 驾意险险种 通用字段设置
+     *
+     * @param itemKindNo 险种序号
+     * @return BoHaiCrawlerQuotationRequest2.ItemKind
+     */
+    private BoHaiCrawlerQuotationRequest2.ItemKind buildBaseItemKind(int itemKindNo) {
+        BoHaiCrawlerQuotationRequest2.ItemKind item = new BoHaiCrawlerQuotationRequest2.ItemKind();
+        item.setItemKindNo(String.valueOf(itemKindNo));
+        item.setOperateType("");
+        item.setStartHour("0");
+        item.setEndHour("24");
+        item.setUnitAmount("");
+        item.setModeCode("");
+        item.setModeName("");
+        item.setShortRateFlag("3");
+        item.setShortRate("");
+        item.setCalculateFlag("Y");
+        item.setRate("");
+        item.setNotDeductibleFlag("0");
+        item.setDeductibleRatio("");
+        item.setDiscount("");
+        item.setAdjustRate("");
+        item.setValue("");
+        return item;
     }
 
     /**
@@ -1045,17 +1107,17 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         // 农业标志:012001=非农业
         mainInfo.setAgriflag("012001");
         mainInfo.setClassCode("");
-        // 险种代码:0380=商业险
-        mainInfo.setRiskCode("0380");
+        // 险种代码:0380=商业险 0382=交强险+驾意险
+        mainInfo.setRiskCode("0382");
         mainInfo.setContractNo("");
         mainInfo.setDiscount("");
         mainInfo.setCurrency("CNY");
         mainInfo.setLastPolicyNo("");
         // 续保标志:0=非续保,1=续保
         mainInfo.setRenewalFlag("0");
-        mainInfo.setStartDate(quoteVo.getBiRiskInfoVo().getStartDate());
+        mainInfo.setStartDate(quoteVo.getBiRiskInfoVo() != null ? DateTimeUtil.parseLocalDateToString(quoteVo.getBiRiskInfoVo().getStartDate(), DateTimeUtil.DATE_PATTERN) : DateTimeUtil.parseLocalDateToString(quoteVo.getCiRiskInfoVo().getStartDate(), DateTimeUtil.DATE_PATTERN));
         mainInfo.setStartHour("0");
-        mainInfo.setEndDate(quoteVo.getBiRiskInfoVo().getEndDate());
+        mainInfo.setEndDate(quoteVo.getBiRiskInfoVo() != null ? DateTimeUtil.parseLocalDateToString(quoteVo.getBiRiskInfoVo().getEndDate(), DateTimeUtil.DATE_PATTERN) : DateTimeUtil.parseLocalDateToString(quoteVo.getCiRiskInfoVo().getEndDate(), DateTimeUtil.DATE_PATTERN));
         mainInfo.setEndHour("24");
         mainInfo.setImmediatelyActiveFlag("");
         // 生效开始时间
@@ -1067,7 +1129,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         mainInfo.setSpecialContractSummary("");
         mainInfo.setNoneFluctuateFlag("");
         // 无赔款优待系数(NCD):1=无优惠
-        mainInfo.setNcdCoefficient("1");
+        mainInfo.setNcdCoefficient("");
         mainInfo.setChannelCoefficient("1.00");
         mainInfo.setUnderwritingCoefficient("");
         mainInfo.setAdjustCoefficient("");
@@ -1079,7 +1141,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         mainInfo.setProposalNo("");
         // 客户属性:001=普通客户
         mainInfo.setCustomerProperty("001");
-        mainInfo.setRiskCoefficient("362001");
+        mainInfo.setRiskCoefficient("362001");// 渤海是362000
         mainInfo.setBusinessCoefficient("363000");
         mainInfo.setVehicleCoefficient("000");
         mainInfo.setCustomerCoefficient("364001");
@@ -1098,7 +1160,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         mainInfo.setPriceId("");
         mainInfo.setNoTaxAmount("");
         mainInfo.setTaxAmount("");
-        mainInfo.setPricingAdjustValue("");
+        mainInfo.setPricingAdjustValue("1");
         mainInfo.setExpPricingAdjustValue("");
         mainInfo.setNoneFluctuateFeeRate("");
         return mainInfo;
@@ -1107,13 +1169,19 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
     /**
      * 处理报价响应
      *
-     * @param quoteVo                        报价Vo
-     * @param boHaiCrawlerQuotationResponse2 报价响应
+     * @param quoteVo 报价Vo
+     * @param response 报价响应
      * @return QuoteResultsVo
      */
     private QuoteResultsVo handleQuotationResponse(QuoteVo quoteVo, BoHaiCrawlerQuotationResponse2 response) {
         if (ResponseCode.Quotation_Failed.getCode().equals(response.getHead().getReturnCode())) {
             log.info("报价失败");
+            // 检查是否为重复投保
+            String returnMessage = response.getHead().getReturnMessage();
+            if (returnMessage != null && returnMessage.contains("发生重复投保")) {
+                log.info("检测到重复投保,尝试重新报价");
+                return handleRepeatInsurance(quoteVo, response, returnMessage);
+            }
             // 报价失败
             boHaiCrawlerOrderService.save(quoteVo, response, false);
             return BoHaiCrawlerQuoteResultsVoBuild.buildQuoteFailResultsVo(response);
@@ -1124,6 +1192,106 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         return BoHaiCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), quoteVo, response);
     }
 
+    /**
+     * 处理重复投保情况
+     *
+     * @param quoteVo 报价Vo
+     * @param response 报价响应
+     * @param returnMessage 返回消息
+     * @return QuoteResultsVo
+     */
+    private QuoteResultsVo handleRepeatInsurance(QuoteVo quoteVo, BoHaiCrawlerQuotationResponse2 response, String returnMessage) {
+        try {
+            log.info("开始处理重复投保情况");
+            
+            // 从错误消息中提取终保日期
+            String endDateStr = extractEndDateFromErrorMessage(returnMessage);
+            if (endDateStr == null || endDateStr.isEmpty()) {
+                log.warn("无法从错误消息中提取终保日期,直接返回失败结果");
+                boHaiCrawlerOrderService.save(quoteVo, response, false);
+                return BoHaiCrawlerQuoteResultsVoBuild.buildQuoteFailResultsVo(response);
+            }
+            
+            log.info("提取到的终保日期: {}", endDateStr);
+            
+            // 计算新的保险期间:从原终保日期开始,到一年后结束
+            String newStartDate = endDateStr + ":00"; // 添加秒部分
+            String newEndDate = DateUtil.getNextYearDateStr(newStartDate);
+            
+            log.info("新的保险期间 - 开始日期: {}, 结束日期: {}", newStartDate, newEndDate);
+            
+            // 更新报价请求中的保险期间
+            updateInsurancePeriod(quoteVo, newStartDate, newEndDate);
+            
+            // 重新执行报价流程
+            return executeQuotation(quoteVo);
+            
+        } catch (Exception e) {
+            log.error("处理重复投保异常", e);
+            // 如果处理重复投保过程中出现异常,返回原始失败结果
+            boHaiCrawlerOrderService.save(quoteVo, response, false);
+            return BoHaiCrawlerQuoteResultsVoBuild.buildQuoteFailResultsVo(response);
+        }
+    }
+
+    /**
+     * 从错误消息中提取终保日期
+     *
+     * @param errorMessage 错误消息
+     * @return 终保日期字符串
+     */
+    private String extractEndDateFromErrorMessage(String errorMessage) {
+        try {
+            // 使用StringSubStringUtils工具类提取终保日期
+            String endDate = StringSubStringUtils.subjectStringContentByTrafficPolicyDTOBenginDate(errorMessage, ":", "终保日期");
+            if (endDate != null && !endDate.isEmpty()) {
+                // 清理日期格式,移除可能的空格
+                return endDate.trim();
+            }
+            
+            // 如果上面的方法没有提取到,尝试另一种格式
+            endDate = StringSubStringUtils.subjectStringContentByBusinessPolicyEndDate(errorMessage, "终保日期:");
+            if (endDate != null && !endDate.isEmpty()) {
+                return endDate.trim();
+            }
+            
+            log.warn("无法从错误消息中提取终保日期: {}", errorMessage);
+            return null;
+        } catch (Exception e) {
+            log.error("提取终保日期异常", e);
+            return null;
+        }
+    }
+
+    /**
+     * 更新报价请求中的保险期间
+     *
+     * @param quoteVo 报价Vo
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     */
+    private void updateInsurancePeriod(QuoteVo quoteVo, String startDate, String endDate) {
+        try {
+            // 更新交强险的保险期间
+            if (quoteVo.getCiRiskInfoVo() != null) {
+                quoteVo.getCiRiskInfoVo().setStartDate(startDate.substring(0, 10)); // 只取日期部分
+                quoteVo.getCiRiskInfoVo().setEndDate(endDate.substring(0, 10));
+                log.info("已更新交强险保险期间 - 开始日期: {}, 结束日期: {}", 
+                    quoteVo.getCiRiskInfoVo().getStartDate(), quoteVo.getCiRiskInfoVo().getEndDate());
+            }
+            
+            // 更新商业险的保险期间
+            if (quoteVo.getBiRiskInfoVo() != null) {
+                quoteVo.getBiRiskInfoVo().setStartDate(startDate.substring(0, 10));
+                quoteVo.getBiRiskInfoVo().setEndDate(endDate.substring(0, 10));
+                log.info("已更新商业险保险期间 - 开始日期: {}, 结束日期: {}", 
+                    quoteVo.getBiRiskInfoVo().getStartDate(), quoteVo.getBiRiskInfoVo().getEndDate());
+            }
+        } catch (Exception e) {
+            log.error("更新保险期间异常", e);
+        }
+    }
+
     /**
      * 核保
      *
@@ -1508,18 +1676,18 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         bodyDTO.setBasicRateCode("");
         // 登录机构编码,先写死
         bodyDTO.setComCode("14070201");
-        bodyDTO.setEffectiveDate(quoteVo.getCiRiskInfoVo().getStartDate());
-        bodyDTO.setExpireDate(quoteVo.getCiRiskInfoVo().getEndDate());
+        bodyDTO.setEffectiveDate(DateTimeUtil.parseLocalDateToString(quoteVo.getCiRiskInfoVo().getStartDate(), DateTimeUtil.DATE_PATTERN));
+        bodyDTO.setExpireDate(DateTimeUtil.parseLocalDateToString(quoteVo.getCiRiskInfoVo().getEndDate(), DateTimeUtil.DATE_PATTERN));
         bodyDTO.setEndHour("24");
         bodyDTO.setStartHour("0");
-        bodyDTO.setRiskCode(quoteVo.getProductId());
-        bodyDTO.setBusinessNature(quoteVo.getCarInfoVo().getCarNatureCode());
-        bodyDTO.setEngineNo(boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getEngineNumber());
-        bodyDTO.setVin(boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getVinCode());
+        bodyDTO.setRiskCode(quoteVo.getOrder().getProductId());// 0380-交强险
+        bodyDTO.setBusinessNature("0");// 传0可以,赋值传参报错,不清楚含义
+        bodyDTO.setEngineNo(ObjectUtils.isEmpty(boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getEngineNumber()) ? quoteVo.getCarInfoVo().getEngineNo() : boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getEngineNumber());
+        bodyDTO.setVin(boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getVinCodeRe());
         bodyDTO.setLicensePlateNo(boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getPlateNumber());
         //车牌类型
         bodyDTO.setLicensePlateType(quoteVo.getCarInfoVo().getLicenseKindCode());
-        bodyDTO.setFirstRegisterDate(boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getRegisterDate());
+        bodyDTO.setFirstRegisterDate(ObjectUtils.isEmpty(boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getRegisterDate()) ? quoteVo.getCarInfoVo().getRegisterDate() : boHaiCrawlerCarApiResponse.getData().getJyCarModelFill().getRegisterDate());
         bodyDTO.setModelCode(boHaiCrawlerCarApiResponse.getData().getPrpDCarModels().get(0).getIndustryCarTypeCode());
         //平台车型代码
         bodyDTO.setPlatFormModelCode(boHaiCrawlerCarApiResponse.getData().getPrpDCarModels().get(0).getIndustryCarTypeCode());
@@ -1532,8 +1700,8 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
 
         //车辆动力参数
         //排量
-        bodyDTO.setExhaustScale(Double.parseDouble(quoteVo.getCarInfoVo().getDisplacement()));
-        bodyDTO.setDisplacement("");
+        bodyDTO.setExhaustScale(ObjectUtils.isEmpty(quoteVo.getCarInfoVo().getDisplacement()) ? 0.0 : Double.parseDouble(quoteVo.getCarInfoVo().getDisplacement()));
+        bodyDTO.setDisplacement(ObjectUtils.isEmpty(quoteVo.getCarInfoVo().getDisplacement()) ? 0.0 : Double.parseDouble(quoteVo.getCarInfoVo().getDisplacement()));
         bodyDTO.setPower(quoteVo.getCarInfoVo().getPowerScale());
         bodyDTO.setModelEnergyType(quoteVo.getCarInfoVo().getEnergyTypeCode());
         bodyDTO.setPureRange("");
@@ -1550,7 +1718,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         bodyDTO.setRatedPassengerCapacity(quoteVo.getCarInfoVo().getSeatCount());
         bodyDTO.setLimitLoadPerson(quoteVo.getCarInfoVo().getSeatCount());
         bodyDTO.setTonnage("0.0000");
-        bodyDTO.setLimitLoad(quoteVo.getCarInfoVo().getLimitLoad());
+        bodyDTO.setLimitLoad("0".equals(quoteVo.getCarInfoVo().getLimitLoad()) ? "0.0000" : quoteVo.getCarInfoVo().getLimitLoad());
         bodyDTO.setWholeWeight(quoteVo.getCarInfoVo().getCompleteKerbMass());
 
         //价格与价值信息
@@ -1570,6 +1738,11 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         bodyDTO.setCarOwnerIdentifyType("01");
         bodyDTO.setSalesChannelRefCode("");
         bodyDTO.setPrecisePriceComCode(true);
+        bodyDTO.setOwnerName("");
+        bodyDTO.setOwnerCertificateType("01");
+        bodyDTO.setOwnerCertificateNum("");
+        bodyDTO.setCertificateType("");
+        bodyDTO.setCertificateNo("");
         boHaiCrawlerVehicleConfirmationReqeust1.setBody(bodyDTO);
         log.info("[车辆确认]请求参数的值:{}", JSON.toJSONString(boHaiCrawlerVehicleConfirmationReqeust1));
         //调用车辆确认接口

+ 2 - 2
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/PythonExecutor.java

@@ -307,8 +307,8 @@ public class PythonExecutor {
         }*/
         // 获取token的值
         String token = PythonExecutor.executeAndGetToken(
-                "e:/project/jzg/tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py",
-                "E:\\project\\memorize_backend\\venv\\Scripts\\python.exe", 120);
+                "E:/IdeaProjects/jzg/tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py",
+                "C:/Users/Administrator/AppData/Local/Programs/Python/Python312/python.exe", 120);
         if (token != null) {
             System.out.println("获取到的token: " + token);
         } else {

+ 3 - 3
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/novel.py

@@ -116,9 +116,10 @@ class BHBX_login():
 # 账号:114050281   密码:Bhcx1234  openId  odviKt0g-CP5NVNnZKiHEStPbRoU
 
 usernamelist = [
-    {"username":"114050281","passward":"Bhcx1234","openId":"odviKt0g-CP5NVNnZKiHEStPbRoU"} # odviKt0g-CP5NVNnZKiHEStPbRoU
+    {"username":"114050281","passward":"Bhcx1234","openId":"odviKt0g-CP5NVNnZKiHEStPbRoU"}, # odviKt0g-CP5NVNnZKiHEStPbRoU
+    {"username":"114050287","passward":"Bhcx1234","openId":"odviKt0g-CP5NVNnZKiHEStPbRIU"}, # odviKt0g-CP5NVNnZKiHEStPbRoU
 ]
-username = "114050281"
+username = "114050287"
 password = ""
 openId = ""
 for item in usernamelist:
@@ -132,4 +133,3 @@ if openId == "":
 bhbx = BHBX_login(username,password,openId)
 print(bhbx.login())
 
-

+ 1 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java

@@ -239,6 +239,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
         CarModelQueryResponse.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getVehicleList(), carInfoVo);
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        underwritingResultsVo.setCompanyOrderNo(underwritingVo.getInsOrders().getCompanyOrderNo());
         // 核保
         SubmitRequest submitRequest = new SubmitRequest(underwritingVo,vehicle, parameters);
         SubmitResponse submitResponse = chengTaiRequestApiComponent.submit(submitRequest,apiUrl);

+ 5 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/DetectLoginRequest.java

@@ -29,4 +29,9 @@ public class DetectLoginRequest {
      * 密码
      */
     private String password;
+
+    /**
+     * 产品id 众安登录用
+     */
+    private String productId;
 }

+ 10 - 2
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateTimeUtil.java

@@ -136,8 +136,16 @@ public class DateTimeUtil {
      * @return String 日期
      */
     public static String parseLocalDateToString(String localDateStr, String pattern) {
-        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
-        return LocalDate.parse(localDateStr, dateTimeFormatter).toString();
+        // 判断是否包含时间部分
+        if (localDateStr.contains(" ") || localDateStr.contains(":")) {
+            // 包含时间部分,先解析为LocalDateTime,再提取日期
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATETIME_PATTERN);
+            return LocalDateTime.parse(localDateStr, dateTimeFormatter).toLocalDate().toString();
+        } else {
+            // 仅日期部分,直接解析为LocalDate
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
+            return LocalDate.parse(localDateStr, dateTimeFormatter).toString();
+        }
     }
 
 

+ 13 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java

@@ -10,6 +10,7 @@ import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.exception.TokenExpireException;
+import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.client.PlatformClient;
@@ -41,6 +42,8 @@ import org.springframework.util.CollectionUtils;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.List;
 import java.util.Optional;
 
@@ -118,6 +121,12 @@ public class GuoRenCrawlerRequestComponent {
      */
     public <Response> Response request(RequestUrl requestUrl, Object body, Class<Response> responseClass, HttpHeaders httpHeaders) {
         String url = guoRenCrawlerProperties.getBaseUrl() + requestUrl.getUri();
+        // 校验是否为合法 URL
+        try {
+            new URL(url);
+        } catch (MalformedURLException e) {
+            return null;
+        }
         ResponseEntity<Response> responseResponseEntity = requestComponent.objectPost(url, body, responseClass, httpHeaders);
         return responseResponseEntity.getBody();
     }
@@ -132,6 +141,7 @@ public class GuoRenCrawlerRequestComponent {
     public IdentifyCodeDataResponse identifyCode(String username) {
         GuoRenCrawlerIdentifyCodeRequest identifyCodeRequest = new GuoRenCrawlerIdentifyCodeRequest(username);
         IdentifyCodeDataResponse request = request(RequestUrl.IDENTIFY_CODE, identifyCodeRequest, IdentifyCodeDataResponse.class, new HttpHeaders());
+        AssertionUtils.isEmpty(request, "验证码请求失败,未获取到验证码编号");
         if (request.getResultCode() != 0) {
             throw new SystemException(request.getResultMsg());
         }
@@ -471,8 +481,9 @@ public class GuoRenCrawlerRequestComponent {
      */
     public GuoRenCrawlerQueryPrpallProposalInfoData queryPrpallProposalInfo(String loginUserCode, String loginComCode, String proposalNo, HttpHeaders httpHeaders) {
         GuoRenCrawlerQueryPrpallProposalInfoRequest queryPrpallProposalInfoRequest = new GuoRenCrawlerQueryPrpallProposalInfoRequest(loginUserCode, loginComCode, proposalNo);
-        List<GuoRenCrawlerQueryPrpallProposalInfoData> queryPrpallProposalInfoData = request(RequestUrl.QUERY_PRPALL_PROPOSAL_INFO, queryPrpallProposalInfoRequest, httpHeaders);
-        return queryPrpallProposalInfoData.get(0);
+        GuoRenCrawlerBaseResponse<List<GuoRenCrawlerQueryPrpallProposalInfoData>> response = request(RequestUrl.QUERY_PRPALL_PROPOSAL_INFO, queryPrpallProposalInfoRequest, new ParameterizedTypeReference<>() {
+        }, httpHeaders);
+        return response.getData().get(0);
     }
 
     /**

+ 6 - 4
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerGetCarPriceRequest.java

@@ -4,10 +4,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.guoren.crawler.entity.dto.PrpTMainDTO;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerQueryByVinNoData;
-import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerQueryCarModelData;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerWriteBackAddressData;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -622,15 +622,17 @@ public class GuoRenCrawlerGetCarPriceRequest {
 
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+        InsOrdersOtherInfoVo otherInfo = quoteVo.getOtherInfo();
+
         this.licenseNo = carInfoVo.getLicenseNo();
         this.vinNo = carInfoVo.getVinNo();
         this.engineNo = carInfoVo.getEngineNo();
         this.carIdentifyType = "01";
         this.rateCode = "20";
         this.loanVehicleFlag = "0";
-        this.chgOwnerFlag = "0";
-        this.ciChgOwnerFlag = "0";
-        this.biChgOwnerFlag = "0";
+        this.chgOwnerFlag =String.valueOf(otherInfo.getTransfer());
+        this.ciChgOwnerFlag = String.valueOf(otherInfo.getTransfer());
+        this.biChgOwnerFlag = String.valueOf(otherInfo.getTransfer());
         this.newDeviceFlag = "0";
         this.chargingpostFlag = "0";
         this.productType = "0101";

+ 4 - 4
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java

@@ -28,13 +28,12 @@ import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerInitSelectRe
 import com.jzg.quotation.guoren.crawler.entity.response.*;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerQuoteProcessService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.http.util.TextUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 
-import java.util.Map;
-import java.util.stream.Collectors;
-
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteProcessService {
@@ -114,8 +113,9 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
         String token = guoRenCrawlerCacheComponent.getToken(username);
 //        String token = "eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3Nzg5MjY2MDB9.UYGTs0DQgbZJinMWJExUV18JhfJW23JonveQVVq6N5Muy_vu6Py8pL-AI5Ohv0BDoCCfdOD7SjLmiCqGy4uU9130O1_QlLzyxsriiBKUPXPJKbipftpqSdjYyFSgfNSIySO99hs005Ip89HnkaT34ephMA-C8jyyxGShQdNkuxI";
         if (!StringUtils.hasText(token)) {
-            throw new TokenExpireException();
+            throw new TokenExpireException("500", "国任财险账号登录过期,请重新登录");
         }
+        log.info("国任账号登录信息:{}", token);
         headers.add(HttpHeaders.AUTHORIZATION, token);
         return headers;
     }

+ 58 - 10
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java

@@ -1,43 +1,38 @@
 package com.jzg.quotation.guoren.crawler.service.impl;
 
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
-import com.jzg.commons.core.page.HttpResult;
-import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
+import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
-import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
-import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.TimeProcessing;
-import com.jzg.quotation.guoren.api.entity.Response.IdentifyCodeDataResponse;
 import com.jzg.quotation.guoren.crawler.build.GuoRenCrawlerQuoteResultsVoBuild;
-import com.jzg.quotation.guoren.crawler.component.GuoRenCrawlerCacheComponent;
 import com.jzg.quotation.guoren.crawler.component.GuoRenCrawlerRequestComponent;
 import com.jzg.quotation.guoren.crawler.constant.enums.RequestUrl;
 import com.jzg.quotation.guoren.crawler.entity.GuoRenCrawlerConfigureParameters;
+import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
 import com.jzg.quotation.guoren.crawler.entity.dto.PrpTMainDTO;
 import com.jzg.quotation.guoren.crawler.entity.po.GuoRenCrawlerOrder;
 import com.jzg.quotation.guoren.crawler.entity.po.OrderCommon;
 import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerCalculationPremiumRequest;
-import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
 import com.jzg.quotation.guoren.crawler.entity.response.*;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerOrderService;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerQuoteProcessService;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerRequest;
 import lombok.RequiredArgsConstructor;
-import org.apache.http.util.TextUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -236,10 +231,63 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
     }
 
     @Override
-    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws Exception {
+    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         OrderCommon orderCommon = getOrderCommon(orderStatusVo.getOrder());
         GuoRenCrawlerQueryPrpallProposalInfoData queryPrpallProposalInfo = guoRenCrawlerRequestComponent.queryPrpallProposalInfo(orderCommon.getUsername(), orderCommon.getComCode(), orderCommon.getBusinessNo(), orderCommon.getHttpHeaders());
-        return new OrderStatusResultVo();
+        OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
+        if (queryPrpallProposalInfo == null) {
+            return orderStatusResultVo;
+        }
+
+        // 获取订单信息
+        GuoRenCrawlerOrder guoRenCrawlerOrder = guoRenCrawlerOrderService.getById(orderStatusVo.getOrder().getOrdersNo());
+        InsOrders insOrders = orderStatusVo.getInsOrders();
+
+        List<String> proposalNos = queryPrpallProposalInfo.getProposalNo();
+        List<String> policyNos = queryPrpallProposalInfo.getPolicyNo();
+        String underWriteFlag = queryPrpallProposalInfo.getUnderWriteFlag();
+
+        // 匹配交强和商业投保单的索引(平行数组,索引一一对应)
+        int ciIndex = proposalNos != null ? proposalNos.indexOf(guoRenCrawlerOrder.getCiPolicyNumber()) : -1;
+        int biIndex = proposalNos != null ? proposalNos.indexOf(guoRenCrawlerOrder.getBiPolicyNumber()) : -1;
+
+        // 获取交强和商业的保单号
+        String ciPolicyNo = ciIndex >= 0 && proposalNos != null && ciIndex < proposalNos.size() ? proposalNos.get(ciIndex) : null;
+        String biPolicyNo = biIndex >= 0 && proposalNos != null && biIndex < proposalNos.size() ? proposalNos.get(biIndex) : null;
+
+        boolean auditPassed = "1".equals(underWriteFlag);
+        boolean ciHasPolicy = StringUtils.hasLength(ciPolicyNo);
+        boolean biHasPolicy = StringUtils.hasLength(biPolicyNo);
+
+        // 待核保状态 → 核保通过 → 待缴费(与API版逻辑保持一致)
+        if (insOrders != null && InsOrderStatusEnum.WAIT_AUDIT.getCode().equals(insOrders.getOrderStatus())) {
+            // 单交 / 单商 / 交商 任一核保通过即转为待缴费
+            boolean jqBoo = ciIndex >= 0 && biIndex < 0 && auditPassed;
+            boolean syBoo = biIndex >= 0 && ciIndex < 0 && auditPassed;
+            boolean jqSyBoo = ciIndex >= 0 && biIndex >= 0 && auditPassed;
+            if (jqBoo || syBoo || jqSyBoo) {
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(orderStatusVo.getOrder());
+                PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                orderStatusResultVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+            }
+        }
+
+        // 保单号存在 → 已承保/已出单
+        if (ciHasPolicy || biHasPolicy) {
+            if (ciHasPolicy) {
+                orderStatusResultVo.setJqPolicyno(ciPolicyNo);
+                orderStatusResultVo.setJqApplyNo(guoRenCrawlerOrder.getCiPolicyNumber());
+            }
+            if (biHasPolicy) {
+                orderStatusResultVo.setSyPolicyno(biPolicyNo);
+                orderStatusResultVo.setSyApplyNo(guoRenCrawlerOrder.getBiPolicyNumber());
+            }
+            orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
+        }
+
+        return orderStatusResultVo;
     }
 
     private OrderCommon getOrderCommon(OrderBase orderBase) {

+ 5 - 7
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -42,17 +42,15 @@ import com.jzg.quotation.hengbang.crawler.properties.HengBangCrawlerProperties;
 import com.jzg.quotation.hengbang.crawler.service.HbCrawlerOrderService;
 import com.jzg.quotation.hengbang.crawler.service.HengBangCrawlerRequest;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.compress.utils.IOUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.util.StringUtils;
 
-
-import java.io.IOException;
-import java.io.InputStream;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.time.temporal.ChronoUnit;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -183,7 +181,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
             status = JSONObject.parseObject(resJson).getString("status");
         }
 
-        if (errorMsg.equals("成功") || status.equals("9")) {
+        if (errorMsg.equals("成功")) {
             errorMsg = "成功";
             // 5.2 报价第三步,获取报价数据
             proposalResponse = hbCrawlerRequestComponent.proposal(plyappno, headers);

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerCacheComponent.java

@@ -26,7 +26,7 @@ public class HuaNongCrawlerCacheComponent {
     // 授权信息
     public static final String AUTHORIZATION = "hunong:crawler:authorization:";
 
-    public static final long AUTHORIZATION_TIME = 3L;
+    public static final long AUTHORIZATION_TIME = 1L;
 
     public static final String TOKEN = "TOKEN";
 

+ 10 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/JiaYiXianProduct.java

@@ -35,8 +35,18 @@ public enum JiaYiXianProduct {
             new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.04, "30000", "3.0万元/座", " ", false),
             new CoverageConfig("F27002", "附加团体意外伤害医疗保险条款", "0008", "意外伤害医疗保险责任", 0.24, "1000", "0.1万元/座", "每次事故免赔300后80%比例赔付", false),
             new CoverageConfig("F27001", "附加团体意外伤害住院津贴保险条款", "0032", "意外伤害住院津贴保险责任", 0.2, "10", "0.001万元/座", "10元/天/座", true)
+    )),
+    ANXIANG_240("092", "好运连连(240)", true, Arrays.asList(
+            new CoverageConfig("Z27096-1", "交通出行团体意外伤害保险C款条款", "0955", "必选责任:意外伤害身故保险责任", 0.06, "30000", "3.0万元/座", " ", false),
+            new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.04, "30000", "3.0万元/座", " ", false),
+            new CoverageConfig("F27002", "附加团体意外伤害医疗保险条款", "0008", "意外伤害医疗保险责任", 0.24, "1000", "0.1万元/座", "每次事故免赔300后80%比例赔付", false),
+            new CoverageConfig("F27001", "附加团体意外伤害住院津贴保险条款", "0032", "意外伤害住院津贴保险责任", 0.2, "10", "0.001万元/座", "10元/天/座", true),
+            new CoverageConfig("F27047-5", "附加辅助金保险条款", "0094", "家庭辅助金", 0.015, "20000", "2.0万元/座", "", true),
+            new CoverageConfig("F27048-6", "附加救护车车费保险条款", "0095", "救护车费用", 0.2, "2000", "0.2万元/座", "", true)
+
     ));
 
+
     /**
      * 产品代码
      */

+ 3 - 3
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerQuotedPriceRequestRequest.java

@@ -1873,7 +1873,6 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
                 contractMainDTO.setChoosed(true);
                 contractMainDTO.setDiscount(100);
                 contractMainDTO.setExpenseRate("");
-                contractMainDTO.setExpiryDate("");
                 contractMainDTO.setInsuredObjectCode("7");
                 contractMainDTO.setInsuredObjectName("从车");
                 contractMainDTO.setIsRegistered("0");
@@ -1888,6 +1887,7 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
                 contractMainDTO.setProductionDate(TimeProcessing.nowDateTime());
                 contractMainDTO.setUnitPremium(0);
                 contractMainDTO.setValidDate(TimeProcessing.tomorrowDateTime());
+                contractMainDTO.setExpiryDate(TimeProcessing.plusOneYearToString(TimeProcessing.tomorrowDateTime()));
                 contractMainDTO.setCommissionRate(0);
                 contractMainDTO.setEachDamageLimitAmount("0");
                 return contractMainDTO;
@@ -2870,7 +2870,7 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
                     this.perRate = 0;
                     this.perRateExt = 0;
                     this.profitRate = 0;
-                    this.quantity = Integer.valueOf(kind.getQuantity());
+                    this.quantity = StringUtils.isEmpty(kind.getQuantity())?5:Integer.valueOf(kind.getQuantity()) ;
                     this.rate = 0;
                     this.returnPremium = 0;
                     this.seatCount = "";
@@ -2879,7 +2879,7 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
                     this.shortRateType = "";
                     this.surrenderPremium = 0;
                     this.term = "";
-                    this.unitAmount = Integer.valueOf(kind.getUnitAmount());
+                    this.unitAmount = StringUtils.isEmpty(kind.getUnitAmount())?1000000:Integer.valueOf(kind.getUnitAmount());
                     this.unitPremium = 0;
                     this.validDate = biRiskInfoVo.getStartDate();
                     this.vat = 0;

+ 2 - 2
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerGetTokenImpl.java

@@ -43,9 +43,9 @@ public class HuaNongCrawlerGetTokenImpl implements HuaNongCrawlerGetToken {
                               Predicate<T> validator) {
         try {
             T data = cacheSupplier.get();
-            /*if (validator.test(data)) {
+            if (validator.test(data)) {
                 return data;
-            }*/
+            }
             huaNongCrawlerQuoteProcessService.login(username, password,deviceId, false);
             T newData = cacheSupplier.get();
             if (!validator.test(newData)) {

+ 4 - 4
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java

@@ -151,14 +151,14 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
 
     private void authorization(String username, String password,String deviceId, boolean isFirst) {
         // 判断是否在首次登录(协议、账号)
-        if (!isFirst) {
+        /*if (!isFirst) {
             huaNongCrawlerCacheComponent.isAccountLockout(username);
-        }
+        }*/
         HuaNongCrawlerLoginResponse login = attemptLoginWithRetry(username, password,deviceId);
         // 判断是否在首次登录(协议、账号)
-        if (!isFirst) {
+        /*if (!isFirst) {
             huaNongCrawlerCacheComponent.accountLockout(username);
-        }
+        }*/
        /* String s = extractErrorMessage(login);
         throw new SystemException(s);*/
     }

+ 2 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java

@@ -315,7 +315,7 @@ public class QuoteVerificationAspect {
             return BigDecimal.ZERO;
         }
         BigDecimal inletPercent = convertPercent(costType.getInlet());
-        return inletPercent.subtract(entranceFeeRatio).setScale(5);
+        return inletPercent.subtract(entranceFeeRatio).setScale(5, RoundingMode.HALF_UP);
     }
 
     /**
@@ -366,7 +366,7 @@ public class QuoteVerificationAspect {
                 .setScale(5, RoundingMode.HALF_EVEN);
 
         // 计算应付金额(保费 * 出口比例,保留2位小数)
-        BigDecimal payable = premium.multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+        BigDecimal payable = premium.multiply(exportPercent.setScale(5, RoundingMode.DOWN));
 
         // 计算各类费用并设置到订单对象
         setReceivable.accept(insFeeOrders, receivable);

+ 3 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java

@@ -32,7 +32,9 @@ public class AsyncGetPayLink {
     @Async("asyncTaskExecutor")
     public void paymentLink(QuotationBaseService quoteService,OrderBase order, String companyCode ){
         try {
-            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)){
+            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)
+                    || StringUtils.equals(CompanyConstants.TSBX.getCompanyCode(),companyCode)
+            ){
                 PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
                 paymentLinkVo.setOrder(order);
                 CompletableFuture<PaymentLinkResultsVo> future = CompletableFuture.completedFuture(doUpdatePaymentLink(paymentLinkVo, quoteService));

+ 47 - 25
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.orders.vo.AuditCostInfoVo;
@@ -20,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Objects;
 
 @Tag(name="订单审核接口")
 @RestController
@@ -36,7 +38,7 @@ public class InsFeeAuditController {
 
     /**
      * 订单列表分页
-     * @return
+     * @return HttpResult<Page<FeeAuditVo>>
      */
     @PostMapping("/auditList")
     @Operation(summary = "订单审核列表分页")
@@ -48,7 +50,7 @@ public class InsFeeAuditController {
 
     /**
      * 订单列表分页
-     * @return
+     * @return HttpResult<String>
      */
     @PostMapping("/exportAuditList")
     @Operation(summary = "导出订单审核列表")
@@ -70,44 +72,47 @@ public class InsFeeAuditController {
 
     /**
      * 判断领取按钮是否锁定
-     * @return
+     * @return HttpResult<Boolean>
      */
     @GetMapping("/isLock")
     @Operation(summary = "判断领取按钮是否锁定")
-    public HttpResult isLock(String orderNo){
+    public HttpResult<Boolean> isLock(String orderNo){
         return HttpResult.ok(insFeeAuditService.isLock(orderNo));
     }
 
     /**
-     * 领取审核订单
-     * @return
+     * 领取待审核订单
+     *
+     * @return HttpResult<String> 领取结果。可能成功,可能被限额
      */
     @PostMapping("/auditReceive")
     @Operation(summary = "领取审核订单")
-    public HttpResult auditReceive(@RequestParam("orderNo") String orderNo){
+    public HttpResult<String> auditReceive(@RequestParam("orderNo") String orderNo){
         insFeeAuditService.auditReceive(orderNo);
         return HttpResult.ok("领取订单完成");
     }
 
     /**
      * 放弃审核订单
-     * @return
+     * @return HttpResult<String>
      */
     @PostMapping("/auditCancel")
     @Operation(summary = "放弃领取审核订单")
-    public HttpResult auditCancel(@RequestParam("orderNo") String orderNo){
+    public HttpResult<String> auditCancel(@RequestParam("orderNo") String orderNo){
         insFeeAuditService.auditCancel(orderNo);
         return HttpResult.ok("已放弃审核订单");
     }
 
     /**
      * 更新签单时间
-     * @return
+     *
+     * @return HttpResult<String>
      */
     @PostMapping("/updateSigningTime")
     @Operation(summary = "更新签单时间")
-    public HttpResult updateSigningTime(@RequestParam("orderNo") String orderNo){
-        insFeeAuditService.updateSigningTime(orderNo);
+    public HttpResult<String> updateSigningTime(@RequestParam("orderNo") String orderNo){
+        String userName = baseController.getUserName();
+        insFeeAuditService.updateSigningTime(orderNo, userName);
         return HttpResult.ok();
     }
 
@@ -125,52 +130,69 @@ public class InsFeeAuditController {
             log.info("审核订单发生异常:param=[{}], e", JSONUtil.toJsonStr(param), e);
             return HttpResult.ok(e.getMessage());
         }
-
-        return HttpResult.ok("订单审核成功");
+        if("1".equals(Objects.toString(param.getAuditStatus(),"") )){
+            return HttpResult.ok("订单审核成功");
+        }else if("2".equals(Objects.toString(param.getAuditStatus(),""))){
+            return HttpResult.ok("订单审核驳回成功");
+        }else{
+            return HttpResult.ok("订单审核状态不支持。"+param.getAuditStatus());
+        }
     }
 
     /**
      * 设置为疑问订单
-     * @return
+     *
+     * @return HttpResult<String> 设为疑问单的处理结果
      */
     @PostMapping("/updateToQuestionOrder")
     @Operation(summary = "设置为疑问订单")
-    public HttpResult updateToQuestionOrder(@RequestParam("orderNo") String orderNo){
-        insFeeAuditService.updateToQuestionOrder(orderNo,"1");
+    public HttpResult<String> updateToQuestionOrder(@RequestParam("orderNo") String orderNo,@RequestParam(value = "problemReason",required = false) String problemReason){
+        insFeeAuditService.updateToQuestionOrder(orderNo,"1", problemReason);
         return HttpResult.ok("已设为疑问订单,可前往疑问订单列表查看");
     }
 
     /**
      * 取消疑问订单
-     * @return
+     * @return HttpResult<String>
      */
     @PostMapping("/updateToUnQuestionOrder")
-    @Operation(summary = "设置为疑问订单")
-    public HttpResult updateToUnQuestionOrder(@RequestParam("orderNo") String orderNo){
-        insFeeAuditService.updateToQuestionOrder(orderNo,"0");
+    @Operation(summary = "取消疑问订单")
+    public HttpResult<String> updateToUnQuestionOrder(@RequestParam("orderNo") String orderNo){
+        insFeeAuditService.updateToQuestionOrder(orderNo,"0", "");
         return HttpResult.ok("已取消疑问订单,可前往待审核订单列表查看");
     }
 
     /**
      * 订单审核费用详情
-     * @return
+     * @return HttpResult<List<AuditCostInfoVo>>
      *
      */
     @GetMapping("/auditCostInfo")
     @Operation(summary = "订单审核费用详情")
-    public HttpResult auditCostInfo(String orderNo){
+    public HttpResult<List<AuditCostInfoVo>> auditCostInfo(String orderNo){
         List<AuditCostInfoVo> costInfoVos = insFeeAuditService.auditCostInfo(orderNo);
         return HttpResult.ok(costInfoVos);
     }
 
     /**
      * 保存调整的费用
-     * @return
+     * @return HttpResult<String>
      */
     @PostMapping("/saveCostInfo")
     @Operation(summary = "保存调整的费用")
-    public HttpResult saveCostInfo(@RequestBody PtlAgreementCostRatioVo param){
+    public HttpResult<String> saveCostInfo(@RequestBody PtlAgreementCostRatioVo param){
         insFeeAuditService.saveCostInfo(param);
         return HttpResult.ok();
     }
+
+    /**
+     * 保存调整的费用
+     * @return HttpResult<CostCalculateRespVO>
+     */
+    @PostMapping("/computedCostInfo")
+    @Operation(summary = "计算调整的费用")
+    public HttpResult<CostCalculateRespVO> computedCostInfo(@RequestBody PtlAgreementCostRatioVo param){
+        CostCalculateRespVO costCalculateRespVO = insFeeAuditService.computedCostInfo(param);
+        return HttpResult.ok(costCalculateRespVO);
+    }
 }

+ 6 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java

@@ -10,6 +10,7 @@ import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.InsOrdersParam;
 import com.jzg.commons.entity.dto.InsOrdersParamVO;
+import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteQueryVo;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteResultVo;
 import com.jzg.commons.entity.po.InsFeeOrders;
@@ -40,7 +41,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.validation.constraints.NotNull;
 import java.util.*;
-import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/supplementOrder")
@@ -200,6 +200,11 @@ public class InsOrdersController extends BaseController {
         return HttpResult.ok(insOrdersService.changeSupplementOrder(orderNo));
     }
 
+    @PostMapping("/updateOrdersBatch")
+    @Operation(summary = "车险报价批量修改联系人等信息")
+    public HttpResult<String> updateOrdersBatch(@RequestBody BatchModifyVo batchModifyVo){
+        return insOrdersService.updateOrdersBatch(batchModifyVo);
+    }
 
     @GetMapping("/comparePrice")
     @Operation(summary = "比价")

+ 6 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java

@@ -24,6 +24,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
@@ -108,7 +109,11 @@ public class QrCodeController extends BaseController {
 
     @PostMapping(value = "/destroyQrCode")
     @Operation(summary = "销毁二维码")
-    public ModelAndView destroyQrCode(@NotBlank(message = "订单号号不能为空") @RequestParam("orderNo") String orderNo) {
+    public ModelAndView destroyQrCode(@RequestBody JSONObject body) {
+        String orderNo = body.getString("orderNo");
+        if (StringUtils.isBlank(orderNo)) {
+            throw new IllegalArgumentException("订单号不能为空");
+        }
         ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView());
         insOrdersQrcodeService.destroyQrCode(orderNo);
         modelAndView.addObject("code", 200);

+ 85 - 83
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -60,6 +60,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
+import org.apache.http.util.TextUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -242,7 +243,7 @@ public class UnifyOrderManager {
         String systemCode = getSystemCode();
         String companyName = CompanyConstants.getCompanyNameByCode(esmInsCompanyHttpResult.getData().getCompanyCode());
 
-        log.info("查询保司配置的协议:systemCode=[{}],companyId=[{}]",systemCode, esmInsCompanyHttpResult.getData().getId());
+        log.info("查询保司配置的协议:systemCode=[{}],companyId=[{}]", systemCode, esmInsCompanyHttpResult.getData().getId());
         HttpResult<List<PtlAgreement>> byCompanyId = orgClient.getByCompanyId(esmInsCompanyHttpResult.getData().getId(), systemCode);
         if (CollUtil.isEmpty(byCompanyId.getData())) {
             AssertionUtils.isFail(true, "保司未配置协议");
@@ -706,7 +707,7 @@ public class UnifyOrderManager {
     @Operation(summary = "获取订单状态")
     @PostMapping("/getOrderStatus")
     public HttpResult getOrderStatus(@RequestBody OrderStatusVo orderStatusVo) throws Exception {
-        log.info("更新订单状态:orderStatusVo=[{}]",JSONUtil.toJsonStr(orderStatusVo));
+        log.info("更新订单状态:orderStatusVo=[{}]", JSONUtil.toJsonStr(orderStatusVo));
         InsOrders insOrders = insOrdersService.getById(orderStatusVo.getOrder().getOrdersNo());
         AssertionUtils.isFail(Objects.isNull(insOrders), "订单不存在");
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(insOrders.getCompanyId());
@@ -728,16 +729,17 @@ public class UnifyOrderManager {
         InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getByOrderId(insOrders.getId());
         orderStatusVo.setInsOrdersAccidentalDriving(insOrdersAccidentalDriving);
         OrderStatusResultVo orderStatusResultVo = orderStatusService.queryOrderState(orderStatusVo);
-        log.info("订单状态orderStatusResultVo=[{}]",JSONUtil.toJsonStr(orderStatusResultVo));
+        log.info("订单状态orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo));
         // 保存状态查询结果
         insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
         // 保存支付链接
-        insOrders.setPayLink(orderStatusResultVo.getPaymentLink());
+        insOrders.setPayLink(!TextUtils.isEmpty(orderStatusResultVo.getPaymentLink()) ? orderStatusResultVo.getPaymentLink() : insOrders.getPayLink());
         insOrdersQrcodeService.updateQrCode(insOrders);
         //////////////////////////////////////////新增营销抽奖活动////////////////////////////////////////////////
         // 承保(客户)、出单(业务员)
-        if(orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED){
-            doSomethingAfterUnderwited(insOrders);
+        if (orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED) {
+            // TODO: 本地生活逻辑未调试通畅,暂时先注掉
+            //doSomethingAfterUnderwited(insOrders);
         }
         return HttpResult.ok("状态刷新成功");
     }
@@ -753,7 +755,7 @@ public class UnifyOrderManager {
     public HttpResult<String> mockUnderwited(@RequestBody OrderStatusVo orderStatusVo) throws Exception {
         log.info("模拟承保(跳过实际付款操作). orderStatusVo=[{}]", JSONUtil.toJsonStr(orderStatusVo));
         InsOrders insOrders = insOrdersService.getById(orderStatusVo.getOrder().getOrdersNo());
-        if(!"4".equals(insOrders.getOrderStatus())){
+        if (!"4".equals(insOrders.getOrderStatus())) {
             return HttpResult.error("只能对待缴费的订单进行模拟承保");
         }
         AssertionUtils.isFail(Objects.isNull(insOrders), "订单不存在");
@@ -781,16 +783,16 @@ public class UnifyOrderManager {
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
         orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
         // 保存状态查询结果
-        try{
+        try {
             // 设置订单状态为 已承保(5)
-            InsOrders insOrdersItem = new  InsOrders();
+            InsOrders insOrdersItem = new InsOrders();
             insOrdersItem.setOrderStatus("5");
             insOrdersItem.setAuditStatus(1);
             insOrdersItem.setId(insOrders.getId());
             insOrdersService.updateById(insOrdersItem);
             insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
-        }catch (Exception e){
-            log.error("承保后,更新状态,进行后续逻辑异常. orderStatusResultVo=[{}]",JSONUtil.toJsonStr(orderStatusResultVo), e);
+        } catch (Exception e) {
+            log.error("承保后,更新状态,进行后续逻辑异常. orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo), e);
         }
 
         //this.doSomethingAfterUnderwited(insOrders);
@@ -820,82 +822,81 @@ public class UnifyOrderManager {
                     continue;
                 }
 
-                    if (activity.getLocalActivityTables() == null) {
-                        continue;
+                if (activity.getLocalActivityTables() == null) {
+                    continue;
+                }
+                // 遍历所有本地活动表
+                for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
+                    // 处理 type=9 的承保规则
+                    if ("9".equals(table.getType())) {
+                        Double totalFee = insOrdersService.queryTotalFee(insOrders.getInsOrderNo());
+                        String userPhone = insOrdersService.queryCustomerPhone(insOrders.getInsOrderNo());
+                        for (UnderwritingRuleVO underwritingRuleVO : table.getUnderwritingRules()) {
+                            if (new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMinPremium()) >= 0 && new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMaxPremium()) <= 0) {
+                                // 存本地记录 等绑定后更新本地记录的同步状态字段即可
+                                completeRule(null, null, userPhone, activity.getId(),
+                                        table.getId(), underwritingRuleVO.getUwMinPremium() + "-" + underwritingRuleVO.getUwMaxPremium(), underwritingRuleVO.getUwLotteryNum(), null, YesNoEnum.NO.getCode(), 9);
+                                log.info("客户承保,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            }
+                        }
                     }
-                    // 遍历所有本地活动表
-                    for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
-                        // 处理 type=9 的承保规则
-                        if ("9".equals(table.getType())) {
-                            Double totalFee = insOrdersService.queryTotalFee(insOrders.getInsOrderNo());
-                            String userPhone = insOrdersService.queryCustomerPhone(insOrders.getInsOrderNo());
-                            for (UnderwritingRuleVO underwritingRuleVO : table.getUnderwritingRules()) {
-                                if (new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMinPremium()) >= 0 && new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMaxPremium()) <= 0) {
+                    // 处理 type=8 的出单规则
+                    if ("8".equals(table.getType())) {
+                        // 只处理本租户的出单规则
+                        if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
+                            continue;
+                        }
+                        // 查询是否在一账通绑定
+                        UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
+                        unifiedUserCenterDTO.setUserId(insOrders.getRealQuoteUserId());
+                        unifiedUserCenterDTO.setClientId(CLIENT_ID);
+                        unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
+                        HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
+                        try {
+                            unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
+                        } catch (Exception e) {
+                            log.info("业务员出单,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            log.error("业务员出单,查询用户绑定一账通接口异常", e);
+                        }
+                        if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
+                            // 判断是否满足条件
+                            // 业务员累计出单次数是否大于等于本活动规定时间范围内的出单次数
+                            // 统计业务员的出单次数
+                            int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                            for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                if (count >= Integer.parseInt(orderRule.getOrdNum())) {
                                     // 存本地记录 等绑定后更新本地记录的同步状态字段即可
-                                    completeRule(null, null, userPhone, activity.getId(),
-                                            table.getId(), underwritingRuleVO.getUwMinPremium() + "-" + underwritingRuleVO.getUwMaxPremium(), underwritingRuleVO.getUwLotteryNum(), null, YesNoEnum.NO.getCode(), 9);
-                                    log.info("客户承保,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                    completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                            table.getId(), orderRule.getOrdNum(), String.valueOf(orderRule.getOrdLotteryNum()), null, YesNoEnum.NO.getCode(), 8);
+
+                                    log.info("业务员出单,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
                                 }
                             }
-                        }
-                        // 处理 type=8 的出单规则
-                        if ("8".equals(table.getType())) {
-                            // 只处理本租户的出单规则
-                            if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
-                                continue;
-                            }
-                            // 查询是否在一账通绑定
-                            UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
-                            unifiedUserCenterDTO.setUserId(insOrders.getRealQuoteUserId());
-                            unifiedUserCenterDTO.setClientId(CLIENT_ID);
-                            unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
-                            HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
-                            try {
-                                unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
-                            } catch (Exception e) {
-                                log.info("业务员出单,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                log.error("业务员出单,查询用户绑定一账通接口异常", e);
-                            }
-                            if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
-                                // 判断是否满足条件
-                                // 业务员累计出单次数是否大于等于本活动规定时间范围内的出单次数
-                                // 统计业务员的出单次数
-                                int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
-                                for (OrderRuleVO orderRule : table.getOrderRules()) {
-                                    if (count >= Integer.parseInt(orderRule.getOrdNum())) {
-                                        // 存本地记录 等绑定后更新本地记录的同步状态字段即可
-                                        completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
-                                                table.getId(), orderRule.getOrdNum(), String.valueOf(orderRule.getOrdLotteryNum()), null, YesNoEnum.NO.getCode(), 8);
-
-                                        log.info("业务员出单,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                    }
+                        } else {
+                            Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
+                                    .stream()
+                                    .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
+                            // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
+                            if (userClientGroupMap.containsKey(CLIENT_ID)) {
+                                LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
+                                lotteryCounDTO.setAppUserId(insOrders.getRealQuoteUserId());
+                                lotteryCounDTO.setActivityId(activity.getId());
+                                lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
+                                HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
+                                try {
+                                    lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
+                                } catch (Exception e) {
+                                    log.info("业务员出单,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", insOrders.getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
+                                    log.error("业务员出单,远程调用本地生活抽奖次数增加异常", e);
                                 }
-                            } else {
-                                Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
-                                        .stream()
-                                        .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
-                                // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
-                                if (userClientGroupMap.containsKey(CLIENT_ID)) {
-                                    LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
-                                    lotteryCounDTO.setAppUserId(insOrders.getRealQuoteUserId());
-                                    lotteryCounDTO.setActivityId(activity.getId());
-                                    lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
-                                    HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
-                                    try {
-                                        lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
-                                    } catch (Exception e) {
-                                        log.info("业务员出单,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", insOrders.getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
-                                        log.error("业务员出单,远程调用本地生活抽奖次数增加异常", e);
-                                    }
-                                    if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
-                                        int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
-                                        for (OrderRuleVO orderRule : table.getOrderRules()) {
-                                            if (count >= Integer.parseInt(orderRule.getOrdNum())) {
-                                                // 记录规则完成  标记已同步
-                                                completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
-                                                        table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 8);
-                                                log.info("业务员出单,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                            }
+                                if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
+                                    int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                                    for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                        if (count >= Integer.parseInt(orderRule.getOrdNum())) {
+                                            // 记录规则完成  标记已同步
+                                            completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                                    table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 8);
+                                            log.info("业务员出单,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
                                         }
                                     }
                                 }
@@ -905,7 +906,8 @@ public class UnifyOrderManager {
                 }
             }
         }
-        //return HttpResult.ok("状态刷新成功");
+    }
+    //return HttpResult.ok("状态刷新成功");
 
 
     @OrderOperationLog(

+ 17 - 8
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeAuditService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.summary.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.orders.po.InsFeeAudit;
@@ -35,15 +36,17 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
     void feeAuditAdd(InsOrders orders);
 
     /**
-     * 订单详情
-     * @param orderNo
-     * @return
+     * 根据订单号查询订单详情
+     *
+     * @param orderNo 订单编号
+     * @return QuoteEchoVo 订单详情
      */
     QuoteEchoVo auditInfo(String orderNo);
 
     /**
      * 领取审核订单
-     * @param orderNo
+     *
+     * @param orderNo 订单编号
      */
     void auditReceive(String orderNo);
 
@@ -63,9 +66,11 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
 
     /**
      * 更新签单时间
-     * @param orderNo
+     *
+     * @param orderNo  订单号(jzg系统内部的车险订单号)
+     * @param userName 操作用户
      */
-    void updateSigningTime(String orderNo);
+    void updateSigningTime(String orderNo, String userName);
 
     /**
      * 审核订单
@@ -75,9 +80,11 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
 
     /**
      * 设置为疑问订单
-     * @param orderNo
+     *
+     * @param orderNo 订单编号
+     * @param problemReason 设置为疑问单的原因
      */
-    void updateToQuestionOrder(String orderNo,String status);
+    void updateToQuestionOrder(String orderNo, String status, String problemReason);
 
     /**
      * 订单审核费用详情
@@ -98,4 +105,6 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
      * @return
      */
     String exportAuditList(FeeAuditParam param);
+
+    CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo param);
 }

+ 2 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.summary.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.InsFeeOrdersParam;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
@@ -24,5 +25,5 @@ public interface InsFeeOrdersService extends IService<InsFeeOrders> {
 
     HttpResult updateAvailableAmount(String orderNo,BigDecimal availableAmount);
 
-
+    CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo param);
 }

+ 11 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java

@@ -7,6 +7,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.InsOrdersParam;
 import com.jzg.commons.entity.dto.InsOrdersParamVO;
 import com.jzg.commons.entity.enums.MessageCodeEnum;
+import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersCosts;
@@ -128,8 +129,8 @@ public interface InsOrdersService extends IService<InsOrders> {
     /**
      * 查询订单详情
      *
-     * @param ordersNo
-     * @return
+     * @param ordersNo 订单号
+     * @return QuoteEchoVo 订单详情
      */
     QuoteEchoVo getOrderDetail(String ordersNo);
 
@@ -282,4 +283,12 @@ public interface InsOrdersService extends IService<InsOrders> {
      * @return
      */
     SysUserActivityCompleteInRule selectByRuleAndUserPhone(String activityId, String userPhone, String qutNum, Integer activityType);
+
+    /**
+     * 车险报价批量修改联系人等信息
+     *
+     * @author lipf
+     * @date 2026/5/28 10:45
+     */
+    HttpResult<String> updateOrdersBatch(BatchModifyVo batchModifyVo);
 }

+ 105 - 59
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -11,6 +11,7 @@ import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.account.po.SysUserAccountIncomeLog;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.orders.po.*;
@@ -136,29 +137,30 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             param.setCompanyIdList(companyIdList);
         }
         Page<FeeAuditVo> page = baseMapper.queryPage(param.getPage(), param);
-        // 循环每条数据,查询 ins_fee_orders 并计算权益金额
-        if (CollUtil.isNotEmpty(page.getRecords())) {
-            Map<String, String> allCompanyHierarchyPaths = esmInsCompanyClient.getAllCompanyHierarchyPaths();
-            for (FeeAuditVo feeAuditVo : page.getRecords()) {
-                String allCompany =  allCompanyHierarchyPaths.get(Objects.toString(feeAuditVo.getCompanyId(),""));
-                feeAuditVo.setCompanyALlName(allCompany);
-                // 查询订单的 ins_fee_orders 数据
-                InsFeeOrders insFeeOrders = feeOrdersService.getById(feeAuditVo.getOrderNo());
-                if (insFeeOrders != null) {
-                    // 权益金额 = (交强出口费用 + 商业出口费用 + 驾意出口费用) - (交强出口留点费用 + 商业出口留点费用 + 驾意出口留点费用)
-                    BigDecimal exportTotal = Optional.ofNullable(insFeeOrders.getJqExportPremium()).orElse(BigDecimal.ZERO)
-                            .add(Optional.ofNullable(insFeeOrders.getSyExportPremium()).orElse(BigDecimal.ZERO))
-                            .add(Optional.ofNullable(insFeeOrders.getJyExportPremium()).orElse(BigDecimal.ZERO));
-
-                    BigDecimal exportKeepPointTotal = Optional.ofNullable(insFeeOrders.getJqExportKeepPointPremium()).orElse(BigDecimal.ZERO)
-                            .add(Optional.ofNullable(insFeeOrders.getSyExportKeepPointPremium()).orElse(BigDecimal.ZERO))
-                            .add(Optional.ofNullable(insFeeOrders.getJyExportKeepPointPremium()).orElse(BigDecimal.ZERO));
-
-                    BigDecimal equityAmount = exportTotal.subtract(exportKeepPointTotal);
-                    feeAuditVo.setEquityAmount(equityAmount);
-                }else{
-                    feeAuditVo.setEquityAmount(BigDecimal.ZERO);
-                }
+        if(CollUtil.isEmpty(page.getRecords())){
+            return page;
+        }
+        Map<String, String> allCompanyHierarchyPaths = esmInsCompanyClient.getAllCompanyHierarchyPaths();
+        for (FeeAuditVo feeAuditVo : page.getRecords()) {
+            String allCompany =  allCompanyHierarchyPaths.get(Objects.toString(feeAuditVo.getCompanyId(),""));
+            feeAuditVo.setCompanyALlName(allCompany);
+            // 循环每条数据,查询 ins_fee_orders 并计算权益金额
+            // 查询订单的 ins_fee_orders 数据
+            InsFeeOrders insFeeOrders = feeOrdersService.getById(feeAuditVo.getOrderNo());
+            if (insFeeOrders != null) {
+                // 权益金额 = (交强出口费用 + 商业出口费用 + 驾意出口费用) - (交强出口留点费用 + 商业出口留点费用 + 驾意出口留点费用)
+                BigDecimal exportTotal = Optional.ofNullable(insFeeOrders.getJqExportPremium()).orElse(BigDecimal.ZERO)
+                        .add(Optional.ofNullable(insFeeOrders.getSyExportPremium()).orElse(BigDecimal.ZERO))
+                        .add(Optional.ofNullable(insFeeOrders.getJyExportPremium()).orElse(BigDecimal.ZERO));
+
+                BigDecimal exportKeepPointTotal = Optional.ofNullable(insFeeOrders.getJqExportKeepPointPremium()).orElse(BigDecimal.ZERO)
+                        .add(Optional.ofNullable(insFeeOrders.getSyExportKeepPointPremium()).orElse(BigDecimal.ZERO))
+                        .add(Optional.ofNullable(insFeeOrders.getJyExportKeepPointPremium()).orElse(BigDecimal.ZERO));
+
+                BigDecimal equityAmount = exportTotal.subtract(exportKeepPointTotal);
+                feeAuditVo.setEquityAmount(equityAmount);
+            }else{
+                feeAuditVo.setEquityAmount(BigDecimal.ZERO);
             }
         }
 
@@ -202,6 +204,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
     @Override
     public void feeAuditAdd(InsOrders orders) {
+        // 先检查是否已存在审核记录,避免重复INSERT导致主键冲突
+        InsFeeAudit existing = this.getOne(new LambdaQueryWrapper<InsFeeAudit>().eq(InsFeeAudit::getOrderNo, orders.getId()));
+        if (existing != null) {
+            return;
+        }
+
         InsFeeAudit insFeeAudit = new InsFeeAudit();
         insFeeAudit.setOrderNo(orders.getId());
 
@@ -219,6 +227,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         this.save(insFeeAudit);
     }
 
+    /**
+     * 根据订单号查询订单详情
+     *
+     * @param orderNo 订单编号
+     * @return QuoteEchoVo 订单详情
+     */
     @Override
     public QuoteEchoVo auditInfo(String orderNo) {
         //险种和订单类型以及业务员对应的管理员
@@ -230,8 +244,14 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         return detailVo;
     }
 
+    /**
+     * 领取审核订单
+     *
+     * @param orderNo 订单编号
+     */
     @Override
     public void auditReceive(String orderNo) {
+        log.info("领取待审核订单。 orderNo=[{}]",orderNo);
         AssertionUtils.isFail(this.isLock(orderNo),"订单已被领取");
         InsFeeAudit audit = this.getById(orderNo);
         if(audit.getAuditStatus() > 0){
@@ -241,32 +261,34 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
                 AssertionUtils.isFail(true, "订单审核驳回,刷新订单列表");
             }
         // 未审核
+        }
+        String userName = baseController.getUserName();
+        if(StringUtils.isNotBlank(audit.getReceiveUser())){
+            if(userName.equals(audit.getReceiveUser())){
+                // redis 锁定按钮
+                RBucket<Object> bucket = redissonClient.getBucket(ORDER_LOCK_PREFIX + orderNo);
+                bucket.set(1, 30, TimeUnit.MINUTES);
+            }else{
+                AssertionUtils.isFail(true, "订单已被" + audit.getReceiveUser() + "领取!");
+            }
         }else{
-            String userName = baseController.getUserName();
-            if(StringUtils.isNotBlank(audit.getReceiveUser())){
-                if(userName.equals(audit.getReceiveUser())){
-                    // redis 锁定按钮
-                    RBucket<Object> bucket = redissonClient.getBucket(ORDER_LOCK_PREFIX + orderNo);
-                    bucket.set(1, 30, TimeUnit.MINUTES);
-                }else{
-                    AssertionUtils.isFail(true, "订单已被" + audit.getReceiveUser() + "领取!");
-                }
+            int countLimit = 10;
+            LambdaQueryWrapper<InsFeeAudit> wrapper = new LambdaQueryWrapper<>();
+            // modify by lipf 2026年5月23日10:15:32 判断是领取限制,需要添加一个未审核的状态
+            wrapper.eq(InsFeeAudit::getAuditStatus,0);
+            wrapper.like(InsFeeAudit::getReceiveUser, userName);
+            long count = this.count(wrapper);
+            if(count >= countLimit){
+                AssertionUtils.isFail(true, "超出"+countLimit+"次领取限制,请先审核后再领取订单!");
             }else{
-                LambdaQueryWrapper<InsFeeAudit> wrapper = new LambdaQueryWrapper<>();
-                wrapper.like(InsFeeAudit::getReceiveUser, userName);
-                long count = this.count(wrapper);
-                if(count >= 10){
-                    AssertionUtils.isFail(true, "超出10次领取限制,请先审核后再领取订单!");
-                }else{
-                    // 领取订单
-                    audit.setReceiveUser(userName);
-                    audit.setReceiveTime(LocalDateTime.now());
-                    this.updateById(audit);
-
-                    // redis 锁定按钮
-                    RBucket<Object> bucket = redissonClient.getBucket(ORDER_LOCK_PREFIX + orderNo);
-                    bucket.set(1, 30, TimeUnit.MINUTES);
-                }
+                // 领取订单
+                audit.setReceiveUser(userName);
+                audit.setReceiveTime(LocalDateTime.now());
+                this.updateById(audit);
+
+                // redis 锁定按钮
+                RBucket<Object> bucket = redissonClient.getBucket(ORDER_LOCK_PREFIX + orderNo);
+                bucket.set(1, 30, TimeUnit.MINUTES);
             }
         }
     }
@@ -296,18 +318,29 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
     @Override
     public Boolean isLock(String orderNo) {
-        RBucket<Object> bucket = redissonClient.getBucket(ORDER_LOCK_PREFIX + orderNo);
-        return bucket.isExists();
+        String key = ORDER_LOCK_PREFIX + orderNo;
+        RBucket<Object> bucket = redissonClient.getBucket(key);
+        boolean exists = bucket.isExists();
+        log.info("订单锁定状态:[{}]-[{}]",key,exists);
+        return exists;
     }
 
+    /**
+     * 更新签单时间
+     *
+     * @param orderNo  订单号(jzg系统内部的车险订单号)
+     * @param userName 操作用户
+     */
     @Override
-    public void updateSigningTime(String orderNo) {
+    public void updateSigningTime(String orderNo, String userName) {
+        log.info("用户[{}]更新订单[{}]的签单时间",userName,orderNo);
         InsOrders orders = insOrdersService.getById(orderNo);
         // 查询电子保单路径
         InsOrdersPdfUrl pdfUrl = ordersPdfUrlService.getById(orderNo);
+        log.info("订单[{}]没有生成电子表单",orderNo);
         AssertionUtils.isFail(Objects.isNull(pdfUrl), "未生成电子保单!");
         String url = null;
-        Integer type = 0;
+        int type = 0;
         if(StringUtils.isNotBlank(pdfUrl.getJqUrl())){
             url = pdfUrl.getJqUrl();
             type = 1;
@@ -349,8 +382,6 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }
         //更新时间表
         insOrdersService.updateById(orders);
-
-
     }
 
     @Override
@@ -555,8 +586,10 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             HttpResult result2 = orgClient.addUserAccountIncomeLog(builderIncomeLog);
             AssertionUtils.isFail(result2.getCode() != 200,"账户记录添加失败,审核失败");
         }else{
+            log.info("订单审核驳回:param=[{}]", JSONUtil.toJsonStr(param));
             StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.FAIL_AUDIT,audit.getAuditStatus()+"");
-            audit.setAuditStatus(stateFailResult.getCurrentState());
+            log.error("订单审核驳回:stateFailResult=[{}]", JSONUtil.toJsonStr(stateFailResult));
+            audit.setAuditStatus(param.getAuditStatus());
         }
         audit.setRefuse(param.getRefuse());
         audit.setIsProblem(0);
@@ -571,7 +604,6 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }catch (Exception e){
             log.error("保存合伙人佣金计算异常:{}",e.getMessage(), e);
         }
-
     }
 
     /**
@@ -649,7 +681,9 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     }
 
     @Override
-    public void updateToQuestionOrder(String orderNo,String status) {
+    public void updateToQuestionOrder(String orderNo, String status, String problemReason) {
+        String userName = baseController.getUserName();
+        log.info("用户[{}]更新订单的疑问状态。orderNo=[{}],status=[{}], problemReason=[{}]",userName, orderNo,status,problemReason);
         InsFeeAudit audit = this.getById(orderNo);
         if(audit.getAuditStatus() > 0){
             AssertionUtils.isFail(true, "订单已审核刷新订单详情页!");
@@ -658,12 +692,18 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         if(StringUtils.isBlank(audit.getReceiveUser())){
             AssertionUtils.isFail(true, "请领取订单后再进行审核退出详情页,返回待审核订单列表!");
         }
-        String userName = baseController.getUserName();
+
         if (!userName.equals(audit.getReceiveUser())) {
             AssertionUtils.isFail(true, "订单已被"+audit.getReceiveUser()+"领取返回待审核订单列表!");
         }
-
+        audit.setProblemReason(Objects.toString(problemReason,""));
         audit.setIsProblem(Integer.parseInt(status));
+        // 设置疑问订单的时间
+        if ("1".equals(status)){
+            audit.setProblemTime(LocalDateTime.now());
+        }else{
+            audit.setProblemTime(null);
+        }
         this.updateById(audit);
     }
 
@@ -700,10 +740,11 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
     @Override
     public void saveCostInfo(PtlAgreementCostRatioVo param) {
+        log.info("保存调整后的费用:param=[{}]", JSONUtil.toJsonStr(param));
         try {
             feeOrdersService.calcCosts(param);
         } catch (ReflectiveOperationException e) {
-            e.printStackTrace();
+            log.error("调整订单费用时,计算异常",e);
             throw new SystemException("费用计算异常:"+ e.getMessage());
         }
         // 保存比例调整记录
@@ -711,6 +752,11 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         recordService.updateById(record);
     }
 
+    @Override
+    public CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo param) {
+        return feeOrdersService.computedCostInfo(param);
+    }
+
     /**
      * 导出订单审核列表
      * @param param

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

@@ -1,9 +1,11 @@
 package com.jzg.quotation.summary.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.InsFeeOrdersParam;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCosts;
@@ -19,6 +21,8 @@ import com.jzg.quotation.summary.service.InsOrdersCostsService;
 import com.jzg.quotation.summary.service.InsOrdersService;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -26,7 +30,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -36,6 +39,8 @@ import java.util.List;
 
 @Service
 public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, InsFeeOrders> implements InsFeeOrdersService {
+
+    private static final Logger log = LoggerFactory.getLogger(InsFeeOrdersServiceImpl.class);
     @Resource
     private InsOrdersService insOrdersService;
 
@@ -62,19 +67,35 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
     }
 
     @Override
-    public InsFeeOrders calcCosts(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) throws ReflectiveOperationException {
+    public CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) {
+        // 常量定义 保留小数5位
+        InsFeeOrders insFeeOrders = getInsFeeOrders(ptlAgreementCostRatioVo);
+        // 拼接返回值
+        CostCalculateRespVO costCalculateRespVO = new CostCalculateRespVO();
+        costCalculateRespVO.setInsFeeOrders(insFeeOrders);
+        costCalculateRespVO.setCostRatio(new PtlAgreementCostRatioVo(insFeeOrders));
+        return costCalculateRespVO;
+    }
+
+
+    @Override
+    public InsFeeOrders calcCosts(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) {
+        InsFeeOrders insFeeOrders = getInsFeeOrders(ptlAgreementCostRatioVo);
+        log.info("调整后费用.参数[{}]真实结果是[{}]", JSONUtil.toJsonStr(ptlAgreementCostRatioVo), JSONUtil.toJsonStr(insFeeOrders));
+        // 保存比例
+        this.updateById(insFeeOrders);
+        return insFeeOrders;
+    }
+
+    private InsFeeOrders getInsFeeOrders(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) {
         // 常量定义 保留小数5位
         final int SCALE = 5;
-        final RoundingMode ROUNDING_MODE = RoundingMode.HALF_EVEN;
-        final BigDecimal ONE_HUNDRED = new BigDecimal("100");
         final BigDecimal TAX_RATE = new BigDecimal("1.06");
 
         // 获取订单信息
         InsOrders insOrders = insOrdersService.getById(ptlAgreementCostRatioVo.getOrderNo());
         // 获取订单费用信息
         InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
-
-        String systemCode = getSystemCode();
         // 获取协议信息
         PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrders.getAgreementId());
         // 获取费用信息
@@ -89,11 +110,12 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         BigDecimal jyPremium = insOrdersCosts.getJyPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getJyPremium();
 
         // 更新对象中的比例字段
-        saveRatio(ptlAgreementCostRatioVo, insFeeOrders);
+        copyRatio(ptlAgreementCostRatioVo, insFeeOrders, withTax);
 
         // 核心:规则重新计算所有费用
         // 1. 交强险
-        calculatePremiumByRule(insFeeOrders, "jq", jqPremium,
+        calculatePremiumByRule(insFeeOrders,
+                "jq", jqPremium,
                 insFeeOrders.getJqCommissionRatio(), insFeeOrders.getJqInletRatio(), insFeeOrders.getJqFollowRatio(),
                 insFeeOrders.getJqAdditionalRatio(), insFeeOrders.getJqKeepPointRatio(), insFeeOrders.getJqExportRatio(), insFeeOrders.getJqExportKeepPointRatio(),
                 withTax, TAX_RATE, SCALE);
@@ -116,9 +138,6 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
 
         insFeeOrders.setTotalPayablePremium(scale(totalPayable, SCALE));
         insFeeOrders.setTotalReceivablePremium(scale(totalReceivable, SCALE));
-
-        // 保存比例
-        this.updateById(insFeeOrders);
         return insFeeOrders;
     }
 
@@ -267,31 +286,55 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
     }
 
     // 保存比例
-    private void saveRatio(PtlAgreementCostRatioVo ptlAgreementCostRatioVo, InsFeeOrders insFeeOrders) {
+    private void copyRatio(PtlAgreementCostRatioVo ptlAgreementCostRatioVo, InsFeeOrders insFeeOrders, Integer withTax) {
+        BigDecimal bigDecimal = new BigDecimal("1");
+        if (withTax == 0) {
+            // 不含税:保费 / 1.06
+            bigDecimal =  new BigDecimal("1.06");
+        }
         // 手续费比例
-        insFeeOrders.setJqCommissionRatio(covertPercent(ptlAgreementCostRatioVo.getJqCommissionRatio()));
-        insFeeOrders.setSyCommissionRatio(covertPercent(ptlAgreementCostRatioVo.getSyCommissionRatio()));
-        insFeeOrders.setJyCommissionRatio(covertPercent(ptlAgreementCostRatioVo.getJyCommissionRatio()));
+        BigDecimal jqCommissionRatio = covertPercent(ptlAgreementCostRatioVo.getJqCommissionRatio());
+        BigDecimal syCommissionRatio = covertPercent(ptlAgreementCostRatioVo.getSyCommissionRatio());
+        BigDecimal jyCommissionRatio = covertPercent(ptlAgreementCostRatioVo.getJyCommissionRatio());
+        insFeeOrders.setJqCommissionRatio(jqCommissionRatio);
+        insFeeOrders.setSyCommissionRatio(syCommissionRatio);
+        insFeeOrders.setJyCommissionRatio(jyCommissionRatio);
         // 入口比例
-        insFeeOrders.setJqInletRatio(covertPercent(ptlAgreementCostRatioVo.getJqInletRatio()));
-        insFeeOrders.setSyInletRatio(covertPercent(ptlAgreementCostRatioVo.getSyInletRatio()));
-        insFeeOrders.setJyInletRatio(covertPercent(ptlAgreementCostRatioVo.getJyInletRatio()));
+        BigDecimal jqInletRatio = covertPercent(ptlAgreementCostRatioVo.getJqInletRatio());
+        BigDecimal syInletRatio = covertPercent(ptlAgreementCostRatioVo.getSyInletRatio());
+        BigDecimal jyInletRatio = covertPercent(ptlAgreementCostRatioVo.getJyInletRatio());
+        insFeeOrders.setJqInletRatio(jqInletRatio);
+        insFeeOrders.setSyInletRatio(syInletRatio);
+        insFeeOrders.setJyInletRatio(jyInletRatio);
         // 跟单比例
-        insFeeOrders.setJqFollowRatio(insFeeOrders.getJqInletRatio().subtract(insFeeOrders.getJqCommissionRatio()));
-        insFeeOrders.setSyFollowRatio(insFeeOrders.getSyInletRatio().subtract(insFeeOrders.getSyCommissionRatio()));
-        insFeeOrders.setJyFollowRatio(insFeeOrders.getJyInletRatio().subtract(insFeeOrders.getJyCommissionRatio()));
+        BigDecimal jqFollowRatio = jqInletRatio.subtract(jqCommissionRatio);
+        BigDecimal syFollowRatio = syInletRatio.subtract(syCommissionRatio);
+        BigDecimal jyFollowRatio = jyInletRatio.subtract(jyCommissionRatio);
+        insFeeOrders.setJqFollowRatio(jqFollowRatio);
+        insFeeOrders.setSyFollowRatio(syFollowRatio);
+        insFeeOrders.setJyFollowRatio(jyFollowRatio);
         // 加投比例
-        insFeeOrders.setJqAdditionalRatio(covertPercent(ptlAgreementCostRatioVo.getJqAdditionalRatio()));
-        insFeeOrders.setSyAdditionalRatio(covertPercent(ptlAgreementCostRatioVo.getSyAdditionalRatio()));
-        insFeeOrders.setJyAdditionalRatio(covertPercent(ptlAgreementCostRatioVo.getJyAdditionalRatio()));
-        // 留点比例
-        insFeeOrders.setJqKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getJqKeepPointRatio()));
-        insFeeOrders.setSyKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getSyKeepPointRatio()));
-        insFeeOrders.setJyKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getJyKeepPointRatio()));
+        BigDecimal jqAdditionalRatio = covertPercent(ptlAgreementCostRatioVo.getJqAdditionalRatio());
+        BigDecimal syAdditionalRatio = covertPercent(ptlAgreementCostRatioVo.getSyAdditionalRatio());
+        BigDecimal jyAdditionalRatio = covertPercent(ptlAgreementCostRatioVo.getJyAdditionalRatio());
+        insFeeOrders.setJqAdditionalRatio(jqAdditionalRatio);
+        insFeeOrders.setSyAdditionalRatio(syAdditionalRatio);
+        insFeeOrders.setJyAdditionalRatio(jyAdditionalRatio);
         // 出口比例
-        insFeeOrders.setJqExportRatio(covertPercent(ptlAgreementCostRatioVo.getJqExportRatio()));
-        insFeeOrders.setSyExportRatio(covertPercent(ptlAgreementCostRatioVo.getSyExportRatio()));
-        insFeeOrders.setJyExportRatio(covertPercent(ptlAgreementCostRatioVo.getJyExportRatio()));
+        BigDecimal jqExportRatio = covertPercent(ptlAgreementCostRatioVo.getJqExportRatio());
+        BigDecimal syExportRatio = covertPercent(ptlAgreementCostRatioVo.getSyExportRatio());
+        BigDecimal jyExportRatio = covertPercent(ptlAgreementCostRatioVo.getJyExportRatio());
+        insFeeOrders.setJqExportRatio(jqExportRatio);
+        insFeeOrders.setSyExportRatio(syExportRatio);
+        insFeeOrders.setJyExportRatio(jyExportRatio);
+        // 需求:入口 + 加投 - 出口 = 留点
+        BigDecimal jqKeepPointRatio = (jqInletRatio.divide(bigDecimal, 5, RoundingMode.HALF_EVEN)).add(jqAdditionalRatio).subtract(jqExportRatio);
+        BigDecimal syKeepPointRatio = (syInletRatio.divide(bigDecimal, 5, RoundingMode.HALF_EVEN)).add(syAdditionalRatio).subtract(syExportRatio);
+        BigDecimal jyKeepPointRatio = (jyInletRatio.divide(bigDecimal, 5, RoundingMode.HALF_EVEN)).add(jyAdditionalRatio).subtract(jyExportRatio);
+        // 留点比例
+        insFeeOrders.setJqKeepPointRatio(jqKeepPointRatio);
+        insFeeOrders.setSyKeepPointRatio(syKeepPointRatio);
+        insFeeOrders.setJyKeepPointRatio(jyKeepPointRatio);
         // 出口留点比例
         insFeeOrders.setJqExportKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getJqExportKeepPointRatio()));
         insFeeOrders.setSyExportKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getSyExportKeepPointRatio()));

+ 39 - 20
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersQrcodeServiceImpl.java

@@ -55,18 +55,24 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
 
     @Override
     public InsOrdersQrcode saveQrCode(InsOrders orders) {
+        // 先查询是否已存在同 ordermo 的记录(不限状态),避免 INSERT 违反唯一约束
+        InsOrdersQrcode existing = baseMapper.selectOne(
+                new LambdaQueryWrapper<>(InsOrdersQrcode.class)
+                        .eq(InsOrdersQrcode::getOrderno, orders.getId()));
+        if (existing != null) {
+            // 已存在则复用旧记录,更新为有效状态
+            existing.setQrcodeStatus(1);
+            existing.setCreatetime(LocalDateTime.now());
+            String paylink = buildJumpUrl(orders.getPayLink());
+            existing.setJumpUrl(paylink);
+            baseMapper.updateById(existing);
+            return existing;
+        }
+
+        // 不存在则新建
         InsOrdersQrcode insOrdersQrcode = new InsOrdersQrcode();
         insOrdersQrcode.setOrderno(orders.getId());
-        String paylink = orders.getPayLink();
-        if(isHttpUrl(orders.getPayLink())){
-            paylink = paylink.replace("{", "").replace("}", "");
-            insOrdersQrcode.setJumpUrl(paylink);
-        }else{
-            if(paylink.contains("data:image/jpg;base64,")){
-                paylink = paylink.replace("data:image/jpg;base64,","");
-            }
-            insOrdersQrcode.setJumpUrl(paylink);
-        }
+        insOrdersQrcode.setJumpUrl(buildJumpUrl(orders.getPayLink()));
         insOrdersQrcode.setQrcodeStatus(1);
         insOrdersQrcode.setCreatetime(LocalDateTime.now());
         this.save(insOrdersQrcode);
@@ -75,17 +81,14 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
 
     @Override
     public void updateQrCode(InsOrders orders) {
-        InsOrdersQrcode ordersQrcode = baseMapper.selectOne(new LambdaQueryWrapper<>(InsOrdersQrcode.class).eq(InsOrdersQrcode::getOrderno, orders.getId()));
-        String paylink = orders.getPayLink();
-        if(isHttpUrl(orders.getPayLink())){
-            paylink = paylink.replace("{", "").replace("}", "");
-            ordersQrcode.setJumpUrl(paylink);
-        }else{
-            if(paylink.contains("data:image/jpg;base64,")){
-                paylink = paylink.replace("data:image/jpg;base64,","");
-            }
-            ordersQrcode.setJumpUrl(paylink);
+        // 查询有效的二维码记录(qrcodeStatus=1),避免拿到已销毁的记录
+        InsOrdersQrcode ordersQrcode = getIsExit(orders.getId());
+        if (ordersQrcode == null) {
+            // 不存在有效记录则新建(内部会处理已销毁记录的复用,不会违反唯一约束)
+            getOneOrSave(orders);
+            return;
         }
+        ordersQrcode.setJumpUrl(buildJumpUrl(orders.getPayLink()));
         baseMapper.updateById(ordersQrcode);
     }
 
@@ -146,6 +149,22 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
             return false;
         }
     }
+
+    /**
+     * 构建跳转链接(去除多余字符)
+     */
+    private String buildJumpUrl(String paylink) {
+        if (StringUtils.isEmpty(paylink)) {
+            return paylink;
+        }
+        if (isHttpUrl(paylink)) {
+            return paylink.replace("{", "").replace("}", "");
+        }
+        if (paylink.contains("data:image/jpg;base64,")) {
+            return paylink.replace("data:image/jpg;base64,", "");
+        }
+        return paylink;
+    }
 }
 
 

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

@@ -24,6 +24,7 @@ import com.jzg.commons.entity.dto.InsOrdersParam;
 import com.jzg.commons.entity.dto.InsOrdersParamVO;
 import com.jzg.commons.entity.dto.InsTaskImagesAdd;
 import com.jzg.commons.entity.enums.MessageCodeEnum;
+import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteQueryVo;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteResultVo;
@@ -779,10 +780,10 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                 ordersCosts.setOrderNo(ordersNo);
             }
             if (BeanUtil.isNotEmpty(quoteResponse) && BeanUtil.isNotEmpty(quoteResponse.getCosts())) {
-                BigDecimal ciPremium = quoteResponse.getCosts().getCiPremium() == null ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getCiPremium());
-                BigDecimal biPremium = quoteResponse.getCosts().getBiPremium() == null ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getBiPremium());
-                BigDecimal niPremium = quoteResponse.getCosts().getNiPremium() == null ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getNiPremium());
-                BigDecimal vvTax = new BigDecimal(quoteResponse.getCosts().getVvTax());
+                BigDecimal ciPremium = quoteResponse.getCosts().getCiPremium() == null || quoteResponse.getCosts().getCiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getCiPremium());
+                BigDecimal biPremium = quoteResponse.getCosts().getBiPremium() == null || quoteResponse.getCosts().getBiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getBiPremium());
+                BigDecimal niPremium = quoteResponse.getCosts().getNiPremium() == null || quoteResponse.getCosts().getNiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getNiPremium());
+                BigDecimal vvTax = quoteResponse.getCosts().getVvTax() == null || quoteResponse.getCosts().getVvTax().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getVvTax());
                 ordersCosts.setJqPremium(ciPremium);
                 ordersCosts.setSyPremium(biPremium);
                 ordersCosts.setJyPremium(niPremium);
@@ -1298,7 +1299,12 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
     }
 
-
+    /**
+     * 查询订单详情
+     *
+     * @param ordersNo 订单号
+     * @return QuoteEchoVo 订单详情
+     */
     @Override
     public QuoteEchoVo getOrderDetail(String ordersNo) {
         log.info("获取订单详情.ordersNo=[{}]", ordersNo);
@@ -1311,7 +1317,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findLogoById(companyId);
         log.info("根据保司id=[{}]获取到的保司信息如下:[{}]", companyId, JSONUtil.toJsonStr(esmInsCompanyHttpResult));
         if (esmInsCompanyHttpResult.getCode() == 200) {
-            resultVo.setInsCompanyVo(esmInsCompanyHttpResult.getData());
+            resultVo.setInsCompanyVo(esmInsCompanyHttpResult.getData(),resultVo.getCosts());
         }
         // 影像资料
         List<InsTaskImages> imagesList = insTaskImagesService.list(new LambdaQueryWrapper<InsTaskImages>()
@@ -1649,4 +1655,78 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     public SysUserActivityCompleteInRule selectByRuleAndUserPhone(String activityId, String userPhone, String qutNum, Integer activityType) {
         return insOrdersMapper.selectByRuleAndUserPhone(activityId, userPhone, qutNum, activityType);
     }
+
+
+    public BigDecimal multiply(BigDecimal premium, BigDecimal ratio) {
+        if(premium==null||ratio==null) {
+            return BigDecimal.ZERO;
+        }
+        return premium.multiply(ratio);
+    }
+    /**
+     * 车险报价批量修改联系人等信息
+     *
+     * @param batchModifyVo 需要批量修改的内容
+     * @author lipf
+     * @date 2026/5/28 10:45
+     */
+    @Override
+    public HttpResult<String> updateOrdersBatch(BatchModifyVo batchModifyVo) {
+        log.info("批量修改车险订单的费用比例,联系人等信息. batchModifyVo=[{}]", JSONUtil.toJsonStr(batchModifyVo));
+
+        List<String> orderNos = batchModifyVo.getOrderNos();
+        if(CollUtil.isEmpty(orderNos)){
+            return HttpResult.error("批量修改时,请指定订单编号");
+        }
+        int count = 0;
+        for (String orderNo : orderNos) {
+            InsOrders oldInsOrders = baseMapper.selectById(orderNo);
+            InsFeeOrders insFeeOrders = insFeeOrdersMapper.selectById(orderNo);
+            if(oldInsOrders == null || insFeeOrders == null){
+                log.info("根据订单号[{}]没有找到车险订单信息和订单的费用信息",orderNo);
+                continue;
+            }
+            log.info("车险订单[{}]对应的订单明细是[{}]", orderNo, JSONUtil.toJsonStr(oldInsOrders));
+
+//            if (Objects.nonNull(batchModifyVo.getJqSuperviseCostsProportion()) && batchModifyVo.getJqSuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+//                BigDecimal superviseReceivablePremium = multiply(new BigDecimal(Objects.toString(insFeeOrders.getJqPremium(),"0") ), batchModifyVo.getJqSuperviseCostsProportion());
+//                insFeeOrdersMapper.update(null, new LambdaUpdateWrapper<InsFeeOrders>()
+//                        .set(InsFeeOrders::getJqSuperviseCostsProportion, batchModifyVo.getJqSuperviseCostsProportion())
+//                        .set(InsFeeOrders::getJqSuperviseCostsPremiums, superviseReceivablePremium)
+//                        .eq(InsFeeOrders::getOrderNo,orderNo));
+//            }
+
+//            if (Objects.nonNull(batchModifyVo.getSySuperviseCostsProportion()) && batchModifyVo.getSySuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+//                BigDecimal otherReceivablePremium = multiply(new BigDecimal(Objects.toString(insFeeOrders.getSyPremium(),"0")), batchModifyVo.getSySuperviseCostsProportion());
+//                baseMapper.update(null, new LambdaUpdateWrapper<InsFeeOrders>()
+//                        .set(InsFeeOrders::getSySuperviseCostsProportion, batchModifyVo.getSySuperviseCostsProportion())
+//                        .set(InsFeeOrders::getSySuperviseCostsPremiums, otherReceivablePremium)
+//                        .eq(InsFeeOrders::getOrderNo,orderNo));
+//            }
+
+
+            if(batchModifyVo.getSigningTime() != null){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsOrders>()
+                        .set(InsOrders::getSigningTime, batchModifyVo.getSigningTime())
+                        .eq(InsOrders::getId,orderNo));
+                insFeeOrdersMapper.update(null, new LambdaUpdateWrapper<InsFeeOrders>()
+                        .set(InsFeeOrders::getSigningTime,batchModifyVo.getSigningTime())
+                        .eq(InsFeeOrders::getOrderNo,orderNo));
+            }
+            if(StrUtil.isNotEmpty(batchModifyVo.getContractUserName())){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsOrders>()
+                        .set(InsOrders::getDockingPerson, batchModifyVo.getContractUserName())
+                        .eq(InsOrders::getId,orderNo));
+            }
+            if(StrUtil.isNotEmpty(batchModifyVo.getContractPhone())){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsOrders>()
+                        .set(InsOrders::getDockingPersonPhone, batchModifyVo.getContractPhone())
+                        .eq(InsOrders::getId,orderNo));
+            }
+            count++;
+        }
+        String msg = String.format("成功修改%d条车险订单",count);
+        log.info(msg);
+        return HttpResult.ok(msg);
+    }
 }

+ 5 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/listener/AuditStateListener.java

@@ -1,10 +1,11 @@
 package com.jzg.quotation.summary.state.listener;
 
-import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.summary.state.AuditState;
 import jakarta.annotation.Resource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.support.MessageBuilder;
 import org.springframework.statemachine.StateMachine;
@@ -19,6 +20,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 @Component
 public class AuditStateListener {
 
+    private static final Logger log = LoggerFactory.getLogger(AuditStateListener.class);
+
     @Resource
     private StateMachine<AuditState.AuditStateEnum, AuditState.AuditStateEvent> costStateMachine;
 
@@ -47,7 +50,7 @@ public class AuditStateListener {
                 result.set(true);
             }
         } catch (Exception e) {
-
+            log.error("sendEvent发生异常",e);
         } finally {
             costStateMachine.stopReactively();
             return result.get();

+ 0 - 3
tenant/insurance/quotation-summary/src/main/resources/application-prod.yaml

@@ -233,9 +233,6 @@ zijin:
 #    downLoadDocument: http://open.zking.com/temp/api/v1/insurance/nonAutoMobile/queryPolicy/downLoadDocument
 #    # 对接三方渠道验车链接接口
 #    sendCheckCarLink: http://open.zking.com/api/v1/open/open-aggregate/auth/wanJiaYun/sendCheckCarLink
-zhongAn:
-  id: "1402039"
-  productId: "10676"
 
 
 feign:

+ 44 - 29
tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml

@@ -27,20 +27,21 @@
     </sql>
     <select id="queryPage" resultType="com.jzg.commons.entity.orders.vo.FeeAuditVo">
         SELECT
-            ifa.order_no as orderNo,
-            io.company_id,
-            io.company_name as companyName,
-            ioci.license_no AS licenseNo,
-            iocui.name as insurName,
-            CASE io.entry_status
-            WHEN 1 THEN '车险出单'
-            WHEN 2 THEN '代客录单'
-            WHEN 3 THEN '补录订单'
-            ELSE ''
-            END AS order_type,
-            suji.name as name,
-            su.mobile as mobile,
-            CASE suji.type_attr
+                qsu.username ,    -- 业务员登录账号
+        ifa.order_no as orderNo,
+        io.company_id,
+        io.company_name as companyName,
+        ioci.license_no AS licenseNo,
+        iocui.name as insurName,
+        CASE io.entry_status
+        WHEN 1 THEN '车险出单'
+        WHEN 2 THEN '代客录单'
+        WHEN 3 THEN '补录订单'
+        ELSE ''
+        END AS order_type,
+        suji.name as name,
+        qsu.mobile as mobile,
+        CASE suji.type_attr
                 WHEN 1 THEN '前线人员'
                 WHEN 2 THEN '后线人员'
                 WHEN 3 THEN '合伙人'
@@ -57,19 +58,27 @@
                ioc.jq_premium as jqPremium, ioc.sy_premium as syPremium, ioc.jy_premium as jyPremium,
                ioc.sum_premium as sumPremium,sd.name as deptName,ifa.create_time as createTime,
                ifa.create_by as createBy,io.pay_time as payTime, ifa.audit_time as auditTime,
-               ifa.audit_user as auditUser, ifa.refuse
-        FROM ins_fee_audit ifa
-        LEFT JOIN ins_orders as io on ifa.order_no = io.id
-        LEFT JOIN ins_orders_car_info as ioci on io.id = ioci.order_no
-        LEFT JOIN ins_orders_car_user_info as iocui on io.id = iocui.order_no and iocui.policy_person_type = 3
-        LEFT JOIN sys_user qsu on qsu.mobile = io.real_quote_user_id
-        LEFT JOIN sys_user_jzg_info suji ON suji.user_id = qsu.id and suji.system_code = #{param.systemCode}
-        LEFT JOIN sys_user su on su.id = io.real_quote_user_id
-        LEFT JOIN sys_dept sd on suji.dept_id = sd.id
-        LEFT JOIN ptl_agreement pa on io.agreement_id = pa.id
-        LEFT JOIN sys_user sua on sua.id = pa.custodian_id
-        LEFT JOIN ins_orders_costs ioc on ioc.order_no = io.id
-        LEFT JOIN ins_orders_external_policy ioep on ioep.order_no = io.id
+               ifa.audit_user as auditUser, ifa.refuse,
+               ifa.is_problem, ifa.problem_reason,
+               ifa.audit_user as auditUser, ifa.refuse,
+                ifa.problem_time,
+                CASE ifa.is_problem
+                WHEN 0 THEN '否'
+                WHEN 1 THEN '是'
+                ELSE ''
+                END AS isProblem,
+                io.order_source
+                FROM ins_fee_audit ifa
+                LEFT JOIN ins_orders as io on ifa.order_no = io.id
+                LEFT JOIN ins_orders_car_info as ioci on io.id = ioci.order_no
+                LEFT JOIN ins_orders_car_user_info as iocui on io.id = iocui.order_no and iocui.policy_person_type = 3
+                LEFT JOIN sys_user qsu on qsu.mobile = io.real_quote_user_id
+                LEFT JOIN sys_user_jzg_info suji ON suji.user_id = qsu.id and suji.system_code = #{param.systemCode}
+                LEFT JOIN sys_dept sd on suji.dept_id = sd.id
+                LEFT JOIN ptl_agreement pa on io.agreement_id = pa.id
+                LEFT JOIN sys_user sua on sua.id = pa.custodian_id
+                LEFT JOIN ins_orders_costs ioc on ioc.order_no = io.id
+                LEFT JOIN ins_orders_external_policy ioep on ioep.order_no = io.id
         <where>
             <choose>
                 <when test="param.receiveUser != null and param.receiveUser != ''">
@@ -85,6 +94,12 @@
             <if test="param.isProblem != null">
                 and ifa.is_problem = #{param.isProblem}
             </if>
+            <if test="param.orderSource != null">
+                and io.order_source = #{param.orderSource}
+            </if>
+            <if test="param.isProblem != null">
+                and ifa.is_problem = #{param.isProblem}
+            </if>
             <if test="param.licenseNo != null and param.licenseNo != ''">
                 and ioci.license_no like concat('%',#{param.licenseNo},'%')
             </if>
@@ -92,7 +107,7 @@
                 and suji.type_attr = #{param.attrType}
             </if>
             <if test="param.salesman != null and param.salesman != ''">
-                and (su.username = #{param.salesman} or su.mobile = #{param.salesman})
+                and (qsu.username = #{param.salesman} or qsu.mobile = #{param.salesman})
             </if>
             <if test="param.orderStatus != null ">
                 and io.order_status = #{param.orderStatus}
@@ -178,7 +193,7 @@
                 END AS attrType,
                io.signing_time as signingTime,
                io.create_time as quotationTime, sua.username as dockingPerson,
-               pa.agreement_abbreviation as agreementName,io.product_name as productName,
+               pa.agreement_abbreviation as agreementName,io.product_id, io.product_name as productName,
                ioc.jq_premium as jqPremium, ioc.sy_premium as syPremium, ioc.jy_premium as jyPremium,
                ioc.sum_premium as sumPremium,sd.name as deptName,ifa.create_time as createTime,
                ifa.create_by as createBy,io.pay_time as payTime, ifa.audit_time as auditTime,

+ 20 - 18
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java

@@ -205,8 +205,8 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
         TaiShanCrawlerQuotationRequest.BusinessInsurance.ProductInfo productInfo = new TaiShanCrawlerQuotationRequest.BusinessInsurance.ProductInfo();
         productInfo.setAnswer("");
         productInfo.setApId("");
-        productInfo.setAboveThresholdFlag("");
-        productInfo.setRecommAdjustValue("");
+        productInfo.setAboveThresholdFlag("0");
+        productInfo.setRecommAdjustValue("0.0");
         productInfo.setDay("365");
         productInfo.setEdrPrjNo("");
         productInfo.setEffective("0");
@@ -215,17 +215,17 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
         productInfo.setOrigInsurer("");
         productInfo.setOrigPlyNo("");
         productInfo.setPolicyNo("");
-        productInfo.setPremium("");
+        productInfo.setPremium("0.0");//"0.0"
         productInfo.setProposalNo("");
-        productInfo.setProposalStatus("");
+        //productInfo.setProposalStatus("");
         productInfo.setQuestion("");
         productInfo.setSyApUseFlg("1");
         productInfo.setSyExpDisCoef("");
         productInfo.setSySpecialExpectDisc("");
-        productInfo.setSyFeeDiscount("");
+        productInfo.setSyFeeDiscount("0");
         productInfo.setSyMeale("");
         productInfo.setPayPkId("");
-        productInfo.setRiskAmount("");
+        productInfo.setRiskAmount("0.0");//"0.0"
         productInfo.setTsApId("");
         productInfo.setComPoints("");
         productInfo.setRenewalClass("");
@@ -247,31 +247,32 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
             itemKind.setMainRiskFlag("");
             itemKind.setDeductibleFlag(false);
             itemKind.setAmount(infoVo.getAmount());
-            itemKind.setRate("");
-            itemKind.setBefPremium(0);
-            itemKind.setPremium(0d);
-            itemKind.setDisCoef(0d);
+            itemKind.setRate("0.0");
+            itemKind.setBefPremium("0.0");//"0.0"
+            itemKind.setPremium("0.0");//"0.0"
+            itemKind.setDisCoef("0.0");//"0.0"
             itemKind.setDeductible("");  // 免额档次
             itemKind.setDuctDiscount("");
             itemKind.setIndemLmtLvl("");
             itemKind.setIndemLmt(infoVo.getAmount());
-            itemKind.setLiabDaysLmt(infoVo.getQuantity());
-            itemKind.setPerAmt(infoVo.getUnitAmount());
+            itemKind.setLiabDaysLmt("");
+            //itemKind.setPerAmt(infoVo.getUnitAmount());
+            itemKind.setPerAmt("");
             itemKind.setGlassType("");
             itemKind.setSpecialGlassFloat("");
             itemKind.setVhlDamageFloat("");
             itemKind.setCompenPerAmt("");
             itemKind.setCompenPerDay("");
             itemKind.setDeductibleRatio("");
-            itemKind.setBefAnnPrm(0);
-            itemKind.setPureRiskPremium(0d);
-            itemKind.setBasePrm(0d);
-            itemKind.setAfterPremiumYear(0d);
-            itemKind.setCalcPrm("0");
+            itemKind.setBefAnnPrm("0.0");//"0.0"
+            itemKind.setPureRiskPremium("0.0");
+            itemKind.setBasePrm("0.0");//"0.0"
+            itemKind.setAfterPremiumYear("0.0");//"0.0"
+            itemKind.setCalcPrm("0.0");//"0.0"
             itemKind.setResvNumberRoad("");
             itemKind.setResvNumberDriver("");
             itemKind.setAbsoluteDeductible("");
-            itemKind.setResvNumAutonomy("");
+            itemKind.setResvNumAutonomy("0.0");//"0.0"
             itemKind.setAmtVar("0.0");
             itemKind.setPrmVar("0.0");
             itemKind.setRowId("");
@@ -727,6 +728,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
     }
 
     private static TaiShanCrawlerQuotationRequest.ApplicantInfo toApplicantInfo(CustomerInfoVo policyHolderInfo, String policyPersonId) {
+        //投保人信息
         TaiShanCrawlerQuotationRequest.ApplicantInfo applicantInfo = new TaiShanCrawlerQuotationRequest.ApplicantInfo();
         applicantInfo.setAddress(policyHolderInfo.getAddr());
         applicantInfo.setCity(policyHolderInfo.getCityCode());

Vissa filer visades inte eftersom för många filer har ändrats