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

Merge remote-tracking branch 'origin/master'

lixiaolong 2 месяцев назад
Родитель
Сommit
58a0710226
34 измененных файлов с 788 добавлено и 71 удалено
  1. 3 3
      commons/src/main/java/com/jzg/commons/config/OpenTelemetryConfig.java
  2. 36 0
      commons/src/main/java/com/jzg/commons/entity/dto/UpdateFeeRatioDTO.java
  3. 8 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  4. 6 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/QueryFollowIncomeVo.java
  5. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/InsFeeOrders.java
  6. 1 1
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java
  7. 9 0
      commons/src/main/java/com/jzg/commons/entity/report/dto/FeeAuditSummaryVo.java
  8. 1 1
      commons/src/main/java/com/jzg/commons/entity/report/dto/ReportReceivableDataDto.java
  9. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/InsFeeOrdersVo.java
  10. 43 0
      consoleStatistics/src/main/java/com/jzg/console/controller/ReportFinanceDataManageController.java
  11. 10 0
      consoleStatistics/src/main/java/com/jzg/console/service/ReportFeeAuditSummaryService.java
  12. 14 0
      consoleStatistics/src/main/java/com/jzg/console/service/ReportReceivableDataService.java
  13. 20 0
      consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportFeeAuditSummaryServiceImpl.java
  14. 89 0
      consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportReceivableDataServiceImpl.java
  15. 1 1
      consoleStatistics/src/main/resources/mapper/ReportFeeAuditSummaryMapper.xml
  16. 4 11
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Request/PremiumRequest.java
  17. 1 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerCacheComponent.java
  18. 2 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenPrpTmainDTO.java
  19. 2 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  20. 1 5
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java
  21. 17 6
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java
  22. 23 5
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  23. 15 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java
  24. 154 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java
  25. 21 12
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  26. 1 1
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerRequestComponent.java
  27. 1 1
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQueryAccommodationResponse.java
  28. 23 15
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java
  29. 8 1
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  30. 10 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  31. 93 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  32. 4 0
      tenant/organization/src/main/resources/mapper/InsFeeFollowOrderMapper.xml
  33. 4 0
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml
  34. 154 0
      修改出入口比例接口对接文档.md

+ 3 - 3
commons/src/main/java/com/jzg/commons/config/OpenTelemetryConfig.java

@@ -1,12 +1,12 @@
 package com.jzg.commons.config;
 
 import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.common.Attributes;
+import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
 import io.opentelemetry.sdk.OpenTelemetrySdk;
 import io.opentelemetry.sdk.resources.Resource;
 import io.opentelemetry.sdk.trace.SdkTracerProvider;
 import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
