Ver Fonte

Merge remote-tracking branch 'origin/master'

Qchen há 2 meses atrás
pai
commit
49021cecd5
25 ficheiros alterados com 564 adições e 41 exclusões
  1. 38 0
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostBatchAdjustParam.java
  2. 8 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  3. 6 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/QueryFollowIncomeVo.java
  4. 9 0
      commons/src/main/java/com/jzg/commons/entity/report/dto/FeeAuditSummaryVo.java
  5. 1 1
      commons/src/main/java/com/jzg/commons/entity/report/dto/ReportReceivableDataDto.java
  6. 43 0
      consoleStatistics/src/main/java/com/jzg/console/controller/ReportFinanceDataManageController.java
  7. 10 0
      consoleStatistics/src/main/java/com/jzg/console/service/ReportFeeAuditSummaryService.java
  8. 14 0
      consoleStatistics/src/main/java/com/jzg/console/service/ReportReceivableDataService.java
  9. 20 0
      consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportFeeAuditSummaryServiceImpl.java
  10. 89 0
      consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportReceivableDataServiceImpl.java
  11. 1 1
      consoleStatistics/src/main/resources/mapper/ReportFeeAuditSummaryMapper.xml
  12. 4 11
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Request/PremiumRequest.java
  13. 1 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerCacheComponent.java
  14. 2 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenPrpTmainDTO.java
  15. 2 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  16. 1 5
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java
  17. 111 15
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java
  18. 7 0
      tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java
  19. 8 1
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  20. 9 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java
  21. 10 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  22. 69 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java
  23. 93 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  24. 4 0
      tenant/organization/src/main/resources/mapper/InsFeeFollowOrderMapper.xml
  25. 4 0
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

+ 38 - 0
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostBatchAdjustParam.java

