소스 검색

Merge remote-tracking branch 'origin/master'

lixiaolong 1 개월 전
부모
커밋
9ffa117d3e
15개의 변경된 파일과 213개의 추가작업 그리고 259개의 파일을 삭제
  1. 2 1
      .gitignore
  2. 1 2
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4Platform.java
  3. 1 3
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseCar.java
  4. 1 3
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseNoCar.java
  5. 43 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/InsuranceData.java
  6. 23 28
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java
  7. 2 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerCalculatePremiumApplyResponse.java
  8. 12 10
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  9. 40 0
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4AllListener.java
  10. 0 25
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4PlatformListener.java
  11. 0 28
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4PrivateListener.java
  12. 1 8
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  13. 29 129
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  14. 41 16
      tenant/organization/src/main/java/com/jzg/organization/service/impl/importincome/ImportIncomeServiceImpl.java
  15. 17 6
      tenant/organization/src/main/java/com/jzg/organization/service/importincome/ImportIncomeService.java

+ 2 - 1
.gitignore

@@ -85,4 +85,5 @@ tenant/insurance/quotation-zhongmei/outPath/
 tenant/insurance/quotation-zijin/outPath/
 tenant/organization/outPath/
 
-.reasonix
+.reasonix
+reasonix.toml

+ 1 - 2
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4Platform.java

@@ -6,7 +6,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
-import java.io.Serializable;
 
 /**
  * @author tz
@@ -16,7 +15,7 @@ import java.io.Serializable;
 @EqualsAndHashCode
 @Data
 @Schema(description = "财务应收表")
-public class ExcelContent4Platform implements Serializable {
+public class ExcelContent4Platform implements InsuranceData {
 
     @Serial
     private static final long serialVersionUID = 6263862008363938379L;

+ 1 - 3
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseCar.java

@@ -6,8 +6,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
-import java.io.Serializable;
-
 /**
  * 私有手续费
  *
@@ -18,7 +16,7 @@ import java.io.Serializable;
 @EqualsAndHashCode
 @Data
 @Schema(description = "财务应收表")
-public class ExcelContent4PrivateSuperviseCar implements Serializable {
+public class ExcelContent4PrivateSuperviseCar implements InsuranceData {
 
     @Serial
     private static final long serialVersionUID = 6263862008363938379L;

+ 1 - 3
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseNoCar.java

@@ -6,8 +6,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
-import java.io.Serializable;
-
 /**
  * 私有手续费
  *
@@ -18,7 +16,7 @@ import java.io.Serializable;
 @EqualsAndHashCode
 @Data
 @Schema(description = "财务应收表")
-public class ExcelContent4PrivateSuperviseNoCar implements Serializable {
+public class ExcelContent4PrivateSuperviseNoCar implements InsuranceData {
 
     @Serial
     private static final long serialVersionUID = 6263862008363938379L;

+ 43 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/InsuranceData.java

@@ -0,0 +1,43 @@
+package com.jzg.commons.entity.finance.vo.importimcome;
+
+import java.io.Serializable;
+
+/**
+ * 车险和非车险的公共方法
+ *
+ * @author lipf
+ * @date 2026/8/17 15:49
+ */
+public interface InsuranceData extends Serializable {
+
+    /**
+     * 交强险保单号。
+     * <p>
+     * 用于在统一处理各 {@link InsuranceData} 实体时按接口多态读取,
+     * 实体若不存在该字段则返回 {@code null}。
+     * </p>
+     *
+     * @return 交强险保单号,实体无此字段时返回 null
+     */
+    default String getJqPolicyNo() {
+        return null;
+    }
+
+    /**
+     * 商业险保单号。
+     *
+     * @return 商业险保单号,实体无此字段时返回 null
+     */
+    default String getSyPolicyNo() {
+        return null;
+    }
+
+    /**
+     * 非车险保单号。
+     *
+     * @return 非车险保单号,实体无此字段时返回 null
+     */
+    default String getJyPolicyNo() {
+        return null;
+    }
+}

+ 23 - 28
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java

@@ -21,6 +21,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Function;
 
@@ -154,39 +155,33 @@ public final class AnShengCrawlerQuoteResultsVoBuild {
                 "scoreKey", "bussinessLevel",
                 "score", data.getBussinessLevel()
         );
