Browse Source

Merge branch 'master' into hlx

helixiao 1 năm trước cách đây
mục cha
commit
20feaa1bf7
73 tập tin đã thay đổi với 3109 bổ sung177 xóa
  1. 6 0
      commons/pom.xml
  2. 9 0
      commons/src/main/java/com/jzg/commons/constants/InsuranceRisk.java
  3. 31 0
      commons/src/main/java/com/jzg/commons/constants/dict/TaxpayerIdentifier.java
  4. 135 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  5. 32 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java
  6. 20 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceLink.java
  7. 36 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java
  8. 19 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlementFile.java
  9. 65 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/AuditedOrder.java
  10. 40 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java
  11. 29 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ImportExcelResultVo.java
  12. 15 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ImportResultVo.java
  13. 39 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoicingVo.java
  14. 69 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/JyExcelVo.java
  15. 81 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/OtherExcelVo.java
  16. 74 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java
  17. 27 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementVo.java
  18. 88 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SuperviseExcelVo.java
  19. 21 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersClause.java
  20. 4 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/QuoteVo.java
  21. 15 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  22. 4 1
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteResultsVo.java
  23. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/CompanyClauseVo.java
  24. 2 0
      commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostRuleVo.java
  25. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostTypeVo.java
  26. 6 4
      platform/src/main/java/com/jzg/controller/ClauseController.java
  27. 35 4
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/component/AnShengCrawlerCacheComponent.java
  28. 48 14
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/component/AnShengCrawlerRequestComponent.java
  29. 4 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/constant/enums/RequestUrl.java
  30. 41 8
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerApplyApplicationRequest.java
  31. 16 4
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java
  32. 77 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerComprehensiveQueryInsurenetRequest.java
  33. 1 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerQueryDocumentsInformationRequest.java
  34. 171 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerComprehensiveQueryInsurenetResponse.java
  35. 24 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerFileUploadResponse.java
  36. 2 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerQuoteProcessService.java
  37. 4 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerQuoteProcessServiceImpl.java
  38. 61 36
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  39. 6 6
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java
  40. 165 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/InsurePremiumRequest.java
  41. 6 6
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  42. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  43. 8 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java
  44. 6 6
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiRequestImpl.java
  45. 6 4
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/vo/GuoRenSpecialAgreementVo.java
  46. 41 34
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java
  47. 6 6
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java
  48. 1 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  49. 24 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  50. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersClauseMapper.java
  51. 13 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersClauseService.java
  52. 35 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersClauseServiceImpl.java
  53. 19 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  54. 46 14
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  55. 5 4
      tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/service/impl/YangGuangApiRequestImpl.java
  56. 6 6
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java
  57. 6 6
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/api/service/impl/ZhongMeiApiRequestImpl.java
  58. 8 1
      tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java
  59. 2 1
      tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java
  60. 172 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  61. 27 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/JyExcelListener.java
  62. 27 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/OtherExcelListener.java
  63. 26 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/SuperviseExcelListener.java
  64. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceLinkMapper.java
  65. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceMapper.java
  66. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementFileMapper.java
  67. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementMapper.java
  68. 36 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  69. 140 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  70. 8 3
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java
  71. 701 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  72. 9 1
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  73. 143 0
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

+ 6 - 0
commons/pom.xml

@@ -98,6 +98,12 @@
             <artifactId>zip4j</artifactId>
             <version>1.3.2</version>
         </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <version>2.0.1.Final</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 9 - 0
commons/src/main/java/com/jzg/commons/constants/InsuranceRisk.java

@@ -31,4 +31,13 @@ public enum InsuranceRisk {
     public static List<InsuranceRisk> getInsuranceRisk() {
         return INSURANCE_RISK;
     }
+
+    public static InsuranceRisk getInsuranceRiskByCode(String code) {
+        for (InsuranceRisk insuranceRisk : INSURANCE_RISK) {
+            if (insuranceRisk.getCode().equals(code)) {
+                return insuranceRisk;
+            }
+        }
+        return null;
+    }
 }

+ 31 - 0
commons/src/main/java/com/jzg/commons/constants/dict/TaxpayerIdentifier.java

@@ -0,0 +1,31 @@
+package com.jzg.commons.constants.dict;
+
+
+import com.jzg.commons.constants.DictEnum;
+import com.jzg.commons.constants.IBaseEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+@DictEnum(key = "taxpayerIdentifier", desc = "纳税人证件类型")
+public enum TaxpayerIdentifier implements IBaseEnum {
+
+    TI_11("11", "工商注册号码", 0, 1),
+    TI_99("99", "其他", 0, 1),
+    TI_01("01", "居民身份证", 0, 1),
+    TI_02("02", "护照", 0, 1),
+    TI_03("03", "军人证", 0, 1),
+    TI_10("10", "组织机构代码", 0, 1);
+
+    // 编号
+    private final String code;
+    // 说明
+    private final String desc;
+    // 排序
+    private final Integer sort;
+    // 状态  0 启用  1 不启用
+    private final Integer status;
+
+
+}

+ 135 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java

@@ -0,0 +1,135 @@
+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;
+
+@Data
+@Schema(description = "财务应收表")
+public class InsPlyIncome  extends BaseModel {
+    private String id;
+
+    @Schema(description = "订单号")
+    private String orderNo;
+
+    @Schema(description = "协议类型")
+    private String agreementType;
+
+    @Schema(description = "机构")
+    private String deptId;
+
+    @Schema(description = "机构名称")
+    private String deptName;
+
+    @Schema(description = "险种")
+    private String riskCode;
+
+    @Schema(description = "出单时间")
+    private String payTime;
+
+    @Schema(description = "签单时间")
+    private String signingTime;
+
+    @Schema(description = "保司ID")
+    private String companyId;
+
+    @Schema(description = "保司名称")
+    private String companyName;
+
+    @Schema(description = "协议Id")
+    private String agreementId;
+
+    @Schema(description = "协议名称")
+    private String agreementName;
+
+    @Schema(description = "车牌号")
+    private String licenseNo;
+
+    @Schema(description = "车船税")
+    private String taxPremium;
+
+    @Schema(description = "交强保单号")
+    private String jqPolicyNo;
+
+    @Schema(description = "商业保单号")
+    private String syPolicyNo;
+
+    @Schema(description = "驾意保单号")
+    private String jyPolicyNo;
+
+    @Schema(description = "交强保费")
+    private String jqPremium;
+
+    @Schema(description = "商业保费")
+    private String syPremium;
+
+    @Schema(description = "驾意保费")
+    private String jyPremium;
+
+    @Schema(description = "交强手续费")
+    private String jqSuperviseCostsPremiums;
+
+    @Schema(description = "交强手续费比例")
+    private String jqSuperviseCostsProportion;
+
+    @Schema(description = "商业手续费")
+    private String sySuperviseCostsPremiums;
+
+    @Schema(description = "商业手续费比例")
+    private String sySuperviseCostsProportion;
+
+    @Schema(description = "驾意手续费")
+    private String jySuperviseCostsPremiums;
+
+    @Schema(description = "驾意手续费比例")
+    private String jySuperviseCostsProportion;
+
+    @Schema(description = "交强跟单费比例")
+    private String jqOtherCostsProportion;
+
+    @Schema(description = "交强跟单费")
+    private String jqOtherCostsPremiums;
+
+    @Schema(description = "商业跟单费比例")
+    private String syOtherCostsProportion;
+
+    @Schema(description = "商业跟单费")
+    private String syOtherCostsPremiums;
+
+    @Schema(description = "驾意跟单费比例")
+    private String jyOtherCostsProportion;
+
+    @Schema(description = "驾意跟单费")
+    private String jyOtherCostsPremiums;
+
+    @Schema(description = "交强应收费用")
+    private String jqReceivablePremium;
+
+    @Schema(description = "商业应收费用")
+    private String syReceivablePremium;
+
+    @Schema(description = "驾意应收费用")
+    private String jyReceivablePremium;
+
+    @Schema(description = "手续费是否已经结算")
+    private String superviseSettlement;
+
+    @Schema(description = "跟单费是否已经结算")
+    private String otherSettlement;
+
+    @Schema(description = "驾意险手续费是否已经结算")
+    private String jySuperviseSettlement;
+
+    @Schema(description = "驾意跟单位是否已经结算")
+    private String jyOtherSettlement;
+
+    @Schema(description = "维护人工号")
+    private String leaderId;
+
+    @Schema(description = "维护人名称")
+    private String leaderName;
+
+    @Schema(description = "对接人")
+    private String contactPerson;
+
+}

+ 32 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java

@@ -0,0 +1,32 @@
+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 java.math.BigDecimal;
+
+@Data
+@Schema(description = "财务应收开票表")
+public class InsPlyIncomeInvoice extends BaseModel {
+    private String id;
+
+    @Schema(description = "开票类型")
+    private String invoiceType;
+
+    @Schema(description = "开票方")
+    private String invoiceParty;
+
+    @Schema(description = "虚增金额")
+    private BigDecimal overinflatedAmount;
+
+    @Schema(description = "应收费用")
+    private BigDecimal receivableSupervisePremium;
+
+    @Schema(description = "税点")
+    private String taxPoint;
+
+    @Schema(description = "状态")
+    private String status;
+
+}

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

@@ -0,0 +1,20 @@
+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 java.math.BigDecimal;
+
+@Data
+@Schema(description = "财务应收开票表")
+public class InsPlyIncomeInvoiceLink{
+    private String id;
+
+    @Schema(description = "开票ID")
+    private String invoiceId;
+
+    @Schema(description = "应收表ID")
+    private String incomeId;
+
+}

+ 36 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java

@@ -0,0 +1,36 @@
+package com.jzg.commons.entity.finance.po;
+
+import cn.hutool.core.date.DateTime;
+import com.jzg.commons.core.base.BaseModel;
+import com.jzg.commons.util.idgen.IdGenerate;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(description = "财务应收开票结算表")
+public class InsPlyIncomeInvoiceSettlement extends BaseModel {
+    private String id;
+
+    @Schema(description = "票据iD")
+    private String invoiceId;
+
+    @Schema(description = "实收金额")
+    private String actualReceivedAmount;
+
+    @Schema(description = "收款日期")
+    private DateTime receivePaymentDate;
+
+    public InsPlyIncomeInvoiceSettlement(){
+
+    }
+
+    public InsPlyIncomeInvoiceSettlement(String invoiceId, String actualReceivedAmount,DateTime receivePaymentDate){
+        this.id = IdGenerate.nextId();
+        this.invoiceId = invoiceId;
+        this.actualReceivedAmount = actualReceivedAmount;
+        this.receivePaymentDate = receivePaymentDate;
+    }
+
+}

+ 19 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlementFile.java

@@ -0,0 +1,19 @@
+package com.jzg.commons.entity.finance.po;
+
+import cn.hutool.core.date.DateTime;
+import com.jzg.commons.core.base.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "财务应收开票结算附件表")
+public class InsPlyIncomeInvoiceSettlementFile extends BaseModel {
+    private String id;
+
+    @Schema(description = "结算id")
+    private String settlementId;
+
+    @Schema(description = "收款日期")
+    private String fileId;
+
+}

+ 65 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/AuditedOrder.java

@@ -0,0 +1,65 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "已审核订单Vo")
+public class AuditedOrder {
+    
+    @Schema(description = "订单号")
+    private String orderNo;
+
+    @Schema(description = "保司id")
+    private String companyId;
+
+    @Schema(description = "协议id")
+    private String agreementId;
+
+    @Schema(description = "费用id")
+    private String costsId;
+
+    @Schema(description = "险种id")
+    private String productId;
+
+    @Schema(description = "车牌号")
+    private String licenseNo;
+    
+    @Schema(description = "交强保单号")
+    private String jqPolicyNo;
+
+    @Schema(description = "商业保单号")
+    private String syPolicyNo;
+
+    @Schema(description = "驾意保单号")
+    private String jyPolicyNo;
+
+    @Schema(description = "交强保费")
+    private String jqPremium;
+
+    @Schema(description = "商业保费")
+    private String syPremium;
+
+    @Schema(description = "驾意保费")
+    private String jyPremium;
+
+    @Schema(description = "交强手续费费用")
+    private String jqCommissionPremium;
+
+    @Schema(description = "交强跟单费费用")
+    private String jqFollowPremium;
+
+    @Schema(description = "商业手续费费用")
+    private String syCommissionPremium;
+
+    @Schema(description = "商业跟单费费用")
+    private String syFollowPremium;
+
+    @Schema(description = "驾意手续费费用")
+    private String jyCommissionPremium;
+
+    @Schema(description = "驾意跟单费费用")
+    private String jyFollowPremium;
+
+
+}

+ 40 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java

@@ -0,0 +1,40 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ *  批量修改Vo
+ */
+@Data
+@Schema(description = "批量修改Vo")
+public class BatchModifyVo {
+
+    @Schema(description = "应收订单id")
+    private List<String> incomeIds;
+
+    @Schema(description = "交强手续费比例")
+    private BigDecimal jqSuperviseCostsProportion;
+
+    @Schema(description = "商业手续费比例")
+    private BigDecimal sySuperviseCostsProportion;
+
+    @Schema(description = "驾意手续费比例")
+    private BigDecimal jySuperviseCostsProportion;
+
+    @Schema(description = "交强跟单费比例")
+    private BigDecimal jqOtherCostsProportion;
+
+    @Schema(description = "商业跟单费比例")
+    private BigDecimal syOtherCostsProportion;
+
+    @Schema(description = "驾意跟单费比例")
+    private BigDecimal jyOtherCostsProportion;
+
+    @Schema(description = "签单时间")
+    private LocalDateTime signingTime;
+}

+ 29 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/ImportExcelResultVo.java

@@ -0,0 +1,29 @@
+package com.jzg.commons.entity.finance.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * excel 导入结果的Vo
+ */
+@Data
+public class ImportExcelResultVo {
+
+    /**
+     * 成功数量
+     */
+    private Integer successNumber;
+
+    /**
+     * 失败数量
+     */
+    private Integer failedNumber;
+
+
+    /**
+     * 失败数据
+     */
+    private List<Object> failedData;
+
+}

+ 15 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/ImportResultVo.java

@@ -0,0 +1,15 @@
+package com.jzg.commons.entity.finance.vo;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * excel 导入结果的Vo
+ */
+@Data
+public class ImportResultVo {
+
+    private boolean success;
+
+    private String message;
+}

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoicingVo.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
+public class InvoicingVo {
+
+    /**
+     * 应收订单号
+     */
+    @Schema(description = "应收订单号")
+    private List<String> incomeIds;
+
+    @Schema(description = "开票的保司id")
+    private String companyId;
+
+    // 开票类型 1:手续费 2:跟单费 3:驾意手续费 4::驾意跟单费
+    @Schema(description = "开票类型")
+    private String invoiceType;
+
+    @Schema(description = "开票方")
+    private String invoiceParty;
+
+    @Schema(description = "虚增金额")
+    private BigDecimal overinflatedAmount;
+
+    @Schema(description = "应收费用")
+    private BigDecimal receivablePremium;
+
+    @Schema(description = "税点")
+    private String taxPoint;
+}

+ 69 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/JyExcelVo.java

@@ -0,0 +1,69 @@
+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.Objects;
+
+/**
+ * 手续费应收excel导入
+ */
+@Data
+@Schema(description = "驾意险应收excel导入Vo")
+public class JyExcelVo {
+    
+    @Schema(description = "保险公司")
+    private String insuranceCompany;
+
+    @Schema(description = "协议编号")
+    private String agreementCode;
+
+    @Schema(description = "签单日期")
+    private String signDate;
+
+    @Schema(description = "车牌号")
+    private String licenseNo;
+
+    @Schema(description = "驾意险保单号")
+    private String jyPolicyNo;
+
+    @Schema(description = "驾意险保费")
+    private BigDecimal jyPremium;
+
+    @Schema(description = "驾意险手续费比例")
+    private BigDecimal jySuperviseRatio;
+
+    @Schema(description = "驾意险跟单费比例")
+    private BigDecimal jyOtherRatio;
+
+    @Schema(description = "错误信息")
+    private String errorMessage;
+
+    public ImportResultVo checkEmpty(){
+        ImportResultVo resultVo = new ImportResultVo();
+        resultVo.setSuccess(false);
+        if(Objects.isNull(this.insuranceCompany) || Objects.equals(this.insuranceCompany,"")){
+            resultVo.setMessage("保险公司不能为空");
+        }
+        if(Objects.isNull(this.licenseNo) || Objects.equals(this.licenseNo,"")){
+            resultVo.setMessage("车牌号不能为空");
+        }
+        if(Objects.isNull(this.jyPolicyNo) || Objects.equals(this.jyPolicyNo,"")){
+            resultVo.setMessage("驾意险保单号不能为空");
+        }
+        if(Objects.isNull(this.jyPremium) || Objects.equals(this.jyPremium,BigDecimal.ZERO)){
+            resultVo.setMessage("驾意险保费不能为空");
+        }
+        if(Objects.isNull(this.jySuperviseRatio) || Objects.equals(this.jySuperviseRatio,BigDecimal.ZERO)){
+            resultVo.setMessage("驾意险手续费比例不能为空");
+        }
+        if(Objects.isNull(this.jyOtherRatio) || Objects.equals(this.jyOtherRatio,BigDecimal.ZERO)){
+            resultVo.setMessage("驾意险跟单费比例不能为空");
+        }
+        if(Objects.isNull(resultVo.getMessage())){
+            resultVo.setSuccess(true);
+        }
+        return resultVo;
+    }
+}

+ 81 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/OtherExcelVo.java

@@ -0,0 +1,81 @@
+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.Objects;
+
+/**
+ * 手续费应收excel导入
+ */
+@Data
+@Schema(description = "跟单费应收excel导入Vo")
+public class OtherExcelVo {
+    
+    @Schema(description = "保险公司")
+    private String insuranceCompany;
+
+    @Schema(description = "协议编号")
+    private String agreementCode;
+
+    @Schema(description = "签单日期")
+    private String signDate;
+
+    @Schema(description = "车牌号")
+    private String licenseNo;
+
+    @Schema(description = "交强险保单号")
+    private String jqPolicyNo;
+
+    @Schema(description = "交强险保费")
+    private BigDecimal jqPremium;
+
+    @Schema(description = "交强险跟单费比例")
+    private BigDecimal jqOtherRatio;
+
+    @Schema(description = "商业险保单号")
+    private String syPolicyNo;
+    
+    @Schema(description = "商业险保费")
+    private BigDecimal syPremium;
+
+    @Schema(description = "商业险跟单费比例")
+    private BigDecimal syOtherRatio;
+
+    @Schema(description = "错误信息")
+    private String errorMessage;
+
+    public ImportResultVo checkEmpty(){
+        ImportResultVo resultVo = new ImportResultVo();
+        resultVo.setSuccess(false);
+        if(Objects.isNull(this.insuranceCompany) || Objects.equals(this.insuranceCompany,"")){
+            resultVo.setMessage("保险公司不能为空");
+        }
+        if(Objects.isNull(this.licenseNo) || Objects.equals(this.licenseNo,"")){
+            resultVo.setMessage("车牌号不能为空");
+        }
+        if(Objects.isNull(this.jqPolicyNo) || Objects.equals(this.jqPolicyNo,"")){
+            resultVo.setMessage("交强险保单号不能为空");
+        }
+        if(Objects.isNull(this.jqPremium) || Objects.equals(this.jqPremium,BigDecimal.ZERO)){
+            resultVo.setMessage("交强险保费不能为空");
+        }
+        if(Objects.isNull(this.jqOtherRatio) || Objects.equals(this.jqOtherRatio,BigDecimal.ZERO)){
+            resultVo.setMessage("交强险手续费比例不能为空");
+        }
+        if(Objects.isNull(this.syPolicyNo) || Objects.equals(this.syPolicyNo,"")){
+            resultVo.setMessage("商业险保单号不能为空");
+        }
+        if(Objects.isNull(this.syPremium) || Objects.equals(this.syPremium,BigDecimal.ZERO)){
+            resultVo.setMessage("商业险保费不能为空");
+        }
+        if(Objects.isNull(this.syOtherRatio) || Objects.equals(this.syOtherRatio,BigDecimal.ZERO)){
+            resultVo.setMessage("商业险手续费比例不能为空");
+        }
+        if(Objects.isNull(resultVo.getMessage())){
+            resultVo.setSuccess(true);
+        }
+        return resultVo;
+    }
+}

+ 74 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java