-import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
-import io.opentelemetry.api.common.Attributes;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -26,7 +26,7 @@ public class OpenTelemetryConfig {
 
         // Trace exporter
         OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter.builder()
-//                .setEndpoint("http://192.168.5.250:4317")
+//                .setEndpoint("http://192.168.1.250:4317")
                 .setEndpoint("http://172.24.144.227:4317")
                 .build();
 

+ 36 - 0
commons/src/main/java/com/jzg/commons/entity/dto/UpdateFeeRatioDTO.java

@@ -0,0 +1,36 @@
+package com.jzg.commons.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author auto
+ * @date 2026/7/23
+ */
+@Data
+@Schema(description = "修改出入口比例DTO")
+public class UpdateFeeRatioDTO {
+
+    @Schema(description = "订单号", required = true)
+    private String orderNo;
+
+    @Schema(description = "交强险入口比例(0-100,服务端自动除以100)")
+    private BigDecimal jqInletRatio;
+
+    @Schema(description = "商业险入口比例(0-100,服务端自动除以100)")
+    private BigDecimal syInletRatio;
+
+    @Schema(description = "驾意险入口比例(0-100,服务端自动除以100)")
+    private BigDecimal jyInletRatio;
+
+    @Schema(description = "交强险出口比例(0-100,服务端自动除以100)")
+    private BigDecimal jqExportRatio;
+
+    @Schema(description = "商业险出口比例(0-100,服务端自动除以100)")
+    private BigDecimal syExportRatio;
+
+    @Schema(description = "驾意险出口比例(0-100,服务端自动除以100)")
+    private BigDecimal jyExportRatio;
+}

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

@@ -376,5 +376,13 @@ public class InsPlyIncome extends BaseModel {
     @Schema(description = "非车应收金额")
     private BigDecimal jyTotalPremiums;
 
+    @TableField(exist = false)
+    @Schema(description = "合作保险公司ID")
+    private String partnerCompanyId;
+
+    @TableField(exist = false)
+    @Schema(description = "禁用标志:1-已对账(禁用),0-未对账(可用)")
+    private String disableFlag;
+
 
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/QueryFollowIncomeVo.java

@@ -33,4 +33,10 @@ public class QueryFollowIncomeVo  extends PageRequest implements Serializable {
     @Schema(description = "创建结束时间")
     private String endTime;
 
+    @Schema(description = "签单开始时间(年月格式:YYYY-MM)")
+    private String signingStartTime;
+
+    @Schema(description = "签单结束时间(年月格式:YYYY-MM)")
+    private String signingEndTime;
+
 }

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

@@ -279,6 +279,9 @@ public class InsFeeOrders {
     @TableField(exist = false)
     private String licenseNo;
 
+    @Schema(description = "出入口比例是否已手动修改 0-未修改 1-已修改")
+    private Integer ratioModified;
+
     @Schema(description = "是否删除")
     @TableLogic
     private Integer isDelete;

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java

@@ -108,7 +108,7 @@ public class SysUserJzgInfo extends BaseModel implements Serializable {
     private String partnerLevel;
 
     @TableField(value = "type_attr")
-    @Schema(description = "用户类型:0个代,1渠道,2团队,3电销组")
+    @Schema(description = "用户类型:1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:渠道 8 :电销")
     private String typeAttr;
 
     @TableField(value = "factor_verify")

+ 9 - 0
commons/src/main/java/com/jzg/commons/entity/report/dto/FeeAuditSummaryVo.java

@@ -1,5 +1,7 @@
 package com.jzg.commons.entity.report.dto;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -16,24 +18,31 @@ import lombok.NoArgsConstructor;
 @Schema(description = "费用审核汇总统计结果VO")
 public class FeeAuditSummaryVo {
 
+    @ExcelIgnore
     @Schema(description = "保险公司ID")
     private String companyId;
 
+    @ExcelProperty(value = "保险公司名称", index = 0)
     @Schema(description = "保险公司名称")
     private String companyName;
 
+    @ExcelProperty(value = "待审核条数", index = 1)
     @Schema(description = "待审核条数")
     private Long pendingReviewNum;
 
+    @ExcelProperty(value = "已审核条数", index = 2)
     @Schema(description = "已审核条数")
     private Long approvedNum;
 
+    @ExcelProperty(value = "审核不通过条数", index = 3)
     @Schema(description = "审核不通过条数")
     private Long rejectedNum;
 
+    @ExcelProperty(value = "疑问订单条数", index = 4)
     @Schema(description = "疑问订单条数")
     private Long problemOrderNum;
 
+    @ExcelProperty(value = "平均审核时长(秒)", index = 5)
     @Schema(description = "平均审核时长(秒)")
     private Long avgAuditDuration;
 }

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/report/dto/ReportReceivableDataDto.java

@@ -50,7 +50,7 @@ public class ReportReceivableDataDto {
     /**
      * 未开票
      */
-    @ExcelProperty(value = "应收", index = 3)
+    @ExcelProperty(value = "未开票", index = 2)
     @ColumnWidth(10)
     @Schema(description = "未开票")
     private BigDecimal uninvoicedMoney;

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/vo/InsFeeOrdersVo.java

@@ -196,6 +196,9 @@ public class InsFeeOrdersVo {
     @Schema(description = "租户代码")
     private String systemCode;
 
+    @Schema(description = "出入口比例是否已手动修改 0-未修改 1-已修改")
+    private Integer ratioModified;
+
     /**
      * 出口费用是否需要扣减1%
      */
@@ -262,6 +265,9 @@ public class InsFeeOrdersVo {
         this.totalExportPremium = BigDecimalUtil.add(BigDecimalUtil.add(insFeeOrders.getJqExportPremium(),insFeeOrders.getSyExportPremium()),insFeeOrders.getJyExportPremium());
         //出口留点总费用
         this.totalExportKeepPointPremium = BigDecimalUtil.add(BigDecimalUtil.add(insFeeOrders.getJqExportKeepPointPremium(),insFeeOrders.getSyExportKeepPointPremium()),insFeeOrders.getJyExportKeepPointPremium());
+
+        //比例是否已修改标识
+        this.ratioModified = insFeeOrders.getRatioModified() != null ? insFeeOrders.getRatioModified() : 0;
     }
 
     public String convert2Str(BigDecimal num){

+ 43 - 0
consoleStatistics/src/main/java/com/jzg/console/controller/ReportFinanceDataManageController.java

@@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -364,6 +365,16 @@ public class ReportFinanceDataManageController extends BaseController {
         }
     }
 
+    /**
+     * 费用审核汇总统计导出Excel
+     * @author: jk
+     */
+    @Operation(summary = "费用审核-汇总统计导出", description = "费用审核-汇总统计导出Excel")
+    @PostMapping(value = "/exportFeeAuditSummary")
+    public void exportFeeAuditSummary(@RequestBody FeeAuditSummaryParam param) {
+        reportFeeAuditSummaryService.exportFeeAuditSummary(param);
+    }
+
     /**
      * 费用审核明细列表:根据保险公司ID查询该公司的所有审核明细(不区分审核状态)
      * @author: jk
@@ -379,6 +390,16 @@ public class ReportFinanceDataManageController extends BaseController {
         }
     }
 
+    /**
+     * 费用审核明细列表导出Excel
+     * @author: jk
+     */
+    @Operation(summary = "费用审核-明细导出", description = "费用审核-明细导出Excel")
+    @PostMapping(value = "/exportFeeAuditDetail")
+    public void exportFeeAuditDetail(@RequestBody FeeAuditDetailParam param) {
+        reportFeeAuditSummaryService.exportFeeAuditDetail(param);
+    }
+
     /**
      * 财务数据-应收统计:按月份汇总查询应收数据
      * 查询选中年份的私有协议(车险+非车的手续费+跟单费)应收数据,按月份汇总
@@ -399,6 +420,17 @@ public class ReportFinanceDataManageController extends BaseController {
         }
     }
 
+    /**
+     * 财务数据-应收统计导出Excel
+     * @author: jk
+     */
+    @Operation(summary = "财务数据-应收统计导出", description = "财务数据-应收统计导出Excel(按月份汇总)")
+    @PostMapping(value = "/exportReceivableStatistics")
+    public void exportReceivableStatistics(@RequestBody ReportSearchCommonVo reportSearchCommonVo) {
+        String systemCode = getSystemCode();
+        reportReceivableDataService.exportReceivableStatistics(reportSearchCommonVo, systemCode);
+    }
+
     /**
      * 财务数据-应收统计明细:按保险公司分组查询应收数据
      * 查询选中年月的应收数据,按保险公司分组
@@ -418,4 +450,15 @@ public class ReportFinanceDataManageController extends BaseController {
         }
     }
 
+    /**
+     * 财务数据-应收统计明细导出Excel
+     * @author: jk
+     */
+    @Operation(summary = "财务数据-应收统计明细导出", description = "财务数据-应收统计明细导出Excel(按保险公司分组)")
+    @PostMapping(value = "/exportReceivableStatisticsDetail")
+    public void exportReceivableStatisticsDetail(@RequestBody ReportSearchCommonVo reportSearchCommonVo) {
+        String systemCode = getSystemCode();
+        reportReceivableDataService.exportReceivableStatisticsDetail(reportSearchCommonVo, systemCode);
+    }
+
 }

+ 10 - 0
consoleStatistics/src/main/java/com/jzg/console/service/ReportFeeAuditSummaryService.java

@@ -21,4 +21,14 @@ public interface ReportFeeAuditSummaryService {
      * 按保险公司查询费用审核明细列表(分页)
      */
     Page<FeeAuditVo> getFeeAuditDetailPage(FeeAuditDetailParam param);
+
+    /**
+     * 费用审核汇总统计导出Excel(复用分页方法,设置不分页参数)
+     */
+    void exportFeeAuditSummary(FeeAuditSummaryParam param);
+
+    /**
+     * 费用审核明细列表导出Excel(复用分页方法,设置不分页参数)
+     */
+    void exportFeeAuditDetail(FeeAuditDetailParam param);
 }

+ 14 - 0
consoleStatistics/src/main/java/com/jzg/console/service/ReportReceivableDataService.java

@@ -49,4 +49,18 @@ public interface ReportReceivableDataService extends  ReportBaseService{
      *  @return 按保险公司分组的应收明细数据列表
      */
     List<?> getReceivableStatisticsDetail(ReportSearchCommonVo reportSearchCommonVo, String systemCode);
+
+    /**
+     * 财务数据-应收统计导出Excel
+     * @param reportSearchCommonVo 查询参数
+     * @param systemCode 系统编码
+     */
+    void exportReceivableStatistics(ReportSearchCommonVo reportSearchCommonVo, String systemCode);
+
+    /**
+     * 财务数据-应收统计明细导出Excel
+     * @param reportSearchCommonVo 查询参数
+     * @param systemCode 系统编码
+     */
+    void exportReceivableStatisticsDetail(ReportSearchCommonVo reportSearchCommonVo, String systemCode);
 }

+ 20 - 0
consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportFeeAuditSummaryServiceImpl.java

@@ -8,6 +8,8 @@ import com.jzg.commons.entity.report.dto.FeeAuditSummaryVo;
 import com.jzg.commons.entity.report.vo.FeeAuditDetailParam;
 import com.jzg.commons.entity.report.vo.FeeAuditSummaryParam;
 import com.jzg.commons.entity.orders.vo.FeeAuditVo;
+import com.jzg.commons.util.EasyExcelUtils;
+import com.jzg.commons.util.ServletUtils;
 import com.jzg.console.client.FeeAuditClient;
 import com.jzg.console.mapper.ReportFeeAuditSummaryMapper;
 import com.jzg.console.service.ReportFeeAuditSummaryService;
@@ -60,4 +62,22 @@ public class ReportFeeAuditSummaryServiceImpl implements ReportFeeAuditSummarySe
         // 返回空分页避免前端报错
         return new Page<>(param.getPages(), param.getSize());
     }
+
+    @Override
+    public void exportFeeAuditSummary(FeeAuditSummaryParam param) {
+        // 复用分页方法,设置不分页参数
+        param.setPages(1);
+        param.setSize(100000);
+        IPage<FeeAuditSummaryVo> page = getFeeAuditSummaryPage(param);
+        EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), FeeAuditSummaryVo.class, page.getRecords(), "费用审核汇总统计");
+    }
+
+    @Override
+    public void exportFeeAuditDetail(FeeAuditDetailParam param) {
+        // 复用分页方法,设置不分页参数
+        param.setPages(1);
+        param.setSize(Integer.MAX_VALUE);
+        Page<FeeAuditVo> page = getFeeAuditDetailPage(param);
+        EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), FeeAuditVo.class, page.getRecords(), "费用审核明细");
+    }
 }

+ 89 - 0
consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportReceivableDataServiceImpl.java

@@ -3,8 +3,11 @@ package com.jzg.console.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.alibaba.excel.EasyExcel;
 import com.jzg.commons.entity.report.dto.*;
 import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
+import com.jzg.commons.util.EasyExcelUtils;
+import com.jzg.commons.util.ServletUtils;
 import com.jzg.console.mapper.ReportReceivableDataMapper;
 import com.jzg.console.service.ReportReceivableDataService;
 import org.slf4j.Logger;
@@ -147,4 +150,90 @@ public class ReportReceivableDataServiceImpl extends ReportBaseServiceImpl imple
         }
         return reportReceivableDataMapper.getReceivableStatisticsDetail(reportSearchCommonVo, systemCode);
     }