@@ -0,0 +1,38 @@
+package com.jzg.commons.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 批量加减费用请求参数
+ *
+ * @author lipf
+ * @date 2026/7/24
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "批量加减费用请求参数")
+public class PtlAgreementCostBatchAdjustParam {
+
+    @NotEmpty(message = "费用ID列表不能为空")
+    @Schema(description = "费用ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> costIds;
+
+    @NotNull(message = "操作类型不能为空")
+    @Schema(description = "操作类型:ADD-加,SUBTRACT-减", requiredMode = Schema.RequiredMode.REQUIRED, example = "ADD")
+    private String operationType;
+
+    @Schema(description = "入口比例调整值(百分比)")
+    private BigDecimal inletRatio;
+
+    @Schema(description = "入口留点比例调整值(百分比)")
+    private BigDecimal inletKeepPointRatio;
+}

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

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

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

+ 111 - 15
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java

@@ -6,13 +6,13 @@ import com.jzg.commons.constants.quote.enums.base.InsuranceImageEnum;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
-import com.jzg.commons.entity.quote.vo.base.LoginBase;
-import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
@@ -351,27 +351,123 @@ public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
 
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
+        // 获取配置信息
         OrderBase order = underwritingVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
-        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
-                attributionInformationVo.getConfigInfo());
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(
+                TaipingCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
         HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+
+        // 获取订单信息
         TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.findByOrdersNo(underwritingVo.getOrder().getOrdersNo());
-        // 验证信息
-        TaiPingCrawlerPremiumCalculateData taiPingCrawlerPremiumCalculateData = taiPingCrawlerCacheComponent.getTaiPingCrawlerPremiumCalculateData(underwritingVo.getOrder()
-                .getOrdersNo());
-        TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest = taiPingCrawlerCacheComponent.getTaiPingCrawlerPremiumCalculateRequest(underwritingVo.getOrder()
-                .getOrdersNo());
+
+        // 获取缓存的报价请求
+        TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest = taiPingCrawlerCacheComponent
+                .getTaiPingCrawlerPremiumCalculateRequest(underwritingVo.getOrder().getOrdersNo());
+
+        // 重新计算保费(核保前必须设置forceLinkCIFlag关联交商)
         taiPingCrawlerPremiumCalculateRequest.getPfMainDto().setForceLinkCIFlag(true);
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> taiPingCrawlerPremiumCalculate = taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
-        TaiPingCrawlerSubmitValidateRequest taiPingCrawlerSubmitValidateRequest = new TaiPingCrawlerSubmitValidateRequest(taiPingCrawlerPremiumCalculate.getData(), taiPingCrawlerPremiumCalculateRequest,taiPingCrawlerOrder);
-        String request = JSON.toJSONString(taiPingCrawlerSubmitValidateRequest);
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerSubmitValidateData> taiPingCrawlerSubmitValidateData = taiPingCrawlerRequestComponent.submitValidate(taiPingCrawlerPremiumCalculate.getData(), httpHeaders,parameters);
-        // 核保
+        log.info("[太平核保]保费重算请求: orderNo={}", taiPingCrawlerOrder.getCompanyOrderNo());
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> recalculateResponse =
+                taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
+        if (!recalculateResponse.isSucc()) {
+            throw new SystemException("保费重算失败:" + recalculateResponse.getErrMsg());
+        }
+        log.info("[太平核保]保费重算成功");
+
+        // 提交验证
+        TaiPingCrawlerSubmitValidateRequest submitValidateRequest = new TaiPingCrawlerSubmitValidateRequest(
+                recalculateResponse.getData(), taiPingCrawlerPremiumCalculateRequest, taiPingCrawlerOrder);
+        log.info("[太平核保]提交验证请求: {}", JSON.toJSONString(submitValidateRequest));
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerSubmitValidateData> submitValidateResponse =
+                taiPingCrawlerRequestComponent.submitValidate(recalculateResponse.getData(), httpHeaders, parameters);
+        log.info("[太平核保]提交验证响应: succ={}, errMsg={}", submitValidateResponse.isSucc(), submitValidateResponse.getErrMsg());
+        if (!submitValidateResponse.isSucc()) {
+            throw new SystemException("提交验证失败:" + submitValidateResponse.getErrMsg());
+        }
+
+        // 提交核保
         TaiPingCrawlersSubmitToAuditRequest submitToAuditRequest = new TaiPingCrawlersSubmitToAuditRequest(taiPingCrawlerOrder.getCompanyOrderNo());
-        TaiPingCrawlerBaseResponse<TaiPingCrawlersSubmitToAuditData> submitToAuditData = taiPingCrawlerRequestComponent.submitToAudit(submitToAuditRequest, httpHeaders,parameters);
+        log.info("[太平核保]提交核保请求: {}", JSON.toJSONString(submitToAuditRequest));
+        TaiPingCrawlerBaseResponse<TaiPingCrawlersSubmitToAuditData> submitToAuditResponse =
+                taiPingCrawlerRequestComponent.submitToAudit(submitToAuditRequest, httpHeaders, parameters);
+        log.info("[太平核保]提交核保响应: {}", JSON.toJSONString(submitToAuditResponse));
 
+        // 构建返回结果
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        underwritingResultsVo.setOrdersNo(underwritingVo.getOrder().getOrdersNo());
+        underwritingResultsVo.setCompanyOrderNo(taiPingCrawlerOrder.getCompanyOrderNo());
+
+        // 核保请求失败
+        if (!submitToAuditResponse.isSucc()) {
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            underwritingResultsVo.setUnderwritingResult(submitToAuditResponse.getErrMsg());
+            return underwritingResultsVo;
+        }
+
+        // 解析核保结果
+        TaiPingCrawlersSubmitToAuditData submitToAuditData = submitToAuditResponse.getData();
+        if (submitToAuditData == null || submitToAuditData.getSubmitAuditResultDto() == null
+                || submitToAuditData.getSubmitAuditResultDto().getAuditResultList() == null
+                || submitToAuditData.getSubmitAuditResultDto().getAuditResultList().isEmpty()) {
+            underwritingResultsVo.setUnderwritingResult("核保处理中");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            return underwritingResultsVo;
+        }
+
+        // 提取交强险和商业险核保结果
+        List<TaiPingCrawlersSubmitToAuditData.SubmitAuditResultDtoDTO.AuditResultListDTO> auditResultList =
+                submitToAuditData.getSubmitAuditResultDto().getAuditResultList();
+        String jqUnderWriteInd = "";
+        String syUnderWriteInd = "";
+        String jqProposalNo = "";
+        String syProposalNo = "";
+        for (TaiPingCrawlersSubmitToAuditData.SubmitAuditResultDtoDTO.AuditResultListDTO result : auditResultList) {
+            if ("0801".equals(result.getProductCode())) {
+                jqUnderWriteInd = result.getUnderWriteInd();
+                jqProposalNo = result.getProposalNo();
+            } else if ("0802".equals(result.getProductCode())) {
+                syUnderWriteInd = result.getUnderWriteInd();
+                syProposalNo = result.getProposalNo();
+            }
+        }
+
+        // 设置投保单号
+        underwritingResultsVo.setJqApplyNo(jqProposalNo);
+        underwritingResultsVo.setSyApplyNo(syProposalNo);
+
+        // 根据underWriteInd判断核保状态(与queryOrderState保持一致的映射规则)
+        if ("8".equals(jqUnderWriteInd) || "9".equals(jqUnderWriteInd)
+                || "8".equals(syUnderWriteInd) || "9".equals(syUnderWriteInd)) {
+            // 人工核保
+            underwritingResultsVo.setUnderwritingResult("人工核保");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+        } else if ("2".equals(jqUnderWriteInd) || "2".equals(syUnderWriteInd)) {
+            // 核保失败
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            underwritingResultsVo.setUnderwritingResult("核保失败");
+        } else if (containsPass(jqUnderWriteInd) || containsPass(syUnderWriteInd)) {
+            // 核保通过,获取支付链接
+            underwritingResultsVo.setUnderwritingResult("核保通过");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+            try {
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(underwritingVo.getOrder());
+                PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+            } catch (Exception e) {
+                log.warn("[太平核保]获取支付链接失败: {}", e.getMessage());
+            }
+        } else if ("6".equals(jqUnderWriteInd) || "6".equals(syUnderWriteInd)) {
+            // 已承保
+            underwritingResultsVo.setUnderwritingResult("已承保");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.UNDERWRITED);
+        } else {
+            // 未知状态,默认转人工处理
+            underwritingResultsVo.setUnderwritingResult("核保处理中");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+        }
+
         return underwritingResultsVo;
     }
 

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java