-
-
         AnShengCrawlerCalculatePremiumApplyResponse.DataDTO.ContractsDTO contractsDTO =
                 data.getContracts().stream()
                         .filter(c -> c.getPlanDefine() != null)
-                        .filter(c -> "105".equals(c.getPlanDefine().getPlanCode()))
+                        .filter(c -> "109".equals(c.getPlanDefine().getPlanCode()))
                         .findAny()
-                        .orElseThrow(() -> new IllegalStateException("未找到 planCode=105 的合约"));
-        JSONObject compulsoryInsure = new JSONObject();
-        compulsoryInsure.put("scoreName","交强存在费用");
-        compulsoryInsure.put("scoreKey","compulsoryInsure");
-        compulsoryInsure.put("score",contractsDTO.getPlanDefine().getCompulsoryInsure() ? "是" : "否");
-        scoreArray.add(compulsoryInsure);
+                        .orElse(null);
+        for (AnShengCrawlerCalculatePremiumApplyResponse.DataDTO.ContractsDTO contract : data.getContracts()) {
+            JSONObject jsonObject = new JSONObject();
+            if (StringUtils.equals("105",contract.getPlanDefine().getPlanCode())){
+                jsonObject.put("scoreName","交强存在费用");
+                jsonObject.put("scoreKey","compulsoryInsure");
+                jsonObject.put("score",contract.getPlanDefine().getCompulsoryInsure() ? "是" : "否");
+            }else if (StringUtils.equals("109",contract.getPlanDefine().getPlanCode())){
+                jsonObject.put("scoreName","商业存在费用");
+                jsonObject.put("scoreKey","businessInsure");
+                jsonObject.put("score",contract.getPlanDefine().getBusinessInsure() ? "是" : "否");
+            }
 
-        JSONObject businessInsure = new JSONObject();
-        businessInsure.put("scoreName","商业存在费用");
-        businessInsure.put("scoreKey","businessInsure");
-        businessInsure.put("score",contractsDTO.getPlanDefine().getBusinessInsure() ? "是" : "否");
-        scoreArray.add(businessInsure);
-//        for (AnShengCrawlerCalculatePremiumApplyResponse.DataDTO.ContractsDTO contract : data.getContracts()) {
-//            JSONObject jsonObject = new JSONObject();
-//            if (StringUtils.equals("105",contract.getPlanDefine().getPlanCode())){
-//                jsonObject.put("scoreName","交强存在费用");
-//                jsonObject.put("scoreKey","compulsoryInsure");
-//                jsonObject.put("score",contract.getPlanDefine().getCompulsoryInsure() ? "是" : "否");
-//            }else if (StringUtils.equals("109",contract.getPlanDefine().getPlanCode())){
-//                jsonObject.put("scoreName","商业存在费用");
-//                jsonObject.put("scoreKey","businessInsure");
-//                jsonObject.put("score",contract.getPlanDefine().getBusinessInsure() ? "是" : "否");
-//            }
-//
-//            scoreArray.add(jsonObject);
-//        }
+            scoreArray.add(jsonObject);
+        }
+        if (Objects.nonNull(contractsDTO)){
+            JSONObject claimTimes = new JSONObject();
+            claimTimes.put("scoreName","连续承保期间出险次数");
+            claimTimes.put("scoreKey","claimTimes");
+            claimTimes.put("score",contractsDTO.getVehicle().getPolicyPricing().getClaimTimes());
+            scoreArray.add(claimTimes);
+        }
         scoreArray.add(bussinessLevel);
         scoreVo.setScoreJson(scoreArray);
         return scoreVo;

+ 2 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerCalculatePremiumApplyResponse.java

@@ -779,6 +779,8 @@ public class AnShengCrawlerCalculatePremiumApplyResponse  implements Serializabl
                     private List<ElectronicCertInfoDTO> electronicCertInfo;
                     @JsonProperty("newColor")
                     private String newColor;
+                    @JsonProperty("claimTimes")
+                    private String claimTimes;
 
                     @NoArgsConstructor
                     @Data

