Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

Qchen 3 месяцев назад
Родитель
Сommit
6b63293dc8
24 измененных файлов с 892 добавлено и 155 удалено
  1. 35 0
      commons/src/main/java/com/jzg/commons/config/LocalDateTimeDefiner.java
  2. 10 25
      commons/src/main/java/com/jzg/commons/core/page/HttpResult.java
  3. 11 2
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  4. 6 1
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java
  5. 25 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/AddReceivableVo.java
  6. 26 10
      commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java
  7. 304 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeExportVo.java
  8. 7 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java
  9. 4 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsFeeAudit.java
  10. 2 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrders.java
  11. 3 0
      commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java
  12. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRulesAttr.java
  13. 10 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/JiaYiXianProduct.java
  14. 3 3
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerQuotedPriceRequestRequest.java
  15. 6 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java
  16. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java
  17. 6 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  18. 75 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  19. 1 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml
  20. 11 2
      tenant/organization/src/main/java/com/jzg/organization/client/InsFeeOrdersClient.java
  21. 70 20
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  22. 17 3
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  23. 229 70
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  24. 19 18
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

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

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

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

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

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

@@ -10,6 +10,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+import java.time.LocalDateTime;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
@@ -50,9 +51,9 @@ public class InsPlyIncome extends BaseModel {
     private String riskCode;
 
     @Schema(description = "签单时间")
-    @TableField(exist = false)
+    //@TableField(exist = false)
     @ExcelProperty("签单时间")
-    private String signingTime;
+    private LocalDateTime signingTime;
 
     @Schema(description = "签单年份")
     @TableField(exist = false)
@@ -226,6 +227,9 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("对接人")
     private String contactPerson;
 
+    @Schema(description = "对接人手机号")
+    private String contactPersonPhone;
+
     @Schema(description = "系统code")
     @ExcelProperty("系统code")
     private String systemCode;
@@ -239,6 +243,7 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("结算状态(编码)")
     private String settlementStatus="0";
 
+    @TableField(exist = false)
     @Schema(description = "结算状态(转义后)")
     @ExcelProperty("结算状态(转义后)")
     private String settlementStatusName;
@@ -294,4 +299,8 @@ public class InsPlyIncome extends BaseModel {
     @Schema(description = "订单关联的发票信息")
     private String invoiceId;
 
+    @TableField(exist = false)
+    @Schema(description = "地区归属")
+    private String companyNameSimple;
+
 }

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

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

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

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

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

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

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

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

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

@@ -2,9 +2,11 @@ package com.jzg.commons.entity.finance.vo;
 
 import com.jzg.commons.core.base.PageRequest;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class InvoiceRecordResult extends PageRequest {
 
@@ -43,6 +45,11 @@ public class InvoiceRecordResult extends PageRequest {
      */
     private BigDecimal overinflatedAmount;
 
+    /**
+     * 差额原因
+     */
+    private String paymentReason;
+
     /**
      * 应收项(转义)
      * 保留这个是为了兼容之前的功能

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

@@ -47,6 +47,10 @@ public class InsFeeAudit extends BaseModel {
     @Schema(description = "设为疑问单的原因")
     private String problemReason;
 
+    @Schema(description = "设为疑问单的时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime problemTime;
+
     @Schema(description = "驳回原因")
     private String refuse;
 

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

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

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

@@ -142,4 +142,7 @@ public class FeeAuditVo extends BaseModel {
 
     @Schema(description = "设置为疑问单的原因")
     private String problemReason;
+
+    @Schema(description = "设为疑问单的时间")
+    private String problemTime;
 }

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

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

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

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

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

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

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

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

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java

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

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

@@ -698,6 +698,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }
         audit.setProblemReason(Objects.toString(problemReason,""));
         audit.setIsProblem(Integer.parseInt(status));
+        // 设置疑问订单的时间
+        if ("1".equals(status)){
+            audit.setProblemTime(LocalDateTime.now());
+        }else{
+            audit.setProblemTime(null);
+        }
         this.updateById(audit);
     }
 

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

@@ -24,6 +24,7 @@ import com.jzg.commons.entity.dto.InsOrdersParam;
 import com.jzg.commons.entity.dto.InsOrdersParamVO;
 import com.jzg.commons.entity.dto.InsTaskImagesAdd;
 import com.jzg.commons.entity.enums.MessageCodeEnum;
+import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteQueryVo;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteResultVo;
@@ -1654,4 +1655,78 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     public SysUserActivityCompleteInRule selectByRuleAndUserPhone(String activityId, String userPhone, String qutNum, Integer activityType) {
         return insOrdersMapper.selectByRuleAndUserPhone(activityId, userPhone, qutNum, activityType);
     }
+
+
+    public BigDecimal multiply(BigDecimal premium, BigDecimal ratio) {
+        if(premium==null||ratio==null) {
+            return BigDecimal.ZERO;
+        }
+        return premium.multiply(ratio);
+    }
+    /**
+     * 车险报价批量修改联系人等信息
+     *
+     * @param batchModifyVo 需要批量修改的内容
+     * @author lipf
+     * @date 2026/5/28 10:45
+     */
+    @Override
+    public HttpResult<String> updateOrdersBatch(BatchModifyVo batchModifyVo) {
+        log.info("批量修改车险订单的费用比例,联系人等信息. batchModifyVo=[{}]", JSONUtil.toJsonStr(batchModifyVo));
+
+        List<String> orderNos = batchModifyVo.getOrderNos();
+        if(CollUtil.isEmpty(orderNos)){
+            return HttpResult.error("批量修改时,请指定订单编号");
+        }
+        int count = 0;
+        for (String orderNo : orderNos) {
+            InsOrders oldInsOrders = baseMapper.selectById(orderNo);
+            InsFeeOrders insFeeOrders = insFeeOrdersMapper.selectById(orderNo);
+            if(oldInsOrders == null || insFeeOrders == null){
+                log.info("根据订单号[{}]没有找到车险订单信息和订单的费用信息",orderNo);
+                continue;
+            }
+            log.info("车险订单[{}]对应的订单明细是[{}]", orderNo, JSONUtil.toJsonStr(oldInsOrders));
+
+//            if (Objects.nonNull(batchModifyVo.getJqSuperviseCostsProportion()) && batchModifyVo.getJqSuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+//                BigDecimal superviseReceivablePremium = multiply(new BigDecimal(Objects.toString(insFeeOrders.getJqPremium(),"0") ), batchModifyVo.getJqSuperviseCostsProportion());
+//                insFeeOrdersMapper.update(null, new LambdaUpdateWrapper<InsFeeOrders>()
+//                        .set(InsFeeOrders::getJqSuperviseCostsProportion, batchModifyVo.getJqSuperviseCostsProportion())
+//                        .set(InsFeeOrders::getJqSuperviseCostsPremiums, superviseReceivablePremium)
+//                        .eq(InsFeeOrders::getOrderNo,orderNo));
+//            }
+
+//            if (Objects.nonNull(batchModifyVo.getSySuperviseCostsProportion()) && batchModifyVo.getSySuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+//                BigDecimal otherReceivablePremium = multiply(new BigDecimal(Objects.toString(insFeeOrders.getSyPremium(),"0")), batchModifyVo.getSySuperviseCostsProportion());
+//                baseMapper.update(null, new LambdaUpdateWrapper<InsFeeOrders>()
+//                        .set(InsFeeOrders::getSySuperviseCostsProportion, batchModifyVo.getSySuperviseCostsProportion())
+//                        .set(InsFeeOrders::getSySuperviseCostsPremiums, otherReceivablePremium)
+//                        .eq(InsFeeOrders::getOrderNo,orderNo));
+//            }
+
+
+            if(batchModifyVo.getSigningTime() != null){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsOrders>()
+                        .set(InsOrders::getSigningTime, batchModifyVo.getSigningTime())
+                        .eq(InsOrders::getId,orderNo));
+                insFeeOrdersMapper.update(null, new LambdaUpdateWrapper<InsFeeOrders>()
+                        .set(InsFeeOrders::getSigningTime,batchModifyVo.getSigningTime())
+                        .eq(InsFeeOrders::getOrderNo,orderNo));
+            }
+            if(StrUtil.isNotEmpty(batchModifyVo.getContractUserName())){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsOrders>()
+                        .set(InsOrders::getDockingPerson, batchModifyVo.getContractUserName())
+                        .eq(InsOrders::getId,orderNo));
+            }
+            if(StrUtil.isNotEmpty(batchModifyVo.getContractPhone())){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsOrders>()
+                        .set(InsOrders::getDockingPersonPhone, batchModifyVo.getContractPhone())
+                        .eq(InsOrders::getId,orderNo));
+            }
+            count++;
+        }
+        String msg = String.format("成功修改%d条车险订单",count);
+        log.info(msg);
+        return HttpResult.ok(msg);
+    }
 }

