Parcourir la source

Merge remote-tracking branch 'origin/dev_jzg_lipf_v20260622'

jiakai il y a 2 mois
Parent
commit
f483f62e57

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/finance/dto/CompanySuperviseSettlementReportDto.java

@@ -20,6 +20,8 @@ public class CompanySuperviseSettlementReportDto implements Serializable {
     private static final long serialVersionUID = -2428003756552348627L;
     @Schema(description = "保险公司Id")
     private String companyId;
+    @Schema(description = "对接人手机号")
+    private String contactPersonPhone;
 
     @Schema(description = "保险公司Id")
     private String id;

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/finance/dto/ReceiverSettlementReportDto.java

@@ -3,6 +3,9 @@ package com.jzg.commons.entity.finance.dto;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
+
 /**
  * @author quchen
  * @date 2025/9/16 10:32
@@ -52,4 +55,7 @@ public class ReceiverSettlementReportDto {
 
     @Schema(description = "已结算发票的发票号")
     private String invoiceIds;
+
+    @Schema(description = "回款差额")
+    private BigDecimal totalPaymentDifference;
 }

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

@@ -61,4 +61,10 @@ public class InsPlyIncomeInvoice extends BaseModel {
 
     @Schema(description = "租户代码")
     private String systemCode;
+
+    @Schema(description = "对接人名称")
+    private String contactPerson;
+
+    @Schema(description = "对接人手机号")
+    private String contactPersonPhone;
 }

+ 10 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/FollowCompanyFeeVO.java

@@ -1,6 +1,7 @@
 package com.jzg.commons.entity.finance.vo;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -15,6 +16,12 @@ public class FollowCompanyFeeVO {
 
     private String companyId;
 
+    @Schema(description = "对接人")
+    private String contactPerson;
+
+    @Schema(description = "对接人手机号")
+    private String contactPersonPhone;
+
     /** 分支保险公司ID partner_company_id */
     private String partnerCompanyId;
 
@@ -30,6 +37,9 @@ public class FollowCompanyFeeVO {
     /** 未结算总金额  totalInvoiced - totalSettlementAmount */
     private BigDecimal totalUnSettlementAmount;
 
+    /** 回款差额 */
+    private BigDecimal totalPaymentDifference;
+
     /** 累计应收  totalReceivable */
     private BigDecimal totalReceivable;
 

+ 38 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeInvoiceSettlementVo.java

@@ -0,0 +1,38 @@
+package com.jzg.commons.entity.finance.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.jzg.commons.core.base.BaseModel;
+import com.jzg.commons.util.idgen.IdGenerate;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "财务应收开票结算表")
+public class InsPlyIncomeInvoiceSettlementVo extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = -2019053289601744522L;
+
+    @Schema(description = "票据iD")
+    private String invoiceId;
+
+    @Schema(description = "实收金额")
+    private BigDecimal actualReceivedAmount;
+
+    @Schema(description = "收款日期")
+    private Date receivePaymentDate;
+
+    @Schema(description = "回款差额")
+    private BigDecimal settlementPaymentDifference;
+
+    @Schema(description = "回款原因")
+    private String settlementPaymentReason;
+
+
+}

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementQueryVo.java