+ 12 - 10
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -150,7 +150,7 @@ public class ReceivableController {
     /**
      * 导入应收的模板
      *
-     * @param paramVO  20 表示平台协议  11表示车险手续费 12 表示非车险手续费 13 表示车险跟单费 14 表示非车险跟单费
+     * @param paramVO  20 表示平台协议  11表示车险手续费 12 表示非车险手续费 13 表示车险跟单费 14 表示非车险跟单费 (13、14 暂时不需要实现)
      * @author lipf
      * @date 2026/8/3 10:23
      */
@@ -161,17 +161,19 @@ public class ReceivableController {
         return HttpResult.ok(receivablePageIds);
     }
 
-    @PostMapping("/importAccountsReceivableInvoice")
-    @Operation(summary = "导入应收开票数据")
-    public HttpResult<ImportUpdateExcelResultVo> importAccountsReceivableInvoice(@RequestParam("file") MultipartFile file){
-        ImportUpdateExcelResultVo importExcelResultVo = receivableService.importAccountsReceivableInvoice(file);
-        return HttpResult.ok(importExcelResultVo);
-    }
 
+
+    /**
+     * 导入应收开票数据
+     *      私有车险应收/私有非车险应收/平台应收
+     * @author lipf
+     * @date 2026/8/17 17:05
+     */
     @PostMapping("/importPlatformReceivableInvoice")
-    @Operation(summary = "导入平台应收开票数据")
-    public HttpResult<ImportUpdateExcelResultVo> importPlatformReceivableInvoice(@RequestParam("file") MultipartFile file){
-        ImportUpdateExcelResultVo importExcelResultVo = receivableService.importPlatformReceivableInvoice(file);
+    @Operation(summary = "导入应收开票数据")
+    public HttpResult<ImportUpdateExcelResultVo> importPlatformReceivableInvoice(@RequestParam("file") MultipartFile file,
+                                                                                @RequestParam(value = "type",required = false) String type){
+        ImportUpdateExcelResultVo importExcelResultVo = receivableService.importPlatformReceivableInvoice(file, type);
         return HttpResult.ok(importExcelResultVo);
     }
 

+ 40 - 0
tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4AllListener.java

@@ -0,0 +1,40 @@
+package com.jzg.organization.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.jzg.commons.entity.finance.vo.importimcome.InsuranceData;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Excel 数据统一读取监听器。
+ * <p>
+ * 该监听器为泛型设计,可统一处理所有实现了 {@link InsuranceData} 的实体,
+ * 例如车险/非车险/平台应收等不同实体:{@code ExcelContent4PrivateSuperviseCar}、
+ * {@code ExcelContent4PrivateSuperviseNoCar}、{@code ExcelContent4Platform} 等。
+ * </p>
+ *
+ * @author lipf
+ * @date 2026/8/17 15:40
+ */
+@Getter
+public class InvoiceReceivbleExcel4AllListener<T extends InsuranceData> extends AnalysisEventListener<T> {
+
+    private final List<T> dataList = new ArrayList<>();
+
+    @Override
+    public void invoke(T data, AnalysisContext context) {
+        dataList.add(data);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        System.out.println("Total rows: " + dataList.size());
+    }
+
+    public List<T> getDataList() {
+        return dataList;
+    }
+}

+ 0 - 25
tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4PlatformListener.java

@@ -1,25 +0,0 @@
-package com.jzg.organization.excel.listener;
-
-import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Platform;
-import lombok.Getter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Getter
-public class InvoiceReceivbleExcel4PlatformListener extends AnalysisEventListener<ExcelContent4Platform> {
-    private final List<ExcelContent4Platform> dataList = new ArrayList<>();
-
-    @Override
-    public void invoke(ExcelContent4Platform data, AnalysisContext context) {
-        dataList.add(data);
-    }
-
-    @Override
-    public void doAfterAllAnalysed(AnalysisContext context) {
-        System.out.println("Total rows: " + dataList.size());
-    }
-
-}

+ 0 - 28
tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4PrivateListener.java

@@ -1,28 +0,0 @@
-package com.jzg.organization.excel.listener;
-
-import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4PrivateSuperviseNoCar;
-import lombok.Getter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Getter
-public class InvoiceReceivbleExcel4PrivateListener extends AnalysisEventListener<ExcelContent4PrivateSuperviseNoCar> {
-    private final List<ExcelContent4PrivateSuperviseNoCar> dataList = new ArrayList<>();
-
-    @Override
-    public void invoke(ExcelContent4PrivateSuperviseNoCar data, AnalysisContext context) {
-        dataList.add(data);
-    }
-
-    @Override
-    public void doAfterAllAnalysed(AnalysisContext context) {
-        System.out.println("Total rows: " + dataList.size());
-    }
-
-    public List<ExcelContent4PrivateSuperviseNoCar> getDataList() {
-        return dataList;
-    }
-}

+ 1 - 8
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -442,14 +442,7 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      * @param file
      * @return
      */
-    ImportUpdateExcelResultVo importAccountsReceivableInvoice(MultipartFile file);
-
-    /**
-     * 导入应收开票数据
-     * @param file
-     * @return
-     */
-    ImportUpdateExcelResultVo importPlatformReceivableInvoice(MultipartFile file);
+    ImportUpdateExcelResultVo importPlatformReceivableInvoice(MultipartFile file, String type);
 
     /**
      * 删除结算记录

+ 29 - 129
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -2534,143 +2534,16 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 "应收开票-导出模板(平台)-" + Instant.now());
     }
 
-    /**
-     * 导入应收开票数据
-     * <p>
-     * 该方法用于从Excel文件中导入并处理应收开票数据,支持新增和更新操作,包括以下处理逻辑:
-     * 1. 解析Excel文件获取应收数据列表
-     * 2. 获取所有保险公司信息用于后续匹配
-     * 3. 校验Excel内部保单号是否重复
-     * 4. 校验导入数据是否只包含一个保险公司
-     * 5. 遍历每条数据进行以下校验和处理:
-     *    - 检查必填字段是否为空
-     *    - 检查Excel内部保单号是否重复
-     *    - 查询订单是否存在
-     *    - 验证协议编码和类型是否匹配
-     *    - 构建InsPlyIncome对象并设置相关信息
-     *    - 如果数据库中不存在该保单号,则作为新增记录处理
-     *    - 如果数据库中存在该保单号,检查是否已结算,未结算则作为更新记录处理
-     * 6. 批量插入或更新成功的记录到数据库
-     * 7. 如果有失败数据,生成失败数据Excel文件并提供下载链接
-     * 8. 返回导入结果(包含成功数、失败数、失败数据、下载链接和成功的订单号列表)
-     * </p>
-     *
-     * @param file Excel文件,包含应收开票数据,文件格式应符合InvoiceReceivableExportExcelVo的定义
-     * @return ImportUpdateExcelResultVo 返回导入结果对象,包含:
-     *         - successNumber: 成功导入的记录数(新增或更新)
-     *         - failedNumber: 失败的记录数
-     *         - failedData: 失败的数据列表,包含错误原因说明
-     *         - failFileUrl: 失败数据Excel文件的下载链接(如果有失败数据)
-     *         - orderNos: 成功导入的订单号列表
-     */
-    @Override
-    public ImportUpdateExcelResultVo importAccountsReceivableInvoice(MultipartFile file) {
-        String userName = baseController.getUserName();
-        log.info("用户[{}]导入私有应设有文件",userName);
-
-        List<ExcelContent4PrivateSuperviseNoCar> excelContents = importIncomeService.parseImportExcel4Private(file);
-        if (CollUtil.isEmpty(excelContents)){
-            throw new SystemException("数据不能为空,导入失败");
-        }
-        AssertionUtils.isEmpty(excelContents, "数据处理失败,导入失败");
-        List<ImportContentExt> datas = importIncomeService.fillExcelContent4Private(excelContents);
-
-
-        // int failedNumber = 0;
-        List<ImportContentExt> failedExcel = new ArrayList<>();
-        // 只存储需要【修改】的数据
-        List<InsPlyIncome> updateExcel = new ArrayList<>();
-        List<InsPlyIncome> insertExcel = new ArrayList<>();
-        // 存储导入成功的订单号
-        List<String> successOrderNoList = new ArrayList<>();
-
-        // 校验Excel内部保单号重复
-        Set<String> existPolicyNoSet = new HashSet<>();
-        Set<String> repeatPolicyNoSet = new HashSet<>();
-        Set<String> existCompanyIdSet = new HashSet<>();
-
-        for (ImportContentExt vo : datas) {
-            String policyNo = vo.getJqPolicyNo();
-            if (existPolicyNoSet.contains(policyNo)) {
-                repeatPolicyNoSet.add(policyNo);
-            } else {
-                existPolicyNoSet.add(policyNo);
-            }
-            existCompanyIdSet.add(vo.getCompanyName());
-        }
-
-        // 导入只能一个保司
-        if (existCompanyIdSet.size() > 1) {
-            throw new SystemException("导入数据不能包含多个保险公司");
-        }
-
-        // 处理数据
-        for (ImportContentExt vo : datas) {
-            // 1. 空数据校验
-            ImportResultVo resultVo = vo.checkEmpty();
-            if (!resultVo.isSuccess()) {
-                vo.setErrorMessage(resultVo.convert2Str());
-                failedExcel.add(vo);
-                continue;
-            }
-
-            // 2. Excel内部保单号重复
-            if (repeatPolicyNoSet.contains(vo.getJqPolicyNo())) {
-                vo.setErrorMessage("保单号重复");
-                failedExcel.add(vo);
-                continue;
-            }
-
-            // 查询订单
-            HttpResult<InsOrdersVo> insOrdersVoHttpResult = insOrdersClient.selectById(vo.getOrderNo());
-            InsOrdersVo data = insOrdersVoHttpResult.getData();
-            if (null == data){
-                vo.setErrorMessage("订单号不存在");
-                failedExcel.add(vo);
-                continue;
-            }
-
-            // 查询数据库中是否已存在该协议
-            PtlAgreement ptlAgreement = ptlAgreementMapper.selectOne(new LambdaQueryWrapper<PtlAgreement>()
-                    .eq(PtlAgreement::getId, data.getAgreementId()));
-
-            // 数据库不存在 → 直接失败
-            if (Objects.isNull(ptlAgreement) || !"2".equals(ptlAgreement.getAgreementType().toString())) {
-                vo.setErrorMessage("协议编码在协议中不存在");
-                failedExcel.add(vo);
-                continue;
-            }
-
-            // 查询数据库中是否已存在该保单号
-            ImportContentExt failedVO = importIncomeService.spliceData(vo, insertExcel, updateExcel);
-            if(failedVO != null){
-                failedExcel.add(failedVO);
-            }
-        }
-        ImportUpdateExcelResultVo importExcelResultVo = importIncomeService.getDataManipulationResult(updateExcel, insertExcel, failedExcel);
-        log.info("私有应收:导入结果。importExcelResultVo=[{}]", JSONUtil.toJsonStr(importExcelResultVo));
-        return importExcelResultVo;
-    }
-
     /**
      * 导入平台的应收数据
      * @param file
      * @return
      */
     @Override
-    public ImportUpdateExcelResultVo importPlatformReceivableInvoice(MultipartFile file) {
+    public ImportUpdateExcelResultVo importPlatformReceivableInvoice(MultipartFile file, String type) {
         String userName = baseController.getUserName();
         log.info("用户[{}]导入平台应收文件",userName);
-
-        List<ExcelContent4Platform> excelContents = importIncomeService.parseImportExcel4Platform(file);
-        log.info("从Excel文件中读取到[{}]条记录", CollUtil.size(excelContents));
-        if (CollUtil.isEmpty(excelContents)){
-            log.error("用户[{}]导入平台应收文件,数据不能为空,导入失败",userName);
-            throw new SystemException("数据不能为空,导入失败");
-        }
-        AssertionUtils.isEmpty(excelContents, "数据处理失败,导入失败");
-        List<ImportContentExt> datas = importIncomeService.fillExcelContent4Platform(excelContents);
-
+        List<ImportContentExt> datas = this.parseAndFillContent(file, type);
         // 只存储需要【修改】的数据
         List<InsPlyIncome> updateExcel = new ArrayList<>();
         List<InsPlyIncome> insertExcel = new ArrayList<>();
@@ -2726,6 +2599,33 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return importExcelResultVo;
     }
 
+    /**
+     * 解析Excel内容并填充缺失的字段
+     *
+     * @param type 类型 20 表示平台协议  11表示车险手续费 12 表示非车险手续费
+     * @param file 上传的文件
+     * @author lipf
+     * @date 2026/8/17 16:57
+     */
+    private List<ImportContentExt> parseAndFillContent(MultipartFile file, String type) {
+        log.info("解析Excel内容并填充缺失的字段. type=[{}]", type);
+
+        if("11".equals(type)){
+            List<ExcelContent4PrivateSuperviseCar> excelContents2 = importIncomeService.parseImportExcel4PrivateCar(file);
+            return importIncomeService.fillExcelContent4All(excelContents2);
+        } if("12".equals(type)){
+            List<ExcelContent4PrivateSuperviseNoCar> excelContents3 = importIncomeService.parseImportExcel4PrivateNoCar(file);
+            return importIncomeService.fillExcelContent4All(excelContents3);
+//        } if("20".equals(type)){
+//            List<ExcelContent4Platform> excelContents = importIncomeService.parseImportExcel4Platform(file);
+//            return importIncomeService.fillExcelContent4All(excelContents);
+        }else{
+            List<ExcelContent4Platform> excelContents = importIncomeService.parseImportExcel4Platform(file);
+            return importIncomeService.fillExcelContent4All(excelContents);
+//            log.info("解析Excel内容并填充缺失的字段.类型不支持 type=[{}]", type);
+//            return Collections.emptyList();
+        }
+    }
 
 
     /**

+ 41 - 16
tenant/organization/src/main/java/com/jzg/organization/service/impl/importincome/ImportIncomeServiceImpl.java

@@ -9,18 +9,14 @@ import com.jzg.commons.constants.ProductsType;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4PrivateSuperviseNoCar;
-import com.jzg.commons.entity.finance.vo.importimcome.ImportUpdateExcelResultVo;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Platform;
-import com.jzg.commons.entity.finance.vo.importimcome.ImportContentExt;
+import com.jzg.commons.entity.finance.vo.importimcome.*;
 import com.jzg.commons.entity.orders.po.InsOrdersPolicy;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.entity.vo.AgreementVo;
 import com.jzg.commons.entity.vo.InsFeeOrdersVo;
 import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.organization.client.InsOrdersClient;
-import com.jzg.organization.excel.listener.InvoiceReceivbleExcel4PlatformListener;
-import com.jzg.organization.excel.listener.InvoiceReceivbleExcel4PrivateListener;
+import com.jzg.organization.excel.listener.InvoiceReceivbleExcel4AllListener;
 import com.jzg.organization.mapper.InsOrdersPolicyMapper;
 import com.jzg.organization.mapper.InsPlyIncomeMapper;
 import com.jzg.organization.mapper.PtlAgreementMapper;
@@ -196,18 +192,24 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
 
     /**
      * 对表格中的内容进行扩展
+     * <p>
+     * 支持同时传入不同的 {@link InsuranceData} 实现类集合(如平台、私有车险、私有非车险),
+     * 统一进行数据扩展处理。
+     * </p>
      *
+     * @param excelContents {@link InsuranceData} 实现类集合
+     * @return 扩展后的数据列表
      * @author lipf
      * @date 2026/8/4 9:22
      */
     @Override
-    public List<ImportContentExt> fillExcelContent4Platform(List<ExcelContent4Platform> excelContents) {
+    public <T extends InsuranceData> List<ImportContentExt> fillExcelContent4All(List<T> excelContents) {
         log.info("填充excel中没有的内容: excelContents.size=[{}]", CollUtil.size(excelContents));
         if(CollUtil.isEmpty(excelContents)){
             return Collections.emptyList();
         }
         List<ImportContentExt> res = new ArrayList<>();
-        for (ExcelContent4Platform excelContent : excelContents) {
+        for (InsuranceData excelContent : excelContents) {
             ImportContentExt ext = new ImportContentExt();
             BeanUtil.copyProperties(excelContent,ext);
             // 查询订单
@@ -250,9 +252,11 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
                     ext.setSigningTime(data.getSigningTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                 }
                 String agreementId = data.getAgreementId();
-                AgreementVo agreementVo = ptlAgreementMapper.queryById(agreementId);
-                if(agreementVo != null){
-                    ext.setPartnerCompanyId(agreementVo.getPartnerCompanyId());
+                if(StrUtil.isNotEmpty(agreementId)){
+                    AgreementVo agreementVo = ptlAgreementMapper.queryById(agreementId);
+                    if(agreementVo != null){
+                        ext.setPartnerCompanyId(agreementVo.getPartnerCompanyId());
+                    }
                 }
                 InsFeeOrdersVo feeOrdersVo = data.getFeeOrdersVo();
                 if(BeanUtil.isEmpty(feeOrdersVo)){
@@ -274,14 +278,14 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
      * @date 2026/8/4 9:07
      */
     public List<ExcelContent4Platform> parseImportExcel4Platform(MultipartFile file) {
-        InvoiceReceivbleExcel4PlatformListener listener = new InvoiceReceivbleExcel4PlatformListener();
+        InvoiceReceivbleExcel4AllListener<ExcelContent4Platform> listener = new InvoiceReceivbleExcel4AllListener<>();
         try (InputStream inputStream = file.getInputStream()) {
             EasyExcel.read(inputStream, ExcelContent4Platform.class, listener)
                     .sheet()
                     .doRead();
             return listener.getDataList();
         } catch (Exception e) {
-            log.error("InvoiceReceivbleExcel4PlatformListenery读取文件异常",e);
+            log.error("InvoiceReceivbleExcel4AllListener处理平台应收数据读取文件异常",e);
             return null;
         }
     }
@@ -292,15 +296,36 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
      * @author lipf
      * @date 2026/8/4 9:07
      */
-    public List<ExcelContent4PrivateSuperviseNoCar> parseImportExcel4Private(MultipartFile file) {
-        InvoiceReceivbleExcel4PrivateListener listener = new InvoiceReceivbleExcel4PrivateListener();
+    public List<ExcelContent4PrivateSuperviseNoCar> parseImportExcel4PrivateNoCar(MultipartFile file) {
+        InvoiceReceivbleExcel4AllListener<ExcelContent4PrivateSuperviseNoCar> listener = new InvoiceReceivbleExcel4AllListener<>();
         try (InputStream inputStream = file.getInputStream()) {
             EasyExcel.read(inputStream, ExcelContent4PrivateSuperviseNoCar.class, listener)
                     .sheet()
                     .doRead();
             return listener.getDataList();
         } catch (Exception e) {
-            log.error("InvoiceReceivbleExcel4PlatformListenery读取文件异常",e);
+            log.error("InvoiceReceivbleExcel4AllListener处理私有非车险数据读取文件异常",e);
+            return null;
+        }
+    }
+
+    /**
+     * 私有车险数据导入
+     *
+     * @param file
+     * @author lipf
+     * @date 2026/8/17 15:38
+     */
+    @Override
+    public List<ExcelContent4PrivateSuperviseCar> parseImportExcel4PrivateCar(MultipartFile file) {
+        InvoiceReceivbleExcel4AllListener<ExcelContent4PrivateSuperviseCar> listener = new InvoiceReceivbleExcel4AllListener<>();
+        try (InputStream inputStream = file.getInputStream()) {
+            EasyExcel.read(inputStream, ExcelContent4PrivateSuperviseCar.class, listener)
+                    .sheet()
+                    .doRead();
+            return listener.getDataList();
+        } catch (Exception e) {
+            log.error("parseImportExcel4PrivateCar读取文件异常",e);
             return null;
         }
     }

+ 17 - 6
tenant/organization/src/main/java/com/jzg/organization/service/importincome/ImportIncomeService.java

@@ -1,10 +1,7 @@
 package com.jzg.organization.service.importincome;
 
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4PrivateSuperviseNoCar;
-import com.jzg.commons.entity.finance.vo.importimcome.ImportUpdateExcelResultVo;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Platform;
-import com.jzg.commons.entity.finance.vo.importimcome.ImportContentExt;
+import com.jzg.commons.entity.finance.vo.importimcome.*;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -15,11 +12,17 @@ public interface ImportIncomeService {
 
     /**
      * 对表格中的内容进行扩展
+     * <p>
+     * 支持同时传入不同的 {@link InsuranceData} 实现类集合(如平台、私有车险、私有非车险),
+     * 统一进行数据扩展处理。
+     * </p>
      *
+     * @param excelContents {@link InsuranceData} 实现类集合
+     * @return 扩展后的数据列表
      * @author lipf
      * @date 2026/8/4 9:22
      */
-    public List<ImportContentExt> fillExcelContent4Platform(List<ExcelContent4Platform> excelContents);
+    <T extends InsuranceData> List<ImportContentExt> fillExcelContent4All(List<T> excelContents);
 
     /**
      * 对表格中的内容进行扩展
@@ -60,7 +63,15 @@ public interface ImportIncomeService {
      * @author lipf
      * @date 2026/8/4 9:07
      */
-    public List<ExcelContent4PrivateSuperviseNoCar> parseImportExcel4Private(MultipartFile file);
+    public List<ExcelContent4PrivateSuperviseNoCar> parseImportExcel4PrivateNoCar(MultipartFile file);
+
+    /**
+     * 私有车险数据导入
+     *
+     * @author lipf
+     * @date 2026/8/17 15:38
+     */
+    public List<ExcelContent4PrivateSuperviseCar> parseImportExcel4PrivateCar(MultipartFile file);
 
     /**
      * 解析并读取Excel中的内容