+ 1 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml

@@ -61,6 +61,7 @@
                ifa.audit_user as auditUser, ifa.refuse,
                ifa.is_problem, ifa.problem_reason,
                ifa.audit_user as auditUser, ifa.refuse,
+                ifa.problem_time,
                 CASE ifa.is_problem
                 WHEN 0 THEN '否'
                 WHEN 1 THEN '是'

+ 11 - 2
tenant/organization/src/main/java/com/jzg/organization/client/InsFeeOrdersClient.java

@@ -1,8 +1,12 @@
 package com.jzg.organization.client;
 
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.po.InsFeeOrders;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -15,10 +19,15 @@ public interface InsFeeOrdersClient {
 
     /**
      * 订单费用列表通过订单号查询
-     * @param orderNo
-     * @return
+     * @param orderNo 订单号
+     * @return List<InsFeeOrders>
      */
     @PostMapping("/insFeeOrder/getInsFeeOrderByOrderNo")
     List<InsFeeOrders> getInsFeeOrderByOrderNo(@RequestParam String orderNo);
 
+
+    @PostMapping("/supplementOrder/updateOrdersBatch")
+    @Operation(summary = "车险报价批量修改联系人等信息")
+    HttpResult<String> updateOrdersBatch(@RequestBody BatchModifyVo batchModifyVo);
+
 }