@@ -25,6 +25,9 @@ public class SettlementQueryVo extends PageRequest {
     @Schema(description = "保险公司Id")
     private String companyId;
 
+    @Schema(description = "保险公司Id")
+    private String partnerCompanyId;
+
     @Schema(description = "应收项")
     private String invoiceRiskType;
 

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

@@ -16,6 +16,12 @@ public class SettlementReportQueryVo extends PageRequest {
     @Schema(description = "保险公司id")
     private String companyId;
 
+    @Schema(description = "对接人")
+    private String contactPerson;
+
+    @Schema(description = "对接人手机号")
+    private String contactPersonPhone;
+
     @Schema(description = "创建开始时间")
     private String startTime;
 

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

@@ -1791,6 +1791,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         if(batchModifyVo.getJqSuperviseCostsProportion() != null && batchModifyVo.getJqOtherCostsProportion() == null){
             jqInletRatio = insFeeOrders.getJqInletRatio();
             jqCommissionRatio = batchModifyVo.getJqSuperviseCostsProportion();
+            if (jqCommissionRatio.compareTo(jqInletRatio) > 0){
+                jqCommissionRatio = jqInletRatio;
+            }
             jqFollowRatio = BigDecimalUtil.subtract(jqInletRatio,jqCommissionRatio);
         }else if(batchModifyVo.getJqSuperviseCostsProportion() == null && batchModifyVo.getJqOtherCostsProportion() != null){
              jqCommissionRatio = insFeeOrders.getJqCommissionRatio();
@@ -1816,6 +1819,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         if(batchModifyVo.getSySuperviseCostsProportion() != null && batchModifyVo.getSyOtherCostsProportion() == null){
             syInletRatio = insFeeOrders.getSyInletRatio();
             syCommissionRatio = batchModifyVo.getSySuperviseCostsProportion();
+            if (syCommissionRatio.compareTo(syInletRatio) > 0){
+                syCommissionRatio = syInletRatio;
+            }
             syFollowRatio = BigDecimalUtil.subtract(syInletRatio,syCommissionRatio);
         }else if(batchModifyVo.getSySuperviseCostsProportion() == null && null != batchModifyVo.getSyOtherCostsProportion()){
             syCommissionRatio = insFeeOrders.getSyCommissionRatio();
@@ -1841,6 +1847,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         if(batchModifyVo.getJySuperviseCostsProportion() != null && batchModifyVo.getJyOtherCostsProportion() == null){
             jyInletRatio = insFeeOrders.getJyInletRatio();
             jyCommissionRatio = batchModifyVo.getJySuperviseCostsProportion();
+            if (jyCommissionRatio.compareTo(jyInletRatio) > 0){
+                jyCommissionRatio = jyInletRatio;
+            }
             jyFollowRatio = BigDecimalUtil.subtract(jyInletRatio,jyCommissionRatio);
         }else if(batchModifyVo.getJySuperviseCostsProportion() == null && batchModifyVo.getJyOtherCostsProportion() != null){
             jyCommissionRatio = insFeeOrders.getJyCommissionRatio();

+ 19 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -628,6 +628,13 @@ public class ReceivableController {
         return HttpResult.ok(receivableService.superviseSettlementDetailExcel(page,settlementQueryVo));
     }
 
+    @PostMapping("followSettlementDetailExcel")
+    @Operation(summary = "跟单手续费结算明细")
+    public HttpResult followSettlementDetailExcel(@RequestBody SettlementQueryVo settlementQueryVo) {
+        Page page = settlementQueryVo.getPage();
+        return HttpResult.ok(receivableService.followSettlementDetailExcel(page,settlementQueryVo));
+    }
+
     @PostMapping("exportSuperviseSettlementDetailExcel")
     @Operation(summary = "导出应收手续费结算明细excel文件")
     public void exportSuperviseSettlementDetailExcel(@RequestBody SettlementQueryVo settlementQueryVo) throws IOException {
@@ -717,6 +724,18 @@ public class ReceivableController {
         return HttpResult.ok(receivableService.followCompanySuperviseSettlementReport(settlementReportQueryVo));
     }
 
+    /**
+     * 平台保险公司报表统计接口
+     *
+     * @author jk
+     * @date 2026/5/28 11:15
+     */
+    @PostMapping("/platformCompanySuperviseSettlementReport")
+    @Operation(summary = "平台公司结算报表")
+    public HttpResult<List<FollowCompanyFeeVO>> platformCompanySuperviseSettlementReport(@RequestBody SettlementReportQueryVo settlementReportQueryVo) {
+        return HttpResult.ok(receivableService.platformCompanySuperviseSettlementReport(settlementReportQueryVo));
+    }
+
     /**
      * 设置指定发票为结算完成状态
      *

+ 17 - 7
tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java

@@ -4,12 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.finance.dto.*;
 import com.jzg.commons.entity.finance.po.*;
-import com.jzg.commons.entity.finance.vo.InvoiceRecordQueryVo;
-import com.jzg.commons.entity.finance.vo.InvoiceRecordResult;
-import com.jzg.commons.entity.finance.vo.InvoicingVo;
-import com.jzg.commons.entity.finance.vo.ReceivableQueryVo;
-import com.jzg.commons.entity.finance.vo.SettlementQueryVo;
-import com.jzg.commons.entity.finance.vo.SettlementReportQueryVo;
+import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.organization.entity.dto.CalRes;
 import org.apache.ibatis.annotations.Mapper;
@@ -111,6 +106,13 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      */
     Page<ExportSuperviseSettlementExcelDto> followSettlementExcelDtos(Page page,@Param("settlementQueryVo") SettlementQueryVo settlementQueryVo);
 
+    /**
+     * 获取平台结算记录列表
+     * @param settlementQueryVo
+     * @return
+     */
+    Page<InvoiceRecordResult> followSettlementDetailExcel(Page page,@Param("settlementQueryVo") SettlementQueryVo settlementQueryVo);
+
     /**
      * 获取应收结算记录明细列表
      * @param settlementQueryVo
@@ -118,6 +120,13 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      */
     Page<ExportSuperviseSettlementDetailExcelDto> getSuperviseSettlementDetailExcelDtos(Page page,@Param("settlementQueryVo") SettlementQueryVo settlementQueryVo);
 
+    /**
+     * 获取应收结算记录明细列表
+     * @param settlementQueryVo
+     * @return
+     */
+    Page<ExportSuperviseSettlementDetailExcelDto> getPlatFormSettlementDetailExcelDtos(Page page,@Param("settlementQueryVo") SettlementQueryVo settlementQueryVo);
+
     /**
      * 获取应收结算记录明细列表(非车)
      * @param settlementQueryVo
@@ -275,6 +284,7 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      * @author lipf
      * @date 2026/6/22 15:47
      */
-    BigDecimal querySettledAmountByInvoiceIds(@Param("invoiceIdList") List<String> invoiceIdList);
+    InsPlyIncomeInvoiceSettlementVo querySettledAmountByInvoiceIds(@Param("invoiceIdList") List<String> invoiceIdList);
 
+    List<FollowCompanyFeeVO> selectPlatformCompanySettlementReport(@Param("query") SettlementReportQueryVo settlementReportQueryVo);
 }

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

@@ -253,6 +253,11 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      * 应收手续费结算明细
      */
     Page<ExportSuperviseSettlementDetailExcelDto> superviseSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo);
+
+    /**
+     * 应收手续费结算明细
+     */
+    Page<InvoiceRecordResult> followSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo);
     /**
      * 导出应收手续费结算明细excel(车险)
      */
@@ -505,4 +510,6 @@ public interface ReceivableService extends IService<InsPlyIncome> {
     Boolean deleteFollowInvoiceById(String id);
 
     List<FollowCompanyFeeVO> followCompanySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo);
+
+    List<FollowCompanyFeeVO> platformCompanySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo);
 }

+ 90 - 4
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.lang.tree.TreeNodeConfig;
 import cn.hutool.core.lang.tree.TreeUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.EasyExcel;
@@ -601,6 +602,23 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return followCompanyFeeVos;
     }
 