+
+    @Override
+    public void exportReceivableStatistics(ReportSearchCommonVo reportSearchCommonVo, String systemCode) {
+        log.info("财务数据-应收统计导出Excel. reportSearchCommonVo=[{}], systemCode=[{}]", JSONUtil.toJsonStr(reportSearchCommonVo), systemCode);
+        List<ReportReceivableDataDto> dataList = reportReceivableDataMapper.getReceivableStatisticsByMonth(reportSearchCommonVo, systemCode);
+        EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), ReportReceivableDataDto.class, dataList, "财务数据-应收统计");
+    }
+
+    @Override
+    public void exportReceivableStatisticsDetail(ReportSearchCommonVo reportSearchCommonVo, String systemCode) {
+        log.info("财务数据-应收统计明细导出Excel. reportSearchCommonVo=[{}], systemCode=[{}]", JSONUtil.toJsonStr(reportSearchCommonVo), systemCode);
+        List<ReportReceivableDetailDto> dataList = reportReceivableDataMapper.getReceivableStatisticsDetail(reportSearchCommonVo, systemCode);
+
+        // 构建表头
+        List<List<String>> head = java.util.Arrays.asList(
+            java.util.Arrays.asList("保险公司名称"),
+            java.util.Arrays.asList("应收-手续费金额"), java.util.Arrays.asList("应收-跟单费金额"),
+            java.util.Arrays.asList("应收-平台应收金额"), java.util.Arrays.asList("应收-合计金额"),
+            java.util.Arrays.asList("未开票-手续费金额"), java.util.Arrays.asList("未开票-跟单费金额"),
+            java.util.Arrays.asList("未开票-平台应收金额"), java.util.Arrays.asList("未开票-合计金额"),
+            java.util.Arrays.asList("已开票-手续费金额"), java.util.Arrays.asList("已开票-跟单费金额"),
+            java.util.Arrays.asList("已开票-平台应收金额"), java.util.Arrays.asList("已开票-合计金额"),
+            java.util.Arrays.asList("未结算-手续费金额"), java.util.Arrays.asList("未结算-跟单费金额"),
+            java.util.Arrays.asList("未结算-平台应收金额"), java.util.Arrays.asList("未结算-合计金额"),
+            java.util.Arrays.asList("已结算-手续费金额"), java.util.Arrays.asList("已结算-跟单费金额"),
+            java.util.Arrays.asList("已结算-平台应收金额"), java.util.Arrays.asList("已结算-合计金额")
+        );
+
+        // 构建数据行
+        List<List<Object>> rows = dataList.stream().map(dto -> {
+            List<Object> row = new java.util.ArrayList<>();
+            row.add(dto.getCompanyName());
+            if (dto.getReceivable() != null) {
+                row.add(dto.getReceivable().getCommissionFee());
+                row.add(dto.getReceivable().getFollowFee());
+                row.add(dto.getReceivable().getPlatformReceivable());
+                row.add(dto.getReceivable().getTotalAmount());
+            } else {
+                row.add(null); row.add(null); row.add(null); row.add(null);
+            }
+            if (dto.getUninvoiced() != null) {
+                row.add(dto.getUninvoiced().getCommissionFee());
+                row.add(dto.getUninvoiced().getFollowFee());
+                row.add(dto.getUninvoiced().getPlatformReceivable());
+                row.add(dto.getUninvoiced().getTotalAmount());
+            } else {
+                row.add(null); row.add(null); row.add(null); row.add(null);
+            }
+            if (dto.getInvoiced() != null) {
+                row.add(dto.getInvoiced().getCommissionFee());
+                row.add(dto.getInvoiced().getFollowFee());
+                row.add(dto.getInvoiced().getPlatformReceivable());
+                row.add(dto.getInvoiced().getTotalAmount());
+            } else {
+                row.add(null); row.add(null); row.add(null); row.add(null);
+            }
+            if (dto.getUnsettled() != null) {
+                row.add(dto.getUnsettled().getCommissionFee());
+                row.add(dto.getUnsettled().getFollowFee());
+                row.add(dto.getUnsettled().getPlatformReceivable());
+                row.add(dto.getUnsettled().getTotalAmount());
+            } else {
+                row.add(null); row.add(null); row.add(null); row.add(null);
+            }
+            if (dto.getSettled() != null) {
+                row.add(dto.getSettled().getCommissionFee());
+                row.add(dto.getSettled().getFollowFee());
+                row.add(dto.getSettled().getPlatformReceivable());
+                row.add(dto.getSettled().getTotalAmount());
+            } else {
+                row.add(null); row.add(null); row.add(null); row.add(null);
+            }
+            return row;
+        }).toList();
+
+        try {
+            jakarta.servlet.http.HttpServletResponse response = ServletUtils.getResponse();
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            String fileEName = java.net.URLEncoder.encode("财务数据-应收统计明细", "UTF-8").replaceAll("\\+", "%20");
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileEName + ".xlsx");
+            EasyExcel.write(response.getOutputStream()).head(head).sheet("财务数据-应收统计明细").doWrite(rows);
+        } catch (java.io.IOException e) {
+            log.error("导出文件异常", e);
+        }
+    }
 }

+ 1 - 1
consoleStatistics/src/main/resources/mapper/ReportFeeAuditSummaryMapper.xml

@@ -22,7 +22,7 @@
         <where>
             ifa.is_delete = 0
             <if test="param.checkTime != null and  param.checkTime.size() > 0">