@@ -0,0 +1,74 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+/**
+ * @author tz
+ * @description 应收查询VO
+ * @createDate 2024-06-26 10:49:31
+ */
+
+@Data
+public class ReceivableQueryVo {
+
+    @Schema(description = "查询类型")
+    private String queryType;
+
+    @Schema(description = "车牌号")
+    private String licenseNo;
+
+    @Schema(description = "保险公司")
+    private String companyId;
+
+    @Schema(description = "签单时间开始时间")
+    private String signingTimeStart;
+
+    @Schema(description = "签单时间结束时间")
+    private String signingTimeEnd;
+
+    @Schema(description = "订单号")
+    private String orderNo;
+
+    @Schema(description = "协议id")
+    private String agreementId;
+
+    @Schema(description = "出单机构")
+    private String deptId;
+
+    @Schema(description = "险种")
+    private String riskCode;
+
+    @Schema(description = "订单类型")
+    private String orderType;
+
+    @Schema(description = "被保人")
+    private String insuredName;
+
+    @Schema(description = "交强险保单号")
+    private String jqPolicyNo;
+
+    @Schema(description = "商业险保单号")
+    private String syPolicyNo;
+
+    @Schema(description = "驾意险保单号")
+    private String jyPolicyNo;
+
+    @Schema(description = "对接人")
+    private String dockingPerson;
+
+    @Schema(description = "交强起保时间")
+    private String jqStartDate;
+
+    @Schema(description = "交强起保时间")
+    private String jqEndDate;
+
+    @Schema(description = "商业起保时间")
+    private String syStartDate;
+
+    @Schema(description = "商业起保时间")
+    private String syEndDate;
+
+
+}

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

@@ -0,0 +1,27 @@
+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 SettlementVo {
+
+    @Schema(description = "开票id")
+    private String invoicingId;
+
+    @Schema(description = "实收金额")
+    private BigDecimal actualReceivedAmount;
+
+    @Schema(description = "收款日期")
+    private String receivePaymentDate;
+
+    @Schema(description = "附加id")
+    private List<String> attachmentIds;
+}

+ 88 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/SuperviseExcelVo.java

@@ -0,0 +1,88 @@
+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.Objects;
+
+/**
+ * 手续费应收excel导入
+ */
+@Data
+@Schema(description = "手续费应收excel导入Vo")
+public class SuperviseExcelVo {
+    
+    @Schema(description = "保险公司")
+    private String insuranceCompany;
+
+    @Schema(description = "协议编号")
+    private String agreementCode;
+
+    @Schema(description = "签单日期")
+    private String signDate;
+
+    @Schema(description = "车牌号")
+    private String licenseNo;
+
+    @Schema(description = "交强险保单号")
+    private String jqPolicyNo;
+
+    @Schema(description = "交强险保费")
+    private BigDecimal jqPremium;
+
+    @Schema(description = "交强险手续费比例")
+    private BigDecimal jqSuperviseRatio;
+
+    @Schema(description = "商业险保单号")
+    private String syPolicyNo;
+    
+    @Schema(description = "商业险保费")
+    private BigDecimal syPremium;
+
+    @Schema(description = "商业险手续费比例")
+    private BigDecimal sySuperviseRatio;
+
+    @Schema(description = "错误信息")
+    private String errorMessage;
+
+    public ImportResultVo checkEmpty(){
+        ImportResultVo resultVo = new ImportResultVo();
+        resultVo.setSuccess(false);
+        if(Objects.isNull(this.insuranceCompany) || Objects.equals(this.insuranceCompany,"")){
+            resultVo.setMessage("保险公司不能为空");
+        }
+        if(Objects.isNull(this.agreementCode) || Objects.equals(this.agreementCode,"")){
+            resultVo.setMessage("协议编号不能为空");
+        }
+        if(Objects.isNull(this.signDate) || Objects.equals(this.signDate,"")){
+            resultVo.setMessage("签单日期不能为空");
+        }
+        if(Objects.isNull(this.licenseNo) || Objects.equals(this.licenseNo,"")){
+            resultVo.setMessage("车牌号不能为空");
+        }
+        if(Objects.isNull(this.jqPolicyNo) || Objects.equals(this.jqPolicyNo,"")){
+            resultVo.setMessage("交强险保单号不能为空");
+        }
+        if(Objects.isNull(this.jqPremium) || Objects.equals(this.jqPremium,BigDecimal.ZERO)){
+            resultVo.setMessage("交强险保费不能为空");
+        }
+        if(Objects.isNull(this.jqSuperviseRatio) || Objects.equals(this.jqSuperviseRatio,BigDecimal.ZERO)){
+            resultVo.setMessage("交强险手续费比例不能为空");
+        }
+        if(Objects.isNull(this.syPolicyNo) || Objects.equals(this.syPolicyNo,"")){
+            resultVo.setMessage("商业险保单号不能为空");
+        }
+        if(Objects.isNull(this.syPremium) || Objects.equals(this.syPremium,BigDecimal.ZERO)){
+            resultVo.setMessage("商业险保费不能为空");
+        }
+        if(Objects.isNull(this.sySuperviseRatio) || Objects.equals(this.sySuperviseRatio,BigDecimal.ZERO)){
+            resultVo.setMessage("商业险手续费比例不能为空");
+        }
+
+        if(Objects.isNull(resultVo.getMessage())){
+            resultVo.setSuccess(true);
+        }
+        return resultVo;
+    }
+}

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

@@ -0,0 +1,21 @@
+package com.jzg.commons.entity.orders.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/7/22 16:08
+ */
+
+@Data
+public class InsOrdersClause {
+    @Schema(description = "订单ID")
+    @TableId(value = "order_no", type = IdType.ASSIGN_ID)
+    private String orderNo;
+
+    @Schema(description = "特约ID")
+    private String clauseId;
+}

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/QuoteVo.java

@@ -2,6 +2,8 @@ package com.jzg.commons.entity.quote.vo;
 
 
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.commons.entity.po.InsCompanyClause;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
 import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
 import com.jzg.commons.util.IDCardUtils;
 import com.jzg.commons.constants.quote.enums.quote.RiskCode;