+    @Override
+    public List<FollowCompanyFeeVO> platformCompanySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo) {
+        log.info("平台协议-结算记录-结算报表: settlementReportQueryVo=[{}]", JSONUtil.toJsonStr(settlementReportQueryVo));
+
+        List<FollowCompanyFeeVO> platformCompanyFeeVos = baseMapper.selectPlatformCompanySettlementReport(settlementReportQueryVo);
+        // 过滤掉对接人和对接人手机号为空的数据
+        List<FollowCompanyFeeVO> list = platformCompanyFeeVos.stream().filter(plat -> StrUtil.isNotBlank(plat.getContactPerson()) && StrUtil.isNotBlank(plat.getContactPersonPhone())).toList();
+        // 查询所有保险公司,匹配保险公司的id和名称
+        HttpResult<Map<String, EsmInsCompany>> mapHttpResult = esmInsCompanyClient.queryAllCompanyMap();
+        Map<String, EsmInsCompany> data = mapHttpResult.getData();
+        for (FollowCompanyFeeVO platformCompanyFeeVo : list) {
+            platformCompanyFeeVo.setCompanyName(null != data.get(platformCompanyFeeVo.getCompanyId()) ? data.get(platformCompanyFeeVo.getCompanyId()).getName() : "");
+            platformCompanyFeeVo.setTotalUnSettlementAmount(BigDecimal.ZERO);
+        }
+        return list;
+    }
+
     /**
      * BigDecimal安全相加工具:null值转为0
      */
@@ -1094,6 +1112,11 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         SettlementVo settlementVo = platformSettlementVo.getSettlementVo();
         InvoicingVo invoicingVo = platformSettlementVo.getInvoicingVo();
         log.info("平台结算:platformSettlement=[{}]", JSONUtil.toJsonStr(platformSettlementVo));