@@ -19,6 +19,7 @@ import com.jzg.organization.service.PtlAgreementDeptService;
 import com.jzg.organization.service.PtlAgreementService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -227,6 +228,12 @@ public class AgreementController extends BaseController {
         return ptlAgreementCostService.batchUpdateValidDate(param);
     }
 
+    @Operation(summary = "批量加减费用比例")
+    @PostMapping("/batchAdjustCostRatio")
+    public HttpResult<String> batchAdjustCostRatio(@RequestBody @Valid PtlAgreementCostBatchAdjustParam param) {
+        return ptlAgreementCostService.batchAdjustCostRatio(param);
+    }
+
     /**
      * 外部协议添加
      * @param param

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

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java

@@ -69,4 +69,13 @@ public interface PtlAgreementCostService extends IService<PtlAgreementCost> {
      */
     HttpResult<String> batchUpdateValidDate(PtlAgreementCostBatchUpdateValidDateParam param);
 
+    /**
+     * 批量加减费用比例
+     *
+     * @param param 批量调整参数
+     * @author lipf
+     * @date 2026/7/24
+     */
+    HttpResult<String> batchAdjustCostRatio(PtlAgreementCostBatchAdjustParam param);
+
 }

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

+ 69 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

@@ -42,6 +42,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
@@ -499,6 +500,74 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
                 ? HttpResult.ok("批量修改成功,共修改 " + finalCostIds.size() + " 条记录")
                 : HttpResult.error("批量修改失败");
     }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult<String> batchAdjustCostRatio(PtlAgreementCostBatchAdjustParam param) {
+        log.info("批量调整费用比例。param=[{}]", JSONUtil.toJsonStr(param));
+
+        if (CollectionUtils.isEmpty(param.getCostIds())) {
+            return HttpResult.error("费用ID列表不能为空");
+        }
+
+        // 查询所有需要调整的费用类型记录
+        LambdaQueryWrapper<PtlAgreementCostType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(PtlAgreementCostType::getPtlAgreementCostId, param.getCostIds());
+        List<PtlAgreementCostType> costTypeList = ptlAgreementCostTypeService.list(queryWrapper);
+
+        if (CollectionUtils.isEmpty(costTypeList)) {
+            return HttpResult.error("未找到需要调整的费用类型记录");
+        }
 
+        boolean isAdd = "ADD".equalsIgnoreCase(param.getOperationType());
+
+        for (PtlAgreementCostType costType : costTypeList) {
+            String costTypeStr = costType.getCostType();
+
+            // 根据费用类型进行调整
+            if ("交强险".equals(costTypeStr)) {
+                adjustCostType(costType, param.getInletRatio(), param.getInletKeepPointRatio(), isAdd);
+            } else if ("商业险".equals(costTypeStr)) {
+                adjustCostType(costType, param.getInletRatio(), param.getInletKeepPointRatio(), isAdd);
+            } else if ("驾意险".equals(costTypeStr)) {
+                adjustCostType(costType, param.getInletRatio(), param.getInletKeepPointRatio(), isAdd);
+            }
+        }
+
+        // 批量更新
+        ptlAgreementCostTypeService.updateBatchById(costTypeList);
+
+        return HttpResult.ok("批量调整成功");
+    }
+
+    /**
+     * 调整费用类型的各项比例
+     */
+    private void adjustCostType(PtlAgreementCostType costType, BigDecimal inlet,
+                                BigDecimal keepPointRatio, boolean isAdd) {
+        // 入口比例
+        if (inlet != null) {
+            costType.setInlet(calculateNewValue(costType.getInlet(), inlet, isAdd));
+        }
+        // 入口留点比例
+        if (keepPointRatio != null) {
+            costType.setKeepPointRatio(calculateNewValue(costType.getKeepPointRatio(), keepPointRatio, isAdd));
+        }
+    }
+
+    /**
+     * 计算新值
+     */
+    private BigDecimal calculateNewValue(BigDecimal currentValue, BigDecimal adjustValue, boolean isAdd) {
+        if (currentValue == null) {
+            currentValue = BigDecimal.ZERO;
+        }
+        if (isAdd) {
+            return currentValue.add(adjustValue);
+        } else {
+            BigDecimal result = currentValue.subtract(adjustValue);
+            // 确保结果不小于0
+            return result.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : result;
+        }
+    }
 
 }

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