@@ -88,6 +90,8 @@ public class QuoteVo implements Serializable {
     @Schema(description = "险种产品代码")
     private String productId;
 
+    @Schema(description = "特约")
+    private List<InsCompanyClause> specialInfoVo;
 
     /**
      * 订单数据库查询数据转 QuoteVo对象

+ 15 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -3,6 +3,7 @@ package com.jzg.commons.entity.quote.vo.aggregated;
 
 import com.jzg.commons.entity.orders.po.InsOrdersQrcode;
 import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.InsCompanyClause;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -26,6 +27,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 
 /**
@@ -204,6 +206,17 @@ public class QuoteEchoVo extends QuoteVo {
      */
     private Integer auditStatus;
 
+    /**
+     * 交强特约
+     */
+    private List<InsCompanyClause> ciSpecialInfoVo;
+
+    /**
+     * 商业特约
+     */
+    private List<InsCompanyClause> biSpecialInfoVo;
+
+
     /**
      * 订单数据库查询数据转 QuoteVo对象
      * @param insOrdersVo
@@ -227,6 +240,8 @@ public class QuoteEchoVo extends QuoteVo {
         this.getOrder().setCreateTime(insOrdersVo.getCreateTime().toString());
         this.getOrder().setQuoteTime(insOrdersVo.getCreateTime().toString());
         this.getOrder().setSigningTime(insOrdersVo.getPayTime());
+        this.setCiSpecialInfoVo(insOrdersVo.getSpecialInfoVo().stream().filter(companyClauseVo -> companyClauseVo.getRiskCode().equals("0507")).collect(Collectors.toList()));
+        this.setBiSpecialInfoVo(insOrdersVo.getSpecialInfoVo().stream().filter(companyClauseVo -> companyClauseVo.getRiskCode().equals("0510")).collect(Collectors.toList()));
         Salesman salesman = new Salesman();
         salesman.setName(insOrdersVo.getSalesmanInfo().getName());
         salesman.setDeptName(insOrdersVo.getSalesmanInfo().getDeptName());

+ 4 - 1
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteResultsVo.java

@@ -107,7 +107,10 @@ public class QuoteResultsVo implements Serializable {
 
     private String quoteStatus;
 
-
+    /**
+     * 费用不符合描述
+     */
+    private String feeNoDescription;
     /**
      * 错误提示
      */

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/vo/CompanyClauseVo.java

@@ -7,6 +7,9 @@ import lombok.Data;
 @Data
 public class CompanyClauseVo extends PageRequest {
 
+    @Schema(description = "主键")
+    private String id;
+
     @Schema(description = "保险公司id")
     private String companyId;
 

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostRuleVo.java

@@ -46,6 +46,8 @@ public class PtlAgreementCostRuleVo{
 
     private PtlAgreementUndwrtRulesAttr rulesAttr;
 
+    private String commission;
+
 
     @TableField(exist = false)
     private List<SysDict> rulesDict;

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostTypeVo.java

@@ -29,4 +29,7 @@ public class PtlAgreementCostTypeVo{
     @Schema(description = "留点比例")
     private BigDecimal keepPointRatio;
 
+    @Schema(description = "手续费比例")
+    private BigDecimal commission;
+
 }

+ 6 - 4
platform/src/main/java/com/jzg/controller/ClauseController.java

@@ -13,10 +13,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
-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.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -52,6 +49,11 @@ public class ClauseController {
     public HttpResult<InsCompanyClauseVo> getClause(@RequestSingleParam(value = "id") String id){
         return HttpResult.ok(insCompanyClauseService.getClause(id));
     }
+
+    @GetMapping(value = "getById")
+    public InsCompanyClause getById(String id){
+        return insCompanyClauseService.getById(id);
+    }
     /**
      * 添加特别约定
      * @param insCompanyClause

+ 35 - 4
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/component/AnShengCrawlerCacheComponent.java

@@ -2,14 +2,19 @@ package com.jzg.quotation.ansheng.crawler.component;
 
 
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerApplyApplicationRequest;
+import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerAutoSpecialPromiseRequest;
 import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerCalculatePremiumApplyMessage;
+import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerFileUploadResponse;
 import lombok.RequiredArgsConstructor;
 import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Component;
 import org.springframework.util.ObjectUtils;
 
 import java.time.Duration;
+import java.util.List;
 
 /**
  * @description: 安盛天平 爬虫 缓存配置
@@ -22,7 +27,7 @@ public class AnShengCrawlerCacheComponent {
 
     public static String AS_QUOTE_RESPONSE = "ansheng:quote:response:";
 
-    public static final long AS_QUOTE_RESPONSE_TIME = 3L;
+    public static final long AS_QUOTE_RESPONSE_TIME = 1L;
 
     public static String AS_LOGIN_COOKIE = "ansheng:login:cookie";
 
@@ -32,6 +37,10 @@ public class AnShengCrawlerCacheComponent {
 
     public static final String AGENT_DEFINE = "ansheng:agent:define:";
 
+    public static final String IMAGES_INFO = "ansheng:images:info:";
+
+    public static final long IMAGES_INFO_TIME = 1L;
+
     public static final long AGENT_DEFINE_TIME = 6L;
 
     private final RedissonClient redissonClient;
@@ -46,6 +55,7 @@ public class AnShengCrawlerCacheComponent {
         redissonClient.getBucket(AS_LOGIN_COOKIE + username).set(cookie, Duration.ofDays(AS_LOGIN_COOKIE_TIME));
     }
 
+
     /**
      * 获取登录的信息
      *
@@ -64,20 +74,41 @@ public class AnShengCrawlerCacheComponent {
      * @param premiumApplyMessage 报价请求信息
      */
     public void cacheQuoteRequest(String orderNo,
-                                  AnShengCrawlerCalculatePremiumApplyMessage premiumApplyMessage) {
+                                  AnShengCrawlerApplyApplicationRequest premiumApplyMessage) {
         String responseStr = JSONObject.toJSONString(premiumApplyMessage);
         redissonClient.getBucket(AS_QUOTE_RESPONSE + orderNo).set(responseStr, Duration.ofDays(AS_QUOTE_RESPONSE_TIME));
     }
 
+
+    /**
+     * 缓存图片信息
+     * @param orderNo 订单号
+     * @param dataDTOS 图片信息
+     */
+    public void cacheImagesInfo(String orderNo, List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> dataDTOS) {
+        String responseStr = JSONObject.toJSONString(dataDTOS);
+        redissonClient.getBucket(IMAGES_INFO + orderNo).set(responseStr, Duration.ofDays(IMAGES_INFO_TIME));
+    }
+
+    /**
+     * 获取图片信息
+     * @param orderNo 订单号
+     * @return 图片信息
+     */
+    public List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> getImagesInfo(String orderNo) {
+        String imagesInfo = (String) redissonClient.getBucket(IMAGES_INFO + orderNo).get();
+        return JSONArray.parseArray(imagesInfo, AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO.class);
+    }
+
     /**
      * 获取订单报价信息
      *
      * @param orderNo 订单号
      * @return 报价订单返回
      */
-    public AnShengCrawlerCalculatePremiumApplyMessage getQuoteResponse(String orderNo) {
+    public AnShengCrawlerApplyApplicationRequest getQuoteResponse(String orderNo) {
         String o = (String) redissonClient.getBucket(AS_QUOTE_RESPONSE + orderNo).get();
-        AnShengCrawlerCalculatePremiumApplyMessage anShengCrawlerCalculatePremiumApplyResponse = JSON.parseObject(o, AnShengCrawlerCalculatePremiumApplyMessage.class);
+        AnShengCrawlerApplyApplicationRequest anShengCrawlerCalculatePremiumApplyResponse = JSON.parseObject(o, AnShengCrawlerApplyApplicationRequest.class);
         if (ObjectUtils.isEmpty(anShengCrawlerCalculatePremiumApplyResponse)) {
             throw new RuntimeException("报价信息过期, 请重新报价");
         }

+ 48 - 14
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/component/AnShengCrawlerRequestComponent.java

@@ -12,7 +12,9 @@ import com.jzg.quotation.commons.utils.CookieParseUtils;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.core.io.FileSystemResource;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
@@ -20,7 +22,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 
-import java.io.File;
 import java.util.*;
 
 /**
@@ -49,7 +50,7 @@ public class AnShengCrawlerRequestComponent {
                 .map(HttpEntity::getBody)
                 .orElseThrow(() -> new SystemException("程序异常请联系管理员"));
 
-        if(response.getCode() == 200){
+        if (response.getCode() == 200) {
             return response;
         }
         throw new SystemException(response.getMessage());
@@ -166,8 +167,9 @@ public class AnShengCrawlerRequestComponent {
      * @param headers 请求头
      * @return
      */
-    public AnShengCrawlerInsureAddResponse.DataDTO insureAdd(AnShengCrawlerInsureAddRequest request, HttpHeaders headers){
-        ResponseEntity<AnShengCrawlerInsureAddResponse> responseEntity = requestComponent.formData(RequestUrl.INSURE_ADD.getRequestUrl(anShengCrawlerProperties.getUrl()), request, AnShengCrawlerInsureAddResponse.class, headers);;
+    public AnShengCrawlerInsureAddResponse.DataDTO insureAdd(AnShengCrawlerInsureAddRequest request, HttpHeaders headers) {
+        ResponseEntity<AnShengCrawlerInsureAddResponse> responseEntity = requestComponent.formData(RequestUrl.INSURE_ADD.getRequestUrl(anShengCrawlerProperties.getUrl()), request, AnShengCrawlerInsureAddResponse.class, headers);
+        ;
         return Optional.ofNullable(responseEntity.getBody())
                 .map(AnShengCrawlerInsureAddResponse::getData)
                 .orElseThrow(() -> new SystemException("添加险种失败"));
@@ -203,7 +205,7 @@ public class AnShengCrawlerRequestComponent {
      * @param headers 请求头
      * @return 报价返回
      */
-    public AnShengCrawlerAutoSpecialPromiseResponse autoSpecialPromise(AnShengCrawlerAutoSpecialPromiseRequest request, HttpHeaders headers) {
+    public AnShengCrawlerAutoSpecialPromiseResponse autoSpecialPromise(AnShengCrawlerApplyApplicationRequest request, HttpHeaders headers) {
         return post(RequestUrl.AUTO_SPECIAL_PROMISE, request, AnShengCrawlerAutoSpecialPromiseResponse.class, headers);
     }
 
@@ -230,17 +232,45 @@ public class AnShengCrawlerRequestComponent {
         return responseEntity.getBody();
     }
 
+    /**
+     * 订单查询
+     *
+     * @param request 订单查询请求
+     * @param headers 请求头
+     * @return 订单信息
+     */
+    public AnShengCrawlerComprehensiveQueryInsurenetResponse comprehensiveQueryInsurenet(AnShengCrawlerComprehensiveQueryInsurenetRequest request, HttpHeaders headers) {
+        ResponseEntity<AnShengCrawlerComprehensiveQueryInsurenetResponse> responseEntity = requestComponent.formData(RequestUrl.COMPREHENSIVE_QUERY_INSURENET.getRequestUrl(anShengCrawlerProperties.getUrl()), request, AnShengCrawlerComprehensiveQueryInsurenetResponse.class, headers);
+        return responseEntity.getBody();
+    }
+
     /**
      * 上传文件
      *
      * @param request 上传文件请求
-     * @param file    文件路径
+     * @param fileData    文件信息
+     * @param fileName 文件名称
      * @param headers 请求头
      */
-    public void fileUpload(AnShengCrawlerFileUploadRequest request, File file, HttpHeaders headers) {
+    public AnShengCrawlerFileUploadResponse.DataDTO fileUpload(AnShengCrawlerFileUploadRequest request, byte[] fileData, String fileName, HttpHeaders headers) {
         MultiValueMap<String, Object> multiValueMap = RequestObjectConversion.convertMultiValueMap(request);
-        multiValueMap.add("file", new FileSystemResource(file));
-        ResponseEntity<AnShengCrawlerQueryDocumentsInformationResponse> responseEntity = requestComponent.formData(RequestUrl.QUERY_DOCUMENTS_INFORMATION.getRequestUrl(anShengCrawlerProperties.getUrl()), request, AnShengCrawlerQueryDocumentsInformationResponse.class, headers);
+        // 添加二进制文件
+        ByteArrayResource fileResource = new ByteArrayResource(fileData) {
+            @Override
+            public String getFilename() {
+                return fileName; // 必须重写此方法
+            }
+        };
+        multiValueMap.add("file", fileResource);
+
+        ResponseEntity<AnShengCrawlerFileUploadResponse> responseEntity = requestComponent.formData(RequestUrl.FILE_UPLOAD.getRequestUrl(anShengCrawlerProperties.getUrl()), multiValueMap, AnShengCrawlerFileUploadResponse.class, headers);
+        List<AnShengCrawlerFileUploadResponse.DataDTO> dataDTOS = Optional.ofNullable(responseEntity.getBody())
+                .map(AnShengCrawlerFileUploadResponse::getData)
+                .orElse(new ArrayList<>());
+        if (!dataDTOS.isEmpty()) {
+            return dataDTOS.get(0);
+        }
+        throw new SystemException("上传失败");
     }
 
     /**
@@ -263,8 +293,10 @@ public class AnShengCrawlerRequestComponent {
      * @param filePath 文件路劲
      * @param headers  请求头
      */
-    public void queryPrintPdf(AnShengCrawlerQueryPrintPdfRequest request, String filePath, HttpHeaders headers) {
-        requestComponent.downloadFileToPost(RequestUrl.QUERY_PRINT_PDF.getRequestUrl(anShengCrawlerProperties.getUrl()), request, filePath, headers);
+    public String queryPrintPdf(AnShengCrawlerQueryPrintPdfRequest request, HttpHeaders headers) {
+        ResponseEntity<Resource> response = requestComponent.formData(RequestUrl.QUERY_PRINT_PDF.getRequestUrl(anShengCrawlerProperties.getUrl()), request, Resource.class, headers);
+        Resource body = response.getBody();
+        return "";
     }
 
     /**
@@ -274,10 +306,12 @@ public class AnShengCrawlerRequestComponent {
      * @param policyNumber 保单号
      * @param headers      请求头
      */
-    public void downloadPdf(String filePath, String policyNumber, HttpHeaders headers) {
+    public String downloadPdf(String policyNumber, HttpHeaders headers) {
         String url = RequestUrl.DOWNLOAD_PDF.getRequestUrl(anShengCrawlerProperties.getUrl());
         url = String.format(url, Base64.getEncoder().encodeToString(policyNumber.getBytes()));
-        requestComponent.downloadFileToGet(url, Map.of(), filePath, headers);
+        Resource resource = requestComponent.get(url, Map.of(), "", new ParameterizedTypeReference<>() {
+        }, headers);
+        return "";
     }
 
 }

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

@@ -33,13 +33,16 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     PAYMENT("/portalapi/payment", "支付"),
     // 投保状态查询
     QUERY_DOCUMENTS_INFORMATION("/portalapi/queryDocumentsInformation", "订单状态查询"),
+    COMPREHENSIVE_QUERY_INSURENET("/portalapi/comprehensiveQueryInsurenet", "订单状态查询"),
     // 保单下载
-    QUERY_PRINT_PDF("printportalapi/printportal/queryPrintpdf.do", "保单下载"),
+    QUERY_PRINT_PDF("/printportalapi/printportal/queryPrintpdf.do", "保单下载"),
     DOWNLOAD_PDF("/printportalapi/printportal/downloadPdf.do?policyNo=%s&policyType=6&channel=print&systemName=tpaic-ec&userName=tpaic-ec", "非车保单下载"),
     ;
 
 
 
+
+
     private final String uri;
 
     private final String description;

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

@@ -29,15 +29,9 @@ public class AnShengCrawlerApplyApplicationRequest {
     @JsonProperty("createdBy")
     private String createdBy;
 
-    public AnShengCrawlerApplyApplicationRequest(String createdBy) {
-        this.contracts = new ArrayList<>();
-        this.policySaleInfo = new PolicySaleInfoDTO();
-        this.agentDefine = new AgentDefineDTO();
-        this.createdBy = createdBy;
-    }
-
     @Data
     public static class PolicySaleInfoDTO {
+
         @JsonProperty("applicantCode")
         private String applicantCode;
         @JsonProperty("applyTime")
@@ -87,6 +81,7 @@ public class AnShengCrawlerApplyApplicationRequest {
     @NoArgsConstructor
     @Data
     public static class ContractsDTO {
+
         @JsonProperty("quotationList")
         private List<?> quotationList;
         @JsonProperty("saleBusinessSource")
@@ -101,8 +96,10 @@ public class AnShengCrawlerApplyApplicationRequest {
         private List<UnderwriteInfosDTO> underwriteInfos;
         @JsonProperty("policyExtend")
         private PolicyExtendDTO policyExtend;
+
         @JsonProperty("policyAttachments")
-        private List<?> policyAttachments;
+        private List<PolicyAttachmentsDTO> policyAttachments;
+
         @JsonProperty("policyPersons")
         private List<PolicyPersonsDTO> policyPersons;
         @JsonProperty("policyCoverages")
@@ -119,6 +116,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class SaleBusinessSourceDTO {
+
             @JsonProperty("saleAgentName")
             private String saleAgentName;
             @JsonProperty("saleGroupCode")
@@ -148,6 +146,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class BillInfoDetailDTO {
+
             @JsonProperty("billPersonType")
             private String billPersonType;
             @JsonProperty("billCertNo")
@@ -175,6 +174,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class BrandAutoModelDTO {
+
             @JsonProperty("modelDesc")
             private String modelDesc;
             @JsonProperty("standardName")
@@ -186,6 +186,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class SaleChannelSourceDTO {
+
             @JsonProperty("chief4S")
             private String chief4S;
         }
@@ -193,6 +194,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class PolicyExtendDTO {
+
             @JsonProperty("orderNumber")
             private String orderNumber;
             @JsonProperty("riskSharingBusinessType")
@@ -240,6 +242,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class PolicyBaseDTO {
+
             @JsonProperty("departmentLevelCode")
             private String departmentLevelCode;
             @JsonProperty("salesGroupCode")
@@ -429,12 +432,35 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class UnderwriteInfosDTO {
+
             @JsonProperty("emergencyCode")
             private String emergencyCode;
+
             @JsonProperty("reportDescription")
             private String reportDescription;
         }
 
+        @NoArgsConstructor
+        @Data
+        public static class PolicyAttachmentsDTO{
+
+            @JsonProperty("attachmentType")
+            private String attachmentType;
+
+            @JsonProperty("attachmentName")
+            private String attachmentName;
+
+            @JsonProperty("uploadFileNo")
+            private String uploadFileNo;
+
+            @JsonProperty("uploadFileType")
+            private String uploadFileType;
+
+            @JsonProperty("uploadFileTypeName")
+            private String uploadFileTypeName;
+
+        }
+
         @NoArgsConstructor
         @Data
         public static class PolicyPersonsDTO {
@@ -613,6 +639,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class PolicyCoveragesDTO {
+
             @JsonProperty("dutyCode")
             private String dutyCode;
             @JsonProperty("dutyChineseName")
@@ -676,6 +703,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class PolicyRatiosDTO {
+
             @JsonProperty("linkId")
             private String linkId;
             @JsonProperty("ratio")
@@ -703,6 +731,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class PolicyPaymentsDTO {
+
             @JsonProperty("paymentPremiumTimes")
             private Integer paymentPremiumTimes;
             @JsonProperty("bankAccountNo")
@@ -744,6 +773,7 @@ public class AnShengCrawlerApplyApplicationRequest {
         @NoArgsConstructor
         @Data
         public static class TargetListDTO {
+
             @JsonProperty("linkId")
             private String linkId;
             @JsonProperty("targetId")
@@ -968,6 +998,7 @@ public class AnShengCrawlerApplyApplicationRequest {
             @NoArgsConstructor
             @Data
             public static class CheckVehicleInfoDTO {
+
                 @JsonProperty("usageAttributeCode")
                 private String usageAttributeCode;
                 @JsonProperty("usageAttributeCodePM")
@@ -991,6 +1022,7 @@ public class AnShengCrawlerApplyApplicationRequest {
             @NoArgsConstructor
             @Data
             public static class PolicyPricingDTO {
+
                 @JsonProperty("usageAttributeCode")
                 private String usageAttributeCode;
                 @JsonProperty("usageAttributeCodePM")
@@ -1146,6 +1178,7 @@ public class AnShengCrawlerApplyApplicationRequest {
             @NoArgsConstructor
             @Data
             public static class VehicleTaxDTO {
+
                 @JsonProperty("ownerName")
                 private String ownerName;
                 @JsonProperty("vehicleTaxAmount")

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

@@ -13,6 +13,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -820,7 +821,9 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.vehicleModelType = "";
                 this.vehicleStyleDesc = "";
                 this.vehicleTypeName = carInfoVo.getCarKindName();
-                this.makeDate = Integer.valueOf(brandAutoModel.getMakeDate());
+                if (StringUtils.hasLength(brandAutoModel.getMakeDate())) {
+                    this.makeDate = Integer.valueOf(brandAutoModel.getMakeDate());
+                }
                 this.stopFlag = brandAutoModel.getStopFlag();
                 this.detailDesc = brandAutoModel.getRemark();
                 this.vehicleCategory = "";
@@ -849,7 +852,11 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.riskFlag = brandAutoModel.getRiskFlag();
                 this.targetType = "vehicleTarget";
                 this.fleetRate = "0";
-                this.usageAttributeCode = brandAutoModel.getVtrList().get(0).getUsageAttributeCode();
+                Optional.ofNullable(brandAutoModel.getVtrList())
+                        .filter(x->!x.isEmpty())
+                        .ifPresent(x->{
+                            this.usageAttributeCode = x.get(0).getUsageAttributeCode();
+                        });
                 this.usageAttributeCodePM = "";
                 this.ownershipAttributeCode = "1";
                 this.beneficiaryList = new ArrayList<>();
@@ -1191,9 +1198,14 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                     this.modelrate = "";
                     this.advicediscount = "";
                     this.dbVehicleBrand = brandAutoModel.getBrandChnName();
-                    this.dbVehicleTypeName = brandAutoModel.getVtrList().get(0).getJyVehicleTypeName();
+                    Optional.ofNullable(brandAutoModel.getVtrList())
+                            .filter(x->!x.isEmpty())
+                            .ifPresent(x->{
+                                this.dbVehicleTypeName = x.get(0).getJyVehicleTypeName();
+                                this.vehicleTypeChiName = x.get(0).getVehicleTypeName();
+                            });
+
                     this.usageLicenceName = carInfoVo.getLicenseKindName();
-                    this.vehicleTypeChiName = brandAutoModel.getVtrList().get(0).getVehicleTypeName();
                     this.autoFloatTargetRebate = "";
                     this.riskFlag = brandAutoModel.getRiskFlag();
                     this.dbExhaustCapability = brandAutoModel.getExhaustCapabilityString();

+ 77 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerComprehensiveQueryInsurenetRequest.java

@@ -0,0 +1,77 @@
+package com.jzg.quotation.ansheng.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class AnShengCrawlerComprehensiveQueryInsurenetRequest {
+
+    @JsonProperty("agentCode")
+    private String agentCode;
+
+    @JsonProperty("departmentCode")
+    private String departmentCode;
+
+    @JsonProperty("planList")
+    private List<String> planList;
+
+    @JsonProperty("businessTypeList")
+    private List<Integer> businessTypeList;
+
+    @JsonProperty("documentNo")
+    private String documentNo;
+
+    @JsonProperty("documentType")
+    private Integer documentType;
+
+    @JsonProperty("appDateStart")
+    private String appDateStart;
+
+    @JsonProperty("appDateEnd")
+    private String appDateEnd;
+
+    @JsonProperty("isSubDepartment")
+    private Boolean isSubDepartment;
+
+    @JsonProperty("updateType")
+    private Integer updateType;
+
+    @JsonProperty("page")
+    private Integer page;
+
+    @JsonProperty("pageSize")
+    private Integer pageSize;
+
+    @JsonProperty("channelSourceList")
+    private List<String> channelSourceList;
+
+    public AnShengCrawlerComprehensiveQueryInsurenetRequest(String agentCode, String departmentCode, String documentNo, String quotationTime) {
+        this.agentCode = agentCode;
+        this.updateType = 2;
+        this.page = 1;
+        this.pageSize = 10;
+        this.departmentCode = departmentCode;
+        this.planList = List.of("103", "105", "107", "109", "110", "111", "113", "516", "518", "521",
+                "610", "712", "718", "788", "888", "889", "890", "895", "CFF", "G01",
+                "GAP", "GH1", "GPI", "H01", "H09", "H17", "H18", "H19", "H20", "H21",
+                "H23", "H24", "H25", "H27", "H86", "H90", "H91", "H92", "H93", "H96",
+                "H98", "H99", "P01", "P03", "P12", "P13", "P15", "P17", "P20", "P23",
+                "P24", "P95");
+        this.businessTypeList = List.of(3);
+        this.channelSourceList = List.of("1", "2");
+        this.documentType = 9;
+        TimeProcessing.TimeFrame timeFrame = TimeProcessing.getTimeFrame(quotationTime, true);
+        this.appDateStart = timeFrame.getStartTime();
+        this.appDateEnd = timeFrame.getEndTime();
+        // 订单号
+        this.documentNo = documentNo;
+        this.isSubDepartment = true;
+    }
+}

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

@@ -55,7 +55,7 @@ public class AnShengCrawlerQueryDocumentsInformationRequest {
     @JsonProperty("unInsuredFlag")
     private Boolean unInsuredFlag;
 
-    @JsonProperty
+    @JsonProperty("documentNo")
     private String documentNo;
 
     public AnShengCrawlerQueryDocumentsInformationRequest(String agentCode, String departmentCode, String documentNo, String quotationTime) {

+ 171 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerComprehensiveQueryInsurenetResponse.java

@@ -0,0 +1,171 @@
+package com.jzg.quotation.ansheng.crawler.entity.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class AnShengCrawlerComprehensiveQueryInsurenetResponse {
+
+    @JsonProperty("code")
+    private Integer code;
+    @JsonProperty("simpleMessage")
+    private String simpleMessage;
+    @JsonProperty("message")
+    private String message;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+        @JsonProperty("pageNum")
+        private Integer pageNum;
+        @JsonProperty("pageSize")
+        private Integer pageSize;
+        @JsonProperty("size")
+        private Integer size;
+        @JsonProperty("startRow")
+        private Integer startRow;
+        @JsonProperty("endRow")
+        private Integer endRow;
+        @JsonProperty("total")
+        private Integer total;
+        @JsonProperty("pages")
+        private Integer pages;
+        @JsonProperty("list")
+        private List<ListDTO> list;
+        @JsonProperty("firstPage")
+        private Integer firstPage;
+        @JsonProperty("prePage")
+        private Integer prePage;
+        @JsonProperty("nextPage")
+        private Integer nextPage;
+        @JsonProperty("lastPage")
+        private Integer lastPage;
+        @JsonProperty("isFirstPage")
+        private Boolean isFirstPage;
+        @JsonProperty("isLastPage")
+        private Boolean isLastPage;
+        @JsonProperty("hasPreviousPage")
+        private Boolean hasPreviousPage;
+        @JsonProperty("hasNextPage")
+        private Boolean hasNextPage;
+        @JsonProperty("navigatePages")
+        private Integer navigatePages;
+        @JsonProperty("navigatepageNums")
+        private List<Integer> navigatepageNums;
+
+        @NoArgsConstructor
+        @Data
+        public static class ListDTO {
+            @JsonProperty("createdBy")
+            private String createdBy;
+            @JsonProperty("updatedBy")
+            private String updatedBy;
+            @JsonProperty("page")
+            private Integer page;
+            @JsonProperty("pageSize")
+            private Integer pageSize;
+            @JsonProperty("transactionNo")
+            private String transactionNo;
+            @JsonProperty("policyConciseDetails")
+            private List<PolicyConciseDetailsDTO> policyConciseDetails;
+
+            @NoArgsConstructor
+            @Data
+            public static class PolicyConciseDetailsDTO {
+                @JsonProperty("createdBy")
+                private String createdBy;
+                @JsonProperty("createdDate")
+                private String createdDate;
+                @JsonProperty("updatedBy")
+                private String updatedBy;
+                @JsonProperty("updatedDate")
+                private String updatedDate;
+                @JsonProperty("page")
+                private Integer page;
+                @JsonProperty("pageSize")
+                private Integer pageSize;
+                @JsonProperty("transactionNo")
+                private String transactionNo;
+                @JsonProperty("temporaryId")
+                private String temporaryId;
+                @JsonProperty("applyPolicyNo")
+                private String applyPolicyNo;
+                @JsonProperty("policyNo")
+                private String policyNo;
+                @JsonProperty("planCode")
+                private String planCode;
+                @JsonProperty("productCode")
+                private String productCode;
+                @JsonProperty("departmentCode")
+                private String departmentCode;
+                @JsonProperty("targetType")
+                private String targetType;
+                @JsonProperty("underwriteMark")
+                private String underwriteMark;
+                @JsonProperty("applicantName")
+                private String applicantName;
+                @JsonProperty("insuranerName")
+                private String insuranerName;
+                @JsonProperty("saleAgentName")
+                private String saleAgentName;
+                @JsonProperty("inputByName")
+                private String inputByName;
+                @JsonProperty("businessType")
+                private String businessType;
+                @JsonProperty("paymentType")
+                private String paymentType;
+                @JsonProperty("vehicleLicenceCode")
+                private String vehicleLicenceCode;
+                @JsonProperty("engineNo")
+                private String engineNo;
+                @JsonProperty("vehicleFrameNo")
+                private String vehicleFrameNo;
+                @JsonProperty("insuranceBeginTime")
+                private String insuranceBeginTime;
+                @JsonProperty("insuranceEndTime")
+                private String insuranceEndTime;
+                @JsonProperty("signTime")
+                private String signTime;
+                @JsonProperty("totalAgreePremium")
+                private String totalAgreePremium;
+                @JsonProperty("riskScore")
+                private Double riskScore;
+                @JsonProperty("departmentName")
+                private String departmentName;
+                @JsonProperty("agentCode")
+                private String agentCode;
+                @JsonProperty("underwriteMarkName")
+                private String underwriteMarkName;
+                @JsonProperty("underwriteName")
+                private String underwriteName;
+                @JsonProperty("personnelType")
+                private String personnelType;
+                @JsonProperty("checkRealNameMessage")
+                private Boolean checkRealNameMessage;
+                @JsonProperty("isBusinessChangePlatform")
+                private String isBusinessChangePlatform;
+                @JsonProperty("waitUnderwriteMark")
+                private String waitUnderwriteMark;
+                @JsonProperty("levelDepCode")
+                private String levelDepCode;
+                @JsonProperty("totalAgreePremiumSum")
+                private String totalAgreePremiumSum;
+                @JsonProperty("insuranerSize")
+                private Integer insuranerSize;
+                @JsonProperty("standarded")
+                private String standarded;
+                @JsonProperty("installmentPremium")
+                private Double installmentPremium;
+                @JsonProperty("autoPlan")
+                private Boolean autoPlan;
+            }
+        }
+    }
+}

+ 24 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerFileUploadResponse.java

@@ -2,16 +2,19 @@ package com.jzg.quotation.ansheng.crawler.entity.response;
 
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerApplyApplicationRequest;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 @NoArgsConstructor
 @Data
-public class AnShengCrawlerFileUploadResponse  implements Serializable, AnShengCrawlerBaseResponse{
+public class AnShengCrawlerFileUploadResponse implements Serializable, AnShengCrawlerBaseResponse {
 
     @Serial
     private static final long serialVersionUID = -2718527375138193717L;
@@ -28,6 +31,26 @@ public class AnShengCrawlerFileUploadResponse  implements Serializable, AnShengC
     @JsonProperty("data")
     private List<DataDTO> data;
 
+    public static List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> toPolicyAttachmentsDTOList(List<DataDTO> data) {
+        return Optional.ofNullable(data)
+                .filter(x -> !x.isEmpty())
+                .orElse(new ArrayList<>())
+                .stream()
+                .map(AnShengCrawlerFileUploadResponse::toPolicyAttachmentsDTO)
+                .toList();
+    }
+
+    public static AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO toPolicyAttachmentsDTO(DataDTO dataDTO) {
+        AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO policyAttachmentsDTO = new AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO();
+        policyAttachmentsDTO.setAttachmentType(dataDTO.getAttachmentType());
+        policyAttachmentsDTO.setAttachmentName(dataDTO.getAttachmentName());
+        policyAttachmentsDTO.setUploadFileNo(dataDTO.getUploadFileNo());
+        policyAttachmentsDTO.setUploadFileType(dataDTO.getUploadFileType());
+        policyAttachmentsDTO.setUploadFileTypeName(dataDTO.getUploadFileTypeName());
+        return policyAttachmentsDTO;
+    }
+
+
     @NoArgsConstructor
     @Data
     public static class DataDTO {

+ 2 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerQuoteProcessService.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.ansheng.crawler.service;
 
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerGetUserDetailResponse;
 import org.springframework.http.HttpHeaders;
 
@@ -12,7 +13,7 @@ public interface AnShengCrawlerQuoteProcessService {
      * @param password 密码
      * @return 请求头
      */
-    HttpHeaders getHttpHeaders(String username, String password);
+    HttpHeaders getHttpHeaders(AttributionInformationVo attributionInformationVo);
 
 
     /**

+ 4 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerQuoteProcessServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.ansheng.crawler.service.impl;
 
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerCacheComponent;
@@ -30,8 +31,10 @@ public class AnShengCrawlerQuoteProcessServiceImpl implements AnShengCrawlerQuot
     private final RedissonComponent redissonComponent;
 
     @Override
-    public HttpHeaders getHttpHeaders(String username, String password) {
+    public HttpHeaders getHttpHeaders(AttributionInformationVo attributionInformationVo) {
         HttpHeaders httpHeaders = new HttpHeaders();
+        String username = attributionInformationVo.getUsername();
+        String password = attributionInformationVo.getPassword();
         String authorization = anShengCrawlerCacheComponent.getAuthorization(username);
         if (!StringUtils.hasText(authorization)) {
             try {

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

@@ -25,7 +25,7 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
-import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -64,15 +64,14 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         final String ordersNo = quoteVo.getOrder().getOrdersNo();
         // 请求头信息
         HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(quoteVo.getOrder()
-                .getAttributionInformationVo()
-                .getUsername(), quoteVo.getOrder().getAttributionInformationVo().getPassword());
+                .getAttributionInformationVo());
         // 归属信息
         AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(quoteVo.getOrder()
                 .getAgreementId(), httpHeaders);
 
         DepartmentPlanCode departmentPlanCode = DepartmentPlanCode.PLAN_109;
         // 新能源
-        if(quoteVo.getCarInfoVo().isNewEnergyMark()){
+        if (quoteVo.getCarInfoVo().isNewEnergyMark()) {
             departmentPlanCode = DepartmentPlanCode.PLAN_113;
         }
 
@@ -89,13 +88,12 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply = new AnShengCrawlerCalculatePremiumApplyMessage(quoteVo, dataDTO, userDetailResponse, departmentPlanCode, checkVehicleCodeSecretGenerate);
         AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply = anShengCrawlerRequestComponent.calculatePremiumApply(crawlerCalculatePremiumApply, httpHeaders);
         // 缓存报价信息
-        AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApplyMessage = new AnShengCrawlerCalculatePremiumApplyMessage();
+        AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = new AnShengCrawlerApplyApplicationRequest();
         // 拷贝结果数据
-        BeanUtil.copyProperties(calculatePremiumApply, crawlerCalculatePremiumApplyMessage, COPY_OPTIONS);
-        // 拷贝报价数据
-        BeanUtil.copyProperties(crawlerCalculatePremiumApply, crawlerCalculatePremiumApplyMessage, COPY_OPTIONS);
+        BeanUtil.copyProperties(calculatePremiumApply, autoSpecialPromiseRequest, COPY_OPTIONS);
+
         // 缓存数据
-        anShengCrawlerCacheComponent.cacheQuoteRequest(ordersNo, crawlerCalculatePremiumApplyMessage);
+        anShengCrawlerCacheComponent.cacheQuoteRequest(ordersNo, autoSpecialPromiseRequest);
         // 构造返回参数
         return AnShengCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(ordersNo, quoteVo, calculatePremiumApply);
     }
@@ -104,25 +102,24 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
         String ordersNo = underwritingVo.getOrder().getOrdersNo();
         // 获取报价信息
-        AnShengCrawlerCalculatePremiumApplyMessage quoteResponse = anShengCrawlerCacheComponent.getQuoteResponse(ordersNo);
+        AnShengCrawlerApplyApplicationRequest applicationRequest = anShengCrawlerCacheComponent.getQuoteResponse(ordersNo);
+        // 获取图片上传信息
+        List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> imagesInfo = anShengCrawlerCacheComponent.getImagesInfo(underwritingVo.getOrder()
+                .getOrdersNo());
 
-        HttpHeaders httpHeaders = new HttpHeaders();
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(underwritingVo.getOrder()
+                .getAttributionInformationVo());
         // 获取特别约定
-        AnShengCrawlerAutoSpecialPromiseRequest autoSpecialPromiseRequest = new AnShengCrawlerAutoSpecialPromiseRequest();
-        BeanUtil.copyProperties(quoteResponse, autoSpecialPromiseRequest, COPY_OPTIONS);
-        AnShengCrawlerAutoSpecialPromiseResponse autoSpecialPromiseResponse = anShengCrawlerRequestComponent.autoSpecialPromise(autoSpecialPromiseRequest, httpHeaders);
-
+        AnShengCrawlerAutoSpecialPromiseResponse autoSpecialPromiseResponse = anShengCrawlerRequestComponent.autoSpecialPromise(applicationRequest, httpHeaders);
         Map<String, AnShengCrawlerAutoSpecialPromiseResponse.DataDTO> stringDataDTOMap = autoSpecialPromiseResponse.getData()
                 .stream()
                 .collect(Collectors.toMap(AnShengCrawlerAutoSpecialPromiseResponse.DataDTO::getPlanCode, x -> x));
 
-        // 提交核保
-        AnShengCrawlerApplyApplicationRequest applicationRequest = new AnShengCrawlerApplyApplicationRequest("");
-        BeanUtil.copyProperties(quoteResponse, applicationRequest);
         applicationRequest.getContracts().forEach(contract -> {
             AnShengCrawlerAutoSpecialPromiseResponse.DataDTO dataDTO = stringDataDTOMap.get(contract.getPolicyBase()
                     .getPlanCode());
-            contract.getPolicyBase().setAlterableSpecialPromise(contract.getPolicyBase().getFixedSpecialPromise());
+            contract.getPolicyBase().setAlterableSpecialPromise(dataDTO.getAlterableSpecialPromise());
+            contract.setPolicyAttachments(imagesInfo);
         });
 
         AnShengCrawlerApplyApplicationResponse applyApplicationResponse = anShengCrawlerRequestComponent.applyApplication(applicationRequest, httpHeaders);
@@ -132,7 +129,10 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
-        HttpHeaders httpHeaders = new HttpHeaders();
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(paymentLinkVo.getOrder()
+                .getAttributionInformationVo()
+        );
+
         AnShengCrawlerPaymentRequest anShengCrawlerPaymentRequest = new AnShengCrawlerPaymentRequest();
         anShengCrawlerRequestComponent.payment(anShengCrawlerPaymentRequest, httpHeaders);
         return null;
@@ -140,39 +140,57 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-        HttpHeaders httpHeaders = new HttpHeaders();
+        // 请求头信息
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(insuranceUploadImageVo.getOrder()
+                .getAttributionInformationVo()
+        );
 
+        List<AnShengCrawlerFileUploadResponse.DataDTO> dataDTOS = new ArrayList<>();
         insuranceUploadImageVo.getImageVoList().forEach(image -> {
-            AnShengCrawlerFileUploadRequest anShengCrawlerFileUploadRequest = new AnShengCrawlerFileUploadRequest();
-            anShengCrawlerRequestComponent.fileUpload(anShengCrawlerFileUploadRequest, new File(""), httpHeaders);
+            AnShengCrawlerFileUploadRequest anShengCrawlerFileUploadRequest = new AnShengCrawlerFileUploadRequest(image.getInsuranceImageType(), image.getInsuranceImageCode());
+            image.getImageBase64List().forEach(imageDTO -> {
+                AnShengCrawlerFileUploadResponse.DataDTO dataDTO = anShengCrawlerRequestComponent.fileUpload(anShengCrawlerFileUploadRequest, imageDTO.getImageByte(), imageDTO.getImageName(), httpHeaders);
+                dataDTOS.add(dataDTO);
+            });
         });
+
+        if (dataDTOS.isEmpty()) {
+            return;
+        }
+
+        List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> policyAttachmentsDTOList = AnShengCrawlerFileUploadResponse.toPolicyAttachmentsDTOList(dataDTOS);
+        anShengCrawlerCacheComponent.cacheImagesInfo(insuranceUploadImageVo.getOrder()
+                .getOrdersNo(), policyAttachmentsDTOList);
     }
 
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
-        HttpHeaders httpHeaders = new HttpHeaders();
+        DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
+
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(downloadPolicyVo.getOrder()
+                .getAttributionInformationVo());
         AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(downloadPolicyVo.getOrder()
                 .getOrdersNo());
 
         Optional.ofNullable(anShengCrawlerOrder.getCiPolicyNo())
                 .ifPresent(policyNo -> {
-                    AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCi = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "");
-                    anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCi, "", httpHeaders);
+                    AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCi = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "6");
+                    downloadPolicyResultVo.setJqUrl(anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCi, httpHeaders));
 
-                    AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCiBz = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "");
-                    anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCiBz, "", httpHeaders);
+                    AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCiBz = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "2");
+                    downloadPolicyResultVo.setJqFlagUrl(anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCiBz, httpHeaders));
                 });
 
         Optional.ofNullable(anShengCrawlerOrder.getBiPolicyNo())
                 .ifPresent(policyNo -> {
-                    AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCi = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "");
-                    anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCi, "", httpHeaders);
+                    AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCi = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "6");
+                    downloadPolicyResultVo.setSyUrl(anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCi, httpHeaders));
                 });
 
         anShengCrawlerOrder.getNiInfos().forEach(niInfo -> {
             Optional.ofNullable(niInfo.getNiPolicyNumber())
                     .ifPresent(policyNo -> {
-                        anShengCrawlerRequestComponent.downloadPdf("", policyNo, httpHeaders);
+                        anShengCrawlerRequestComponent.downloadPdf( policyNo, httpHeaders);
                     });
         });
         return null;
@@ -180,13 +198,20 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
-
+        // 获取订单信息
         AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(orderStatusVo.getOrder()
                 .getOrdersNo());
-
-        HttpHeaders httpHeaders = new HttpHeaders();
-        AnShengCrawlerQueryDocumentsInformationRequest queryDocumentsInformationRequest = new AnShengCrawlerQueryDocumentsInformationRequest("", "", anShengCrawlerOrder.getOrderNo(), anShengCrawlerOrder.getRecordingTime());
-        AnShengCrawlerQueryDocumentsInformationResponse queryDocumentsInformationResponse = anShengCrawlerRequestComponent.queryDocumentsInformation(queryDocumentsInformationRequest, httpHeaders);
+        // 获取请求头
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(orderStatusVo.getOrder()
+                .getAttributionInformationVo());
+        // 归属信息
+        AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(orderStatusVo.getOrder()
+                .getAgreementId(), httpHeaders);
+        // 查询订单状态
+        AnShengCrawlerComprehensiveQueryInsurenetRequest crawlerComprehensiveQueryInsurenet = new AnShengCrawlerComprehensiveQueryInsurenetRequest(userDetailResponse.getAgentCode(), userDetailResponse.getDepartmentCode(), anShengCrawlerOrder.getOrderNo(), anShengCrawlerOrder.getRecordingTime());
+        AnShengCrawlerComprehensiveQueryInsurenetResponse queryDocumentsInformationResponse = anShengCrawlerRequestComponent.comprehensiveQueryInsurenet(crawlerComprehensiveQueryInsurenet, httpHeaders);
+        List<AnShengCrawlerComprehensiveQueryInsurenetResponse.DataDTO.ListDTO> list = queryDocumentsInformationResponse.getData()
+                .getList();
 
         return null;
     }

+ 6 - 6
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java

@@ -115,7 +115,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         OrderBase order = quoteVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
         //配置信息
-        String url = getApiUrl(order.getInsuranceCompanyCode());
+        String url = getApiUrl(order.getInsuranceCompanyId());
         BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
         // 生成订单号
         GenerateOrderNoRequest generateOrderNoRequest = new GenerateOrderNoRequest(parameters);
@@ -187,7 +187,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws Exception {
         OrderBase order = underwritingVo.getOrder();
         //获取配置信息
-        String url = getApiUrl(order.getInsuranceCompanyCode());
+        String url = getApiUrl(order.getInsuranceCompanyId());
         BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, order.getAttributionInformationVo().getConfigInfo());
         //核保请求
         BoHaiApiOrder apiOrder = boHaiApiOrderService.findByOrdersNo(order.getOrdersNo());
@@ -238,7 +238,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         //获取配置信息
-        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyId());
         BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, paymentLinkVo.getOrder().getAttributionInformationVo().getConfigInfo());
         BoHaiApiOrder apiOrder = boHaiApiOrderService.findByOrdersNo(paymentLinkVo.getOrder().getOrdersNo());
         PaymentRequest paymentRequest = new PaymentRequest(parameters, apiOrder.getOrderNo(), apiOrder.getBusUniqueId());
@@ -257,7 +257,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         OrderBase order = insuranceUploadImageVo.getOrder();
         //获取配置信息
-        String url = getApiUrl(order.getInsuranceCompanyCode());
+        String url = getApiUrl(order.getInsuranceCompanyId());
         BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, order.getAttributionInformationVo().getConfigInfo());
         BoHaiApiOrder apiOrder = boHaiApiOrderService.findByOrdersNo(order.getOrdersNo());
         ImageUploadRequest imageUploadRequest = new ImageUploadRequest(parameters, apiOrder.getOrderNo(), apiOrder.getBusUniqueId(), insuranceUploadImageVo.getImageVoList());
@@ -277,7 +277,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         //获取配置信息
-        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyId());
         BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, downloadPolicyVo.getOrder().getAttributionInformationVo().getConfigInfo());
         BoHaiApiOrder apiOrder = boHaiApiOrderService.findByOrdersNo(downloadPolicyVo.getOrder().getOrdersNo());
         // 保单号
@@ -313,7 +313,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
      */
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws Exception {
-        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyId());
         List<StatusDocumentsResponse.DataDTO.DocumentListDTO> documentList = getDocumentListDTO(orderStatusVo,url);
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
         List<StatusDocumentsResponse.DataDTO.DocumentListDTO> documentListDTOS =

+ 165 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/InsurePremiumRequest.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.chengtai.api.entity.request;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
 import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.IDCardUtils;
@@ -19,6 +20,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 /**
@@ -70,6 +72,11 @@ public class InsurePremiumRequest extends BaseRequest {
     @JsonProperty("handlerCode")
     private String handlerCode;
 
+    @JsonProperty("applicant")
+    private ApplicantDTO applicant;
+    @JsonProperty("insured")
+    private InsuredDTO insured;
+
     public InsurePremiumRequest(CarInfoResponse.CarModelListDTO carModelListDTO,
                                 QueryCarActualValueResponse carActualValueResponse,
                                 ChengTaiApiConfigureParameters parameters,
@@ -113,6 +120,164 @@ public class InsurePremiumRequest extends BaseRequest {
         }
         this.handlerCode = parameters.getUserId();
 
+        // 获取投保人被保人信息
+        CustomerInfoVo insuredHolder = quoteVo.getInsuredPersonInfo();
+        InsuredDTO insured = new InsuredDTO(insuredHolder);
+        this.insured = insured;
+        CustomerInfoVo policyHolder = quoteVo.getPolicyHolderInfo();
+        ApplicantDTO applicant = new ApplicantDTO(policyHolder);
+        this.applicant = applicant;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class InsuredDTO {
+        @JsonProperty("type")
+        private String type;
+        @JsonProperty("name")
+        private String name;
+        @JsonProperty("identifyTypeCode")
+        private String identifyTypeCode;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("identifyValidDate")
+        private String identifyValidDate;
+        @JsonProperty("identifyValidEndDate")
+        private String identifyValidEndDate;
+        @JsonProperty("identifyTypeName")
+        private String identifyTypeName;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("age")
+        private Integer age;
+        @JsonProperty("birthday")
+        private String birthday;
+        @JsonProperty("longTerm")
+        private String longTerm;
+        @JsonProperty("province")
+        private String province;
+        @JsonProperty("city")
+        private String city;
+        @JsonProperty("district")
+        private String district;
+        @JsonProperty("addr")
+        private String addr;
+        @JsonProperty("mobile")
+        private String mobile;
+        @JsonProperty("relationWithInsured")
+        private String relationWithInsured;
+        @JsonProperty("relationWithCar")
+        private String relationWithCar;
+        @JsonProperty("organizationCode")
+        private String organizationCode;
+        @JsonProperty("tel")
+        private String tel;
+        @JsonProperty("linkerName")
+        private String linkerName;
+        @JsonProperty("unitTypeCode")
+        private String unitTypeCode;
+
+        public InsuredDTO(CustomerInfoVo insuredHolder) {
+            if (insuredHolder.getPersonType().equals(1)) {
+                this.type = "1";
+                this.identifyTypeCode = "01";
+                this.identifyNumber = insuredHolder.getIdentifyNumber();
+                this.sex = insuredHolder.getGender();
+                this.birthday = IDCardUtils.GetBirthday(insuredHolder.getIdentifyNumber());
+                this.relationWithInsured = "0";
+                this.relationWithCar = "1";
+            } else {
+                this.type = "2";
+                this.identifyTypeCode = "4";
+                this.identifyNumber = insuredHolder.getIdentifyNumber();
+                this.organizationCode = insuredHolder.getIdentifyNumber();
+                this.tel = insuredHolder.getTelephone();
+//                this.linkerName = insuredHolder.getContact();
+                this.unitTypeCode = "900"; // 单位性质 900:其他
+            }
+            this.name = insuredHolder.getName();
+            this.province = insuredHolder.getProvinceCode();
+            this.city = insuredHolder.getCityCode();
+            this.district = insuredHolder.getCountyCode();
+            this.addr = insuredHolder.getAddr();
+            this.mobile = insuredHolder.getMobile();
+            this.identifyValidDate = insuredHolder.getIdentifyValidDate();
+            this.identifyValidEndDate = insuredHolder.getIdentifyValidEndDate();
+            this.longTerm = "0";
+        }
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class ApplicantDTO {
+        @JsonProperty("type")
+        private String type;
+        @JsonProperty("name")
+        private String name;
+        @JsonProperty("identifyTypeCode")
+        private String identifyTypeCode;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("identifyValidDate")
+        private String identifyValidDate;
+        @JsonProperty("identifyValidEndDate")
+        private String identifyValidEndDate;
+        @JsonProperty("identifyTypeName")
+        private String identifyTypeName;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("age")
+        private Integer age;
+        @JsonProperty("birthday")
+        private String birthday;
+        @JsonProperty("longTerm")
+        private String longTerm;
+        @JsonProperty("province")
+        private String province;
+        @JsonProperty("city")
+        private String city;
+        @JsonProperty("district")
+        private String district;
+        @JsonProperty("addr")
+        private String addr;
+        @JsonProperty("mobile")
+        private String mobile;
+        @JsonProperty("organizationCode")
+        private String organizationCode;
+        @JsonProperty("tel")
+        private String tel;
+        @JsonProperty("linkerName")
+        private String linkerName;
+        @JsonProperty("unitTypeCode")
+        private String unitTypeCode;
+
+
+        public ApplicantDTO(CustomerInfoVo policyHolder){
+            if(policyHolder.getPersonType().equals(1)){
+                this.type = "1";
+                this.identifyTypeCode = "01";
+                this.identifyNumber = policyHolder.getIdentifyNumber();
+                this.sex = policyHolder.getGender();
+                this.birthday = IDCardUtils.GetBirthday(policyHolder.getIdentifyNumber());
+            }else{
+                this.type = "2";
+                this.identifyTypeCode = "4";
+                this.identifyNumber = policyHolder.getIdentifyNumber();
+                this.organizationCode = policyHolder.getIdentifyNumber();
+                this.tel = policyHolder.getTelephone();
+//                this.linkerName = policyHolder.getContact();
+                this.unitTypeCode = "900"; // 单位性质 900:其他
+            }
+            this.name = policyHolder.getName();
+            this.province = policyHolder.getProvinceCode();
+            this.city = policyHolder.getCityCode();
+            this.district = policyHolder.getCountyCode();
+            this.addr = policyHolder.getAddr();
+            this.mobile = policyHolder.getMobile();
+            this.identifyValidDate = policyHolder.getIdentifyValidDate();
+            this.identifyValidEndDate = policyHolder.getIdentifyValidEndDate();
+            this.longTerm = "0";
+        }
     }
 
     @NoArgsConstructor

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

@@ -73,7 +73,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
         OrderBase order = quoteVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
         // 配置信息
-        String url = getApiUrl(order.getInsuranceCompanyCode());
+        String url = getApiUrl(order.getInsuranceCompanyId());
         ChengTaiApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ChengTaiApiConfigureParameters.class,
                 attributionInformationVo.getConfigInfo());
         HttpHeaders httpHeaders = chengTaiRequestApiComponent.getHttpHeaders(parameters,url);
@@ -300,7 +300,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
         OrderBase orderBase = underwritingVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         ChengTaiApiOrder chengTaiApiOrder = chengTaiCrawlerOrderService.getById(orderBase.getOrdersNo());
         // 配置信息
         ChengTaiApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ChengTaiApiConfigureParameters.class, orderBase
@@ -367,7 +367,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         ChengTaiApiOrder chengTaiApiOrder = chengTaiCrawlerOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
         // 配置信息
-        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyId());
         ChengTaiApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ChengTaiApiConfigureParameters.class, paymentLinkVo.getOrder()
                 .getAttributionInformationVo()
                 .getConfigInfo());
@@ -384,7 +384,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         OrderBase orderBase = insuranceUploadImageVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         ChengTaiApiOrder chengTaiApiOrder = chengTaiCrawlerOrderService.getById(orderBase.getOrdersNo());
         // 配置信息
         ChengTaiApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ChengTaiApiConfigureParameters.class, orderBase
@@ -407,7 +407,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         // 配置信息
-        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyId());
         ChengTaiApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ChengTaiApiConfigureParameters.class, downloadPolicyVo.getOrder()
                 .getAttributionInformationVo()
                 .getConfigInfo());
@@ -461,7 +461,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
         // 配置信息
-        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyId());
         ChengTaiApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ChengTaiApiConfigureParameters.class, orderStatusVo.getOrder()
                 .getAttributionInformationVo()
                 .getConfigInfo());

+ 1 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
-@FeignClient(name="jzg-organization",url = "http://localhost:8084/")
+@FeignClient(name="jzg-organization",url = "http://192.168.0.250:8084/")
 public interface OrgClient {
 
     /**

+ 8 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java

@@ -4,6 +4,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
 import com.jzg.commons.entity.agreement.po.PtlAgreementUrl;
 import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.InsCompanyClause;
 import com.jzg.commons.entity.po.QrBarcodeConfig;
 import com.jzg.commons.entity.po.SysUploadFiles;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -79,4 +80,11 @@ public interface PlatformClient {
     @GetMapping("/manager/agreementUrl/getAgreementUrlByCompanyId")
     public HttpResult<PtlAgreementUrl> getAgreementUrlByCompanyId(@RequestParam String companyId);
 
+    /**
+     * 获取特约
+     * @return
+     */
+    @GetMapping("/manager/clause/getById")
+    public InsCompanyClause getClause(@RequestParam String id);
+
 }

+ 6 - 6
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiRequestImpl.java

@@ -70,7 +70,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
         OrderBase order = quoteVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
         // 配置信息
-        String url = getApiUrl(order.getInsuranceCompanyCode());
+        String url = getApiUrl(order.getInsuranceCompanyId());
         DaJiaApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaApiConfigureParameters.class,
                 attributionInformationVo.getConfigInfo());
         // 获取业务订单号
@@ -274,7 +274,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws Exception {
         OrderBase orderBase = underwritingVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         DaJiaApiOrder daJiaApiOrder = daJiaCrawlerOrderService.getById(orderBase.getOrdersNo());
         // 配置信息
         DaJiaApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaApiConfigureParameters.class,
@@ -327,7 +327,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
 
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws Exception {
-        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyId());
         DaJiaApiOrder daJiaApiOrder = daJiaCrawlerOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
         DaJiaApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaApiConfigureParameters.class,
                 paymentLinkVo.getOrder().getAttributionInformationVo().getConfigInfo());
@@ -364,7 +364,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         // 获取订单信息
         OrderBase orderBase = insuranceUploadImageVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         DaJiaApiOrder daJiaApiOrder = daJiaCrawlerOrderService.getById(orderBase.getOrdersNo());
         // 配置信息
         DaJiaApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaApiConfigureParameters.class,
@@ -382,7 +382,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         // 配置信息
-        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyId());
         DaJiaApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaApiConfigureParameters.class,
                 downloadPolicyVo.getOrder().getAttributionInformationVo().getConfigInfo());
 
@@ -473,7 +473,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
         // 配置信息
-        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyId());
         DaJiaApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaApiConfigureParameters.class,
                 orderStatusVo.getOrder().getAttributionInformationVo().getConfigInfo());
         ODR2010Request odr2010Request = new ODR2010Request(orderStatusVo.getOrder().getCompanyOrderNo(), parameters);

+ 6 - 4
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/vo/GuoRenSpecialAgreementVo.java

@@ -1,6 +1,8 @@
 package com.jzg.quotation.guoren.api.entity.vo;
 
 import com.jzg.commons.constants.InsuranceRisk;
+import com.jzg.commons.entity.po.InsCompanyClause;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
 import com.jzg.quotation.guoren.api.entity.Request.PremiumRequest;
 import com.jzg.quotation.guoren.api.entity.Response.SpecialAgreementResponse;
 import lombok.Data;
@@ -36,10 +38,10 @@ public class GuoRenSpecialAgreementVo implements Serializable {
 //    @ApiModelProperty("险种名称")
     private String riskName;
 
-    public GuoRenSpecialAgreementVo(SpecialAgreementResponse.DataDTO dataDTO, InsuranceRisk insuranceRisk) {
-        this.clauseCode = dataDTO.getClauseCode();
-        this.clauses = dataDTO.getClauses();
-        this.clausesContext = dataDTO.getClausesContext();
+    public GuoRenSpecialAgreementVo(InsCompanyClause companyClauseVo, InsuranceRisk insuranceRisk) {
+        this.clauseCode = companyClauseVo.getClauseCode();
+        this.clauses = companyClauseVo.getClauseName();
+        this.clausesContext = companyClauseVo.getClauseContent();
         this.riskName = insuranceRisk.getShortName();
         this.riskCode = insuranceRisk.getCode();
     }

+ 41 - 34
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java

@@ -10,10 +10,13 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.agreement.po.PtlAgreementUrl;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersPolicy;
+import com.jzg.commons.entity.po.InsCompanyClause;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
+import com.jzg.commons.entity.vo.InsCompanyClauseVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.StringUtils;
@@ -96,7 +99,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
     public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
         OrderBase orderBase = quoteVo.getOrder();
         //配置信息
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         GuoRenConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(GuoRenConfigureParameters.class, orderBase.getAttributionInformationVo().getConfigInfo());
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         //vin码查询
@@ -131,7 +134,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
         }
 
         //获取特约数据
-        List<GuoRenSpecialAgreementVo> specialAgreements = getSpecialAgreements(orderBase, parameters,url);
+        List<GuoRenSpecialAgreementVo> specialAgreements = getSpecialAgreements(quoteVo);
 
         // 4、保费计算
         PremiumResponse premiumResponse = premiumQuery(quoteVo, carPriceQuery, vinQuery, isNoCar,
@@ -183,7 +186,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
         OrderBase orderBase = underwritingVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         //配置信息
         GuoRenConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(GuoRenConfigureParameters.class, orderBase.getAttributionInformationVo().getConfigInfo());
         GuoRenApiOrder guoRenApiOrder = guoRenApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
@@ -251,7 +254,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         //配置信息
-        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyId());
         GuoRenConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(GuoRenConfigureParameters.class, paymentLinkVo.getOrder().getAttributionInformationVo().getConfigInfo());
         GuoRenApiOrder guoRenApiOrder = guoRenApiOrderService.findByOrdersNo(paymentLinkVo.getOrder().getOrdersNo());
 
@@ -281,7 +284,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
      */
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
-        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyId());
         InsOrdersPolicy policie = downloadPolicyVo.getPolicie();
         DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
         GuoRenApiOrder guoRenApiOrder = guoRenApiOrderService.findByOrdersNo(downloadPolicyVo.getOrder().getOrdersNo());
@@ -315,7 +318,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
         //查询投保单信息
         InsOrdersPolicy insOrdersPolicy = orderBase.getInsOrdersPolicy();
         InsOrders insOrders = orderBase.getInsOrders();
-        String url = getApiUrl(orderBase.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getOrder().getInsuranceCompanyId());
         // 获取保司订单状态
         OrderStateResponse orderStateResponse = insOrderStatus(insOrdersPolicy,url);
         GuoRenApiOrder guoRenApiOrder = guoRenApiOrderService.findByOrdersNo(orderBase.getOrder().getOrdersNo());
@@ -507,40 +510,44 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
 
     /**
      * 查询国任特约数据
-     * @param orderBase 原参数为agreementId,以后看orderbase中的配置信息map中是否可以获取
+     * @param quoteVo 原参数为agreementId,以后看orderbase中的配置信息map中是否可以获取
      * @return
      */
-    public List<GuoRenSpecialAgreementVo> getSpecialAgreements(OrderBase orderBase, GuoRenConfigureParameters parameters,String url) {
-        // 获取协议配置信息
-        String specialAgreementKey = GR_SPECIAL_AGREEMENT_KEY + orderBase.getOrdersNo();//现在用ordersNo替换agreementId
-
-        // 从缓存中获取数据
-        String info = (String) redisTemplate.opsForValue().get(specialAgreementKey);
-        if (!StringUtils.isEmpty(info)) {
-            List<GuoRenSpecialAgreementVo> list = JSON.parseArray(info, GuoRenSpecialAgreementVo.class);
-            return list;
-        }
-
+//    public List<GuoRenSpecialAgreementVo> getSpecialAgreements(OrderBase orderBase, GuoRenConfigureParameters parameters,String url) {
+//        // 获取协议配置信息
+//        String specialAgreementKey = GR_SPECIAL_AGREEMENT_KEY + orderBase.getOrdersNo();//现在用ordersNo替换agreementId
+//
+//        // 从缓存中获取数据
+//        String info = (String) redisTemplate.opsForValue().get(specialAgreementKey);
+//        if (!StringUtils.isEmpty(info)) {
+//            List<GuoRenSpecialAgreementVo> list = JSON.parseArray(info, GuoRenSpecialAgreementVo.class);
+//            return list;
+//        }
+//
+//        List<GuoRenSpecialAgreementVo> list = new ArrayList<>();
+//        for (InsuranceRisk insuranceRisk : InsuranceRisk.getInsuranceRisk()) {
+//            String riskCode = GuoRenRiskCode.toInsuranceRisk(insuranceRisk.getCode());
+//            SpecialAgreementRequest specialAgreementRequest = new SpecialAgreementRequest(parameters.getComCode(),
+//                    riskCode);
+//            SpecialAgreementResponse response = guoRenRequestApiComponent.request(specialAgreementRequest,
+//                    PlatformInterfaceCode.API_IIRBT00005, SpecialAgreementResponse.class,url);
+//
+//            AssertionUtils.isFail("1".equals(response.getResultCode().toString()), response.getResultMsg());
+//
+//            List<GuoRenSpecialAgreementVo> collect =
+//                    response.getData().stream().map(x -> new GuoRenSpecialAgreementVo(x, insuranceRisk)).collect(Collectors.toList());
+//            list.addAll(collect);
+//        }
+//        return list;
+//    }
+
+    public List<GuoRenSpecialAgreementVo> getSpecialAgreements(QuoteVo quoteVo) {
+        List<InsCompanyClause> companyClauseVos = quoteVo.getSpecialInfoVo();
         List<GuoRenSpecialAgreementVo> list = new ArrayList<>();
         for (InsuranceRisk insuranceRisk : InsuranceRisk.getInsuranceRisk()) {
-            String riskCode = GuoRenRiskCode.toInsuranceRisk(insuranceRisk.getCode());
-            SpecialAgreementRequest specialAgreementRequest = new SpecialAgreementRequest(parameters.getComCode(),
-                    riskCode);
-            SpecialAgreementResponse response = guoRenRequestApiComponent.request(specialAgreementRequest,
-                    PlatformInterfaceCode.API_IIRBT00005, SpecialAgreementResponse.class,url);
-
-            AssertionUtils.isFail("1".equals(response.getResultCode().toString()), response.getResultMsg());
-
-            List<GuoRenSpecialAgreementVo> collect =
-                    response.getData().stream().map(x -> new GuoRenSpecialAgreementVo(x, insuranceRisk)).collect(Collectors.toList());
+            List<GuoRenSpecialAgreementVo> collect = companyClauseVos.stream().map(x -> new GuoRenSpecialAgreementVo(x, insuranceRisk)).collect(Collectors.toList());
             list.addAll(collect);
         }
-
-        // 数据存入缓存
-        if (!list.isEmpty()) {
-            redisTemplate.opsForValue().set(specialAgreementKey, JSON.toJSONString(list), GR_SPECIAL_AGREEMENT_TIME,
-                    TimeUnit.DAYS);
-        }
         return list;
     }
 

+ 6 - 6
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java

@@ -74,7 +74,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         //配置信息
         HuaTaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, orderBase.getAttributionInformationVo().getConfigInfo());
         HuaTaiBaseRequestHead baseRequestHead = new HuaTaiBaseRequestHead(parameters);
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
 
         //查询车型
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
@@ -157,7 +157,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
         OrderBase orderBase = underwritingVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         //配置信息
         HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
@@ -272,7 +272,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
-        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyId());
         //配置信息
         HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
 
@@ -300,7 +300,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         try {
             OrderBase orderBase = insuranceUploadImageVo.getOrder();
-            String url = orderBase.getInsuranceCompanyCode();
+            String url = orderBase.getInsuranceCompanyId();
             AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
             //配置信息
             HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
@@ -329,7 +329,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         if (ObjectUtil.isNull(police)){
             throw new RuntimeException("请选择保单");
         }
-        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyId());
         DownloadPolicyResultVo resultVo = new DownloadPolicyResultVo();
         AttributionInformationVo attributionInformationVo = downloadPolicyVo.getOrder().getAttributionInformationVo();
         //配置信息
@@ -407,7 +407,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
-        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyId());
         AttributionInformationVo attributionInformationVo = orderStatusVo.getOrder().getAttributionInformationVo();
         //配置信息
         HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());

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

@@ -154,6 +154,7 @@ public class QuoteVerificationAspect {
             } else {
                 logs.append("没有找到该协议的费用信息" + "\n");
             }
+            result.getData().setFeeNoDescription(logs.toString());
         }
     }
 

+ 24 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.constants.CompanyConstants;
+import com.jzg.commons.constants.InsuranceRisk;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.base.StateResult;
@@ -12,10 +13,13 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.enums.MessageCodeEnum;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.InsCompanyClause;
 import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.entity.quote.vo.underwriting.SpecialAppointmentsVo;
+import com.jzg.commons.entity.vo.InsCompanyClauseVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.exception.TokenExpireException;
 import com.jzg.commons.util.AssertionUtils;
@@ -50,6 +54,7 @@ import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -100,6 +105,8 @@ public class UnifyOrderManager {
     @Autowired
     InsOrdersCostsService insOrdersCostsService;
 
+    @Autowired
+    InsOrdersClauseService insOrdersClauseService;
     @Autowired
     InsTaskImagesService insTaskImagesService;
 
@@ -291,6 +298,23 @@ public class UnifyOrderManager {
         underwritingVo.setPolicy(insOrdersPolicy);
         underwritingVo.getOrder().setCompanyOrderNo(insOrders.getCompanyOrderNo());
 
+        // 特约查询
+        List<InsOrdersClause> insOrdersClauseList = insOrdersClauseService
+                .list(new LambdaQueryWrapper<InsOrdersClause>().eq(InsOrdersClause::getOrderNo, insOrders.getId()));
+        List<SpecialAppointmentsVo> specialAppointmentsVos = new ArrayList<>();
+        for (InsOrdersClause insOrdersClause : insOrdersClauseList) {
+            InsCompanyClause companyClause = platformClient.getClause(insOrdersClause.getClauseId());
+            SpecialAppointmentsVo specialAppointmentsVo = new SpecialAppointmentsVo();
+            specialAppointmentsVo.setClauseCode(companyClause.getClauseCode());
+            specialAppointmentsVo.setClauses(companyClause.getClauseContent());
+            specialAppointmentsVo.setRiskCode(companyClause.getRiskCode());
+            specialAppointmentsVo.setClausesContext(companyClause.getClauseContent());
+            InsuranceRisk insuranceRisk = InsuranceRisk.getInsuranceRiskByCode(companyClause.getRiskCode());
+            specialAppointmentsVo.setRiskName(insuranceRisk.getShortName());
+            specialAppointmentsVos.add(specialAppointmentsVo);
+        }
+        underwritingVo.setSpecialAppointmentsVos(specialAppointmentsVos);
+
         UnderwritingResultsVo underwritingResultsVo = quoteService.underwriting(underwritingVo);
         underwritingResultsVo.setOrdersNo(insOrders.getId());
         // 保存核保结果

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersClauseMapper.java

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

+ 13 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersClauseService.java

@@ -0,0 +1,13 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersClause;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
+
+import java.util.List;
+
+public interface InsOrdersClauseService extends IService<InsOrdersClause> {
+    void createClause(InsOrders insOrders,QuoteVo quoteVo);
+}

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

@@ -0,0 +1,35 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersClause;
+import com.jzg.commons.entity.po.InsCompanyClause;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
+import com.jzg.quotation.summary.mapper.InsOrdersClauseMapper;
+import com.jzg.quotation.summary.service.InsOrdersClauseService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/7/22 16:11
+ */
+
+@Service
+public class InsOrdersClauseServiceImpl extends ServiceImpl<InsOrdersClauseMapper, InsOrdersClause> implements InsOrdersClauseService {
+    @Override
+    public void createClause(InsOrders insOrders,QuoteVo quoteVo) {
+        List<InsCompanyClause> companyClauseVos = quoteVo.getSpecialInfoVo();
+        List<InsOrdersClause> insOrdersClauses = new ArrayList<>();
+        for (InsCompanyClause companyClauseVo : companyClauseVos) {
+            InsOrdersClause insOrdersClause = new InsOrdersClause();
+            insOrdersClause.setOrderNo(insOrders.getId());
+            insOrdersClause.setClauseId(companyClauseVo.getId());
+            insOrdersClauses.add(insOrdersClause);
+        }
+        this.saveBatch(insOrdersClauses);
+    }
+}

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

@@ -32,6 +32,7 @@ import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.aggregated.UnderwritingResultsVo;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
+import com.jzg.commons.entity.quote.vo.underwriting.SpecialAppointmentsVo;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.MinioUtils;
@@ -91,6 +92,8 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
     private final InsOrdersCarInfoService ordersCarInfoService;
 
+    private final InsOrdersClauseService insOrdersClauseService;
+
     private final InsOrdersMapper insOrdersMapper;
 
     private final OrgClient orgClient;
@@ -396,7 +399,17 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         if (insOrdersVo.getInsOrdersPdfUrl() ==  null) {
             insOrdersVo.setInsOrdersPdfUrl(new InsOrdersPdfUrl());
         }
-
+        // 特约查询
+        List<InsOrdersClause> insOrdersClauseList = insOrdersClauseService
+                .list(new LambdaQueryWrapper<InsOrdersClause>().eq(InsOrdersClause::getOrderNo, id));
+        if (insOrdersClauseList != null) {
+            List<InsCompanyClause> companyClauseList = new ArrayList<>();
+            for (InsOrdersClause insOrdersClause : insOrdersClauseList) {
+                InsCompanyClause companyClause = platformClient.getClause(insOrdersClause.getClauseId());
+                companyClauseList.add(companyClause);
+            }
+            insOrdersVo.setSpecialInfoVo(companyClauseList);
+        }
         insOrdersVo.setInsOrdersTax(insOrdersTaxService.getById(id));
         setInsOrdersExternalPolicy(insOrdersVo.getInsOrdersExternalPolicy());
         return insOrdersVo;
@@ -820,6 +833,10 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         // 保存订单车船税税信息 ins_orders_tax
         insOrdersTaxService.createTax(insOrders,quoteVo);
 
+        // 保存特约信息
+        if (quoteVo.getSpecialInfoVo() != null) {
+            insOrdersClauseService.createClause(insOrders,quoteVo);
+        }
         return insOrders.getId();
     }
 
@@ -956,9 +973,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         // 费用信息
         InsFeeOrders insFeeOrders = insFeeOrdersMapper.selectOne(new LambdaQueryWrapper<InsFeeOrders>()
                 .eq(InsFeeOrders::getOrderNo, ordersNo));
-        resultVo.setInsFeeOrders(new InsFeeOrdersVo(insFeeOrders));
         // 比例信息
         if (insFeeOrders != null) {
+            resultVo.setInsFeeOrders(new InsFeeOrdersVo(insFeeOrders));
             List<PtlAgreementCostTypeVo> ptlAgreementCostTypeList = orgClient.queryByCostId(insFeeOrders.getCostId());
             PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrdersVo.getInsOrders().getAgreementId(),baseController.getToken());
             resultVo.setCostRatio(new PtlAgreementCostRatioVo(ptlAgreementCostTypeList,ptlAgreement));

+ 46 - 14
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -52,25 +52,25 @@ yc:
     url: https://test.baoxianzhanggui.com/yongcheng/
 
 #阳光财险生产api
-#yangguang:
-#  api:
-#    key: GVGFDsmWyvydKuCrtP
-#    url: http://wxopenapi.sinosig.com/serviceCar/nonstandard.action?sysFlag=CCSI_SXJZG
-#    uploadUrl: http://autoimage.sinosig.com/AutoImagePlatform/third/upload
-#    payCallBack: https://sxzgkj.baoxianzhanggui.com/web-api/api/yangGuang/callBack
-#    secret: 6CPxxlHwLLphTR7gVg3hJLsH
-#    referer: SXJZG
-
-#阳光财险测试api
 yangguang:
   api:
-    key: uYPP7AIc3HYsUh8rFn
-    url: http://chexiantest.sinosig.com:7002/serviceCar/nonstandard.action?sysFlag=CCSI_SXJZG
-    uploadUrl: http://unifiedimage.sinosig.com:8082/AutoImagePlatform/third/upload
+    key: GVGFDsmWyvydKuCrtP
+    url: http://wxopenapi.sinosig.com/serviceCar/nonstandard.action?sysFlag=CCSI_SXJZG
+    uploadUrl: http://autoimage.sinosig.com/AutoImagePlatform/third/upload
     payCallBack: https://sxzgkj.baoxianzhanggui.com/web-api/api/yangGuang/callBack
     secret: 6CPxxlHwLLphTR7gVg3hJLsH
     referer: SXJZG
 
+#阳光财险测试api
+#yangguang:
+#  api:
+#    key: uYPP7AIc3HYsUh8rFn
+#    url: http://chexiantest.sinosig.com:7002/serviceCar/nonstandard.action?sysFlag=CCSI_SXJZG
+#    uploadUrl: http://unifiedimage.sinosig.com:8082/AutoImagePlatform/third/upload
+#    payCallBack: https://sxzgkj.baoxianzhanggui.com/web-api/api/yangGuang/callBack
+#    secret: 6CPxxlHwLLphTR7gVg3hJLsH
+#    referer: SXJZG
+
 
 #诚泰财险api
 chengtai:
@@ -126,7 +126,7 @@ huatai:
     huaTaiKey: AdOdn409KE6Z9XvFsJ
     key: kFl5aiHALbZ6TMTqQDxghMMC
     tokenUrl: https://vehpxy.pc.ehuatai.com/sign
-# 渤海财险
+# 渤海财险生产api
 bohai:
   api:
     #    url: https://esales.bpic.com.cn
@@ -136,6 +136,15 @@ bohai:
     boHaiPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIC3wgJd+7Wue63Qjdh3/uscQSKec2m9gaeCq007kjEiSFES5Tfx75VPSxRj6qk6XN4umHOsHY+W9jkv+Cj4+z3XpPozsRdoj21oxPx8fPJzpVeaUHrEkZtj9Yvo/KhByBK5sRjKmlENXVF3wXVfAg48JZR2XUyUcBdZhR9aHhoQIDAQAB
     insurerCode: 'BPIC'
 
+# 渤海财险测试api
+#bohai:
+#  api:
+#    url: http://uatwhale.bpic.com.cn/app-intermediary/gatewayFromPlat
+#    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKbJHlAPiXza9A7Mfs2cLvysKa5GjdMtG1QQv8oADkAgcdujRq0aHVjNFXoVm7b1DdlhEAdhKXJ7XyY/2zoEbpoU4YxzIftloHZ0vd/k4vgAg5beH972jpWZj6N3ER+EgR73+Ui0p0pdXIRjDF4o8mWSLw8W8Z93eILtLg0DcOIwIDAQAB
+#    selfPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIbDhcA8eL4r78XXJvik/cxNI66sBaxX6jZvN5Utoj4vgBh5daExJn8vnIRfU6+lkqQFEPop4jMMWqU/7BneqC3ifwyhp4Dj/9mPhNJdvJdU+0UC2l5OJ13uhYElZzJ2+G1xZeuEFGH3ASthnr6ELCHXQkFaZJtNwObSpjw/Kq6xAgMBAAECgYB2odAwNgukfVEJvCjWYYf6PT3YGh60ZIANg0JO1GkqjO4anXFrgLT+6Y7DCJfG296G/N7BGfXCMnHpXqgc7eDlmSy2JVfKzvptgKJBLktP7Yfajg3oY9S8parSK+iyHT6qYqQv6wBmQ3Q9smOp/TM2ndBMDXu9MjoTkNJhrfMDsQJBANbWHciQhazb3Y2DY42hW/zBf7rmmJFrw7aOrEjzw5E+SnGs/vcr3LUWBbSRTYHcoJ+V/kudfwRMlz0SLkfMAvMCQQCglcjNRx35Zw6vNKHE4vTN/ny2gukjvtkzXpPeTUfblrXjK3w3x9aWBZ/MUiphVe5NB8CAtlfYZMo4UG+WMEjLAkA4yHsyydArMinK/5FOm/meQt6p3c0xkpQ2KlurJJLqTtaKWTlCx1scmeeEJGuiCViDFbgS8FvkHQJUZ/vHikq1AkAHbUX/MHXTbg/AzKdaqsB1snpkGoPb0lzLQmmGU36qSjsZSY6SKdzjzVjJo1cwbz/5Mg2WJljDuk2b8yRmBs+nAkEAzoEZmM031u/0KBpukSbqef8JgJOZ0Do9KDbf2P6YuBal6drUeNYVhImKBxQAbjETp9m5TxxW/dkKmHCnc3zqsA==
+#    boHaiPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKbJHlAPiXza9A7Mfs2cLvysKa5GjdMtG1QQv8oADkAgcdujRq0aHVjNFXoVm7b1DdlhEAdhKXJ7XyY/2zoEbpoU4YxzIftloHZ0vd/k4vgAg5beH972jpWZj6N3ER+EgR73+Ui0p0pdXIRjDF4o8mWSLw8W8Z93eILtLg0DcOIwIDAQAB
+#    insurerCode: 'BPIC'
+
 #中煤财险测试
 zhongmei:
   api:
@@ -152,3 +161,26 @@ zhongmei:
   crawler:
     baseUrl: https://hxkscd.chinacoal-ins.com/singlePlatform
     imageUrl: https://image.chinacoal-ins.com/SunICMS
+
+zijin:
+  api:
+    #    appKey: SXTQ-C-SX
+    #    appSecret: vAI9sW4bM1m5Y074AUT72wvxKu55SbGY
+    #    proposalCityCode: 320100
+    #    proposalAreaCode: 320000
+    # 为接入方提供获取token服务
+    accessTokenUrl: https://test-open.zking.com/api/v1/public/token/getAccessToken
+    # 车险业务
+    url: http://test-open.zking.com/api/v1/insurance/autoMobile/carInsurance/
+    # 支付
+    payUrl: http://test-open.zking.com/api/v1/public/payment/cashier/zbfAggregatePay
+    # 新支付
+    newPayUrl: http://test-open.zking.com/api/v1/open/open-aggregate/auth/newPay
+    # 订单详情查询服务
+    orderUrl: http://test-open.zking.com/api/v1/insurance/public/getOrderDetail
+    # 订单状态查询
+    orderDetailUrl: http://test-open.zking.com/api/v1/insurance/autoMobile/geelyCarInsurance/queryOrderDetail
+    # 下载保单地址
+    downLoadDocument: http://test-open.zking.com/temp/api/v1/insurance/nonAutoMobile/queryPolicy/downLoadDocument
+    # 对接三方渠道验车链接接口
+    sendCheckCarLink: http://open.zking.com/api/v1/open/open-aggregate/auth/wanJiaYun/sendCheckCarLink

+ 5 - 4
tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/service/impl/YangGuangApiRequestImpl.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.yangguang.api.service.impl;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.agreement.po.PtlAgreementUrl;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
@@ -158,7 +159,7 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws JsonProcessingException {
         OrderBase orderBase = underwritingVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         YangGuangApiOrder yangGuangApiOrder = yangGuangApiOrderService.getById(orderBase.getOrdersNo());
         // 账号配置信息
         YangGuangConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(YangGuangConfigureParameters.class, orderBase
@@ -226,7 +227,7 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
                 .getAttributionInformationVo()
                 .getConfigInfo());
 
-        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyId());
         YangGuangPaymentRequest yangGuangPaymentRequest = new YangGuangPaymentRequest(paymentLinkVo,parameters,yangGuangApiProperties.getPayCallBack());
         YangGuangPaymentResponse yangGuangPaymentResponse = yangGuangApiRequestComponent.payment(yangGuangPaymentRequest,url);
         PaymentLinkResultsVo resultsVo = new PaymentLinkResultsVo();
@@ -291,7 +292,7 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
     private void queryPolicy(String policyNo,YangGuangConfigureParameters parameters,DownloadPolicyResultVo downloadPolicyResultVo,PolicyType policyType,OrderBase orderBase){
         YangGuangGetEpolicyPdfUrlRequest downloadPolicyRequest = new YangGuangGetEpolicyPdfUrlRequest(parameters, policyNo);
         try {
-            String apiUrl = getApiUrl(orderBase.getInsuranceCompanyCode());
+            String apiUrl = getApiUrl(orderBase.getInsuranceCompanyId());
             YangGuangGetEpolicyPdfUrlResponse response = yangGuangApiRequestComponent.getEpolicyPDFURL(downloadPolicyRequest,apiUrl);
             if (response.getErrorCode().equals("0")) {
                 if (StringUtils.isNotEmpty(response.getEPolicyPDFURL())) {
@@ -325,7 +326,7 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws JsonProcessingException {
         OrderBase orderBase = orderStatusVo.getOrder();
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
-        String apiUrl = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String apiUrl = getApiUrl(orderBase.getInsuranceCompanyId());
         // 账号配置信息
         YangGuangConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(YangGuangConfigureParameters.class, orderBase
                 .getAttributionInformationVo()

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

@@ -131,7 +131,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
     public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
         OrderBase order = quoteVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
-        String url = getApiUrl(order.getInsuranceCompanyCode());
+        String url = getApiUrl(order.getInsuranceCompanyId());
         //1.车型获取
         YcApiConfigurationProperties configurationProperties = ConfigureParametersConversion.conversionEntity(YcApiConfigurationProperties.class, attributionInformationVo.getConfigInfo());
         ModelsQueryResponse.VehicleInfo vehicleInfo = gainVehicleModel(configurationProperties, quoteVo.getCarInfoVo(),url);
@@ -196,7 +196,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         //组装参数
         AuditRequest m = AuditRequest.buildAuditParam(underwritingVo);
-        String url = getApiUrl(underwritingVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(underwritingVo.getOrder().getInsuranceCompanyId());
         try {
             AuditResponse auditResponse = ycRequestApiComponents.newXnyUnderwritingService(m,url);
             if (auditResponse.getResponseHead().getReturnCode().equals("0000")) {
@@ -247,7 +247,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         try {
-            String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyCode());
+            String url = getApiUrl(paymentLinkVo.getOrder().getInsuranceCompanyId());
             PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
             paymentLinkResultsVo.setPayLinkStatus(false);
             YcApiConfigurationProperties configurationProperties = ConfigureParametersConversion.conversionEntity(YcApiConfigurationProperties.class, paymentLinkVo.getOrder().getAttributionInformationVo().getConfigInfo());
@@ -272,7 +272,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-        String url = getApiUrl(insuranceUploadImageVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(insuranceUploadImageVo.getOrder().getInsuranceCompanyId());
         YcApiConfigurationProperties configurationProperties = ConfigureParametersConversion.conversionEntity(YcApiConfigurationProperties.class, insuranceUploadImageVo.getOrder().getAttributionInformationVo().getConfigInfo());
         //获取协议配置信息
         HashMap<String, String> map = new HashMap<>();
@@ -298,7 +298,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
         DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
         // 获取协议配置信息
         YcApiConfigurationProperties configurationProperties = ConfigureParametersConversion.conversionEntity(YcApiConfigurationProperties.class, downloadPolicyVo.getOrder().getAttributionInformationVo().getConfigInfo());
-        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyId());
         String jqPolicyNo = downloadPolicyVo.getPolicie().getJqPolicyNo();
         if(Objects.nonNull(jqPolicyNo)) {
             queryPolicy(jqPolicyNo, configurationProperties, downloadPolicyResultVo, url);
@@ -363,7 +363,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
-        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyCode());
+        String url = getApiUrl(orderStatusVo.getOrder().getInsuranceCompanyId());
         YcApiConfigurationProperties configurationProperties = ConfigureParametersConversion.conversionEntity(YcApiConfigurationProperties.class, orderStatusVo.getOrder().getAttributionInformationVo().getConfigInfo());
         //0 支付回调 1核保回调 5直接返回字符串信息
         String type = "5";

+ 6 - 6
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/api/service/impl/ZhongMeiApiRequestImpl.java

@@ -59,7 +59,7 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
     public QuoteResultsVo quote(QuoteVo quoteVo) {
         OrderBase order = quoteVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
-        String url = getApiUrl(order.getInsuranceCompanyCode());
+        String url = getApiUrl(order.getInsuranceCompanyId());
         //配置信息
         ZmApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmApiConfigureParameters.class, attributionInformationVo.getConfigInfo());
         BaseRequestHead baseRequestHead = new BaseRequestHead(parameters);
@@ -213,7 +213,7 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
     @Transactional
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
         OrderBase orderBase = underwritingVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         //获取配置信息
         ZmApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmApiConfigureParameters.class, orderBase.getAttributionInformationVo().getConfigInfo());
 
@@ -273,7 +273,7 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws JsonProcessingException {
         OrderBase orderBase = paymentLinkVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         ZmApiOrder zmApiOrder = zhongmeiApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
         String payUrl = zmApiOrder.getPayUrl();
         //如果mongodb中没有支付链接,说明是人工审核,需要调用核保状态查询接口
@@ -298,7 +298,7 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         OrderBase orderBase = insuranceUploadImageVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         //获取配置信息
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         ZmApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmApiConfigureParameters.class, attributionInformationVo.getConfigInfo());
@@ -320,7 +320,7 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         //获取配置信息
         OrderBase orderBase = downloadPolicyVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         ZmApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmApiConfigureParameters.class, attributionInformationVo.getConfigInfo());
         DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
@@ -384,7 +384,7 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         //获取配置信息
         OrderBase orderBase = orderStatusVo.getOrder();
-        String url = getApiUrl(orderBase.getInsuranceCompanyCode());
+        String url = getApiUrl(orderBase.getInsuranceCompanyId());
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
 
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();

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

@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
-@FeignClient(name="jzg-platform",url = "http://192.168.0.115:8001/")
+@FeignClient(name="jzg-platform",url = "http://192.168.0.250:8001/")
 public interface EsmInsCompanyClient {
 
 
@@ -22,6 +22,13 @@ public interface EsmInsCompanyClient {
     @GetMapping("/esmInsCompany/findById")
     public HttpResult<EsmInsCompany> findById(@RequestParam String id);
 
+    /**
+     * 查找存在协议的保险公司列表
+     * @return
+     */
+    @GetMapping("/esmInsCompany/liveCompanyList")
+    public HttpResult<List<EsmInsCompany>> liveCompanyList();
+
     @GetMapping("/system/getBusPerms")
     public HttpResult<SysSystemBusPermsVo> getBusPerms(@RequestParam String systemCode);
 

+ 2 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java

@@ -161,7 +161,8 @@ public class AgreementController extends BaseController {
     @Operation(summary = "批量删除协议")
     @DeleteMapping("/agreementDelete")
     public HttpResult agreementDelete(String[] ids) {
-        return HttpResult.ok(agreementService.deleteByIds(List.of(ids))? "删除成功":"删除失败");
+        boolean b = agreementService.deleteByIds(List.of(ids));
+        return HttpResult.ok(b ? "删除成功":"删除失败");
     }
 
     /**

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

@@ -0,0 +1,172 @@
+package com.jzg.organization.controller;
+
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.finance.po.InsPlyIncome;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
+import com.jzg.commons.entity.finance.vo.ImportExcelResultVo;
+import com.jzg.commons.entity.finance.vo.InvoicingVo;
+import com.jzg.commons.entity.finance.vo.ReceivableQueryVo;
+import com.jzg.commons.entity.finance.vo.SettlementVo;
+import com.jzg.commons.request.RequestSingleParam;
+import com.jzg.organization.service.ReceivableService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @author jzg
+ * @version 1.0
+ * @create 2024-04-28 15:07
+ * @description: 财务应收Controller
+ */
+
+@Tag(name = "财务应收")
+@RequestMapping("/receivable")
+@RestController
+public class ReceivableController {
+
+    @Autowired
+    private ReceivableService receivableService;
+
+    // 拉取已审核订单
+    @PostMapping("pullAuditedOrder")
+    @Operation(summary = "拉取已审核订单")
+    public HttpResult pullAuditedOrder(String orderNo){
+        InsPlyIncome auditedOrder  = receivableService.getAuditedOrder(orderNo, InsOrderStatusEnum.UNDERWRITED.getCode(),"1");
+        boolean result = receivableService.saveAuditedOrder(auditedOrder);
+        return result ? HttpResult.ok("拉取成功") : HttpResult.error("拉取失败");
+    }
+
+    @PostMapping("getUnauditedOrder")
+    @Operation(summary = "获取未审核的订单")
+    public HttpResult getUnauditedOrder(String orderNo){
+        InsPlyIncome auditedOrder  = receivableService.getAuditedOrder(orderNo, InsOrderStatusEnum.UNDERWRITED.getCode(),"0");
+        boolean result = receivableService.saveAuditedOrder(auditedOrder);
+        return result ? HttpResult.ok("拉取成功") : HttpResult.error("拉取失败");
+    }
+
+    @PostMapping("getCommissionReceivableList")
+    @Operation(summary = "获取私有协议手续费列表")
+    public HttpResult getCommissionReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
+        receivableQueryVo.setQueryType("1");
+        return HttpResult.ok(receivableService.getReceivableList(receivableQueryVo));
+    }
+
+    @PostMapping("getOtherReceivableList")
+    @Operation(summary = "获取私有协议跟单费列表")
+    public HttpResult getOtherReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
+        receivableQueryVo.setQueryType("2");
+        return HttpResult.ok(receivableService.getReceivableList(receivableQueryVo));
+    }
+
+    @PostMapping("getJyCommissionReceivableList")
+    @Operation(summary = "获取私有协议驾意险手续费列表")
+    public HttpResult getJyCommissionReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
+        receivableQueryVo.setQueryType("3");
+        return HttpResult.ok(receivableService.getReceivableList(receivableQueryVo));
+    }
+
+    @PostMapping("getJyOtherReceivableList")
+    @Operation(summary = "获取私有协议驾意险跟单费列表")
+    public HttpResult getJyOtherReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
+        receivableQueryVo.setQueryType("4");
+        return HttpResult.ok(receivableService.getReceivableList(receivableQueryVo));
+    }
+
+
+    @PostMapping("getPlatformReceivableList")
+    @Operation(summary = "获取平台协议驾意险列表")
+    public void getPlatformReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
+
+    }
+
+    @PostMapping("commissionInvoicing")
+    @Operation(summary = "手续费开票")
+    public HttpResult commissionInvoicing(@RequestBody InvoicingVo invoicingVo){
+        // 设置手续费开票
+        invoicingVo.setInvoiceType("1");
+        boolean invoicingCheck = receivableService.invoicingCheck(invoicingVo);
+        if(!invoicingCheck){
+            return HttpResult.error("有订单占用");
+        }
+        boolean result = receivableService.addInvoicing(invoicingVo);
+
+        return result ? HttpResult.ok("开票成功") : HttpResult.error("开票失败");
+
+    }
+
+    @PostMapping("otherInvoicing")
+    @Operation(summary = "跟单费开票")
+    public HttpResult otherInvoicing(@RequestBody InvoicingVo invoicingVo){
+        // 设置跟单费开票
+        invoicingVo.setInvoiceType("2");
+        boolean invoicingCheck = receivableService.invoicingCheck(invoicingVo);
+        if(!invoicingCheck){
+            return HttpResult.error("有订单占用");
+        }
+
+        return HttpResult.ok();
+    }
+
+    @PostMapping("invoicingCheck")
+    @Operation(summary = "开票检测")
+    public HttpResult invoicingCheck(@RequestBody InvoicingVo invoicingVo) {
+        boolean result = receivableService.invoicingCheck(invoicingVo);
+        // 查询订单的应收跟单金额
+
+        return result ? HttpResult.ok("无占用") : HttpResult.error("有订单占用");
+    }
+
+    @PostMapping("getReceivableCompany")
+    @Operation(summary = "获取保险公司")
+    public HttpResult getReceivableCompany(@RequestBody InvoicingVo invoicingVo){
+        return HttpResult.ok(receivableService.getReceivableCompany(invoicingVo));
+    }
+
+    @PostMapping("settlement")
+    @Operation(summary = "结算")
+    public HttpResult settlement(@RequestBody SettlementVo settlementVo){
+        return receivableService.settlement(settlementVo) ? HttpResult.ok("结算成功") : HttpResult.error("结算失败");
+    }
+
+    @PostMapping("settlementList")
+    @Operation(summary = "结算明细")
+    public HttpResult  settlementList(@RequestSingleParam("invoiceId") String invoiceId){
+        List<InsPlyIncomeInvoiceSettlement> settlementList = receivableService.getSettlementList(invoiceId);
+        return HttpResult.ok(settlementList);
+    }
+
+
+    @PostMapping("importSuperviseExcel")
+    @Operation(summary = "导入手续费excel文件")
+    public HttpResult importSuperviseExcel(@RequestParam("file") MultipartFile file){
+        ImportExcelResultVo importExcelResultVo = receivableService.importSuperviseData(file);
+        return HttpResult.ok(importExcelResultVo);
+    }
+
+    @PostMapping("importOtherExcel")
+    @Operation(summary = "导入跟单费excel文件")
+    public HttpResult importOtherExcel(@RequestParam("file") MultipartFile file){
+        ImportExcelResultVo importExcelResultVo = receivableService.importOtherData(file);
+        return HttpResult.ok(importExcelResultVo);
+    }
+
+    @PostMapping("importJyExcel")
+    @Operation(summary = "导入驾意excel文件")
+    public HttpResult importJyExcel(@RequestParam("file") MultipartFile file){
+        ImportExcelResultVo importExcelResultVo = receivableService.importJyData(file);
+        return HttpResult.ok(importExcelResultVo);
+    }
+
+//    @PostMapping("batchModify")
+//    @Operation(summary = "批量修改")
+//    public HttpResult batchModify(@RequestBody List<SettlementVo> settlementVoList){
+//        return receivableService.batchModify(settlementVoList) ? HttpResult.ok("批量修改成功") : HttpResult.error("批量修改失败");
+//    }
+
+}

+ 27 - 0
tenant/organization/src/main/java/com/jzg/organization/excel/listener/JyExcelListener.java

@@ -0,0 +1,27 @@
+package com.jzg.organization.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.jzg.commons.entity.finance.vo.JyExcelVo;
+import com.jzg.commons.entity.finance.vo.OtherExcelVo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class JyExcelListener extends AnalysisEventListener<JyExcelVo> {
+    private final List<JyExcelVo> dataList = new ArrayList<>();
+
+    @Override
+    public void invoke(JyExcelVo data, AnalysisContext context) {
+        dataList.add(data);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        System.out.println("Total rows: " + dataList.size());
+    }
+
+    public List<JyExcelVo> getDataList() {
+        return dataList;
+    }
+}

+ 27 - 0
tenant/organization/src/main/java/com/jzg/organization/excel/listener/OtherExcelListener.java

@@ -0,0 +1,27 @@
+package com.jzg.organization.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.jzg.commons.entity.finance.vo.OtherExcelVo;
+import com.jzg.commons.entity.finance.vo.SuperviseExcelVo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class OtherExcelListener extends AnalysisEventListener<OtherExcelVo> {
+    private final List<OtherExcelVo> dataList = new ArrayList<>();
+
+    @Override
+    public void invoke(OtherExcelVo data, AnalysisContext context) {
+        dataList.add(data);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        System.out.println("Total rows: " + dataList.size());
+    }
+
+    public List<OtherExcelVo> getDataList() {
+        return dataList;
+    }
+}

+ 26 - 0
tenant/organization/src/main/java/com/jzg/organization/excel/listener/SuperviseExcelListener.java

@@ -0,0 +1,26 @@
+package com.jzg.organization.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.jzg.commons.entity.finance.vo.SuperviseExcelVo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SuperviseExcelListener extends AnalysisEventListener<SuperviseExcelVo> {
+    private final List<SuperviseExcelVo> dataList = new ArrayList<>();
+
+    @Override
+    public void invoke(SuperviseExcelVo data, AnalysisContext context) {
+        dataList.add(data);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        System.out.println("Total rows: " + dataList.size());
+    }
+
+    public List<SuperviseExcelVo> getDataList() {
+        return dataList;
+    }
+}

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceLinkMapper.java

@@ -0,0 +1,11 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoice;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceLink;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsPlyIncomeInvoiceLinkMapper extends BaseMapper<InsPlyIncomeInvoiceLink> {
+
+}

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceMapper.java

@@ -0,0 +1,11 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoice;
+import com.jzg.commons.entity.scheme.po.PtlSchemeInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsPlyIncomeInvoiceMapper extends BaseMapper<InsPlyIncomeInvoice> {
+
+}

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementFileMapper.java

@@ -0,0 +1,11 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlementFile;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsPlyIncomeInvoiceSettlementFileMapper extends BaseMapper<InsPlyIncomeInvoiceSettlementFile> {
+
+}

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementMapper.java

@@ -0,0 +1,11 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoice;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsPlyIncomeInvoiceSettlementMapper extends BaseMapper<InsPlyIncomeInvoiceSettlement> {
+
+}

+ 36 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java

@@ -0,0 +1,36 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.finance.po.InsPlyIncome;
+import com.jzg.commons.entity.finance.vo.InvoicingVo;
+import com.jzg.commons.entity.finance.vo.ReceivableQueryVo;
+import com.jzg.commons.entity.po.EsmInsCompany;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
+
+    /**
+     * 获取已审核的订单
+     * @param orderNo
+     * @return
+     */
+    InsPlyIncome getAuditedOrder(String orderNo, String orderStatus, String auditStatus);
+
+    /**
+     * 获取应收订单的保司
+     */
+    List<EsmInsCompany> getReceivableCompany(@Param("invoicingVo") InvoicingVo invoicingVo);
+
+    /**
+     * 获取应收列表
+     * @param receivableQueryVo
+     * @return
+     */
+    List<InsPlyIncome> getReceivableList(@Param("receivableQueryVo") ReceivableQueryVo receivableQueryVo);
+
+    Integer invoicingCheck(@Param("invoicingVo") InvoicingVo invoicingVo);
+}

+ 140 - 0
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -0,0 +1,140 @@
+package com.jzg.organization.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.finance.po.InsPlyIncome;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
+import com.jzg.commons.entity.finance.vo.*;
+import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.scheme.po.PtlScheme;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface ReceivableService extends IService<InsPlyIncome> {
+
+    /**
+     * 获取已审核的订单
+     * @param orderNo
+     * @return
+     */
+    InsPlyIncome getAuditedOrder(String orderNo, String orderStatus, String auditStatus);
+
+    /**
+     * 添加已审核订单的数据 应收表插入
+     */
+    boolean saveAuditedOrder(InsPlyIncome order);
+
+    /**
+     * 获取应收订单的保司
+     * @param invoicingVo
+     * @return
+     */
+    List<EsmInsCompany> getReceivableCompany(InvoicingVo invoicingVo);
+
+    /**
+     * 获取手续费应收列表
+     * @param receivableQueryVo
+     * @return
+     */
+    List<InsPlyIncome> getReceivableList(ReceivableQueryVo receivableQueryVo);
+
+    /**
+     * 开票检测
+     * @param invoicingVo
+     * @return
+     */
+    boolean invoicingCheck(InvoicingVo invoicingVo);
+
+    /**
+     * 获取应收金额
+     * @param invoicingVo
+     * @return
+     */
+    BigDecimal getReceivableAmount(InvoicingVo invoicingVo);
+
+    /**
+     * 添加开票
+     */
+    boolean addInvoicing(InvoicingVo invoicingVo);
+
+    /**
+     * 获取票据的实收金额
+     */
+    BigDecimal getInvoicingAmount(String invoicingId);
+
+    /**
+     * 更新应收订单结算状态
+     * @param invoiceType
+     * @return
+     */
+    boolean updateIncomeSettlementStatus(String invoiceType, List<String> invoiceIds);
+
+    /**
+     * 结算
+     * @param settlementVo
+     * @return
+     */
+    boolean settlement(SettlementVo settlementVo);
+
+    /**
+     * 获取结算列表
+     * @param invoiceId
+     * @return
+     */
+    List<InsPlyIncomeInvoiceSettlement> getSettlementList(String invoiceId);
+
+
+    /**
+     * 导入手续费excel
+     */
+    List<SuperviseExcelVo> importSuperviseExcel(MultipartFile file);
+
+    /**
+     * 导入跟单费excel
+     * @param file
+     * @return
+     */
+    List<OtherExcelVo> importOtherExcel(MultipartFile file);
+
+    /**
+     * 导入驾意费excel
+     * @param file
+     * @return
+     */
+    List<JyExcelVo> importJyExcel(MultipartFile file);
+
+    /**
+     * 导入手续费excel  并处理数据
+     * @param file
+     * @return
+     */
+    ImportExcelResultVo importSuperviseData(MultipartFile file);
+
+    /**
+     * 导入跟单费excel 并处理数据
+     * @param file
+     * @return
+     */
+    ImportExcelResultVo importOtherData(MultipartFile file);
+
+    /**
+     * 导入驾意excel  并处理数据
+     * @param file
+     * @return
+     */
+    ImportExcelResultVo importJyData(MultipartFile file);
+
+    /**
+     * 批量修改
+     * @param batchModifyVo
+     * @return
+     */
+    boolean batchModify(BatchModifyVo batchModifyVo);
+
+    /**
+     * 计算应收金额
+     * @return
+     */
+    BigDecimal calcReceivableAmount(BigDecimal premium,BigDecimal ratio);
+}

+ 8 - 3
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java

@@ -165,11 +165,14 @@ public class PtlAgreementServiceImpl extends ServiceImpl<PtlAgreementMapper, Ptl
 
     @Override
     public boolean isExistsName(String agreementTitle, String id, int isExternal) {
+        LocalDateTime now = LocalDateTime.now();
         long count = this.count(new LambdaQueryWrapper<PtlAgreement>()
                 .eq(PtlAgreement::getAgreementTitle, agreementTitle)
                 .eq(PtlAgreement::getIsExternal, isExternal)
                 .ne(StringUtils.isNotNull(id),PtlAgreement::getId, id)
                 .eq(PtlAgreement::getIsDelete,0)
+                .le(PtlAgreement::getStartDate, now)
+                .ge(PtlAgreement::getEndDate, now)
         );
         return count > 0;
     }
@@ -275,10 +278,12 @@ public class PtlAgreementServiceImpl extends ServiceImpl<PtlAgreementMapper, Ptl
         agreementCostService.removeByIds(costIds);
 
         // 删除费用关联的规则
-        agreementCostRuleService.remove(new LambdaQueryWrapper<PtlAgreementCostRule>()
-               .in(PtlAgreementCostRule::getPtlAgreementCostId, costIds));
+        if(costIds.size() > 0) {
+            agreementCostRuleService.remove(new LambdaQueryWrapper<PtlAgreementCostRule>()
+                    .in(PtlAgreementCostRule::getPtlAgreementCostId, costIds));
+        }
 
-        return baseMapper.deleteByIds(ids) > 0;
+        return true;
     }
 
     @Override

+ 701 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -0,0 +1,701 @@
+package com.jzg.organization.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.finance.po.*;
+import com.jzg.commons.entity.finance.vo.*;
+import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.PtlAgreement;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.idgen.IdGenerate;
+import com.jzg.organization.client.EsmInsCompanyClient;
+import com.jzg.organization.excel.listener.JyExcelListener;
+import com.jzg.organization.excel.listener.OtherExcelListener;
+import com.jzg.organization.excel.listener.SuperviseExcelListener;
+import com.jzg.organization.mapper.*;
+import com.jzg.organization.service.ReceivableService;
+import org.redisson.api.RBucket;
+import org.redisson.api.RKeys;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+
+/**
+ * @author tz
+ * @description 财务应收模块Service实现
+ * @createDate 2024-06-26 10:49:31
+ */
+@Service
+public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyIncome> implements ReceivableService {
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private BaseController baseController;
+
+    @Autowired
+    private InsPlyIncomeInvoiceMapper insPlyIncomeInvoiceMapper;
+
+    @Autowired
+    private InsPlyIncomeInvoiceLinkMapper insPlyIncomeInvoiceLinkMapper;
+
+    @Autowired
+    private InsPlyIncomeInvoiceSettlementMapper insPlyIncomeInvoiceSettlementMapper;
+
+    @Autowired
+    private InsPlyIncomeInvoiceSettlementFileMapper insPlyIncomeInvoiceSettlementFileMapper;
+
+    @Autowired
+    private EsmInsCompanyClient esmInsCompanyClient;
+
+    @Autowired
+    private PtlAgreementMapper ptlAgreementMapper;
+
+    // 车辆险种手续费结算锁
+    private static final String CAR_INVOICING_COMMISSION_LOCK = "CAR_INVOICING_COMMISSION_LOCK:";
+    // 车辆险种跟单费结算锁
+    private static final String CAR_INVOICING_OTHER_LOCK = "CAR_INVOICING_OTHER_LOCK:";
+    // 驾意险手续费结算锁
+    private static final String JY_INVOICING_COMMISSION_LOCK = "JY_INVOICING_COMMISSION_LOCK:";
+    // 驾意险跟单费结算所
+    private static final String JY_INVOICING_OTHER_LOCK = "JY_INVOICING_OTHER_LOCK:";
+
+    @Override
+    public InsPlyIncome getAuditedOrder(String orderNo, String orderStatus, String auditStatus) {
+        return baseMapper.getAuditedOrder(orderNo, orderStatus, auditStatus);
+    }
+
+    @Override
+    public boolean saveAuditedOrder(InsPlyIncome order) {
+        // 查看当前表是否已经存在了已审核订单数据
+        Long count = baseMapper.selectCount(new LambdaQueryWrapper<InsPlyIncome>().eq(InsPlyIncome::getOrderNo, order.getOrderNo()));
+        // 订单已经录入成功了
+        if (count > 0){
+            return false;
+        }
+
+        order.setId(IdGenerate.nextId());
+        return save(order);
+    }
+
+    @Override
+    public List<EsmInsCompany> getReceivableCompany(InvoicingVo invoicingVo) {
+        return baseMapper.getReceivableCompany(invoicingVo);
+    }
+
+    @Override
+    public List<InsPlyIncome> getReceivableList(ReceivableQueryVo receivableQueryVo) {
+        return baseMapper.getReceivableList(receivableQueryVo);
+    }
+
+    @Override
+    public boolean invoicingCheck(InvoicingVo invoicingVo) {
+        Integer count = baseMapper.invoicingCheck(invoicingVo);
+        RKeys keys = redissonClient.getKeys();
+        Iterable<String> allKeys = null;
+        String redisKey = null;
+        if (invoicingVo.getInvoiceType().equals("1")){
+            redisKey = CAR_INVOICING_COMMISSION_LOCK;
+        }else if (invoicingVo.getInvoiceType().equals("2")){
+            redisKey = CAR_INVOICING_OTHER_LOCK;
+        }else if (invoicingVo.getInvoiceType().equals("3")){
+            redisKey = JY_INVOICING_COMMISSION_LOCK;
+        }else if (invoicingVo.getInvoiceType().equals("4")){
+            redisKey = JY_INVOICING_OTHER_LOCK;
+        }
+        allKeys = keys.getKeysByPattern(redisKey + "*");
+        //提取所有redis的key  然后遍历是否存在重复的id
+        for (String key : allKeys) {
+            // 过滤掉自己的redis key
+            if (!key.equals(key+baseController.getUserName())) {
+                RBucket<Object> bucket = redissonClient.getBucket(key);
+                String incomeIds = bucket.get().toString();
+                incomeIds = incomeIds.substring(1, incomeIds.length() - 1);
+                List<String> incomeIdList = Arrays.stream(incomeIds.split(",")).collect(Collectors.toList());
+                boolean hasDuplicate = invoicingVo.getIncomeIds().stream().anyMatch(incomeIdList::contains);
+                if (hasDuplicate) {
+                    return false;
+                }
+            }
+        }
+
+        if (count == 0){
+            // 设置缓存
+            RBucket<Object> bucket = redissonClient.getBucket(redisKey + baseController.getUserName());
+            bucket.set(invoicingVo.getIncomeIds(), 10, TimeUnit.MINUTES);
+        }
+
+        return count == 0;
+    }
+
+    @Override
+    public BigDecimal getReceivableAmount(InvoicingVo invoicingVo) {
+        String invoiceType = invoicingVo.getInvoiceType();
+        // 私有手续费 应收金额
+        if(invoiceType.equals("1")){
+
+        }else if(invoiceType.equals("2")){
+
+        }else if(invoiceType.equals("3")){
+
+        }else if(invoiceType.equals("4")){
+
+        }
+        return null;
+    }
+
+    /**
+     * 添加发票
+     * @param invoicingVo
+     * @return
+     */
+    @Override
+    @Transactional
+    public boolean addInvoicing(InvoicingVo invoicingVo) {
+        try {
+            InsPlyIncomeInvoice invoice = new InsPlyIncomeInvoice();
+            invoice.setId(IdGenerate.nextId());
+            invoice.setInvoiceType(invoicingVo.getInvoiceType());
+            invoice.setInvoiceParty(invoicingVo.getInvoiceParty());
+            invoice.setOverinflatedAmount(invoicingVo.getOverinflatedAmount());
+            invoice.setReceivableSupervisePremium(invoicingVo.getReceivablePremium());
+            invoice.setTaxPoint(invoicingVo.getTaxPoint());
+            int insert = insPlyIncomeInvoiceMapper.insert(invoice);
+
+            List<InsPlyIncomeInvoiceLink> invoicingLinkList = new ArrayList();
+
+            invoicingVo.getIncomeIds().forEach(incomeId -> {
+                InsPlyIncomeInvoiceLink link = new InsPlyIncomeInvoiceLink();
+                link.setId(IdGenerate.nextId());
+                link.setInvoiceId(invoice.getId());
+                link.setIncomeId(incomeId);
+                invoicingLinkList.add(link);
+            });
+            insPlyIncomeInvoiceLinkMapper.insert(invoicingLinkList);
+            return insert > 0;
+        }catch (Exception e){
+            // 回滚事务
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return false;
+        }
+    }
+
+    @Override
+    public BigDecimal getInvoicingAmount(String invoicingId) {
+        BigDecimal ctualReceivedAmount = new BigDecimal(BigInteger.ZERO);
+
+        // 获取票据的实际收款金额
+        List<InsPlyIncomeInvoiceSettlement> insPlyIncomeInvoiceSettlements = insPlyIncomeInvoiceSettlementMapper.selectList(new LambdaQueryWrapper<InsPlyIncomeInvoiceSettlement>()
+                .eq(InsPlyIncomeInvoiceSettlement::getInvoiceId, invoicingId));
+        for (InsPlyIncomeInvoiceSettlement settlement : insPlyIncomeInvoiceSettlements) {
+            ctualReceivedAmount = ctualReceivedAmount.add(new BigDecimal(settlement.getActualReceivedAmount()));
+        }
+
+        return ctualReceivedAmount;
+    }
+
+    @Override
+    public boolean updateIncomeSettlementStatus(String invoiceType,List<String> invoiceIds) {
+        long result = 0;
+        switch(invoiceType){
+            case "1":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId,invoiceIds)
+                        .set(InsPlyIncome::getSuperviseSettlement,"1"));
+                break;
+            case "2":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId,invoiceIds)
+                        .set(InsPlyIncome::getOtherSettlement,"1"));
+                break;
+            case "3":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId,invoiceIds)
+                        .set(InsPlyIncome::getJySuperviseSettlement,"1"));
+                break;
+            case "4":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId,invoiceIds)
+                        .set(InsPlyIncome::getJyOtherSettlement,"1"));
+                break;
+            default:
+                result = 0;
+        }
+        return result > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean settlement(SettlementVo settlementVo) {
+        try {
+            // 获取应收的金额
+            InsPlyIncomeInvoice insPlyIncomeInvoice = insPlyIncomeInvoiceMapper.selectById(settlementVo.getInvoicingId());
+            AssertionUtils.isFail(Objects.isNull(insPlyIncomeInvoice), "发票数据不存在");
+
+            // 实际已经收的了金额
+            BigDecimal ctualReceivedAmount = getInvoicingAmount(settlementVo.getInvoicingId());
+
+            // 剩余的金额
+            BigDecimal surplusPremium = insPlyIncomeInvoice.getReceivableSupervisePremium().subtract(ctualReceivedAmount);
+
+            // 校验是否超出了剩余的金额
+            AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
+
+            // 处理结算数据
+            // 未完全结算完成
+            InsPlyIncomeInvoiceSettlement settlement = new InsPlyIncomeInvoiceSettlement(settlementVo.getInvoicingId(), settlementVo.getActualReceivedAmount().toString(), DateTime.now());
+            insPlyIncomeInvoiceSettlementMapper.insert(settlement);
+
+            // 添加发票附件
+            List<InsPlyIncomeInvoiceSettlementFile> files = new ArrayList<>();
+            for (String fileId : settlementVo.getAttachmentIds()) {
+                InsPlyIncomeInvoiceSettlementFile file = new InsPlyIncomeInvoiceSettlementFile();
+                file.setId(IdGenerate.nextId());
+                file.setSettlementId(settlement.getId());
+                file.setFileId(fileId);
+                files.add(file);
+            }
+            insPlyIncomeInvoiceSettlementFileMapper.insert(files);
+
+            // 判断是否已经结算完成
+            if (surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) == 0) {
+                // 更新发票状态
+                insPlyIncomeInvoice.setStatus("1");
+                insPlyIncomeInvoiceMapper.updateById(insPlyIncomeInvoice);
+                // 将所有订单进行标记
+                List<String> incomeIds = new ArrayList<>();
+                insPlyIncomeInvoiceLinkMapper.selectList(new LambdaQueryWrapper<InsPlyIncomeInvoiceLink>()
+                                .eq(InsPlyIncomeInvoiceLink::getInvoiceId, settlementVo.getInvoicingId()))
+                        .forEach(item -> {
+                            incomeIds.add(item.getIncomeId());
+                        });
+
+                // 判断是需要更新哪个字段
+                this.updateIncomeSettlementStatus(insPlyIncomeInvoice.getInvoiceType(), incomeIds);
+            }
+
+            return true;
+        }catch(Exception e){
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return false;
+        }
+    }
+
+    @Override
+    public List<InsPlyIncomeInvoiceSettlement> getSettlementList(String invoiceId) {
+        return insPlyIncomeInvoiceSettlementMapper.selectList(new LambdaQueryWrapper<InsPlyIncomeInvoiceSettlement>()
+                .eq(InsPlyIncomeInvoiceSettlement::getInvoiceId, invoiceId));
+    }
+
+    @Override
+    public List<SuperviseExcelVo> importSuperviseExcel(MultipartFile file) {
+        SuperviseExcelListener listener = new SuperviseExcelListener();
+        try (InputStream inputStream = file.getInputStream()) {
+            EasyExcel.read(inputStream, SuperviseExcelVo.class, listener)
+                    .sheet()
+                    .doRead();
+            List<SuperviseExcelVo> dataList = listener.getDataList();
+            return dataList;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public List<OtherExcelVo> importOtherExcel(MultipartFile file) {
+        OtherExcelListener listener = new OtherExcelListener();
+        try (InputStream inputStream = file.getInputStream()) {
+            EasyExcel.read(inputStream, OtherExcelVo.class, listener)
+                    .sheet()
+                    .doRead();
+            List<OtherExcelVo> dataList = listener.getDataList();
+            return dataList;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public List<JyExcelVo> importJyExcel(MultipartFile file) {
+        JyExcelListener listener = new JyExcelListener();
+        try (InputStream inputStream = file.getInputStream()) {
+            EasyExcel.read(inputStream, OtherExcelVo.class, listener)
+                    .sheet()
+                    .doRead();
+            List<JyExcelVo> dataList = listener.getDataList();
+            return dataList;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    @Transactional
+    public ImportExcelResultVo importSuperviseData(MultipartFile file) {
+        ImportExcelResultVo importExcelResultVo = new ImportExcelResultVo();
+
+        List<SuperviseExcelVo> superviseExcelVos = importSuperviseExcel(file);
+        AssertionUtils.isEmpty(superviseExcelVos,"数据处理失败,导入失败");
+
+        // 获取保司名称
+        HttpResult<List<EsmInsCompany>> listHttpResult = esmInsCompanyClient.liveCompanyList();
+        AssertionUtils.isFail(listHttpResult.getCode() != 200,listHttpResult.getMsg());
+        List<EsmInsCompany> esmInsCompanies = listHttpResult.getData();
+
+        int failedNumber = 0;
+        List<Object> failedExcel = new ArrayList<>();
+        List<InsPlyIncome> successExcel = new ArrayList<>();
+        // 处理数据
+        for(SuperviseExcelVo vo : superviseExcelVos){
+            // 出现空数据则失败
+            ImportResultVo resultVo = vo.checkEmpty();
+            if(!resultVo.isSuccess()) {
+                failedNumber++;
+                vo.setErrorMessage(resultVo.getMessage());
+                failedExcel.add(vo);
+                continue;
+            }
+
+            //匹配协议号
+            PtlAgreement ptlAgreement = ptlAgreementMapper.selectOne(new LambdaQueryWrapper<PtlAgreement>()
+                    .eq(PtlAgreement::getAgreementCode, vo.getAgreementCode()));
+            if (Objects.isNull(ptlAgreement)){
+                failedNumber++;
+                vo.setErrorMessage("匹配协议编号失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            LocalDateTime signDate = null;
+            try {
+                // 解析签单时间
+                signDate = LocalDateTime.parse(vo.getSignDate(), DateTimeFormatter.ofPattern("yyyy-M-d H:m:s"));
+            }catch (DateTimeParseException e){
+                failedNumber++;
+                vo.setErrorMessage("解析签单时间失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+
+            //匹配保司名称
+            EsmInsCompany matchCompany = esmInsCompanies.stream()
+                                    .filter(x -> Objects.equals(x.getName(), vo.getInsuranceCompany()))
+                                    .findFirst().orElse(null);
+            // 保司匹配失败
+            if (Objects.isNull(matchCompany)){
+                failedNumber++;
+                vo.setErrorMessage("匹配保司名称失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 检测是否有重复的保单号
+            InsPlyIncome checkInsPlyIncome = baseMapper.selectOne(new LambdaQueryWrapper<InsPlyIncome>()
+                    .eq(InsPlyIncome::getJqPolicyNo, vo.getJqPolicyNo()));
+            if(!Objects.isNull(checkInsPlyIncome)){
+                failedNumber++;
+                vo.setErrorMessage("交强保单号重复");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 处理数据
+            InsPlyIncome insPlyIncome = new InsPlyIncome();
+            insPlyIncome.setId(IdGenerate.nextId());
+            insPlyIncome.setCompanyId(matchCompany.getId());
+            insPlyIncome.setSigningTime(signDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            insPlyIncome.setAgreementId(ptlAgreement.getId());
+            insPlyIncome.setLicenseNo(vo.getLicenseNo());
+            insPlyIncome.setJqPolicyNo(vo.getJqPolicyNo());
+            insPlyIncome.setJqPremium(vo.getJqPremium().toString());
+            insPlyIncome.setJqSuperviseCostsProportion(vo.getJqSuperviseRatio().toString());
+            successExcel.add(insPlyIncome);
+        }
+
+        importExcelResultVo.setFailedData(failedExcel);
+        importExcelResultVo.setSuccessNumber(successExcel.size());
+        importExcelResultVo.setFailedNumber(failedNumber);
+
+        // 批量插入数据
+        baseMapper.insert(successExcel);
+
+        return importExcelResultVo;
+    }
+
+    @Override
+    public ImportExcelResultVo importOtherData(MultipartFile file) {
+        ImportExcelResultVo importExcelResultVo = new ImportExcelResultVo();
+
+        List<OtherExcelVo> otherExcelVos = importOtherExcel(file);
+        AssertionUtils.isEmpty(otherExcelVos,"数据处理失败,导入失败");
+
+        // 获取保司名称
+        HttpResult<List<EsmInsCompany>> listHttpResult = esmInsCompanyClient.liveCompanyList();
+        AssertionUtils.isFail(listHttpResult.getCode() != 200,listHttpResult.getMsg());
+        List<EsmInsCompany> esmInsCompanies = listHttpResult.getData();
+
+        int failedNumber = 0;
+        List<Object> failedExcel = new ArrayList<>();
+        List<InsPlyIncome> successExcel = new ArrayList<>();
+        // 处理数据
+        for(OtherExcelVo vo : otherExcelVos){
+            // 出现空数据则失败
+            ImportResultVo resultVo = vo.checkEmpty();
+            if(!resultVo.isSuccess()) {
+                failedNumber++;
+                vo.setErrorMessage(resultVo.getMessage());
+                failedExcel.add(vo);
+                continue;
+            }
+
+            //匹配协议号
+            PtlAgreement ptlAgreement = ptlAgreementMapper.selectOne(new LambdaQueryWrapper<PtlAgreement>()
+                    .eq(PtlAgreement::getAgreementCode, vo.getAgreementCode()));
+            if (Objects.isNull(ptlAgreement)){
+                failedNumber++;
+                vo.setErrorMessage("匹配协议编号失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            LocalDateTime signDate = null;
+            try {
+                // 解析签单时间
+                signDate = LocalDateTime.parse(vo.getSignDate(), DateTimeFormatter.ofPattern("yyyy-M-d H:m:s"));
+            }catch (DateTimeParseException e){
+                failedNumber++;
+                vo.setErrorMessage("解析签单时间失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+
+            //匹配保司名称
+            EsmInsCompany matchCompany = esmInsCompanies.stream()
+                    .filter(x -> Objects.equals(x.getName(), vo.getInsuranceCompany()))
+                    .findFirst().orElse(null);
+            // 保司匹配失败
+            if (Objects.isNull(matchCompany)){
+                failedNumber++;
+                vo.setErrorMessage("匹配保司名称失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 检测是否有重复的保单号
+            InsPlyIncome checkInsPlyIncome = baseMapper.selectOne(new LambdaQueryWrapper<InsPlyIncome>()
+                    .eq(InsPlyIncome::getJqPolicyNo, vo.getJqPolicyNo()));
+            if(!Objects.isNull(checkInsPlyIncome)){
+                failedNumber++;
+                vo.setErrorMessage("车险保单号重复");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 处理数据
+            InsPlyIncome insPlyIncome = new InsPlyIncome();
+            insPlyIncome.setId(IdGenerate.nextId());
+            insPlyIncome.setCompanyId(matchCompany.getId());
+            insPlyIncome.setSigningTime(signDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            insPlyIncome.setAgreementId(ptlAgreement.getId());
+            insPlyIncome.setLicenseNo(vo.getLicenseNo());
+            insPlyIncome.setJqPolicyNo(vo.getJqPolicyNo());
+            insPlyIncome.setJqPremium(vo.getJqPremium().toString());
+            insPlyIncome.setJqOtherCostsProportion(vo.getJqOtherRatio().toString());
+            successExcel.add(insPlyIncome);
+        }
+
+        importExcelResultVo.setFailedData(failedExcel);
+        importExcelResultVo.setSuccessNumber(successExcel.size());
+        importExcelResultVo.setFailedNumber(failedNumber);
+
+        // 批量插入数据
+        baseMapper.insert(successExcel);
+
+        return importExcelResultVo;
+    }
+
+    @Override
+    public ImportExcelResultVo importJyData(MultipartFile file) {
+        ImportExcelResultVo importExcelResultVo = new ImportExcelResultVo();
+
+        List<JyExcelVo> jyExcelVos = importJyExcel(file);
+        AssertionUtils.isEmpty(jyExcelVos,"数据处理失败,导入失败");
+
+        // 获取保司名称
+        HttpResult<List<EsmInsCompany>> listHttpResult = esmInsCompanyClient.liveCompanyList();
+        AssertionUtils.isFail(listHttpResult.getCode() != 200,listHttpResult.getMsg());
+        List<EsmInsCompany> esmInsCompanies = listHttpResult.getData();
+
+        int failedNumber = 0;
+        List<Object> failedExcel = new ArrayList<>();
+        List<InsPlyIncome> successExcel = new ArrayList<>();
+        // 处理数据
+        for(JyExcelVo vo : jyExcelVos){
+            // 出现空数据则失败
+            ImportResultVo resultVo = vo.checkEmpty();
+            if(!resultVo.isSuccess()) {
+                failedNumber++;
+                vo.setErrorMessage(resultVo.getMessage());
+                failedExcel.add(vo);
+                continue;
+            }
+
+            //匹配协议号
+            PtlAgreement ptlAgreement = ptlAgreementMapper.selectOne(new LambdaQueryWrapper<PtlAgreement>()
+                    .eq(PtlAgreement::getAgreementCode, vo.getAgreementCode()));
+            if (Objects.isNull(ptlAgreement)){
+                failedNumber++;
+                vo.setErrorMessage("匹配协议编号失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            LocalDateTime signDate = null;
+            try {
+                // 解析签单时间
+                signDate = LocalDateTime.parse(vo.getSignDate(), DateTimeFormatter.ofPattern("yyyy-M-d H:m:s"));
+            }catch (DateTimeParseException e){
+                failedNumber++;
+                vo.setErrorMessage("解析签单时间失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+
+            //匹配保司名称
+            EsmInsCompany matchCompany = esmInsCompanies.stream()
+                    .filter(x -> Objects.equals(x.getName(), vo.getInsuranceCompany()))
+                    .findFirst().orElse(null);
+            // 保司匹配失败
+            if (Objects.isNull(matchCompany)){
+                failedNumber++;
+                vo.setErrorMessage("匹配保司名称失败");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 检测是否有重复的保单号
+            InsPlyIncome checkInsPlyIncome = baseMapper.selectOne(new LambdaQueryWrapper<InsPlyIncome>()
+                    .eq(InsPlyIncome::getJyPolicyNo, vo.getJyPolicyNo()));
+            if(!Objects.isNull(checkInsPlyIncome)){
+                failedNumber++;
+                vo.setErrorMessage("驾意保单号重复");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 处理数据
+            InsPlyIncome insPlyIncome = new InsPlyIncome();
+            insPlyIncome.setId(IdGenerate.nextId());
+            insPlyIncome.setCompanyId(matchCompany.getId());
+            insPlyIncome.setSigningTime(signDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            insPlyIncome.setAgreementId(ptlAgreement.getId());
+            insPlyIncome.setLicenseNo(vo.getLicenseNo());
+            insPlyIncome.setJyPolicyNo(vo.getJyPolicyNo());
+            insPlyIncome.setJyPremium(vo.getJyPremium().toString());
+            insPlyIncome.setJySuperviseCostsProportion(vo.getJySuperviseRatio().toString());
+            insPlyIncome.setJyOtherCostsProportion(vo.getJyOtherRatio().toString());
+            successExcel.add(insPlyIncome);
+        }
+
+        importExcelResultVo.setFailedData(failedExcel);
+        importExcelResultVo.setSuccessNumber(successExcel.size());
+        importExcelResultVo.setFailedNumber(failedNumber);
+
+        // 批量插入数据
+        baseMapper.insert(successExcel);
+
+        return importExcelResultVo;
+    }
+
+    @Override
+    @Transactional
+    public boolean batchModify(BatchModifyVo batchModifyVo) {
+        List<InsPlyIncome> updateInsPlyIncome = new ArrayList<>();
+
+        for (String incomeId : batchModifyVo.getIncomeIds()){
+            InsPlyIncome insPlyIncome = baseMapper.selectById(incomeId);
+            if (Objects.nonNull(insPlyIncome)){
+                if (Objects.nonNull(batchModifyVo.getJqSuperviseCostsProportion()) && batchModifyVo.getJqSuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+                    BigDecimal superviseReceivablePremium = calcReceivableAmount(new BigDecimal(insPlyIncome.getJqPremium()),batchModifyVo.getJqSuperviseCostsProportion());
+                    insPlyIncome.setJqSuperviseCostsPremiums(superviseReceivablePremium.toString());
+                }
+                if (Objects.nonNull(batchModifyVo.getSySuperviseCostsProportion()) && batchModifyVo.getSySuperviseCostsProportion().compareTo(BigDecimal.ZERO) < 0) {
+                    BigDecimal otherReceivablePremium = calcReceivableAmount(new BigDecimal(insPlyIncome.getSyPremium()), batchModifyVo.getSySuperviseCostsProportion());
+                    insPlyIncome.setSySuperviseCostsPremiums(otherReceivablePremium.toString());
+                }
+
+                if (Objects.nonNull(batchModifyVo.getJqOtherCostsProportion()) && batchModifyVo.getJqOtherCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+                    BigDecimal otherReceivablePremium = calcReceivableAmount(new BigDecimal(insPlyIncome.getJqPremium()),batchModifyVo.getJqOtherCostsProportion());
+                    insPlyIncome.setJqOtherCostsPremiums(otherReceivablePremium.toString());
+                }
+                if (Objects.nonNull(batchModifyVo.getSyOtherCostsProportion()) && batchModifyVo.getSyOtherCostsProportion().compareTo(BigDecimal.ZERO) < 0) {
+                    BigDecimal otherReceivablePremium = calcReceivableAmount(new BigDecimal(insPlyIncome.getSyPremium()), batchModifyVo.getSyOtherCostsProportion());
+                    insPlyIncome.setSySuperviseCostsPremiums(otherReceivablePremium.toString());
+                }
+
+                if (Objects.nonNull(batchModifyVo.getJySuperviseCostsProportion()) && batchModifyVo.getJySuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+                    BigDecimal jySuperviseReceivablePremium = calcReceivableAmount(new BigDecimal(insPlyIncome.getJyPremium()),batchModifyVo.getJySuperviseCostsProportion());
+                    insPlyIncome.setJySuperviseCostsPremiums(jySuperviseReceivablePremium.toString());
+                }
+                if (Objects.nonNull(batchModifyVo.getJySuperviseCostsProportion()) && batchModifyVo.getJySuperviseCostsProportion().compareTo(BigDecimal.ZERO) < 0) {
+                    BigDecimal jyOtherReceivablePremium = calcReceivableAmount(new BigDecimal(insPlyIncome.getJyPremium()), batchModifyVo.getJySuperviseCostsProportion());
+                    insPlyIncome.setJyOtherCostsPremiums(jyOtherReceivablePremium.toString());
+                }
+
+                if (batchModifyVo.getSigningTime() != null){
+                    insPlyIncome.setSigningTime(batchModifyVo.getSigningTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                }
+
+
+                updateInsPlyIncome.add(insPlyIncome);
+            }
+            baseMapper.updateById(updateInsPlyIncome);
+            return true;
+        }
+
+        // 批量修改
+        baseMapper.update(new InsPlyIncome(), new LambdaUpdateWrapper<InsPlyIncome>()
+                .set(InsPlyIncome::getJqSuperviseCostsProportion, batchModifyVo.getJqSuperviseCostsProportion())
+                .set(InsPlyIncome::getSySuperviseCostsProportion, batchModifyVo.getSySuperviseCostsProportion())
+                .set(InsPlyIncome::getJySuperviseCostsProportion, batchModifyVo.getJySuperviseCostsProportion())
+                .set(InsPlyIncome::getJqOtherCostsProportion, batchModifyVo.getJqOtherCostsProportion())
+                .set(InsPlyIncome::getSyOtherCostsProportion, batchModifyVo.getSyOtherCostsProportion())
+                .set(InsPlyIncome::getJyOtherCostsProportion, batchModifyVo.getJyOtherCostsProportion())
+                .set(InsPlyIncome::getSigningTime, batchModifyVo.getSigningTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
+                .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
+
+        return false;
+    }
+
+    @Override
+    public BigDecimal calcReceivableAmount(BigDecimal premium,BigDecimal ratio) {
+        return premium.multiply(ratio);
+    }
+}
+

+ 9 - 1
tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml

@@ -280,9 +280,17 @@
             tt.cost_type,
             tt.inlet,
             tt.export,
-            tt.add_throw
+            tt.add_throw,
+            CASE
+                WHEN tt.cost_type = '交强险' THEN pa.jq_entrance_fee_ratio
+                WHEN tt.cost_type = '商业险' THEN pa.sy_entrance_fee_ratio
+                WHEN tt.cost_type = '驾意险' THEN pa.jy_entrance_fee_ratio
+                ELSE NULL
+                END AS commission
         FROM
             ptl_agreement_cost_type tt
+                left join ptl_agreement_cost pac on pac.id = tt.ptl_agreement_cost_id
+                left join ptl_agreement pa on pa.id = pac.ptl_agreement_id
         WHERE
             tt.ptl_agreement_cost_id = #{costId}
     </select>

+ 143 - 0
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.organization.mapper.ReceivableMapper">
+
+    <resultMap id="InsPlyIncomeResultMap" type="com.jzg.commons.entity.finance.po.InsPlyIncome">
+        <result column="order_no" property="orderNo"/>
+        <result column="dept_id" property="deptId"/>
+        <result column="dept_name" property="deptName"/>
+        <!-- 其他字段可不写,会自动映射 -->
+    </resultMap>
+
+    <select id="getAuditedOrder" resultMap="InsPlyIncomeResultMap">
+        SELECT
+            iop.order_no,
+            ioci.license_no,
+            io.company_id,
+            iop.jq_policy_no,
+            iop.sy_policy_no,
+            iop.jy_policy_no,
+            ioc.jq_premium,
+            ioc.sy_premium,
+            ioc.jy_premium,
+            ioc.tax_premium,
+            sd.id AS dept_id,
+            sd.NAME AS dept_name,
+            ifo.jq_commission_ratio as jq_supervise_costs_proportion,
+            ifo.sy_commission_ratio as sy_supervise_costs_proportion,
+            ifo.jy_commission_ratio as jy_supervise_costs_proportion,
+            ifo.jq_commission_premium as jq_supervise_costs_premiums,
+            ifo.sy_commission_premium as sy_supervise_costs_premiums,
+            ifo.jy_commission_premium as jy_supervise_costs_premiums,
+            ifo.jq_follow_ratio as jq_other_costs_proportion,
+            ifo.sy_follow_ratio as sy_other_costs_proportion,
+            ifo.jy_follow_ratio as jy_other_costs_proportion,
+            ifo.jq_follow_premium as jq_other_costs_premiums,
+            ifo.sy_follow_premium as sy_other_costs_premiums,
+            ifo.jy_follow_premium as jy_other_costs_premiums,
+            ifo.jq_receivable_premium,
+            ifo.sy_receivable_premium,
+            ifo.jy_receivable_premium,
+            eic.name_simple,
+            pa.id AS agreement_id,
+            pa.agreement_name,
+            pa.agreement_type,
+            io.product_id,
+            io.product_name,
+            io.pay_time,
+            io.signing_time,
+            ifa.audit_status
+        FROM
+            ins_orders io
+                LEFT JOIN ins_orders_policy iop ON io.id = iop.order_no
+                LEFT JOIN ins_orders_car_info ioci ON io.id = ioci.order_no
+                LEFT JOIN ins_orders_costs ioc ON io.id = ioc.order_no
+                LEFT JOIN ins_fee_orders ifo ON io.id = ifo.order_no
+                LEFT JOIN esm_ins_company eic ON io.company_id = eic.id
+                LEFT JOIN sys_user su ON su.mobile = io.real_quote_user_id
+                LEFT JOIN sys_user_jzg_info suji ON suji.user_id = su.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 ins_fee_audit ifa on ifa.order_no = io.id
+        WHERE
+            io.id = #{orderNo}
+        AND
+            io.order_status = #{orderStatus}
+        AND
+            ifa.audit_status = #{auditStatus}
+    </select>
+
+    <select id="getReceivableList" resultType="com.jzg.commons.entity.finance.po.InsPlyIncome">
+        SELECT
+            *
+        FROM
+            ins_ply_income ipi
+        WHERE
+            1=1
+          AND NOT EXISTS ( SELECT 1 FROM ins_ply_income_invoice_link ipil WHERE ipil.income_id = ipi.id )
+        <if test="receivableQueryVo.queryType != null and receivableQueryVo.queryType == 1">
+            AND ipi.supervise_settlement = 0
+        </if>
+        <if test="receivableQueryVo.queryType!= null and receivableQueryVo.queryType == 2">
+            AND ipi.other_settlement = 1
+        </if>
+        <if test="receivableQueryVo.queryType!= null and (receivableQueryVo.queryType == 3 or receivableQueryVo.queryType == 4)">
+            AND ipi.jy_premium != 0
+        </if>
+        <if test="receivableQueryVo.licenseNo != null and receivableQueryVo.licenseNo != ''">
+            AND ipi.license_no LIKE CONCAT('%', #{receivableQueryVo.licenseNo}, '%')
+        </if>
+        <if test="receivableQueryVo.companyId != null and receivableQueryVo.companyId != ''">
+            AND ipi.company_id = #{receivableQueryVo.companyId}
+        </if>
+        <if test="receivableQueryVo.orderNo != null and receivableQueryVo.orderNo != ''">
+            AND ipi.order_no = #{receivableQueryVo.orderNo}
+        </if>
+        <if test="receivableQueryVo.agreementId != null and receivableQueryVo.agreementId != ''">
+            AND ipi.agreement_id = #{receivableQueryVo.agreementId}
+        </if>
+        <if test="receivableQueryVo.deptId != null and receivableQueryVo.deptId != ''">
+            AND ipi.dept_id = #{receivableQueryVo.deptId}
+        </if>
+        <if test="receivableQueryVo.productId!= null and receivableQueryVo.productId!= ''">
+            AND ipi.product_id = #{receivableQueryVo.productId}
+        </if>
+        <if test="receivableQueryVo.signingTimeStart != null and receivableQueryVo.signingTimeStart != ''">
+            AND ipi.signing_time between #{receivableQueryVo.signingTimeStart} and  #{receivableQueryVo.signingTimeEnd}
+        </if>
+
+
+    </select>
+
+    <select id="getReceivableCompany" resultType="com.jzg.commons.entity.po.EsmInsCompany">
+        SELECT
+            eic.id,
+            eic.company_code,
+            eic.`name`
+        FROM
+            ins_ply_income ipi
+                LEFT JOIN esm_ins_company eic ON ipi.company_id = eic.id
+        WHERE
+            ipi.id IN
+            <foreach collection="invoicingVo.incomeIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        GROUP BY
+            eic.company_code,
+            eic.`name`,
+            eic.id
+    </select>
+
+    <select id="invoicingCheck" resultType="Integer">
+        SELECT
+            count(id) as count
+        FROM
+            ins_ply_income_invoice_link
+        where
+            income_id IN
+            <foreach collection="invoicingVo.incomeIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+    </select>
+
+</mapper>