+
+        if (StrUtil.isBlank(platformSettlementVo.getInvoicingVo().getContactPerson())
+                || StrUtil.isBlank(platformSettlementVo.getInvoicingVo().getContactPersonPhone())){
+            throw new SystemException("对接人信息不能为空");
+        }
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         LocalDateTime settlementDateTime = LocalDateTime.parse(platformSettlementVo.getSettlementVo().getReceivePaymentDate(), formatter);
         try {
@@ -1117,6 +1140,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             invoice.setOverinflatedAmount(invoicingVo.getOverinflatedAmount());
             invoice.setReceivableSupervisePremium(invoicingVo.getReceivablePremium());
             invoice.setTaxPoint(invoicingVo.getTaxPoint());
+            invoice.setContactPerson(platformSettlementVo.getInvoicingVo().getContactPerson());
+            invoice.setContactPersonPhone(platformSettlementVo.getInvoicingVo().getContactPersonPhone());
 
             List<InsPlyIncomeInvoiceLink> invoicingLinkList = new ArrayList<>();
 
@@ -2325,6 +2350,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if(batchModifyVo.getJqSuperviseCostsProportion() != null && batchModifyVo.getJqOtherCostsProportion() == null){
             jqInletRatio = insFeeOrders .getJqInletRatio();
             jqCommissionRatio = batchModifyVo.getJqSuperviseCostsProportion();
+            if (jqCommissionRatio.compareTo(jqInletRatio) > 0){
+                jqCommissionRatio = jqInletRatio;
+            }
             jqFollowRatio = BigDecimalUtil.subtract(jqInletRatio,jqCommissionRatio);
         }else if(batchModifyVo.getJqSuperviseCostsProportion() == null && batchModifyVo.getJqOtherCostsProportion() != null){
             jqCommissionRatio = BigDecimalUtil.null2Zero(insPlyIncome.getJqSuperviseCostsProportion());
@@ -2350,6 +2378,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if(batchModifyVo.getSySuperviseCostsProportion() != null && batchModifyVo.getSyOtherCostsProportion() == null){
             syInletRatio = insFeeOrders.getSyInletRatio();
             syCommissionRatio = batchModifyVo.getSySuperviseCostsProportion();
+            if (syCommissionRatio.compareTo(syInletRatio) > 0){
+                syCommissionRatio = syInletRatio;
+            }
             syFollowRatio = BigDecimalUtil.subtract(syInletRatio,syCommissionRatio);
         }else if(batchModifyVo.getSySuperviseCostsProportion() == null && null != batchModifyVo.getSyOtherCostsProportion()){
             syCommissionRatio = BigDecimalUtil.null2Zero(insPlyIncome.getSySuperviseCostsProportion());
@@ -2375,6 +2406,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if(batchModifyVo.getJySuperviseCostsProportion() != null && batchModifyVo.getJyOtherCostsProportion() == null){
             jyInletRatio = insFeeOrders.getJyInletRatio();
             jyCommissionRatio = batchModifyVo.getJySuperviseCostsProportion();
+            if (jyCommissionRatio.compareTo(jyInletRatio) > 0){
+                jyCommissionRatio = jyInletRatio;
+            }
             jyFollowRatio = BigDecimalUtil.subtract(jyInletRatio,jyCommissionRatio);
         }else if(batchModifyVo.getJySuperviseCostsProportion() == null && batchModifyVo.getJyOtherCostsProportion() != null){
             jyCommissionRatio = BigDecimalUtil.null2Zero(insPlyIncome.getJySuperviseCostsProportion());
@@ -3515,7 +3549,12 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     public Page<ExportSuperviseSettlementDetailExcelDto> superviseSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo) {
         log.info("superviseSettlementDetailExcel:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
         settlementQueryVo.setSystemCode(baseController.getSystemCode());
-        Page<ExportSuperviseSettlementDetailExcelDto> exportSuperviseSettlementDetailExcelDtos = baseMapper.getSuperviseSettlementDetailExcelDtos(page, settlementQueryVo);
+        Page<ExportSuperviseSettlementDetailExcelDto> exportSuperviseSettlementDetailExcelDtos = null;
+        if (settlementQueryVo.getInvoiceTypes().contains("5") && settlementQueryVo.getInvoiceTypes().contains("6")) {
+            exportSuperviseSettlementDetailExcelDtos = baseMapper.getPlatFormSettlementDetailExcelDtos(page, settlementQueryVo);
+        }else{
+            exportSuperviseSettlementDetailExcelDtos = baseMapper.getSuperviseSettlementDetailExcelDtos(page, settlementQueryVo);
+        }
         exportSuperviseSettlementDetailExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
                 dto.setInvoiceParty("我方开票");
@@ -3531,6 +3570,52 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return exportSuperviseSettlementDetailExcelDtos;
     }
 
+    @Override
+    public Page<InvoiceRecordResult> followSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo) {
+        log.info("followSettlementDetailExcel:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
+        Page<InvoiceRecordResult> invoiceRecordResultPage = baseMapper.followSettlementDetailExcel(page, settlementQueryVo);
+        List<InvoiceRecordResult> records = invoiceRecordResultPage.getRecords();
+        if(CollUtil.isNotEmpty(records)){
+            Map<String, String> allCompanyHierarchyPaths = esmInsCompanyClient.getAllCompanyHierarchyPaths();
+            records.stream().peek(action->{
+                if (action.getInvoiceParty().equals("1")) {
+                    action.setInvoiceParty("我方开票");
+                } else if (action.getInvoiceParty().equals("2")) {
+                    action.setInvoiceParty("保司开票");
+                }
+                if (action.getStatus().equals("1")) {
+                    action.setStatus("已结算");
+                } else if (action.getStatus().equals("0")) {
+                    action.setStatus("未结算");
+                }
+                String settlementStatusName = Constant.settlementStatusMap.get(Objects.toString(action.getStatus(),""));
+                action.setSettlementStatusName(settlementStatusName);
+                String invoiceRiskTypeName = Constant.invoiceRiskTypeMap.get(Objects.toString(action.getInvoiceRiskType(), ""));
+                action.setAccountsReceivable(invoiceRiskTypeName);
+                action.setInvoiceRiskTypeName(invoiceRiskTypeName);
+                List<InsPlyIncomeInvoiceSettlement> insPlyIncomeInvoiceSettlements = baseMapper.queryInvoiceSettlementByInvoiceId(action.getId());
+                BigDecimal settlementAmount = insPlyIncomeInvoiceSettlements.stream()
+                        .map(InsPlyIncomeInvoiceSettlement::getActualReceivedAmount)
+                        .filter(Objects::nonNull)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal receivableSupervisePremium = action.getReceivableSupervisePremium()  != null ? action.getReceivableSupervisePremium(): BigDecimal.ZERO;
+//                BigDecimal overinflatedAmount = action.getOverinflatedAmount() != null? action.getOverinflatedAmount(): BigDecimal.ZERO;
+                // 待结算金额 = 开票金额 - 已收金额
+                BigDecimal remainSettlementAmount = receivableSupervisePremium.subtract(settlementAmount);
+                // 设置已结算的金额
+                action.setSettlementAmount(settlementAmount);
+                // 设置待结算金额
+                action.setRemainSettlementAmount(remainSettlementAmount);
+                action.setCompanyAllName(allCompanyHierarchyPaths.get(Objects.toString(action.getCompanyId(),"")));
+                action.setSettlementStatus(settlementStatusName);
+                // 开票金额
+                action.setReceivableAmount(action.getReceivableSupervisePremium().subtract(action.getOverinflatedAmount()).toString());
+            }).toList();
+        }
+        return invoiceRecordResultPage;
+    }
+
     /**
      * 导出应收手续费结算记录明细
      *
@@ -4101,9 +4186,10 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                     List<String> invoiceIdList = Arrays.asList(invoiceIds.split(","));
                     log.info("invoiceIdList.size=[{}]", CollUtil.size(invoiceIdList));
                     log.info("invoiceIdList=[{}]", JSONUtil.toJsonStr(invoiceIdList));
-                    BigDecimal amount = baseMapper.querySettledAmountByInvoiceIds(invoiceIdList);
-                    action.setSettledAmount(Objects.toString(amount,"0"));
-                    action.setUnSettledAmount(BigDecimalUtil.subtract(new BigDecimal(action.getTotalReceivable()),amount).toString());
+                    InsPlyIncomeInvoiceSettlementVo insPlyIncomeInvoiceSettlementVo = baseMapper.querySettledAmountByInvoiceIds(invoiceIdList);
+                    action.setSettledAmount(Objects.toString(insPlyIncomeInvoiceSettlementVo.getActualReceivedAmount(),"0"));
+                    action.setTotalPaymentDifference(insPlyIncomeInvoiceSettlementVo.getSettlementPaymentDifference());
+                    action.setUnSettledAmount(BigDecimalUtil.subtract(new BigDecimal(action.getTotalReceivable()),insPlyIncomeInvoiceSettlementVo.getActualReceivedAmount()).toString());
                 }else{
                     action.setSettledAmount("0");
                     action.setUnSettledAmount(BigDecimalUtil.subtract(new BigDecimal(action.getTotalReceivable()),BigDecimal.ZERO).toString());

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

@@ -48,10 +48,10 @@
     <select id="selectFollowCompanySettlementReport" resultType="com.jzg.commons.entity.finance.vo.FollowCompanyFeeVO">
         SELECT
         ffo.partner_company_id AS partnerCompanyId,
-        COALESCE(SUM(ffo.invoiced), 0.00) AS totalInvoiced,
-        COALESCE(SUM(ffo.uninvoiced), 0.00) AS totalUnInvoiced,
-        COALESCE(SUM(sett.actual_received_amount), 0.00) AS totalSettlementAmount,
-        COALESCE(SUM(ffo.reconciliation_amount), 0.00) AS totalReceivable
+        SUM(COALESCE(ffo.invoiced, 0.00)) AS totalInvoiced,
+        SUM(COALESCE(ffo.uninvoiced, 0.00)) AS totalUnInvoiced,
+        SUM(COALESCE(sett.actual_received_amount, 0.00)) AS totalSettlementAmount,
+        SUM(COALESCE(ffo.reconciliation_amount, 0.00)) AS totalReceivable
         FROM ins_fee_follow_order ffo
         -- 跟单订单关联发票中间表
         INNER JOIN ins_ply_follow_invoice_link link

+ 211 - 2
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -755,6 +755,9 @@
             <if test="settlementQueryVo.companyId != null and settlementQueryVo.companyId != ''">
                 AND ipii.company_id = #{settlementQueryVo.companyId}
             </if>
+            <if test="settlementQueryVo.partnerCompanyId != null and settlementQueryVo.partnerCompanyId != ''">
+                AND fo.partner_company_id = #{settlementQueryVo.partnerCompanyId}
+            </if>
             <if test="settlementQueryVo.invoiceParty != null and settlementQueryVo.invoiceParty != ''">
                 AND ipii.invoice_party = #{settlementQueryVo.invoiceParty}
             </if>
@@ -784,6 +787,91 @@
         order by ipiis.create_time desc
     </select>
 
+
+
+    <select id="followSettlementDetailExcel" resultType="com.jzg.commons.entity.finance.vo.InvoiceRecordResult">
+        SELECT
+        ipii.id,
+        ipii.company_id,
+        ipii.invoice_no,
+        ipii.invoice_type,
+        ipii.invoice_risk_type,
+        CASE
+        WHEN ipii.invoice_party = '1' THEN
+        '我方开票' ELSE '保司开票'
+        END as invoice_party,
+        ipii.overinflated_amount,
+        ipii.receivable_supervise_premium,
+        ipii.tax_point,
+        ipii.create_time,
+        ipii.create_by,
+        ipii.update_time,
+        ipii.update_by,
+        eic.name as company_name,
+        eic.name_simple as companyNameSimple,
+        sum( ipiis.actual_received_amount ) AS actual_received_amount,
+        ipii.status,
+        ipii.payment_reason,
+        GROUP_CONCAT(DISTINCT iffo.year SEPARATOR ',') AS year,
+        GROUP_CONCAT(DISTINCT iffo.month SEPARATOR ',') AS month,
+        iffo.partner_company_id,
+        ( select cp.name from  esm_ins_company cp  where cp.id = iffo.partner_company_id) as partner_company_name
+        FROM
+        ins_ply_income_invoice ipii
+        LEFT JOIN ins_ply_follow_invoice_link ipfii ON ipii.id = ipfii.invoice_id  AND ipfii.is_delete = 0
+        LEFT JOIN ins_fee_follow_order iffo ON iffo.id = ipfii.follow_id  AND iffo.is_delete = 0
+        LEFT JOIN ins_ply_income_invoice_settlement ipiis ON ipii.id = ipiis.invoice_id AND ipiis.is_delete = 0
+        LEFT JOIN esm_ins_company eic on eic.id = ipii.company_id AND eic.is_delete = 0
+        <where>
+            ipii.is_delete = 0
+            AND ipii.system_code = #{settlementQueryVo.systemCode}
+            <if test="settlementQueryVo.invoicePerson != null and settlementQueryVo.invoicePerson != ''">
+                AND ipiis.create_by like concat('%',#{settlementQueryVo.invoicePerson},'%')
+            </if>
+            <if test="settlementQueryVo.invoiceParty != null and settlementQueryVo.invoiceParty != ''">
+                AND ipii.invoice_party = #{settlementQueryVo.invoiceParty}
+            </if>
+            <if test="settlementQueryVo.invoiceId != null and settlementQueryVo.invoiceId != ''">
+                AND ipii.id = #{settlementQueryVo.invoiceId}
+            </if>
+            <if test="settlementQueryVo.companyId != null and settlementQueryVo.companyId != ''">
+                AND ipii.company_id = #{settlementQueryVo.companyId}
+            </if>
+            <!-- 这里重复了invoiceParty判断,可以删掉重复的if标签 -->
+            <if test="settlementQueryVo.status != null and settlementQueryVo.status != ''">
+                AND ipii.status = #{settlementQueryVo.status}
+            </if>
+            <if test="settlementQueryVo.partnerCompanyId != null and settlementQueryVo.partnerCompanyId != ''">
+                AND iffo.partner_company_id = #{settlementQueryVo.partnerCompanyId}
+            </if>
+            <!-- 严重逻辑错误:时间字段对比了金额字段 -->
+            <if test="settlementQueryVo.settlementTimeStart != null and settlementQueryVo.settlementTimeStart != '' and settlementQueryVo.settlementTimeEnd != null and settlementQueryVo.settlementTimeEnd != '' ">
+                AND ipiis.create_time between #{settlementQueryVo.settlementTimeStart} and #{settlementQueryVo.settlementTimeEnd}
+            </if>
+            <if test="settlementQueryVo.invoiceTypes != null and settlementQueryVo.invoiceTypes != ''">
+                AND ipii.invoice_type IN
+                <foreach collection="settlementQueryVo.invoiceTypes" item="invoiceType" open="(" separator="," close=")">
+                    #{invoiceType}
+                </foreach>
+            </if>
+        </where>
+        <if test="settlementQueryVo.settlementStatus != null and settlementQueryVo.settlementStatus != ''">
+            HAVING CASE
+            WHEN ipii.receivable_supervise_premium = SUM(ipiis.actual_received_amount) THEN '1'
+            ELSE '0'
+            END = #{settlementQueryVo.settlementStatus}
+        </if>
+        GROUP BY
+        ipii.id,
+        ipii.receivable_supervise_premium,
+        ipii.invoice_type,
+        ipii.company_id,
+        ipii.invoice_party,
+        iffo.partner_company_id
+        ORDER BY ipii.create_time DESC
+    </select>
+
+
     <select id="getSuperviseSettlementDetailExcelDtos" resultType="com.jzg.commons.entity.finance.dto.ExportSuperviseSettlementDetailExcelDto">
         select ipi.contact_person, ipi.contact_person_phone,
         ipiis.id as settlementId,
@@ -855,6 +943,78 @@
             </if>
         </where>
     </select>
+    <select id="getPlatFormSettlementDetailExcelDtos" resultType="com.jzg.commons.entity.finance.dto.ExportSuperviseSettlementDetailExcelDto">
+        select ipi.contact_person, ipi.contact_person_phone,
+        ipiis.id as settlementId,
+        ipiis.invoice_id as invoiceId,
+        io.company_name as companyName,
+        io.signing_time as signingTime,
+        ipii.status as status,
+        ipi.license_no as licenseNo,
+        io.product_name as productName,
+        ipii.invoice_type as invoiceType,
+        ipii.invoice_party as invoiceParty,
+        ipii.tax_point as taxPoint,
+        COALESCE(ipi.jq_supervise_costs_premiums, 0) + COALESCE(ipi.sy_supervise_costs_premiums, 0) + COALESCE(ipi.jy_supervise_costs_premiums, 0) + COALESCE(ipi.jq_other_costs_premiums, 0) + COALESCE(ipi.sy_other_costs_premiums, 0) + COALESCE(ipi.jy_other_costs_premiums, 0) AS receivableSuperviseCosts,
+        ipi.jq_premium as jqPremium,
+        ipi.jq_supervise_costs_proportion as jqSuperviseCostsProportion,
+        ipi.jq_policy_no as jqPolicyNo,
+        ipi.sy_premium as syPremium,
+        ipi.sy_supervise_costs_proportion as sySuperviseCostsProportion,
+        ipi.sy_policy_no as syPolicyNo,
+        ipi.jy_premium as jyPremium,
+        ipi.jy_supervise_costs_proportion as jySuperviseCostsProportion,
+        ipi.jy_policy_no as jyPolicyNo,
+        ipi.tax_premium as taxPremium,
+        ipii.create_by as invoicePerson,
+        ipii.create_time as invoiceTime,
+        ipiis.create_by as settlementPerson,
+        ipiis.create_time as settlementTime
+        FROM
+        ins_ply_income_invoice ipii
+        LEFT JOIN ins_ply_income_invoice_settlement ipiis ON ipiis.invoice_id = ipii.id AND ipiis.is_delete = 0
+        LEFT JOIN ins_ply_income_invoice_link ipil ON ipil.invoice_id = ipiis.invoice_id AND ipil.is_delete = 0
+        LEFT JOIN ins_ply_income ipi ON ipi.id = ipil.income_id AND ipi.is_delete = 0
+        LEFT JOIN ins_orders io ON ipi.order_no = io.id AND io.is_delete = 0
+        <where>
+            ipii.is_delete = 0
+            AND ipii.system_code = #{settlementQueryVo.systemCode}
+            <if test="settlementQueryVo.settlementId != null and settlementQueryVo.settlementId != ''">
+                AND ipiis.id = #{settlementQueryVo.settlementId}
+            </if>
+            <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
+                AND ipiis.id IN
+                <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
+                    #{settlementId}
+                </foreach>
+            </if>
+            <if test="settlementQueryVo.invoiceTypes != null and settlementQueryVo.invoiceTypes != ''">
+                AND ipii.invoice_type IN
+                <foreach collection="settlementQueryVo.invoiceTypes" item="invoiceType" open="(" separator="," close=")">
+                    #{invoiceType}
+                </foreach>
+            </if>
+            <if test="settlementQueryVo.invoiceId != null and settlementQueryVo.invoiceId != ''">
+                AND ipiis.invoice_id = #{settlementQueryVo.invoiceId}
+            </if>
+            <if test="settlementQueryVo.companyId != null and settlementQueryVo.companyId != ''">
+                AND ipi.company_id = #{settlementQueryVo.companyId}
+            </if>
+            <if test="settlementQueryVo.invoiceParty != null and settlementQueryVo.invoiceParty != ''">
+                AND ipii.invoice_party = #{settlementQueryVo.invoiceParty}
+            </if>
+            <if test="settlementQueryVo.settlementPerson != null and settlementQueryVo.settlementPerson != ''">
+                AND ipiis.create_by = #{settlementQueryVo.settlementPerson}
+            </if>
+            <if test="settlementQueryVo.settlementTimeStart != null and settlementQueryVo.settlementTimeStart != ''">
+                AND ipiis.create_time between #{settlementQueryVo.signingTimeStart} and #{settlementQueryVo.signingTimeEnd}
+            </if>
+            <if test="settlementQueryVo.agreementType != null and settlementQueryVo.agreementType != ''">
+                AND ipi.agreement_type = #{settlementQueryVo.agreementType}
+            </if>
+        </where>
+    </select>
+
 
     <select id="getSuperviseSettlementDetailJyExcelDtos" resultType="com.jzg.commons.entity.finance.dto.ExportSuperviseSettlementDetailJyExcelDto">
         select
@@ -1908,8 +2068,12 @@
         </where>
     </select>
     <!-- 查询发票结算的金额 2026年6月22日15:48:33 lipf  -->
-    <select id="querySettledAmountByInvoiceIds" resultType="java.math.BigDecimal">
-        select sum(ipiis.actual_received_amount ) from ins_ply_income_invoice_settlement ipiis
+    <select id="querySettledAmountByInvoiceIds" resultType="com.jzg.commons.entity.finance.vo.InsPlyIncomeInvoiceSettlementVo">
+        select
+            sum(ipiis.actual_received_amount ) as actual_received_amount,
+            sum(ipiis.settlement_payment_difference ) as settlement_payment_difference
+        from
+        ins_ply_income_invoice_settlement ipiis
         <where>
             <if test="invoiceIdList != null and invoiceIdList.size() > 0">
                 and ipiis.invoice_id in
@@ -1920,4 +2084,49 @@
         </where>
     </select>
 
+
+    <select id="selectPlatformCompanySettlementReport" resultType="com.jzg.commons.entity.finance.vo.FollowCompanyFeeVO">
+        SELECT
+        ipi.company_id,
+        ipii.contact_person,
+        ipii.contact_person_phone,
+        COALESCE(SUM(sett.actual_received_amount), 0.00) AS totalSettlementAmount,
+        COALESCE(SUM(ipii.receivable_supervise_premium), 0.00) AS totalReceivable,
+        COALESCE(SUM(sett.settlement_payment_difference), 0.00) AS totalPaymentDifference
+        FROM ins_ply_income ipi
+        LEFT JOIN ins_ply_income_invoice_link ipil ON ipi.id = ipil.income_id AND ipil.is_delete = 0
+        LEFT JOIN ins_ply_income_invoice ipii ON ipil.invoice_id = ipii.id AND ipii.is_delete = 0
+        LEFT JOIN ins_ply_income_invoice_settlement sett ON ipii.id = sett.invoice_id AND sett.is_delete = 0
+        <where>
+            ipi.is_delete = 0
+            <if test="query.companyId != null and query.companyId != ''">
+                AND ipi.company_id = #{query.companyId}
+            </if>
+            <if test="query.contactPersonPhone != null and query.contactPersonPhone != ''">
+                AND ipii.contact_person_phone LIKE CONCAT('%', #{query.contactPersonPhone}, '%')
+            </if>
+            <if test="query.contactPerson != null and query.contactPerson != ''">
+                AND ipii.contact_person LIKE CONCAT('%', #{query.contactPerson}, '%')
+            </if>
+            -- 跟单订单创建时间范围
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND ipii.create_time BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+            -- 发票状态筛选
+            <if test="query.status != null">
+                AND ipii.status = #{query.status}
+            </if>
+            -- 开票时间范围
+            <if test="query.invoiceStartTime != null and query.invoiceStartTime != '' and query.invoiceEndTime != null and query.invoiceEndTime != ''">
+                AND ipii.invoice_time BETWEEN #{query.invoiceStartTime} AND #{query.invoiceEndTime}
+            </if>
+            -- 结算创建时间范围(子查询过滤结算时间)
+            <if test="query.settlementStartTime != null and query.settlementStartTime != '' and query.settlementEndTime != null and query.settlementEndTime != ''">
+                AND sett.create_time BETWEEN #{query.settlementStartTime} AND #{query.settlementEndTime}
+            </if>
+        </where>
+        GROUP BY ipii.contact_person_phone, ipii.contact_person, ipi.company_id
+    </select>
+
+
 </mapper>