Forráskód Böngészése

财务应收功能

785834757 1 éve
szülő
commit
ccff7ae5e7
36 módosított fájl, 2155 hozzáadás és 7 törlés
  1. 6 0
      commons/pom.xml
  2. 31 0
      commons/src/main/java/com/jzg/commons/constants/dict/TaxpayerIdentifier.java
  3. 135 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  4. 32 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java
  5. 20 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceLink.java
  6. 36 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java
  7. 19 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlementFile.java
  8. 65 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/AuditedOrder.java
  9. 40 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java
  10. 29 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ImportExcelResultVo.java
  11. 15 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ImportResultVo.java
  12. 39 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoicingVo.java
  13. 69 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/JyExcelVo.java
  14. 81 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/OtherExcelVo.java
  15. 74 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java
  16. 27 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementVo.java
  17. 88 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SuperviseExcelVo.java
  18. 2 0
      commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostRuleVo.java
  19. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostTypeVo.java
  20. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  21. 8 1
      tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java
  22. 2 1
      tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java
  23. 172 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  24. 27 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/JyExcelListener.java
  25. 27 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/OtherExcelListener.java
  26. 26 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/SuperviseExcelListener.java
  27. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceLinkMapper.java
  28. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceMapper.java
  29. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementFileMapper.java
  30. 11 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/InsPlyIncomeInvoiceSettlementMapper.java
  31. 36 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  32. 140 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  33. 8 3
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java
  34. 701 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  35. 9 1
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  36. 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>

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

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

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