Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

wks 1 gadu atpakaļ
vecāks
revīzija
93f4901321
60 mainītis faili ar 2460 papildinājumiem un 106 dzēšanām
  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. 6 6
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java
  28. 6 6
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  29. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  30. 8 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java
  31. 6 6
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiRequestImpl.java
  32. 6 4
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/vo/GuoRenSpecialAgreementVo.java
  33. 41 34
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java
  34. 6 6
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java
  35. 1 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  36. 24 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  37. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersClauseMapper.java
  38. 13 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersClauseService.java
  39. 35 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersClauseServiceImpl.java
  40. 19 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  41. 46 14
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  42. 5 4
      tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/service/impl/YangGuangApiRequestImpl.java
  43. 6 6
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java
  44. 6 6
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/api/service/impl/ZhongMeiApiRequestImpl.java
  45. 8 1
      tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java
  46. 2 1
      tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java
  47. 172 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  48. 27 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/JyExcelListener.java
  49. 27 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/OtherExcelListener.java
  50. 26 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/SuperviseExcelListener.java
  51. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceLinkMapper.java
  52. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceMapper.java
  53. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementFileMapper.java
  54. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementMapper.java
  55. 36 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  56. 140 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  57. 8 3
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java
  58. 701 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  59. 9 1
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  60. 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

+ 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 =

+ 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>