+ 70 - 20
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -59,7 +59,7 @@ public class ReceivableController {
     @PostMapping("getUnauditedOrder")
     @Operation(summary = "获取未审核的订单")
     public HttpResult getUnauditedOrder(@RequestBody ReceivableQueryVo receivableQueryVo){
-        if (Objects.isNull(receivableQueryVo.getAgreementType()) || receivableQueryVo.getAgreementType().isEmpty()) {
+        if (Objects.isNull(receivableQueryVo.getAgreementType()) || StrUtil.isBlank(receivableQueryVo.getAgreementType())) {
             receivableQueryVo.setAgreementType("1");
         }
         InsPlyIncome auditedOrder  = receivableService.getUnauditedOrder(receivableQueryVo);
@@ -72,8 +72,8 @@ public class ReceivableController {
 
     @PostMapping("addReceivable")
     @Operation(summary = "添加应收记录")
-    public HttpResult addReceivable(@RequestSingleParam("orderNos") List<String> orderNos){
-        boolean result = receivableService.saveAuditedOrder(orderNos);
+    public HttpResult addReceivable(@RequestBody AddReceivableVo addReceivableVo){
+        boolean result = receivableService.saveAuditedOrder(addReceivableVo);
         return result ? HttpResult.ok("添加成功") : HttpResult.error("添加失败");
     }
 
@@ -93,6 +93,20 @@ public class ReceivableController {
         return HttpResult.ok(new InsPlyIncomeVO(data, receivablePageIds));
     }
 
+    @PostMapping("/exportTemplateReceivableList")
+    @Operation(summary = "导出模板私有协议手续费")
+    public HttpResult<String> exportTemplateReceivableList(){
+        String receivablePageIds = receivableService.exportTemplateReceivableList();
+        return HttpResult.ok(receivablePageIds);
+    }
+
+    @PostMapping("/importReceivableListUpdate")
+    @Operation(summary = "导入私有协议手续费修改")
+    public HttpResult<ImportUpdateExcelResultVo> importReceivableListUpdate(@RequestParam("file") MultipartFile file){
+        ImportUpdateExcelResultVo importExcelResultVo = receivableService.importReceivableListUpdate(file);
+        return HttpResult.ok(importExcelResultVo);
+    }
+
     /**
      *
      * @author lipf
@@ -139,18 +153,12 @@ public class ReceivableController {
         return HttpResult.ok(new InsPlyIncomeVO(data, receivablePageIds));
     }
 
-    //@PostMapping("getSelectedReceivableList")
-    @Operation(summary = "获取选中应收列表")
-    public HttpResult getSelectedReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
-        return HttpResult.ok(receivableService.getReceivableList(receivableQueryVo));
-    }
-
     @PostMapping("commissionInvoicing")
     @Operation(summary = "手续费开票")
     public HttpResult<InvoiceingResult> commissionInvoicing(@RequestBody InsPlyIncomeInvoiceVO invoicingVo){
         InvoiceingResult result = receivableService.addInvoicing(invoicingVo);
         if (Objects.nonNull(result)){
-            return HttpResult.ok("开票成功,发票号是" + result.getInvoiceId() ,result);
+            return HttpResult.ok("开票成功,发票编号是" + result.getInvoiceId() ,result);
         }
         return HttpResult.error("开票失败");
     }
@@ -178,7 +186,7 @@ public class ReceivableController {
             return HttpResult.ok("无占用");
         }else{
             List<String> invoiceIds = receivableService.queryIncomeBindInvoice(invoicingVo);
-            return HttpResult.error("订单已开票。发票号是"+ invoiceIds.toString());
+            return HttpResult.error("订单已开票。发票号是"+ invoiceIds.toString());
         }
     }
 
@@ -321,24 +329,41 @@ public class ReceivableController {
         return HttpResult.ok(receivableService.deleteInvoiceById(id) ? "删除成功":"删除失败");
     }
 
-//    @PostMapping("batchModify")
-//    @Operation(summary = "批量修改")
-//    public HttpResult batchModify(@RequestBody List<SettlementVo> settlementVoList){
-//        return receivableService.batchModify(settlementVoList) ? HttpResult.ok("批量修改成功") : HttpResult.error("批量修改失败");
-//    }
+    /**
+     * 私有协议批量修改
+     *      修改手续费比例(商业险手续费比例, 交强险手续费比例)
+     *      签单时间
+     *      对接人(对接人姓名,手机号)
+     *
+     * @author lipf
+     * @date 2026/5/27 20:25
+     */
+    @PostMapping("batchModify")
+    @Operation(summary = "批量修改")
+    public HttpResult<String> batchModify(@RequestBody BatchModifyVo batchModifyVo){
+        return receivableService.batchModify(batchModifyVo) ? HttpResult.ok("批量修改成功") : HttpResult.error("批量修改失败");
+    }
     @PostMapping("exportSuperviseExcel")
     @Operation(summary = "导出应收手续费excel文件(车险)")
     public void exportSuperviseExcel(@RequestBody ReceivableQueryVo receivableQueryVo) throws IOException {
-        receivableQueryVo.setAgreementType("2");
-        receivableQueryVo.setQueryType("1");
+        if (StrUtil.isBlank(receivableQueryVo.getAgreementType())){
+            receivableQueryVo.setAgreementType("2");
+        }
+        if (StrUtil.isBlank(receivableQueryVo.getQueryType())){
+            receivableQueryVo.setQueryType("1");
+        }
         receivableService.exportSuperviseExcel(receivableQueryVo);
     }
 
     @PostMapping("exportSuperviseJyExcel")
     @Operation(summary = "导出应收手续费excel文件(非车险)")
     public void exportSuperviseJyExcel(@RequestBody ReceivableQueryVo receivableQueryVo) throws IOException {
-        receivableQueryVo.setAgreementType("2");
-        receivableQueryVo.setQueryType("3");
+        if (StrUtil.isBlank(receivableQueryVo.getAgreementType())){
+            receivableQueryVo.setAgreementType("2");
+        }
+        if (StrUtil.isBlank(receivableQueryVo.getQueryType())){
+            receivableQueryVo.setQueryType("3");
+        }
         receivableService.exportSuperviseJyExcel(receivableQueryVo);
     }
 
@@ -443,6 +468,12 @@ public class ReceivableController {
         receivableService.exportOtherSettlementDetailJyExcel(page,settlementQueryVo);
     }
 
+    /**
+     * 私有协议-手续费,跟单费,平台协议三个页面的保险公司报表统计接口
+     *
+     * @author lipf
+     * @date 2026/5/28 11:15
+     */
     @PostMapping("companySuperviseSettlementReport")
     @Operation(summary = "保险公司结算报表")
     public HttpResult<List<CompanySuperviseSettlementReportDto>> companySuperviseSettlementReport(@RequestBody SettlementReportQueryVo settlementReportQueryVo) {
@@ -490,4 +521,23 @@ public class ReceivableController {
         List<Long> idList = Arrays.asList(ids);
         return receivableService.deleteIncomesByIds(idList,userName);
     }
+
+    /**
+     * 计算两数只差
+     *
+     * @param minuend 被减数 例如 10-3 = 7 , 被减数就是10
+     * @param subtrahend 减数, 例如 10-3 = 7,减数就是3
+     * @author lipf
+     * @date 2026/5/27 19:29
+     */
+    @GetMapping("calSub")
+    public HttpResult<BigDecimal> sub(@RequestParam("minuend") BigDecimal minuend,
+                                      @RequestParam("subtrahend") BigDecimal subtrahend){
+        log.info("计算两数只差。 minuend=[{}], subtrahend=[{}]", minuend, subtrahend);
+        if(minuend == null || subtrahend == null){
+            return HttpResult.error("被减数和减数不能为空");
+        }
+        BigDecimal subtract = minuend.subtract(subtrahend);
+        return HttpResult.ok(subtract);
+    }
 }

+ 17 - 3
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -30,7 +30,7 @@ public interface ReceivableService extends IService<InsPlyIncome> {
     /**
      * 添加已审核订单的数据 应收表插入
      */
-    boolean saveAuditedOrder(List<String> orderNos);
+    boolean saveAuditedOrder(AddReceivableVo addReceivableVo);
 
     /**
      * 获取应收订单的保司
@@ -160,8 +160,9 @@ public interface ReceivableService extends IService<InsPlyIncome> {
 
     /**
      * 批量修改
-     * @param batchModifyVo
-     * @return
+     *
+     * @param batchModifyVo 要修改的内容
+     * @return boolean 是否修改成功
      */
     boolean batchModify(BatchModifyVo batchModifyVo);
 
@@ -354,4 +355,17 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      * @return
      */
     boolean platformSettlement(PlatformSettlementVo platformSettlementVo);
+
+    /**
+     * 导出模板私有协议手续费
+     * @return
+     */
+    String exportTemplateReceivableList();
+
+    /**
+     * 导入私有协议手续费修改
+     * @param file
+     * @return
+     */
+    ImportUpdateExcelResultVo importReceivableListUpdate(MultipartFile file);
 }

+ 229 - 70
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -19,10 +19,12 @@ import com.jzg.commons.entity.finance.dto.*;
 import com.jzg.commons.entity.finance.po.*;
 import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
+import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.entity.po.SysUploadFiles;
+import com.jzg.commons.exception.ServiceException;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.EasyExcelUtils;
@@ -102,7 +104,6 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Autowired
     private PtlAgreementMapper ptlAgreementMapper;
-
     @Autowired
     private SysUploadFilesMapper sysUploadFilesMapper;
 
@@ -146,19 +147,19 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public InsPlyIncome getUnauditedOrder(ReceivableQueryVo receivableQueryVo) {
-        InsPlyIncome auditedOrder = baseMapper.getAuditedOrder(receivableQueryVo.getOrderNo(), receivableQueryVo.getQueryType(), InsOrderStatusEnum.UNDERWRITED.getCode(), receivableQueryVo.getAgreementType());
-        if (receivableQueryVo.getQueryType().equals("3") || receivableQueryVo.getQueryType().equals("4")) {
-            if (Objects.isNull(auditedOrder.getJyPolicyNo()) && auditedOrder.getJyPolicyNo().isEmpty()) {
+        InsPlyIncome auditedOrder = baseMapper.getAuditedOrder(receivableQueryVo.getOrderNo(), InsOrderStatusEnum.UNDERWRITED.getCode(), "0", receivableQueryVo.getAgreementType());
+        if ("3".equals(receivableQueryVo.getQueryType()) || "4".equals(receivableQueryVo.getQueryType())) {
+            if (StrUtil.isBlank(auditedOrder.getJyPolicyNo())) {
                 return null;
             }
         }
-        return baseMapper.getAuditedOrder(receivableQueryVo.getOrderNo(), InsOrderStatusEnum.UNDERWRITED.getCode(), "0", receivableQueryVo.getAgreementType());
+        return auditedOrder;
     }
 
     @Override
-    public boolean saveAuditedOrder(List<String> orderNos) {
+    public boolean saveAuditedOrder(AddReceivableVo addReceivableVo) {
 
-        List<InsPlyIncome> auditedOrder = this.getUnauditOrderList(orderNos, InsOrderStatusEnum.UNDERWRITED.getCode(), "0");
+        List<InsPlyIncome> auditedOrder = this.getUnauditOrderList(addReceivableVo.getOrderNo(), InsOrderStatusEnum.UNDERWRITED.getCode(), "0");
         AssertionUtils.isEmpty(auditedOrder, "订单不存在");
         // 查看当前表是否已经存在了已审核订单数据
 //        Long count = baseMapper.selectCount(new LambdaQueryWrapper<InsPlyIncome>().eq(InsPlyIncome::getOrderNo, order.getOrderNo()));
@@ -276,8 +277,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 };
                 // 签单时间
                 Predicate<InsPlyIncome> signDatePredicate = insPlyIncome -> {
-                    String signingTime = insPlyIncome.getSigningTime();
-                    if(StrUtil.isEmpty(signingTime)){
+                    LocalDateTime signingTime = insPlyIncome.getSigningTime();
+                    if(signingTime == null){
                         // 签单时间如果为空,说明是数据问题 先返回去,让业务去处理
                         return true;
                     }
@@ -492,7 +493,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if(!b){
             List<String> invoiceIds = this.queryIncomeBindInvoice(invoicingVo);
             invoice.setCanInvoice(false);
-            invoice.setErrMsg("订单已开票。发票号是"+ invoiceIds.toString());
+            invoice.setErrMsg("订单已开票。发票号是"+ invoiceIds.toString());
             return invoice;
         }
         invoice.setCanInvoice(true);
@@ -653,6 +654,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     public InvoiceingResult addInvoicing(InsPlyIncomeInvoiceVO invoicingVo) {
         log.info("开票:invoicingVo=[{}]", JSONUtil.toJsonStr(invoicingVo));
         try {
+            this.valide4Invoicing(invoicingVo);
             InvoiceingResult result = new InvoiceingResult();
             InsPlyIncomeInvoice invoice = new InsPlyIncomeInvoice();
             BeanUtils.copyProperties(invoicingVo, invoice);
@@ -693,6 +695,21 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         }
     }
 
+    /**
+     * 开票前的校验
+     *
+     * @author lipf
+     * @date 2026/5/28 9:25
+     */
+    private void valide4Invoicing(InsPlyIncomeInvoiceVO invoicingVo) {
+        if(invoicingVo == null){
+            throw new ServiceException("无法开票,开票参数为空");
+        }
+        if(StrUtil.isEmpty(invoicingVo.getInvoiceNo())){
+            throw new ServiceException("发票号不能为空");
+        }
+    }
+
     @Override
     public BigDecimal getInvoicingAmount(String invoicingId) {
         BigDecimal ctualReceivedAmount = new BigDecimal(BigInteger.ZERO);
@@ -712,36 +729,37 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             return false;
         }
         long result = 0;
+        final String number = "1";
         switch (invoiceType) {
-            case "1":
+            case number:
                 result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
                         .in(InsPlyIncome::getId, invoiceIds)
-                        .set(InsPlyIncome::getSuperviseSettlement, "1"));
+                        .set(InsPlyIncome::getSuperviseSettlement, number));
                 break;
             case "2":
                 result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
                         .in(InsPlyIncome::getId, invoiceIds)
-                        .set(InsPlyIncome::getOtherSettlement, "1"));
+                        .set(InsPlyIncome::getOtherSettlement, number));
                 break;
             case "3":
                 result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
                         .in(InsPlyIncome::getId, invoiceIds)
-                        .set(InsPlyIncome::getJySuperviseSettlement, "1"));
+                        .set(InsPlyIncome::getJySuperviseSettlement, number));
                 break;
             case "4":
                 result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
                         .in(InsPlyIncome::getId, invoiceIds)
-                        .set(InsPlyIncome::getJyOtherSettlement, "1"));
+                        .set(InsPlyIncome::getJyOtherSettlement, number));
                 break;
             case "5":
                 result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
                         .in(InsPlyIncome::getId, invoiceIds)
-                        .set(InsPlyIncome::getPlatformSuperviseSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
+                        .set(InsPlyIncome::getPlatformSuperviseSettlement, number).set(InsPlyIncome::getSettlementStatus, number));
                 break;
             case "6":
                 result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
                         .in(InsPlyIncome::getId, invoiceIds)
-                        .set(InsPlyIncome::getPlatformOtherSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
+                        .set(InsPlyIncome::getPlatformOtherSettlement, number).set(InsPlyIncome::getSettlementStatus, number));
                 break;
             default:
                 result = 0;
@@ -868,6 +886,137 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         }
     }
 
+    @Override
+    public String exportTemplateReceivableList() {
+        List<InsPlyIncomeExportVo> emptyList = ListUtil.empty();
+
+        // 调用动态导出
+        return exportBaseService.upLoadFile(
+                InsPlyIncomeExportVo.class,
+                emptyList,
+                "私有协议应收-批量修改-导出模板-" + Instant.now()
+        );
+    }
+
+    @Override
+    public ImportUpdateExcelResultVo importReceivableListUpdate(MultipartFile file) {
+        String userName = baseController.getUserName();
+        log.info("用户[{}]导入平台协议文件",userName);
+        ImportUpdateExcelResultVo importExcelResultVo = new ImportUpdateExcelResultVo();
+        List<ReceivableExportExcelVo> receivableExportExcelVos = importReceivableExcel(file);
+        if (CollUtil.isEmpty(receivableExportExcelVos)){
+            throw new SystemException("数据不能为空,导入失败");
+        }
+        AssertionUtils.isEmpty(receivableExportExcelVos, "数据处理失败,导入失败");
+        // 获取保司名称
+        HttpResult<List<EsmInsCompany>> listHttpResult = esmInsCompanyClient.liveCompanyList();
+        AssertionUtils.isFail(listHttpResult.getCode() != 200, listHttpResult.getMsg());
+
+        int failedNumber = 0;
+        List<ReceivableExportExcelVo> failedExcel = new ArrayList<>();
+        // 只存储需要【修改】的数据
+        List<InsPlyIncome> updateExcel = new ArrayList<>();
+
+        // 校验Excel内部保单号重复
+        Set<String> existPolicyNoSet = new HashSet<>();
+        Set<String> repeatPolicyNoSet = new HashSet<>();
+
+        for (ReceivableExportExcelVo vo : receivableExportExcelVos) {
+            String orderNo = vo.getOrderNo();
+            if (existPolicyNoSet.contains(orderNo)) {
+                repeatPolicyNoSet.add(orderNo);
+            } else {
+                existPolicyNoSet.add(orderNo);
+            }
+        }
+
+        // 处理数据
+        for (ReceivableExportExcelVo vo : receivableExportExcelVos) {
+            // 1. 空数据校验
+            ImportResultVo resultVo = vo.checkEmpty();
+            if (!resultVo.isSuccess()) {
+                failedNumber++;
+                vo.setErrorMessage(resultVo.getMessage());
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 2. Excel内部保单号重复
+            if (repeatPolicyNoSet.contains(vo.getOrderNo())) {
+                failedNumber++;
+                vo.setErrorMessage("订单号重复");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 3. 查询数据库中是否已存在该订单号
+            InsPlyIncome existIncome = baseMapper.selectOne(new LambdaQueryWrapper<InsPlyIncome>()
+                    .eq(InsPlyIncome::getOrderNo, vo.getOrderNo()));
+
+            // 数据库不存在 → 直接失败
+            if (Objects.isNull(existIncome)) {
+                failedNumber++;
+                vo.setErrorMessage("订单号不存在,不允许新增");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 数据库已存在 → 继续后续校验
+            // 判断已开票 / 已结算
+            String settlementFlag = "1";
+            if (settlementFlag.equals(existIncome.getSuperviseSettlement()) || settlementFlag.equals(existIncome.getOtherSettlement())
+                    || settlementFlag.equals(existIncome.getJySuperviseSettlement()) || settlementFlag.equals(existIncome.getJyOtherSettlement())
+                    || settlementFlag.equals(existIncome.getPlatformSuperviseSettlement()) || settlementFlag.equals(existIncome.getPlatformOtherSettlement())) {
+                failedNumber++;
+                vo.setErrorMessage("应收数据已结算");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 封装修改数据
+            InsPlyIncome insPlyIncome = new InsPlyIncome();
+            insPlyIncome.setId(existIncome.getId());
+            insPlyIncome.setLicenseNo(vo.getLicenseNo());
+            insPlyIncome.setJqPolicyNo(vo.getJqPolicyNo());
+            insPlyIncome.setJqSuperviseCostsProportion(vo.getJqSuperviseCostsProportion());
+            insPlyIncome.setJqOtherCostsProportion(vo.getJqOtherCostsProportion());
+            insPlyIncome.setSyPolicyNo(vo.getSyPolicyNo());
+            insPlyIncome.setSySuperviseCostsProportion(vo.getSySuperviseCostsProportion());
+            insPlyIncome.setSyOtherCostsProportion(vo.getSyOtherCostsProportion());
+            insPlyIncome.setJyPolicyNo(vo.getJyPolicyNo());
+            insPlyIncome.setJySuperviseCostsProportion(vo.getJySuperviseCostsProportion());
+            insPlyIncome.setJyOtherCostsProportion(vo.getJyOtherCostsProportion());
+            insPlyIncome.setContactPerson(vo.getDockingPerson());
+
+            // 加入修改列表
+            updateExcel.add(insPlyIncome);
+        }
+
+        // 执行批量更新(只更新,不新增)
+        if (CollUtil.isNotEmpty(updateExcel)) {
+            baseMapper.updateById(updateExcel);
+        }
+
+        // ===================== 生成失败数据下载链接 =====================
+        String failFileUrl = "";
+        if (CollUtil.isNotEmpty(failedExcel)) {
+            failFileUrl = exportBaseService.upLoadFile(
+                    ReceivableExportExcelVo.class,
+                    failedExcel,
+                    "平台协议应收-导入失败-" + Instant.now()
+            );
+        }
+
+        // 返回结果
+        importExcelResultVo.setFailedData(failedExcel);
+        importExcelResultVo.setFailFileUrl(failFileUrl);
+        importExcelResultVo.setSuccessNumber(updateExcel.size());
+        importExcelResultVo.setFailedNumber(failedNumber);
+
+        return importExcelResultVo;
+    }
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean settlement(SettlementVo settlementVo) {
@@ -1195,6 +1344,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         log.info("用户[{}]导入平台协议文件",userName);
         ImportUpdateExcelResultVo importExcelResultVo = new ImportUpdateExcelResultVo();
         List<ReceivableExportExcelVo> receivableExportExcelVos = importReceivableExcel(file);
+        if (CollUtil.isEmpty(receivableExportExcelVos)){
+            throw new SystemException("数据不能为空,导入失败");
+        }
         AssertionUtils.isEmpty(receivableExportExcelVos, "数据处理失败,导入失败");
         // 获取保司名称
         HttpResult<List<EsmInsCompany>> listHttpResult = esmInsCompanyClient.liveCompanyList();
@@ -1251,9 +1403,10 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
             // 数据库已存在 → 继续后续校验
             // 判断已开票 / 已结算
-            if ("1".equals(existIncome.getSuperviseSettlement()) || "1".equals(existIncome.getOtherSettlement())
-                    || "1".equals(existIncome.getJySuperviseSettlement()) || "1".equals(existIncome.getJyOtherSettlement())
-                    || "1".equals(existIncome.getPlatformSuperviseSettlement()) || "1".equals(existIncome.getPlatformOtherSettlement())) {
+            String settlementFlag = "1";
+            if (settlementFlag.equals(existIncome.getSuperviseSettlement()) || settlementFlag.equals(existIncome.getOtherSettlement())
+                    || settlementFlag.equals(existIncome.getJySuperviseSettlement()) || settlementFlag.equals(existIncome.getJyOtherSettlement())
+                    || settlementFlag.equals(existIncome.getPlatformSuperviseSettlement()) || settlementFlag.equals(existIncome.getPlatformOtherSettlement())) {
                 failedNumber++;
                 vo.setErrorMessage("应收数据已结算");
                 failedExcel.add(vo);
@@ -1397,68 +1550,74 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return importExcelResultVo;
     }
 
+    /**
+     * 私有协议批量修改
+     *      修改手续费比例(商业险手续费比例, 交强险手续费比例)
+     *      签单时间
+     *      对接人(对接人姓名,手机号)
+     *
+     * @author lipf
+     * @date 2026/5/27 20:25
+     */
     @Override
     @Transactional
     public boolean batchModify(BatchModifyVo batchModifyVo) {
-        List<InsPlyIncome> updateInsPlyIncome = new ArrayList<>();
-
+        log.info("批量修改应收订单: batchModifyVo=[{}]", JSONUtil.toJsonStr(batchModifyVo));
+        List<String> incomeIds = batchModifyVo.getIncomeIds();
+        if(CollUtil.isEmpty(incomeIds)) {
+            throw new ServiceException("请勾选要批量修改的应收订单");
+        }
+        List<String> insOrders = 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")));
-//                }
+            InsPlyIncome insPlyIncomeSource = baseMapper.selectById(incomeId);
+            if(insPlyIncomeSource == null) {
+                log.info("批量修改应收订单。序号为[{}]的应收订单不存在", incomeId);
+                continue;
+            }
+            insOrders.add(insPlyIncomeSource.getOrderNo());
+            if (Objects.nonNull(batchModifyVo.getJqSuperviseCostsProportion()) && batchModifyVo.getJqSuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal superviseReceivablePremium = calcReceivableAmount(new BigDecimal(Objects.toString(insPlyIncomeSource.getJqPremium(),"0") ), batchModifyVo.getJqSuperviseCostsProportion());
+                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
+                        .set(InsPlyIncome::getJqSuperviseCostsProportion, batchModifyVo.getJqSuperviseCostsProportion())
+                        .set(InsPlyIncome::getJqSuperviseCostsPremiums, superviseReceivablePremium)
+                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
+            }
+            if (Objects.nonNull(batchModifyVo.getSySuperviseCostsProportion()) && batchModifyVo.getSySuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal otherReceivablePremium = calcReceivableAmount(new BigDecimal(Objects.toString(insPlyIncomeSource.getSyPremium(),"0")), batchModifyVo.getSySuperviseCostsProportion());
+                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
+                        .set(InsPlyIncome::getSySuperviseCostsProportion, batchModifyVo.getSySuperviseCostsProportion())
+                        .set(InsPlyIncome::getSySuperviseCostsPremiums, otherReceivablePremium)
+                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
+            }
+            if (batchModifyVo.getSigningTime() != null){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
+                        .set(InsPlyIncome::getSigningTime, batchModifyVo.getSigningTime())
+                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
 
+            }
+            if(StrUtil.isNotEmpty(batchModifyVo.getContractUserName())){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
+                        .set(InsPlyIncome::getContactPerson, batchModifyVo.getContractUserName())
+                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
 
-                updateInsPlyIncome.add(insPlyIncome);
             }
-            baseMapper.updateById(updateInsPlyIncome);
-            return true;
+            if(StrUtil.isNotEmpty(batchModifyVo.getContractPhone())){
+                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
+                        .set(InsPlyIncome::getContactPersonPhone, batchModifyVo.getContractPhone())
+                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
+            }
         }
-
-        // 批量修改
-        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;
+        batchModifyVo.setOrderNos(insOrders);
+        HttpResult<String> updateOrdersRes = insFeeOrdersClient.updateOrdersBatch(batchModifyVo);
+        log.info("更新车险订单的结果:updateOrdersRes=[{}]", JSONUtil.toJsonStr(updateOrdersRes));
+        return true;
     }
 
     @Override
     public BigDecimal calcReceivableAmount(BigDecimal premium, BigDecimal ratio) {
+        if(premium==null||ratio==null) {
+            return BigDecimal.ZERO;
+        }
         return premium.multiply(ratio);
     }
 

+ 19 - 18
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -61,15 +61,14 @@
                 LEFT JOIN ins_fee_audit ifa on ifa.order_no = io.id
         WHERE
             io.id = #{orderNo}
-        AND
-            io.order_status = #{orderStatus}
+        <if test="orderStatus != null and orderStatus != ''">
+            AND io.order_status = #{orderStatus}
+        </if>
         <if test="auditStatus != null and auditStatus != ''">
-            AND
-                ifa.audit_status = #{auditStatus}
+            AND ifa.audit_status = #{auditStatus}
         </if>
         <if test="agreementType != null and agreementType != ''">
-            AND
-                pa.agreement_type = #{agreementType}
+            AND pa.agreement_type = #{agreementType}
         </if>
     </select>
 
@@ -181,15 +180,16 @@
         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 in
-        <foreach collection="orderNo" item="id" open="(" separator="," close=")">
-            #{id}
-        </foreach>
-        AND
+        <if test="orderNo != null and orderNo.size > 0">
+            io.id in
+            <foreach collection="orderNo" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+            AND
+        </if>
         io.order_status = #{orderStatus}
         <if test="auditStatus != null and auditStatus != ''">
-            AND
-            ifa.audit_status = #{auditStatus}
+            AND ifa.audit_status = #{auditStatus}
         </if>
     </select>
 
@@ -243,7 +243,8 @@
         io.company_name,
         io.company_id,
         io.create_time,
-        io.docking_person
+        io.docking_person,
+        eic.name_simple as companyNameSimple
         FROM
         ins_ply_income ipi
         LEFT JOIN ins_orders io ON ipi.order_no = io.id
@@ -251,6 +252,7 @@
         LEFT JOIN ins_orders_risk ior1 ON ipi.order_no = ior1.order_no and ior1.risk_code = '0507'
         LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510'
         LEFT JOIN ins_orders_policy iop ON ipi.order_no = iop.order_no
+        LEFT JOIN esm_ins_company eic on ipi.company_id = eic.id
         WHERE 1=1 and ipi.settlement_status = '0' and ipi.is_delete  = 0
     </sql>
 
@@ -380,9 +382,7 @@
         LEFT JOIN ins_orders_risk ior1 ON ipi.order_no = ior1.order_no and ior1.risk_code = '0507'
         LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510'
         LEFT JOIN ins_orders_policy iop ON ipi.order_no = iop.order_no
-        WHERE
-        1=1
-        AND NOT EXISTS ( SELECT 1 FROM ins_ply_income_invoice_link ipil WHERE ipil.income_id = ipi.id )
+        WHERE 1=1 and ipi.settlement_status = '0' and ipi.is_delete  = 0
         <if test="receivableQueryVo.queryType != null and receivableQueryVo.queryType == 1">
             AND ipi.supervise_settlement = 0
         </if>
@@ -1171,7 +1171,8 @@
             eic.name as company_name,
             eic.name_simple as companyNameSimple,
             sum( ipiis.actual_received_amount ) AS actual_received_amount,
-            ipii.status
+            ipii.status,
+            ipii.payment_reason
         FROM
             ins_ply_income_invoice ipii
                 LEFT JOIN ins_ply_income_invoice_settlement ipiis ON ipii.id = ipiis.invoice_id