-                AND (ifa.audit_time BETWEEN #{param.checkTime[0]} AND #{param.checkTime[1]}} OR ifa.audit_time IS NULL)
+                AND (ifa.audit_time BETWEEN #{param.checkTime[0]} AND #{param.checkTime[1]} OR ifa.audit_time IS NULL)
             </if>
         </where>
         GROUP BY io.company_id, io.company_name

+ 4 - 11
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Request/PremiumRequest.java

@@ -6,15 +6,11 @@ import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.constants.InsuranceRisk;
-import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
-import com.jzg.commons.entity.quote.vo.KindInfoVo;
-import com.jzg.commons.entity.quote.vo.RiskInfoVo;
-import com.jzg.commons.entity.quote.vo.VehicleAndVesselTaxVo;
-import com.jzg.commons.util.AssertionUtils;
-import com.jzg.commons.util.StringUtils;
 import com.jzg.commons.constants.quote.enums.quote.EnergyTypeCode;
 import com.jzg.commons.constants.quote.enums.quote.KindCode;
-import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.*;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.guoren.api.constant.enums.BaseTaxation;
 import com.jzg.quotation.guoren.api.constant.enums.ClauseTypeSystem;
@@ -335,10 +331,7 @@ public class PremiumRequest {
             //乘客数
             BigDecimal passengerNum = BigDecimal.valueOf(StringUtils.toInt(vinQ.getSeatCountBC()) - 1);
 
-            boolean isEnergy = false;
-            if (EnergyTypeCode.getNewEnergy().contains(vinQ.getFuelType())) {
-                isEnergy = true;
-            }
+            boolean isEnergy = EnergyTypeCode.getNewEnergy().contains(vinQ.getFuelType());
 
             //起保时间
             prptitemkind.setStartDate(biRiskInfo.getStartDate());

+ 1 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerCacheComponent.java

@@ -15,7 +15,7 @@ public class GuoRenCrawlerCacheComponent {
 
     public static final String GUOREN_TOKEN = "guoren:token:";
 
-    public static final Duration GUOREN_TOKEN_TIME = Duration.ofHours(6L);
+    public static final Duration GUOREN_TOKEN_TIME = Duration.ofHours(12L);
 
     /**
      * 缓存 token 信息

+ 2 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenPrpTmainDTO.java

@@ -322,12 +322,12 @@ public class GuoRenPrpTmainDTO {
         this.immeValiFlag0507 = riskInfoVo.isInstantFlag() ? 1 : 0;
         this.startDate0507 = TimeProcessing.dateTimeToDate(riskInfoVo.getStartDate());
         this.endDate0507 = TimeProcessing.dateTimeToDate(riskInfoVo.getEndDate());
-        this.immeValidStartDate0507 =  DateUtil.toUtcDateTime(riskInfoVo.getStartDate());
+        this.immeValidStartDate0507 = DateUtil.toUtcDateTime(riskInfoVo.getStartDate());
         this.immeValidEndDate0507 = DateUtil.toUtcDateTime(riskInfoVo.getEndDate());
         this.startHour0507 = TimeProcessing.getHour(riskInfoVo.getStartDate());
         this.endHour0507 = TimeProcessing.getHour(riskInfoVo.getEndDate());
         this.startMinute0507 = TimeProcessing.getMinute(riskInfoVo.getStartDate());
-        this.endMinute0507 =  TimeProcessing.getMinute(riskInfoVo.getEndDate());
+        this.endMinute0507 = TimeProcessing.getMinute(riskInfoVo.getEndDate());
         this.startDateFlag0507 = 0;
 
         // 0507t1字段赋值

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

@@ -110,8 +110,8 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
     @Override
     public HttpHeaders getHeaders(String username) {
         HttpHeaders headers = new HttpHeaders();
-//        String token = guoRenCrawlerCacheComponent.getToken(username);
-        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3ODQ3OTMwNzR9.Jc-DOyqO7RatX9veTtF0cfVFF9EhLuP40eaEkSe_Tv8u33YFvosk50nAPdevmJ9t9WW7263S88fpfHy0gFNjTOjUk8KcOqmpJWbC9Q7Ydoq6NTRwKGIVgZI2VLVlPA99fPzTuxl-MPsyEU0_2KV4I_U7LcV5p3w0jEkPLdUFuXM";
+        String token = guoRenCrawlerCacheComponent.getToken(username);
+//        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3ODQ5NDA2NzF9.fl3etn9yGRPrBxaaPgCFdjeg91oRzI9930ee0nOrV9VllMM7uFG9ktudt8iYinQ2ebIDeYMk51Q3ijrMwyuj5eyxiPtfZeoRtBPiAq0N08E_e1a3GZnjaSTM3TopX2vcb9_LHioskQI90Px9OHcr17YkVZ40X1wb-owaHpEmsCc";
         if (!StringUtils.hasText(token)) {
             throw new TokenExpireException("500", "国任财险账号登录过期,请重新登录");
         }

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

@@ -151,8 +151,8 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
             if (startTime == null) {
                 return GuoRenCrawlerQuoteResultsVoBuild.buildFailQuoteResultsVo(quoteVo, calculationPremium);
             } else {
+                // 交强
                 RiskInfoVo ciRiskInfoVo = new RiskInfoVo();
-
                 if (startTime != null && startTime.endsWith("00:00:00")) {
                     ciRiskInfoVo.setInstantFlag(false);
                     endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
@@ -167,10 +167,6 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
                 ciRiskInfoVo.setEndDate(endTime);
 
                 GuoRenPrpTmainDTO prpTMainDTO = new GuoRenPrpTmainDTO(ciRiskInfoVo, TimeProcessing.nowDate());
-
-                // 交强
-                quoteVo.getCiRiskInfoVo().setStartDate(startTime);
-                quoteVo.getCiRiskInfoVo().setEndDate(endTime);
                 crawlerCalculationPremiumRequest.getCi().setPrpTmain(prpTMainDTO);
 
                 crawlerCalculationPremiumRequest.getCi().getPrptitemkindList().forEach(item -> {

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

@@ -11,6 +11,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.dto.UpdateFeeRatioDTO;
 import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
@@ -20,11 +21,7 @@ import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
-import com.jzg.commons.entity.quote.vo.orders.InsFeeCalculateRequest;
-import com.jzg.commons.entity.quote.vo.orders.InsFeeCalculateResponse;
-import com.jzg.commons.entity.quote.vo.orders.InsOrdersAdd;
-import com.jzg.commons.entity.quote.vo.orders.InsOrdersEnd;
-import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
+import com.jzg.commons.entity.quote.vo.orders.*;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import com.jzg.commons.request.RequestSingleParam;
 import com.jzg.quotation.summary.mapper.InsOrdersMapper;
@@ -46,7 +43,8 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.List;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/supplementOrder")
@@ -227,6 +225,19 @@ public class InsOrdersController extends BaseController {
         return insFeeOrdersService.calcCosts(ptlAgreementCostRatioVo);
     }
 
+    /**
+     * 修改出入口比例(交强/商业/驾意的入口和出口比例)
+     */
+    @Operation(summary = "修改出入口比例")
+    @PostMapping("/updateFeeRatio")
+    public HttpResult<InsFeeOrders> updateFeeRatio(@RequestBody UpdateFeeRatioDTO dto) {
+        log.info("修改出入口比例。dto=[{}]", JSONUtil.toJsonStr(dto));
+        InsFeeOrders result = insFeeOrdersService.updateFeeRatio(
+                dto.getOrderNo(), dto.getJqInletRatio(), dto.getSyInletRatio(), dto.getJyInletRatio(),
+                dto.getJqExportRatio(), dto.getSyExportRatio(), dto.getJyExportRatio());
+        return HttpResult.ok(result);
+    }
+
     @GetMapping("/changePerson")
     @Operation(summary = "更改对接人")
     public HttpResult changePerson(String orderNo,String name,String phone){

+ 23 - 5
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -10,7 +10,6 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -39,7 +38,10 @@ import com.jzg.commons.entity.quote.vo.underwriting.SpecialAppointmentsVo;
 import com.jzg.commons.entity.rights.dto.InsOrderRightsDto;
 import com.jzg.commons.entity.rights.dto.InsOrderRightsInfoDto;
 import com.jzg.commons.entity.rights.dto.InsOrderRightsPackageDto;
-import com.jzg.commons.entity.vo.*;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
+import com.jzg.commons.entity.vo.InsCompanyClauseVo;
+import com.jzg.commons.entity.vo.LotteryCountVO;
+import com.jzg.commons.entity.vo.UnifiedUserClientVO;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.exception.TokenExpireException;
 import com.jzg.commons.util.AssertionUtils;
@@ -52,8 +54,8 @@ import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerRequest;
 import com.jzg.quotation.summary.aop.AuditVerification;
-import com.jzg.quotation.summary.aop.aspect.OrderOperationLog;
 import com.jzg.quotation.summary.aop.QuoteVerification;
+import com.jzg.quotation.summary.aop.aspect.OrderOperationLog;
 import com.jzg.quotation.summary.async.AsyncGetPayLink;
 import com.jzg.quotation.summary.classifier.QuoteInfoParameterFilling;
 import com.jzg.quotation.summary.client.LocalLivingClient;
@@ -82,7 +84,6 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
-import javax.annotation.Resource;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -216,7 +217,7 @@ public class UnifyOrderManager {
     @Operation(summary = "获取报价号")
     @GetMapping("/getQuoteNo")
     public HttpResult getQuoteNo(@Schema(description = "车牌号") String licenseNo, @Schema(description = "车架号") String vinNo, @Schema(description = "发动机号") String engineNo) {
-        String quoteNo = String.valueOf(SnowFlakeUtil.getSnowFlakeId());
+        String quoteNo = SnowFlakeUtil.getSnowFlakeId();
         List<InsOrdersCarInfo> carInfos = insOrdersCarInfoService.list(new LambdaQueryWrapper<InsOrdersCarInfo>().eq(InsOrdersCarInfo::getLicenseNo, licenseNo)
                 .eq(InsOrdersCarInfo::getVinNo, vinNo)
                 .eq(InsOrdersCarInfo::getEngineNo, engineNo));
@@ -945,6 +946,7 @@ public class UnifyOrderManager {
         orderStatusVo.setInsOrdersAccidentalDriving(insOrdersAccidentalDriving);
         OrderStatusResultVo orderStatusResultVo = orderStatusService.queryOrderState(orderStatusVo);
         log.info("订单状态orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo));
+
         // 保存状态查询结果
         insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
         // 保存支付链接
@@ -956,6 +958,22 @@ public class UnifyOrderManager {
             doSomethingAfterUnderwited(insOrders);
         }
 
+        // 电销组订单状态已变更但比例未修改时,向前端提示
+        if (orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED) {
+            String queryUserId = insOrders.getRealQuoteUserId();
+            if (StrUtil.isNotBlank(queryUserId)) {
+                String systemCode = getSystemCode();
+                HttpResult<SysUserJzgInfo> userResult = orgClient.queryUserByUserId(queryUserId, systemCode);
+                if (userResult != null && userResult.getCode() == 200 && userResult.getData() != null
+                        && "8".equals(userResult.getData().getTypeAttr())) {
+                    InsFeeOrders feeOrders = insFeeOrdersService.getById(insOrders.getId());
+                    if (feeOrders == null || !Integer.valueOf(1).equals(feeOrders.getRatioModified())) {
+                        return HttpResult.ok("订单状态已更新,请修改出入口费用比例后发起财务审核");
+                    }
+                }
+            }
+        }
+
         return HttpResult.ok("状态刷新成功");
     }
 

+ 15 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java

@@ -42,4 +42,19 @@ public interface InsFeeOrdersService extends IService<InsFeeOrders> {
      * @date 2026/6/4 10:17
      */
     BigDecimal queryAllTotalReceivablePremiumByOrderNo(List<String> orderNos);
+
+    /**
+     * 修改出入口比例
+     *
+     * @param orderNo       订单号
+     * @param jqInletRatio  交强险入口比例
+     * @param syInletRatio  商业险入口比例
+     * @param jyInletRatio  驾意险入口比例
+     * @param jqExportRatio 交强险出口比例
+     * @param syExportRatio 商业险出口比例
+     * @param jyExportRatio 驾意险出口比例
+     * @return 更新后的费用记录
+     */
+    InsFeeOrders updateFeeRatio(String orderNo, BigDecimal jqInletRatio, BigDecimal syInletRatio, BigDecimal jyInletRatio,
+                                BigDecimal jqExportRatio, BigDecimal syExportRatio, BigDecimal jyExportRatio);
 }

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

@@ -35,7 +35,6 @@ import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.List;
-import java.util.Objects;
 
 /**
  * @author quchen
@@ -487,6 +486,160 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         return insFeeOrdersMapper.getInsFeeOrderByOrderNo(orderNo);
     }
 
+    @Override
+    public InsFeeOrders updateFeeRatio(String orderNo, BigDecimal jqInletRatio, BigDecimal syInletRatio, BigDecimal jyInletRatio,
+                                       BigDecimal jqExportRatio, BigDecimal syExportRatio, BigDecimal jyExportRatio) {
+        final int SCALE = 5;
+
+        // 1. 查询订单费用记录
+        InsFeeOrders insFeeOrders = getFeeOrderByOrderNo(orderNo);
+        AssertionUtils.isFail(insFeeOrders == null, "根据订单号查询订单费用表查无数据,订单号:" + orderNo);
+
+        // 2. 获取关联数据用于费用重算
+        InsOrders insOrders = insOrdersService.getById(orderNo);
+        InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
+        PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrders.getAgreementId());
+        Integer withTax = ptlAgreement.getWithTax();
+        BigDecimal taxFactor = BigDecimal.ONE;
+        if (withTax == 0) {
+            taxFactor = new BigDecimal("1.06");
+        }
+
+        // 保费
+        BigDecimal jqPremium = insOrdersCosts.getJqPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getJqPremium();
+        BigDecimal syPremium = insOrdersCosts.getSyPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getSyPremium();
+        BigDecimal jyPremium = insOrdersCosts.getJyPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getJyPremium();
+
+        // 3. 更新出入口比例(前端传0-100,服务端除以100后保存)
+        // 入口比例变化时,同步调整手续费比例和跟单比例
+        if (jqInletRatio != null) {
+            adjustInletAndRelatedRatios(insFeeOrders, "jq", covertPercent(jqInletRatio));
+        }
+        if (syInletRatio != null) {
+            adjustInletAndRelatedRatios(insFeeOrders, "sy", covertPercent(syInletRatio));
+        }
+        if (jyInletRatio != null) {
+            adjustInletAndRelatedRatios(insFeeOrders, "jy", covertPercent(jyInletRatio));
+        }
+        if (jqExportRatio != null) {
+            insFeeOrders.setJqExportRatio(covertPercent(jqExportRatio));
+        }
+        if (syExportRatio != null) {
+            insFeeOrders.setSyExportRatio(covertPercent(syExportRatio));
+        }
+        if (jyExportRatio != null) {
+            insFeeOrders.setJyExportRatio(covertPercent(jyExportRatio));
+        }
+
+        // 4. 根据新的出入口比例重新计算留点比例和含分销出口比例
+        BigDecimal distributionRatio = BigDecimalUtil.divide(
+                BigDecimalUtil.add(insFeeOrders.getFirstDistributionRatio(),
+                        insFeeOrders.getSecondDistributionRatio(),
+                        insFeeOrders.getThirdDistributionRatio()),
+                new BigDecimal(100));
+
+        insFeeOrders.setJqExportRatioContainDistribution(BigDecimalUtil.add(insFeeOrders.getJqExportRatio(), distributionRatio));
+        insFeeOrders.setSyExportRatioContainDistribution(BigDecimalUtil.add(insFeeOrders.getSyExportRatio(), distributionRatio));
+        insFeeOrders.setJyExportRatioContainDistribution(BigDecimalUtil.add(insFeeOrders.getJyExportRatio(), distributionRatio));
+
+        BigDecimal jqKeepPointRatio = insFeeOrders.getJqInletRatio().divide(taxFactor, SCALE, RoundingMode.HALF_EVEN)
+                .add(insFeeOrders.getJqAdditionalRatio())
+                .subtract(BigDecimalUtil.add(insFeeOrders.getJqExportRatio(), distributionRatio));
+        BigDecimal syKeepPointRatio = insFeeOrders.getSyInletRatio().divide(taxFactor, SCALE, RoundingMode.HALF_EVEN)
+                .add(insFeeOrders.getSyAdditionalRatio())
+                .subtract(BigDecimalUtil.add(insFeeOrders.getSyExportRatio(), distributionRatio));
+        BigDecimal jyKeepPointRatio = insFeeOrders.getJyInletRatio().divide(taxFactor, SCALE, RoundingMode.HALF_EVEN)
+                .add(insFeeOrders.getJyAdditionalRatio())
+                .subtract(BigDecimalUtil.add(insFeeOrders.getJyExportRatio(), distributionRatio));
+
+        insFeeOrders.setJqKeepPointRatio(jqKeepPointRatio);
+        insFeeOrders.setSyKeepPointRatio(syKeepPointRatio);
+        insFeeOrders.setJyKeepPointRatio(jyKeepPointRatio);
+
+        // 5. 按险种重新计算所有费用
+        calculatePremiumByRule(insFeeOrders, "jq", jqPremium,
+                insFeeOrders.getJqCommissionRatio(), insFeeOrders.getJqInletRatio(), insFeeOrders.getJqFollowRatio(),
+                insFeeOrders.getJqAdditionalRatio(), insFeeOrders.getJqKeepPointRatio(), insFeeOrders.getJqExportRatio(),
+                insFeeOrders.getJqExportKeepPointRatio(), insFeeOrders.getJqExportRatioContainDistribution(),
+                withTax, taxFactor, SCALE);
+
+        calculatePremiumByRule(insFeeOrders, "sy", syPremium,
+                insFeeOrders.getSyCommissionRatio(), insFeeOrders.getSyInletRatio(), insFeeOrders.getSyFollowRatio(),
+                insFeeOrders.getSyAdditionalRatio(), insFeeOrders.getSyKeepPointRatio(), insFeeOrders.getSyExportRatio(),
+                insFeeOrders.getSyExportKeepPointRatio(), insFeeOrders.getSyExportRatioContainDistribution(),
+                withTax, taxFactor, SCALE);
+
+        calculatePremiumByRule(insFeeOrders, "jy", jyPremium,
+                insFeeOrders.getJyCommissionRatio(), insFeeOrders.getJyInletRatio(), insFeeOrders.getJyFollowRatio(),
+                insFeeOrders.getJyAdditionalRatio(), insFeeOrders.getJyKeepPointRatio(), insFeeOrders.getJyExportRatio(),
+                insFeeOrders.getJyExportKeepPointRatio(), insFeeOrders.getJyExportRatioContainDistribution(),
+                withTax, taxFactor, SCALE);
+
+        // 6. 重新统计总应收、总应付
+        BigDecimal totalPayable = insFeeOrders.getJqPayablePremium().add(insFeeOrders.getSyPayablePremium()).add(insFeeOrders.getJyPayablePremium());
+        BigDecimal totalReceivable = insFeeOrders.getJqReceivablePremium().add(insFeeOrders.getSyReceivablePremium()).add(insFeeOrders.getJyReceivablePremium());
+        insFeeOrders.setTotalPayablePremium(scale(totalPayable, SCALE));
+        insFeeOrders.setTotalReceivablePremium(scale(totalReceivable, SCALE));
+
+        // 7. 设置已修改标识
+        insFeeOrders.setRatioModified(1);
+
+        // 8. 保存到数据库
+        int updateCount = insFeeOrdersMapper.updateById(insFeeOrders);
+        AssertionUtils.isFail(updateCount <= 0, "修改出入口比例失败,订单号:" + orderNo);
+
+        log.info("修改出入口比例并重算费用成功,orderNo=[{}], jqInletRatio=[{}], syInletRatio=[{}], jyInletRatio=[{}], jqExportRatio=[{}], syExportRatio=[{}], jyExportRatio=[{}]",
+                orderNo, jqInletRatio, syInletRatio, jyInletRatio, jqExportRatio, syExportRatio, jyExportRatio);
+
+        return insFeeOrders;
+    }
+
+    /**
+     * 调整入口比例及关联的手续费比例和跟单比例
+     * 规则:手续费比例不能大于入口比例,跟单比例 = 入口比例 - 手续费比例
+     *
+     * @param insFeeOrders  费用订单
+     * @param type          险种类型 jq/sy/jy
+     * @param newInletRatio 新的入口比例(已除以100)
+     */
+    private void adjustInletAndRelatedRatios(InsFeeOrders insFeeOrders, String type, BigDecimal newInletRatio) {
+        switch (type) {
+            case "jq": {
+                insFeeOrders.setJqInletRatio(newInletRatio);
+                BigDecimal commissionRatio = insFeeOrders.getJqCommissionRatio();
+                if (newInletRatio.compareTo(commissionRatio) < 0) {
+                    insFeeOrders.setJqCommissionRatio(newInletRatio);
+                    insFeeOrders.setJqFollowRatio(BigDecimal.ZERO);
+                } else {
+                    insFeeOrders.setJqFollowRatio(newInletRatio.subtract(commissionRatio));
+                }
+                break;
+            }
+            case "sy": {
+                insFeeOrders.setSyInletRatio(newInletRatio);
+                BigDecimal commissionRatio = insFeeOrders.getSyCommissionRatio();
+                if (newInletRatio.compareTo(commissionRatio) < 0) {
+                    insFeeOrders.setSyCommissionRatio(newInletRatio);
+                    insFeeOrders.setSyFollowRatio(BigDecimal.ZERO);
+                } else {
+                    insFeeOrders.setSyFollowRatio(newInletRatio.subtract(commissionRatio));
+                }
+                break;
+            }
+            case "jy": {
+                insFeeOrders.setJyInletRatio(newInletRatio);
+                BigDecimal commissionRatio = insFeeOrders.getJyCommissionRatio();
+                if (newInletRatio.compareTo(commissionRatio) < 0) {
+                    insFeeOrders.setJyCommissionRatio(newInletRatio);
+                    insFeeOrders.setJyFollowRatio(BigDecimal.ZERO);
+                } else {
+                    insFeeOrders.setJyFollowRatio(newInletRatio.subtract(commissionRatio));
+                }
+                break;
+            }
+        }
+    }
+
     /**
      * 更新订单的可用金额,同时调整剩余金额
      * 更新前会校验:订单存在性、出口留点比例必须为0、新可用金额不能大于当前金额

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

@@ -36,11 +36,7 @@ import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.aggregated.UnderwritingResultsVo;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
-import com.jzg.commons.entity.quote.vo.orders.InsFeeCalculateRequest;
-import com.jzg.commons.entity.quote.vo.orders.InsFeeCalculateResponse;
-import com.jzg.commons.entity.quote.vo.orders.InsOrdersAdd;
-import com.jzg.commons.entity.quote.vo.orders.InsOrdersEnd;
-import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
+import com.jzg.commons.entity.quote.vo.orders.*;
 import com.jzg.commons.entity.rights.vo.InsOrderRightsInfoVo;
 import com.jzg.commons.entity.system.vo.SysSystemBusPermsVo;
 import com.jzg.commons.entity.vo.*;
@@ -52,7 +48,6 @@ import com.jzg.quotation.commons.client.OrgClient;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.utils.BeanCopyUtil;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
-import com.jzg.quotation.summary.aop.aspect.QuoteVerificationAspect;
 import com.jzg.quotation.summary.client.EsmInsCompanyClient;
 import com.jzg.quotation.summary.consumer.template.OrderMessageTemplate;
 import com.jzg.quotation.summary.entity.bo.DataValueBo;
@@ -1144,10 +1139,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                 quoteVo.getOrder().getInsuranceCompanyCode(),
                 quoteVo.getCarInfoVo().getLicenseNo(),
                 quoteVo.getCarInfoVo().getVinNo());
-        boolean isExistsMainOrder = false;
-        if (Objects.nonNull(mainOrders)) {
-            isExistsMainOrder = true;
-        }
+        boolean isExistsMainOrder = Objects.nonNull(mainOrders);
         String mainOrderNo;
         // 如果订单号为0 则生成主订单
         if (!isExistsMainOrder) {
@@ -1666,8 +1658,25 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                     baseController.getToken(), MessageCodeEnum.TEMPLATE_5);
         }
         if (orderStatusResultVo.getOrderStatus().equals(InsOrderStatusEnum.UNDERWRITED)) {
-            // 增加财务审核
-            insFeeAuditService.feeAuditAdd(insOrders,systemCode );
+            // 电销组业务员的订单变更为已承保时,检查出入口比例是否已修改,未修改则跳过财务审核
+            boolean skipFeeAudit = false;
+            String realQuoteUserId = insOrders.getRealQuoteUserId();
+            if (StrUtil.isNotBlank(realQuoteUserId)) {
+                HttpResult<SysUserJzgInfo> userResult = orgClient.queryUserByUserId(realQuoteUserId, systemCode);
+                if (userResult != null && userResult.getCode() == 200 && userResult.getData() != null
+                        && "8".equals(userResult.getData().getTypeAttr())) {
+                    InsFeeOrders feeOrders = insFeeOrdersMapper.selectOne(new LambdaQueryWrapper<InsFeeOrders>()
+                            .eq(InsFeeOrders::getOrderNo, insOrders.getId()));
+                    if (feeOrders == null || !Integer.valueOf(1).equals(feeOrders.getRatioModified())) {
+                        skipFeeAudit = true;
+                        log.info("电销组订单出入口比例未修改,跳过财务审核,订单号=[{}]", orderNo);
+                    }
+                }
+            }
+            if (!skipFeeAudit) {
+                // 增加财务审核
+                insFeeAuditService.feeAuditAdd(insOrders, systemCode);
+            }
             // 将父订单的保司id 和名称更新
             InsOrders baseInsOrders = insOrdersMapper.selectOne(new LambdaQueryWrapper<InsOrders>().eq(InsOrders::getId, insOrders.getParentId()));
             baseInsOrders.setCompanyId(insOrders.getCompanyId());

+ 1 - 1
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerRequestComponent.java

@@ -286,6 +286,6 @@ public class ZhongAnCrawlerRequestComponent {
     public ZhongAnCrawlerQueryAccommodationResponse queryAccommodation(ZhongAnCrawlerQueryAccommodationRequest queryAccommodationRequest, HttpHeaders headers) {
         InsuranceLog.infoLog(InsuranceEnum.ZAPA.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
                 "众安爬虫订单提交通融接口",RequestUrl.QUERY_ACCOMMODATION.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), JSON.toJSONString(queryAccommodationRequest));
-        return requestComponent.formDataZhongAn(RequestUrl.QUERY_ACCOMMODATION.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), queryAccommodationRequest,ZhongAnCrawlerQueryAccommodationResponse.class, headers, "订单查询通融原因").getBody();
+        return requestComponent.formDataZhongAn(RequestUrl.QUERY_ACCOMMODATION.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), queryAccommodationRequest, ZhongAnCrawlerQueryAccommodationResponse.class, headers, "订单提交通融查询").getBody();
     }
 }

+ 1 - 1
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQueryAccommodationResponse.java

@@ -199,7 +199,7 @@ public class ZhongAnCrawlerQueryAccommodationResponse {
                     private String materialUrl;
 
                     @JsonProperty("errorCode")
-                    private String errorCode;
+                    private Object errorCode;
 
                     @JsonProperty("file")
                     private Map<String, Object> file;

+ 23 - 15
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.zhongan.crawler.service.Impl;
 import cn.hutool.cache.Cache;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.common.cache.CacheBuilder;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
@@ -50,10 +51,7 @@ import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.Base64;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -243,7 +241,7 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
         ZhongAnCrawlerConfirmOrderResponse.ValueDTO.DataDTO dataDTO = confirmOrderResponse.getValue().getDatas();
         zhongAnCrawlerCacheComponent.setCache(dataDTO.getOrderNo(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.ORDER_NO);
         zhongAnCrawlerCacheComponent.setCache(dataDTO.getPolicyId(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.POLICY_ID);
-
+        ZhongAnCrawlerOrder zhongAnCrawlerOrder = new ZhongAnCrawlerOrder();
         //非车险提交核保
         if (quoteVo.getAccidentalDrivings() != null && quoteVo.getAccidentalDrivings().size() > 0) {
             ZhongAnCrawlerJyxUnderwritingRequest jyxUnderwritingRequest = new ZhongAnCrawlerJyxUnderwritingRequest(parameters, getOrderResponse.getValue().getDatas().getQuoteId());
@@ -252,9 +250,6 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
         ZhongAnCrawlerUploadInitDateRequest zhongAnCrawlerUploadInitDateRequest = new ZhongAnCrawlerUploadInitDateRequest(dataDTO, parameters);
         ZhongAnCrawlerUploadInitDateResponse uploadInitDateResponse = zhongAnCrawlerRequestComponent.uploadInitData(zhongAnCrawlerUploadInitDateRequest, headers);
         zhongAnCrawlerCacheComponent.setCache(uploadInitDateResponse.getValue().getDatas(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.INITDATE);
-
-
-        ZhongAnCrawlerOrder zhongAnCrawlerOrder = new ZhongAnCrawlerOrder();
         zhongAnCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
         zhongAnCrawlerOrder.setOrderNo(dataDTO.getOrderNo());
         zhongAnCrawlerOrder.setPolicyId(dataDTO.getPolicyId());
@@ -342,14 +337,23 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
         PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
         paymentLinkVo.setOrder(underwritingVo.getOrder());
         PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
-
-
+        // 通融待审核查询
+        ZhongAnCrawlerQueryAccommodationRequest queryAccommodationRequest = new ZhongAnCrawlerQueryAccommodationRequest(zhongAnCrawlerOrder.getQuoteId(), parameters);
+        ZhongAnCrawlerQueryAccommodationResponse queryAccommodationResponse = zhongAnCrawlerRequestComponent.queryAccommodation(queryAccommodationRequest, headers);
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        if (queryAccommodationResponse.getValue().getDatas().getAccommodation().getErrorCode() != null) {
+            String errorCode = JSONObject.toJSONString(queryAccommodationResponse.getValue().getDatas().getAccommodation().getErrorCode());
+            //核保状态
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            //核保结果
+            underwritingResultsVo.setUnderwritingResult("人工处理:" + errorCode);
+        } else {
+            //核保状态
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+            //核保结果
+            underwritingResultsVo.setUnderwritingResult("核保成功");
+        }
         underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
-        //核保结果
-        underwritingResultsVo.setUnderwritingResult("核保成功");
-        //核保状态
-        underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         //保司订单号
         underwritingResultsVo.setCompanyOrderNo(zhongAnCrawlerOrder.getOrderNo());
         // 交强险投保单号
@@ -467,6 +471,10 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
                     log.info("上传影像成功");
                 }
             }
+        } else {
+            if (uploadImageResponse != null && uploadImageResponse.getSuccess()) {
+                log.info("影像" + imageType + ":上传成功");
+            }
         }
     }
 
@@ -592,7 +600,7 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
                                 if (queryAccommodationResponse.getSuccess()) {
                                     ZhongAnCrawlerQueryAccommodationResponse.ValueDTO.DatasDTO.AccommodationDTO accommodationDTO = queryAccommodationResponse.getValue().getDatas().getAccommodation();
                                     if (accommodationDTO.getErrorCode() != null) {
-                                        orderStatusResultVo.setOrderStatusStr(accommodationDTO.getErrorCode());
+                                        orderStatusResultVo.setOrderStatusStr(JSONObject.toJSONString(accommodationDTO.getErrorCode()));
                                         orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.AUDIT_FAIL);
                                     }
                                 }

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -182,9 +182,16 @@ public class ReceivableController {
             receivableQueryVo.setAgreementType("2");
         }
         //return HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
-        receivableQueryVo.setSystemCode(baseController.getSystemCode());
+        String systemCode = baseController.getSystemCode();
+        receivableQueryVo.setSystemCode(systemCode);
         HttpResult<Page<InsPlyIncome>> ok = HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
         Page<InsPlyIncome> data = ok.getData();
+        
+        // 设置disableFlag:根据签单时间的年月、companyId、partnerCompanyId查询是否存在对账数据
+        if (data != null && data.getRecords() != null && !data.getRecords().isEmpty()) {
+            receivableService.setDisableFlagForOtherReceivable(data.getRecords(), systemCode);
+        }
+        
         InsPlyIncomeVO vo = receivableService.getReceivablePageIds(receivableQueryVo);
         vo.setInsPlyIncomePage(data);
         return HttpResult.ok(vo);

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

@@ -519,4 +519,14 @@ public interface ReceivableService extends IService<InsPlyIncome> {
     List<FollowCompanyFeeVO> followCompanySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo);
 
     List<PlatformCompanyFeeVO> platformCompanySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo);
+
+    /**
+     * 为私有协议跟单费列表设置disableFlag
+     * 根据签单时间的年月、companyId、partnerCompanyId查询ins_fee_follow_order表,有数据则disableFlag为1
+     * 如果没有数据再根据年月、partnerCompanyId查询ins_fee_follow_order_reconciliation表,有数据则disableFlag为1
+     * 否则disableFlag为0
+     * @param records 应收数据列表
+     * @param systemCode 租户代码
+     */
+    void setDisableFlagForOtherReceivable(List<InsPlyIncome> records, String systemCode);
 }

+ 93 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -963,7 +963,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     private List<InsPlyIncomeDto> queryFollowIncomeData(SettlementReportQueryVo queryVo) {
         QueryFollowIncomeVo incomeVo = new QueryFollowIncomeVo(
                 null, null, baseController.getSystemCode(), null,
-                queryVo.getCompanyId(), queryVo.getStartTime(), queryVo.getEndTime()
+                queryVo.getCompanyId(), queryVo.getStartTime(), queryVo.getEndTime(),
+                queryVo.getSigningStartTime(), queryVo.getSigningEndTime()
         );
         return baseMapper.queryFollowIncome(incomeVo);
     }
@@ -1011,6 +1012,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if (invoiceTimeCond) {
             invoiceWrapper.between(InsPlyIncomeInvoice::getInvoiceTime, toStartDateTime(invoiceStartTime), toEndDateTime(invoiceEndTime));
         }
+        invoiceWrapper.eq(InsPlyIncomeInvoice::getInvoiceType, queryVo.getInvoiceType());
         List<InsPlyIncomeInvoice> invoiceList = insPlyIncomeInvoiceMapper.selectList(invoiceWrapper);
         if ((StrUtil.isNotBlank(status) || invoiceTimeCond) && CollUtil.isEmpty(invoiceList)) {
             return new ArrayList<>(0);
@@ -1199,6 +1201,95 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return platformCompanyFeeVos;
     }
 
+    /**
+     * 为私有协议跟单费列表设置disableFlag
+     * 根据签单时间的年月、companyId、partnerCompanyId查询ins_fee_follow_order表,有数据则disableFlag为1
+     * 如果没有数据再根据年月、partnerCompanyId查询ins_fee_follow_order_reconciliation表,有数据则disableFlag为1
+     * 否则disableFlag为0
+     * @param records 应收数据列表
+     * @param systemCode 租户代码
+     */
+    @Override
+    public void setDisableFlagForOtherReceivable(List<InsPlyIncome> records, String systemCode) {
+        if (CollUtil.isEmpty(records)) {
+            return;
+        }
+
+        // 第一步:批量查询 ptl_agreement 表,补全 partner_company_id
+        Set<String> agreementIds = records.stream()
+                .filter(r -> StrUtil.isNotBlank(r.getAgreementId()))
+                .map(InsPlyIncome::getAgreementId)
+                .collect(Collectors.toSet());
+        
+        Map<String, String> agreementPartnerCompanyMap = new HashMap<>();
+        if (CollUtil.isNotEmpty(agreementIds)) {
+            LambdaQueryWrapper<PtlAgreement> agreementWrapper = new LambdaQueryWrapper<>();
+            agreementWrapper.in(PtlAgreement::getId, agreementIds);
+            List<PtlAgreement> agreements = ptlAgreementMapper.selectList(agreementWrapper);
+            for (PtlAgreement agreement : agreements) {
+                agreementPartnerCompanyMap.put(agreement.getId(), agreement.getPartnerCompanyId());
+            }
+        }
+        
+        // 将 partner_company_id 设置到对应的 ins_ply_income 对象中
+        for (InsPlyIncome record : records) {
+            if (StrUtil.isNotBlank(record.getAgreementId())) {
+                record.setPartnerCompanyId(agreementPartnerCompanyMap.get(record.getAgreementId()));
+            }
+        }
+
+        // 第二步:构建查询条件的唯一标识:year_month_companyId_partnerCompanyId
+        Map<String, InsPlyIncome> keyMap = new HashMap<>();
+        Set<Integer> years = new HashSet<>();
+        Set<Integer> months = new HashSet<>();
+        Set<String> companyIds = new HashSet<>();
+        Set<String> partnerCompanyIds = new HashSet<>();
+        
+        for (InsPlyIncome record : records) {
+            if (record.getSigningTime() == null || StrUtil.isBlank(record.getCompanyId()) || StrUtil.isBlank(record.getPartnerCompanyId())) {
+                record.setDisableFlag("0");
+                continue;
+            }
+            int year = record.getSigningTime().getYear();
+            int month = record.getSigningTime().getMonthValue();
+            String key = year + "_" + month + "_" + record.getCompanyId() + "_" + record.getPartnerCompanyId();
+            keyMap.put(key, record);
+            
+            years.add(year);
+            months.add(month);
+            companyIds.add(record.getCompanyId());
+            partnerCompanyIds.add(record.getPartnerCompanyId());
+        }
+
+        if (keyMap.isEmpty()) {
+            return;
+        }
+
+        Set<String> matchedKeys = new HashSet<>();
+
+        // 第一步:查询 ins_fee_follow_order 表(@TableLogic 自动处理 is_delete=0)
+        LambdaQueryWrapper<InsFeeFollowOrder> followOrderWrapper = new LambdaQueryWrapper<>();
+        followOrderWrapper.eq(InsFeeFollowOrder::getSystemCode, systemCode);
+        followOrderWrapper.in(InsFeeFollowOrder::getYear, years);
+        followOrderWrapper.in(InsFeeFollowOrder::getMonth, months);
+        followOrderWrapper.in(InsFeeFollowOrder::getCompanyId, companyIds);
+        followOrderWrapper.in(InsFeeFollowOrder::getPartnerCompanyId, partnerCompanyIds);
+        
+        List<InsFeeFollowOrder> followOrders = insFeeFollowOrderMapper.selectList(followOrderWrapper);
+        
+        for (InsFeeFollowOrder order : followOrders) {
+            String key = order.getYear() + "_" + order.getMonth() + "_" + order.getCompanyId() + "_" + order.getPartnerCompanyId();
+            if (keyMap.containsKey(key)) {
+                matchedKeys.add(key);
+            }
+        }
+
+        // 设置 disableFlag
+        for (Map.Entry<String, InsPlyIncome> entry : keyMap.entrySet()) {
+            entry.getValue().setDisableFlag(matchedKeys.contains(entry.getKey()) ? "1" : "0");
+        }
+    }
+
 
     /**
      * 填充应收订单的必要字段信息
@@ -4148,7 +4239,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         String systemCode = baseController.getUserSystemCode();
 
         // 查询该年份下的所有跟进收入数据,并按合作方公司ID进行分组
-        QueryFollowIncomeVo queryFollowIncomeVo = new QueryFollowIncomeVo(startYear, endYear, systemCode, null, null, null, null);
+        QueryFollowIncomeVo queryFollowIncomeVo = new QueryFollowIncomeVo(startYear, endYear, systemCode, null, null, null, null, null, null);
         List<InsPlyIncomeDto> incomes = baseMapper.queryFollowIncome(queryFollowIncomeVo);
 
         // ====================== 增加动态条件过滤 ======================

+ 4 - 0
tenant/organization/src/main/resources/mapper/InsFeeFollowOrderMapper.xml

@@ -96,6 +96,10 @@
             <if test="query.invoiceType != null and query.invoiceType != ''">
                 AND ffo.invoice_type = #{query.invoiceType}
             </if>
+            <!-- 签单时间范围筛选(年月格式:YYYY-MM) -->
+            <if test="query.signingStartTime != null and query.signingStartTime != '' and query.signingEndTime != null and query.signingEndTime != ''">
+                AND CONCAT(ffo.year, '-', LPAD(ffo.month, 2, '0')) BETWEEN #{query.signingStartTime} AND #{query.signingEndTime}
+            </if>
         </where>
     </select>
 

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

@@ -2108,6 +2108,10 @@
                     #{item}
                 </foreach>
             </if>
+            <!-- 签单时间范围筛选(年月格式:YYYY-MM) -->
+            <if test="query.signingStartTime != null and query.signingStartTime != '' and query.signingEndTime != null and query.signingEndTime != ''">
+                AND CONCAT(YEAR(a.signing_time), '-', LPAD(MONTH(a.signing_time), 2, '0')) BETWEEN #{query.signingStartTime} AND #{query.signingEndTime}
+            </if>
         </where>
     </select>
     <!-- 查询发票结算的金额 2026年6月22日15:48:33 lipf  -->

+ 154 - 0
修改出入口比例接口对接文档.md

@@ -0,0 +1,154 @@
+# 修改出入口比例接口对接文档
+
+## 1. 概述
+
+- **功能**:修改 `ins_fee_orders` 表中交强险、商业险、驾意险的入口比例和出口比例,并标记是否已手动修改。
+- **Base URL**:`{host}/supplementOrder`
+
+---
+
+## 2. 修改出入口比例
+
+### 2.1 接口信息
+
+| 项目             | 说明                              |
+|------------------|-----------------------------------|
+| **URL**          | `/supplementOrder/updateFeeRatio` |
+| **Method**       | `POST`                            |
+| **Content-Type** | `application/json`                |
+
+### 2.2 请求参数
+
+```json
+{
+  "orderNo": "OR2026072300001",
+  "jqInletRatio": 10,
+  "syInletRatio": 20,
+  "jyInletRatio": 5,
+  "jqExportRatio": 8,
+  "syExportRatio": 15,
+  "jyExportRatio": 3
+}
+```
+
+| 字段            | 类型       | 必填   | 说明                                                         |
+|-----------------|------------|--------|--------------------------------------------------------------|
+| `orderNo`       | String     | **是** | 订单号                                                       |
+| `jqInletRatio`  | BigDecimal | 否     | 交强险入口比例(0-100,服务端自动除以100,如传 10 表示 10%) |
+| `syInletRatio`  | BigDecimal | 否     | 商业险入口比例(0-100)                                      |
+| `jyInletRatio`  | BigDecimal | 否     | 驾意险入口比例(0-100)                                      |
+| `jqExportRatio` | BigDecimal | 否     | 交强险出口比例(0-100)                                      |
+| `syExportRatio` | BigDecimal | 否     | 商业险出口比例(0-100)                                      |
+| `jyExportRatio` | BigDecimal | 否     | 驾意险出口比例(0-100)                                      |
+
+> **说明**:6个比例字段均为可选,仅更新传入的非 `null` 值。前端传入 0-100 的百分比数值,服务端自动除以 100 后保存。
+
+### 2.3 返回结果
+
+#### 成功响应
+
+```json
+{
+  "code": 200,
+  "message": "success",
+  "data": {
+    "orderNo": "OR2026072300001",
+    "jqInletRatio": 0.10,
+    "syInletRatio": 0.20,
+    "jyInletRatio": 0.05,
+    "jqExportRatio": 0.08,
+    "syExportRatio": 0.15,
+    "jyExportRatio": 0.03,
+    "ratioModified": 1
+  }
+}
+```
+
+#### 失败响应
+
+```json
+{
+  "code": 500,
+  "message": "根据订单号查询订单费用表查无数据,订单号:OR2026072300001",
+  "data": null
+}
+```
+
+---
+
+## 3. 获取订单详情(含比例修改标识)
+
+### 3.1 接口信息
+
+| 项目       | 说明                              |
+|------------|-----------------------------------|
+| **URL**    | `/supplementOrder/getOrderDetail` |
+| **Method** | `GET`                             |
+
+### 3.2 请求参数
+
+| 参数       | 类型   | 必填   | 说明                                    |
+|------------|--------|--------|-----------------------------------------|
+| `ordersNo` | String | **是** | 订单号                                  |
+| `from`     | String | 否     | `share`=分享链接进入,其他=订单列表进入 |
+
+### 3.3 响应新增字段
+
+在 `data.insFeeOrders` 对象中新增字段:
+
+| 字段            | 类型    | 说明                                                     |
+|-----------------|---------|----------------------------------------------------------|
+| `ratioModified` | Integer | 出入口比例是否已手动修改<br>`0` - 未修改<br>`1` - 已修改 |
+
+#### 示例
+
+```json
+{
+  "code": 200,
+  "message": "success",
+  "data": {
+    "order": { "...": "..." },
+    "insFeeOrders": {
+      "orderNo": "OR2026072300001",
+      "jqPremium": "950.00",
+      "syPremium": "3000.00",
+      "jyPremium": "200.00",
+      "jqInletRatio": 0.10,
+      "syInletRatio": 0.20,
+      "jyInletRatio": 0.05,
+      "jqExportRatio": 0.08,
+      "syExportRatio": 0.15,
+      "jyExportRatio": 0.03,
+      "ratioModified": 1,
+      "...": "..."
+    },
+    "costRatio": { "...": "..." }
+  }
+}
+```
+
+---
+
+## 4. 处理逻辑说明
+
+1. **参数校验**:校验 `orderNo` 是否为空,查询 `ins_fee_orders` 表中是否存在该订单。
+2. **选择性更新**:仅更新请求中传入的非 `null` 比例字段,未传入的字段保持原值不变。
+3. **百分比转换**:前端传入 0-100 的数值,服务端调用 `covertPercent()` 除以 100 后保存(如前端传 10,保存为 0.10)。
+4. **关联比例联动**(入口比例变化时):
+    - 若新的入口比例 **小于** 手续费比例,则手续费比例强制调整为入口比例,跟单比例置为 0
+    - 若新的入口比例 **大于等于** 手续费比例,则跟单比例 = 入口比例 - 手续费比例
+5. **留点比例重算**:`留点比例 = 入口比例/税费因子 + 加投比例 - (出口比例 + 分销比例)`
+6. **含分销出口比例重算**:`含分销出口比例 = 出口比例 + 分销比例`
+7. **费用重算**:根据更新后的所有比例,调用 `calculatePremiumByRule` 重新计算每个险种的:
+    - 入口应收金额、手续费金额、跟单金额、加投金额、留点金额、出口金额、出口留点金额
+8. **汇总重算**:重新计算总应收金额 `totalReceivablePremium` 和总应付金额 `totalPayablePremium`
+9. **修改标识**:更新成功后自动将 `ratio_modified` 字段置为 `1`(已修改)。
+10. **返回数据**:返回完整的 `InsFeeOrders` 对象(含重算后的所有费用)。
+
+---
+
+## 5. 数据库变更
+
+```sql
+ALTER TABLE ins_fee_orders ADD COLUMN ratio_modified TINYINT DEFAULT 0 COMMENT '出入口比例是否已手动修改 0-未修改 1-已修改';
+```