فهرست منبع

Merge remote-tracking branch 'origin/master'

lixiaolong 1 ماه پیش
والد
کامیت
8ff50e6b6a
22فایلهای تغییر یافته به همراه242 افزوده شده و 59 حذف شده
  1. 2 0
      commons/src/main/java/com/jzg/commons/entity/dto/CostManagementVo.java
  2. 6 1
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostExternalEnd.java
  3. 3 3
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4Platform.java
  4. 3 3
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateFollow.java
  5. 2 2
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseCar.java
  6. 1 1
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseNoCar.java
  7. 5 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ImportUpdateExcelResultVo.java
  8. 3 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersOther.java
  9. 10 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  10. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/InsOrdersOtherInfoVo.java
  11. 1 0
      gateway/src/main/resources/application-prod.yml
  12. 1 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java
  13. 2 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java
  14. 3 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  15. 5 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  16. 4 2
      tenant/insurance/quotation-summary/src/main/resources/application-prod.yaml
  17. 2 1
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  18. 39 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/build/TaiPingCrawlerQuoteResultsVoBuild.java
  19. 3 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  20. 129 26
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  21. 9 12
      tenant/organization/src/main/java/com/jzg/organization/service/impl/importincome/ImportIncomeServiceImpl.java
  22. 6 1
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml

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

@@ -13,6 +13,8 @@ import java.util.List;
 @Schema(description = "费用管理")
 public class CostManagementVo {
 
+    @Schema(description = "规则ID")
+    private String ruleId;
 
     @Schema(description = "审核人姓名")
     private String auditPersonName;

+ 6 - 1
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostExternalEnd.java

@@ -71,7 +71,6 @@ public class PtlAgreementCostExternalEnd {
     public static class PtlAgreementCostExternalTypeAdd {
 
         @Schema(description = "费用类型1-交强险2-商业险3-驾意险")
-        @NotBlank(message = "费用类型不能为空")
         private String costType;
 
         @Schema(description = "入口比例")
@@ -80,6 +79,12 @@ public class PtlAgreementCostExternalEnd {
         @Schema(description = "出口比例")
         private BigDecimal export;
 
+        @Schema(description = "加投比例")
+        private BigDecimal addThrow;
+
+        @Schema(description = "留点比例")
+        private BigDecimal keepPointRatio;
+
         @Schema(description = "总费用比例")
         private BigDecimal totalCost;
 

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

@@ -37,15 +37,15 @@ public class ExcelContent4Platform implements InsuranceData {
     private String jyPolicyNo;
 
     @Schema(description = "交强险入口比例")
-    @ExcelProperty(value = "交强险入口比例(%)", index = 4)
+    @ExcelProperty(value = "交强险入口比例", index = 4)
     private String jqInletRatio;
 
     @Schema(description = "商业险入口比例")
-    @ExcelProperty(value = "商业险入口比例(%)", index = 5)
+    @ExcelProperty(value = "商业险入口比例", index = 5)
     private String syInletRatio;
 
     @Schema(description = "非车险入口比例")
-    @ExcelProperty(value = "非车险入口比例(%)", index = 6)
+    @ExcelProperty(value = "非车险入口比例", index = 6)
     private String jyInletRatio;
 
 }

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

@@ -39,15 +39,15 @@ public class ExcelContent4PrivateFollow implements Serializable {
     private String jyPolicyNo;
 
     @Schema(description = "交强险跟单费比例")
-    @ExcelProperty(value = "交强险跟单费比例(%)", index = 4)
+    @ExcelProperty(value = "交强险跟单费比例", index = 4)
     private String jqOtherCostsProportion;
 
     @Schema(description = "商业险跟单费比例")
-    @ExcelProperty(value = "商业险跟单费比例(%)", index = 5)
+    @ExcelProperty(value = "商业险跟单费比例", index = 5)
     private String syOtherCostsProportion;
 
     @Schema(description = "非车险跟单费比例")
-    @ExcelProperty(value = "非车险跟单费比例(%)", index = 6)
+    @ExcelProperty(value = "非车险跟单费比例", index = 6)
     private String jyOtherCostsProportion;
 
 }

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

@@ -34,12 +34,12 @@ public class ExcelContent4PrivateSuperviseCar implements InsuranceData {
     private String syPolicyNo;
 
     @Schema(description = "交强险手续费比例")
-    @ExcelProperty(value = "交强险手续费比例(%)", index = 3)
+    @ExcelProperty(value = "交强险手续费比例", index = 3)
     private String jqSuperviseCostsProportion;
 
 
     @Schema(description = "商业险手续费比例")
-    @ExcelProperty(value = "商业险手续费比例(%)", index = 4)
+    @ExcelProperty(value = "商业险手续费比例", index = 4)
     private String sySuperviseCostsProportion;
 
 

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

@@ -31,7 +31,7 @@ public class ExcelContent4PrivateSuperviseNoCar implements InsuranceData {
 
 
     @Schema(description = "非车险手续费比例")
-    @ExcelProperty(value = "非车险手续费比例(%)", index = 2)
+    @ExcelProperty(value = "非车险手续费比例", index = 2)
     private String jySuperviseCostsProportion;
 
 }

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ImportUpdateExcelResultVo.java

@@ -35,4 +35,9 @@ public class ImportUpdateExcelResultVo {
      * 新增成功的订单编号
      */
     private List<?> orderNos;
+
+    /**
+     * 错误信息
+     */
+    private String errMsg;
 }

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

@@ -85,5 +85,8 @@ public class InsOrdersOther {
     @Schema(description = "商业险是否有费用")
     private String ciMessage;
 
+    @Schema(description = "未匹配费用原因")
+    private String feeNoDescription;
+
 
 }

+ 10 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -247,6 +247,11 @@ public class QuoteEchoVo extends QuoteVo {
      */
     private String errorMessage;
 
+    /**
+     * 未匹配费用原因
+     */
+    private String feeNoDescription;
+
     /**
      * 影像资料
      */
@@ -496,6 +501,11 @@ public class QuoteEchoVo extends QuoteVo {
         this.scoreVo.setSyLossRation(Objects.isNull(insOrdersVo.getInsOrdersOtherInfo().getSyLossRation()) ? null : insOrdersVo.getInsOrdersOtherInfo().getSyLossRation().toString());
         this.scoreVo.setScoreJson(insOrdersVo.getInsOrdersOtherInfo().getScoreJson());
 
+        // 未匹配费用原因
+        if(Objects.nonNull(insOrdersVo.getInsOrdersOtherInfo())) {
+            this.setFeeNoDescription(insOrdersVo.getInsOrdersOtherInfo().getFeeNoDescription());
+        }
+
         //驾意险存储
         List<AccidentalDrivingVo> accidentalDrivings = insOrdersVo.getAccidentalDrivings();
 

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

@@ -117,4 +117,7 @@ public class InsOrdersOtherInfoVo {
      */
     @Schema(description = "出口费用是否需要扣减1%")
     private boolean isrecordByLeader;
+
+    @Schema(description = "费用未完成描述")
+    private String feeNoDescription;
 }

+ 1 - 0
gateway/src/main/resources/application-prod.yml

@@ -118,6 +118,7 @@ spring:
                   - /adjust/**
                   - /rightsGrant/**
                   - /insOrderRights/**
+                  - /order/searchHistory/**
 
         - id: costsorrule_route
           uri: http://172.24.144.225:8085/

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java

@@ -180,7 +180,7 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
         return redissonComponent.cacheJson(HuaNongCrawlerCacheComponent.SALE_INFO + agreementId, () -> {
             HttpHeaders httpHeaders = new HttpHeaders();
             // 归属机构
-            HuaNongCrawlerComInfoQueryRequestRequest huaNongCrawlerComInfoQueryRequest = new HuaNongCrawlerComInfoQueryRequestRequest(parameters.getComCode(), token);
+            HuaNongCrawlerComInfoQueryRequestRequest huaNongCrawlerComInfoQueryRequest = new HuaNongCrawlerComInfoQueryRequestRequest(loginComCode, token);
             HuaNongCrawlerComInfoQueryResponse huaNongCrawlerComInfoQueryResponse = huaNongCrawlerRequestComponent.comInfoQuery(huaNongCrawlerComInfoQueryRequest, httpHeaders);
             List<HuaNongCrawlerComInfoQueryResponse.ComListDTO> comList = huaNongCrawlerComInfoQueryResponse.getComList();
             Map<String, HuaNongCrawlerComInfoQueryResponse.ComListDTO> com = comList.stream()

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

@@ -89,7 +89,7 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
 
         // 1 归属信息
         HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO saleInfoDTO = huaNongCrawlerQuoteProcessService.attributionInformation(quoteVo.getOrder()
-                .getAgreementId(), loginInfoDto.getParameters(), attributionInformationVo.getUsername(), loginInfoDto.getToken(),loginInfoDto.getParameters().getComCode());
+                .getAgreementId(), loginInfoDto.getParameters(), attributionInformationVo.getUsername(), loginInfoDto.getToken(),loginInfoDto.getParameters().getLoginCom());
 
         // 2 车型查询
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
@@ -1287,7 +1287,7 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         String token = (String) authorization.get(HuaNongCrawlerCacheComponent.TOKEN);
         String userCode = (String) authorization.get(HuaNongCrawlerCacheComponent.USER_CODE);
         String userName = (String) authorization.get(HuaNongCrawlerCacheComponent.USER_NAME);
-        String loginCom = parameters.getComCode();
+        String loginCom = parameters.getLoginCom();
         String loginComCode = parameters.getComCode();
         return new LoginInfoBO(token, loginCom, loginComCode, userCode, userName, parameters);
     }

+ 3 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java

@@ -145,6 +145,9 @@ public class QuoteVerificationAspect {
             } else {
                 logs.append("没有找到该协议的费用信息" + "\n");
             }
+            // 数据库更新费用匹配的原因
+            insOrdersOther.setFeeNoDescription(logs.toString());
+            insOrdersOtherService.updateById(insOrdersOther);
             result.getData().setFeeNoDescription(logs.toString());
         }
     }

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

@@ -236,6 +236,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     private static BigDecimal capRatio(BigDecimal ratio, PtlAgreementCostTypeVo costType) {
         if (costType == null || costType.getInlet() == null) return ratio != null ? ratio : BigDecimal.ZERO;
         BigDecimal inlet = BigDecimalUtil.divide(costType.getInlet(), new BigDecimal(100)); // scale=5, HALF_EVEN
+        ratio = BigDecimalUtil.divide(ratio, new BigDecimal(100)); // scale=5, HALF_EVEN
         return BigDecimalUtil.subtract(ratio, inlet).compareTo(BigDecimal.ZERO) > 0 ? inlet : ratio;
     }
 
@@ -2182,13 +2183,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         feeOrders.setSyKeepPointRatio(nvl(feeOrders.getSyKeepPointRatio()));
         feeOrders.setJyKeepPointRatio(nvl(feeOrders.getJyKeepPointRatio()));
 
-        // —— 出口比例 = 出口比例 - 分销比例(对齐旧 saveRatio)
+        // 出口比例 = 入口比例 +加投比例 - 分销比例 -出口留点比例
         BigDecimal firstDist = nvl(feeOrders.getFirstDistributionRatio());
         BigDecimal secondDist = nvl(feeOrders.getSecondDistributionRatio());
         BigDecimal thirdDist = nvl(feeOrders.getThirdDistributionRatio());
-        feeOrders.setJqExportRatio(jqExport.compareTo(BigDecimal.ZERO) > 0 ? div100(jqExport).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist)) : BigDecimal.ZERO);
-        feeOrders.setSyExportRatio(syExport.compareTo(BigDecimal.ZERO) > 0 ? div100(syExport).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist)) : BigDecimal.ZERO);
-        feeOrders.setJyExportRatio(jyExport.compareTo(BigDecimal.ZERO) > 0 ? div100(jyExport).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist)) : BigDecimal.ZERO);
+        feeOrders.setJqExportRatio(jqInlet.compareTo(BigDecimal.ZERO) > 0 ? div100(jqInlet).add(div100(request.getJqAddThrow())).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist)).subtract(div100(jqEKP)) : BigDecimal.ZERO);
+        feeOrders.setSyExportRatio(syInlet.compareTo(BigDecimal.ZERO) > 0 ? div100(syInlet).add(div100(request.getSyAddThrow())).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist)).subtract(div100(syEKP)) : BigDecimal.ZERO);
+        feeOrders.setJyExportRatio(jyInlet.compareTo(BigDecimal.ZERO) > 0 ? div100(jyInlet).add(div100(request.getJyAddThrow())).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist)).subtract(div100(jyEKP)) : BigDecimal.ZERO);
 
         feeOrders.setJqExportKeepPointRatio(div100(jqEKP));
         feeOrders.setSyExportKeepPointRatio(div100(syEKP));

+ 4 - 2
tenant/insurance/quotation-summary/src/main/resources/application-prod.yaml

@@ -252,7 +252,9 @@ feign:
     jzg-partner:
       url: http://172.24.144.227:8087/
     jeecg-boot:
-      url: https://life.baoxianzhanggui.com/jeecg-pro-boot/
+      url: https://life.baoxianzhanggui.com/locallive-pro-java
+    unifiedAccountClient:
+      url: https://test.baoxianzhanggui.com/user-api/usercenter
 # 和生活服务平台约定的appkey、appSeCret,用于获取token
 live:
   service:
@@ -260,6 +262,6 @@ live:
     appSeCret: y4PJIzlijRo5eqt37IfgzqQTcMLQT4ytMDX27ncY_QA
 
 localLive:
-  base-url: https://life.baoxianzhanggui.com/jeecg-pro-boot/
+  base-url: https://life.baoxianzhanggui.com/locallive-pro-java
   app-key: OSCB2iyvt4-CgMQjTtqUe6r7gyk6xAhlpx3z_6Q-u-Y
   app-secret: y4PJIzlijRo5eqt37IfgzqQTcMLQT4ytMDX27ncY_QA

+ 2 - 1
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml

@@ -774,7 +774,8 @@
         co.sum_premium,
         co.tax_premium,
         p.jq_policy_no,
-        p.sy_policy_no
+        p.sy_policy_no,
+        ot.fee_no_description
         FROM ins_orders_other ot
         LEFT JOIN ins_orders o ON o.quote_no = ot.order_no and o.is_delete = 0
         LEFT JOIN ins_orders_costs co ON co.order_no = ot.order_no and co.is_delete = 0

+ 39 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/build/TaiPingCrawlerQuoteResultsVoBuild.java

@@ -1,5 +1,7 @@
 package com.jzg.quotation.taiping.crawler.build;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.ExpenseFactor;
@@ -12,6 +14,9 @@ import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerPremiumCa
 
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 public class TaiPingCrawlerQuoteResultsVoBuild {
@@ -122,7 +127,41 @@ public class TaiPingCrawlerQuoteResultsVoBuild {
         premiumCalculateData.getPfRiskDtoList()
                 .stream().filter(riskDto -> riskDto.getRiskCode().equals("0802"))
                 .findFirst().ifPresent(syRiskDto -> scoreVo.setSyAdjustRate(String.valueOf(syRiskDto.getDiscount())));
+        Integer score = getCarScoreFromFlowApproveDto(premiumCalculateData.getFlowApproveDto());
+        JSONArray scoreJson = new JSONArray();
+        scoreJson.add(new JSONObject()
+                .fluentPut("scoreName", "太平评分")
+                .fluentPut("scoreKey","taipingScore")
+                .fluentPut("score", score));
+        scoreVo.setScoreJson(scoreJson);
         return scoreVo;
     }
 
+    public static Integer getCarScoreFromFlowApproveDto(List<TaiPingCrawlerPremiumCalculateData.FlowApproveDtoDTO> flowApproveDtoList) {
+        // 空集合直接返回null
+        if (flowApproveDtoList == null || flowApproveDtoList.isEmpty()) {
+            return null;
+        }
+        Pattern pattern = Pattern.compile("该车评分值为\\s*(\\d+)");
+
+        Optional<TaiPingCrawlerPremiumCalculateData.FlowApproveDtoDTO> dtoOpt = flowApproveDtoList.stream()
+                .filter(dto -> dto.getDescription() != null)
+                .filter(dto -> dto.getDescription().contains("该车评分值为"))
+                .findFirst();
+
+        if (dtoOpt.isPresent()) {
+            String desc = dtoOpt.get().getDescription();
+            Matcher matcher = pattern.matcher(desc);
+            if (matcher.find()) {
+                String numStr = matcher.group(1);
+                try {
+                    return Integer.parseInt(numStr);
+                } catch (NumberFormatException e) {
+                    return null;
+                }
+            }
+        }
+        return null;
+    }
+
 }

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

@@ -174,6 +174,9 @@ public class ReceivableController {
     public HttpResult<ImportUpdateExcelResultVo> importPlatformReceivableInvoice(@RequestParam("file") MultipartFile file,
                                                                                 @RequestParam(value = "type",required = false) String type){
         ImportUpdateExcelResultVo importExcelResultVo = receivableService.importPlatformReceivableInvoice(file, type);
+        if(StrUtil.isNotEmpty(importExcelResultVo.getErrMsg())){
+            return HttpResult.error(importExcelResultVo.getErrMsg(), importExcelResultVo);
+        }
         return HttpResult.ok(importExcelResultVo);
     }
 

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

@@ -2541,41 +2541,144 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      */
     @Override
     public ImportUpdateExcelResultVo importPlatformReceivableInvoice(MultipartFile file, String type) {
+        ImportUpdateExcelResultVo resultVo = new ImportUpdateExcelResultVo();
         String userName = baseController.getUserName();
-        log.info("用户[{}]导入平台应收文件",userName);
+        log.info("用户[{}]导入平台应收文件。type=[{}]",userName,type);
         List<ImportContentExt> datas = this.parseAndFillContent(file, type);
-        // 只存储需要【修改】的数据
-        List<InsPlyIncome> updateExcel = new ArrayList<>();
-        List<InsPlyIncome> insertExcel = new ArrayList<>();
-        List<ImportContentExt> failedExcel = new ArrayList<>();
-
-        // 校验Excel内部保单号重复
-        Set<String> existPolicyNoSet = new HashSet<>();
-        Set<String> repeatPolicyNoSet = new HashSet<>();
-        Set<String> existCompanyIdSet = new HashSet<>();
+        String errMsg = this.validateData(datas,type);
+        if(StrUtil.isNotEmpty(errMsg)){
+            log.error("数据校验异常. errMsg=[{}]", errMsg);
+            resultVo.setErrMsg(errMsg);
+            return resultVo;
+        }
+        resultVo.setSuccessNumber(CollUtil.size(datas));
+        List<String> orderNos = datas.stream().map(ImportContentExt::getOrderNo).toList();
+        resultVo.setOrderNos(orderNos);
+        return resultVo;
+//
+//        // 只存储需要【修改】的数据
+//        List<InsPlyIncome> updateExcel = new ArrayList<>();
+//        List<InsPlyIncome> insertExcel = new ArrayList<>();
+//        List<ImportContentExt> failedExcel = 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.getParternerCompanyId());
+//        }
+//
+//        // 导入只能一个保司
+//        if (existCompanyIdSet.size() > 1) {
+//            log.info("导入数据不能包含多个保险公司. existCompanyIdSet=[{}]", JSONUtil.toJsonStr(existCompanyIdSet));
+//            throw new SystemException("导入数据不能包含多个保险公司");
+//        }
+//
+//
+//        // 执行批量更新
+//        ImportUpdateExcelResultVo importExcelResultVo = importIncomeService.getDataManipulationResult(updateExcel, insertExcel,failedExcel);
+//        log.info("平台应收导入结果:importExcelResultVo=[{}]", JSONUtil.toJsonStr(importExcelResultVo));
+//
+//        return importExcelResultVo;
+    }
 
-        for (ImportContentExt vo : datas) {
-            String policyNo = vo.getJqPolicyNo();
-            if (existPolicyNoSet.contains(policyNo)) {
-                repeatPolicyNoSet.add(policyNo);
-            } else {
-                existPolicyNoSet.add(policyNo);
+    /**
+     * 校验数据的合法性
+     *
+     * @param datas excel导入数据初步处理后的数据
+     * @param type 数据类型
+     * @author lipf
+     * @date 2026/8/19 15:34
+     */
+    private String validateData(List<ImportContentExt> datas, String type) {
+        StringBuilder errrMsg = new StringBuilder();
+        List<ImportContentExt> licenseNos = datas.stream().filter(action -> StrUtil.isEmpty(action.getLicenseNo())).toList();
+        if(CollUtil.isNotEmpty(licenseNos)){
+            errrMsg.append("存在记录车牌号为空,请检查后重新导入");
+            return errrMsg.toString();
+        }
+        String orderAbanda = datas.stream().filter(action -> StrUtil.isEmpty(action.getOrderNo()))
+                .map(ImportContentExt::getLicenseNo).collect(Collectors.joining(""));
+        if(StrUtil.isNotEmpty(orderAbanda)){
+            errrMsg.append("车牌号为").append(orderAbanda).append("的订单不存在. ");
+        }
+        String incomeAbanda  = datas.stream().filter(action -> StrUtil.isNotEmpty(action.getOrderNo())).filter(action-> action.getInsPlyIncome() == null)
+                .map(ImportContentExt::getLicenseNo).collect(Collectors.joining(","));
+        if(StrUtil.isNotEmpty(incomeAbanda)){
+            errrMsg.append("车牌号为").append(incomeAbanda).append("的应收数据不存在. ");
+        }
+
+        String settlementedDatas  = datas.stream().filter(action -> StrUtil.isNotEmpty(action.getOrderNo())).filter(action-> action.getInsPlyIncome() != null)
+                .filter(action -> "1".equals(action.getInsPlyIncome().getSettlementStatus())).map(ImportContentExt::getLicenseNo).collect(Collectors.joining(","));
+        if(StrUtil.isNotEmpty(settlementedDatas)){
+            errrMsg.append("车牌号为").append(settlementedDatas).append("的应收数据已结算.");
+        }
+
+        if("20".equals(type)){
+            List<String> contactPersons = datas.stream().map(ImportContentExt::getContactPerson).filter(Objects::nonNull).distinct().toList();
+            if(CollUtil.size(contactPersons) > 1){
+                errrMsg.append("该批数据的对接人不唯一. ");
+            }else if(CollUtil.isEmpty(contactPersons)){
+                errrMsg.append("该批数据的对接人为空");
+            }
+        }else if("11".equals(type) || "12".equals(type)){
+            List<String> parternerCompanyIds = datas.stream().map(ImportContentExt::getParternerCompanyId).filter(Objects::nonNull).distinct().toList();
+            if(CollUtil.size(parternerCompanyIds) > 1){
+                errrMsg.append("该批数据的保险机构不唯一. ");
+            }else if(CollUtil.isEmpty(parternerCompanyIds)){
+                errrMsg.append("该批数据的保险机构为空. ");
             }
-            existCompanyIdSet.add(vo.getParternerCompanyId());
         }
 
-        // 导入只能一个保司
-        if (existCompanyIdSet.size() > 1) {
-            log.info("导入数据不能包含多个保险公司. existCompanyIdSet=[{}]", JSONUtil.toJsonStr(existCompanyIdSet));
-            throw new SystemException("导入数据不能包含多个保险公司");
-        }
 
+        for (ImportContentExt data : datas) {
+            boolean all = false;
+            boolean jq = false;
+            boolean sy = false;
+            boolean jy = false;
+            InsPlyIncome insPlyIncome = data.getInsPlyIncome();
+            String jqadd = BigDecimalUtil.add(insPlyIncome.getJqSuperviseCostsProportion(), insPlyIncome.getJqOtherCostsProportion());
+            BigDecimal jqsubtract = BigDecimalUtil.subtract(new BigDecimal(jqadd), new BigDecimal(data.getJqInletRatio()));
+            if(BigDecimal.ZERO.compareTo(jqsubtract) != 0){
+                all = true;
+                jq = true;
+            }
+            String syadd = BigDecimalUtil.add(insPlyIncome.getSySuperviseCostsProportion(), insPlyIncome.getSyOtherCostsProportion());
+            BigDecimal sysubtract = BigDecimalUtil.subtract(new BigDecimal(syadd), new BigDecimal(data.getSyInletRatio()));
+            if(BigDecimal.ZERO.compareTo(sysubtract) != 0){
+                all = true;
+                sy = true;
+            }
+            String jyadd = BigDecimalUtil.add(insPlyIncome.getJySuperviseCostsProportion(), insPlyIncome.getJyOtherCostsProportion());
+            BigDecimal jysubtract = BigDecimalUtil.subtract(new BigDecimal(jyadd), new BigDecimal(data.getJyInletRatio()));
+            if(BigDecimal.ZERO.compareTo(jysubtract) != 0){
+                all = true;
+                jy = true;
+            }
 
-        // 执行批量更新
-        ImportUpdateExcelResultVo importExcelResultVo = importIncomeService.getDataManipulationResult(updateExcel, insertExcel,failedExcel);
-        log.info("平台应收导入结果:importExcelResultVo=[{}]", JSONUtil.toJsonStr(importExcelResultVo));
+            if(all){
+                errrMsg.append("车牌号为").append(data.getLicenseNo()).append("的导入记录中,");
+                if(jq){
+                    errrMsg.append("交强险入口比例异常. 应收数据的交强险入口比例是[").append(jqadd).append("].excel维护的交强险入口比例是[").append(data.getJqInletRatio()).append("].");
+                }
+                if(sy){
+                    errrMsg.append("商业险入口比例异常.应收数据的商业险入口比例是[").append(syadd).append("].excel维护的商业险入口比例是[").append(data.getSyInletRatio()).append("].");
+                }
+                if(jy){
+                    errrMsg.append("驾意险入口比例异常.应收数据的驾意险入口比例是[").append(jyadd).append("].excel维护的驾意险入口比例是[").append(data.getJyInletRatio()).append("].");
+                }
+            }
+        }
 
-        return importExcelResultVo;
+        return errrMsg.toString();
     }
 
     /**

+ 9 - 12
tenant/organization/src/main/java/com/jzg/organization/service/impl/importincome/ImportIncomeServiceImpl.java

@@ -114,6 +114,7 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
         for (InsuranceData excelContent : excelContents) {
             ImportContentExt ext = new ImportContentExt();
             BeanUtil.copyProperties(excelContent,ext);
+            res.add(ext);
             // 查询订单
             String orderNO = "";
 
@@ -147,7 +148,7 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
             log.info("处理订单号是[{}]的订单",orderNO);
             ext.setOrderNo(orderNO);
 
-            LambdaQueryWrapper<InsPlyIncome> wrapper = new LambdaQueryWrapper();
+            LambdaQueryWrapper<InsPlyIncome> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(InsPlyIncome::getOrderNo,orderNO);
             List<InsPlyIncome> insPlyIncomes = insPlyIncomeMapper.selectList(wrapper);
             if(CollUtil.isEmpty(insPlyIncomes)){
@@ -159,19 +160,15 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
             ext.setIncomeId(insPlyIncome.getId());
             ext.setContactPerson(insPlyIncome.getContactPerson());
             ext.setParternerCompanyId(insPlyIncome.getPartnerCompanyId());
-
+            ext.setInsPlyIncome(insPlyIncome);
 
             // 校验 手续费等比例是否一致
-            String jqSuperviseCostsProportion = insPlyIncome.getJqSuperviseCostsProportion();
-            String sySuperviseCostsProportion = insPlyIncome.getSySuperviseCostsProportion();
-            String jySuperviseCostsProportion = insPlyIncome.getJySuperviseCostsProportion();
-            String jqOtherCostsProportion = insPlyIncome.getJqOtherCostsProportion();
-            String syOtherCostsProportion = insPlyIncome.getSyOtherCostsProportion();
-            String jyOtherCostsProportion = insPlyIncome.getJyOtherCostsProportion();
-
-
-
-            res.add(ext);
+//            String jqSuperviseCostsProportion = insPlyIncome.getJqSuperviseCostsProportion();
+//            String sySuperviseCostsProportion = insPlyIncome.getSySuperviseCostsProportion();
+//            String jySuperviseCostsProportion = insPlyIncome.getJySuperviseCostsProportion();
+//            String jqOtherCostsProportion = insPlyIncome.getJqOtherCostsProportion();
+//            String syOtherCostsProportion = insPlyIncome.getSyOtherCostsProportion();
+//            String jyOtherCostsProportion = insPlyIncome.getJyOtherCostsProportion();
         }
         return res;
     }

+ 6 - 1
tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml

@@ -357,6 +357,8 @@
 
     <select id="pageList" resultMap="CostManagementVoMap">
         SELECT
+            pc.id as cost_id,
+            pr_raw.id as ruld_id,
             pc.audit_time,
             pc.audit_person,
             pc.product_id,
@@ -432,6 +434,9 @@
                         #{productId}
                 </foreach>
             </if>
+            <if test="costParam.productId != null and costParam.productId != '' ">
+                AND pc.product_id = #{costParam.productId}
+            </if>
             <if test="costParam.agreementId != null and costParam.agreementId != ''">
                 AND pc.ptl_agreement_id = #{costParam.agreementId}
             </if>
@@ -458,7 +463,7 @@
             <if test="costParam.costRules != null and costParam.costRules.length > 0">
                 AND
                 <foreach collection="costParam.costRules" item="keyword" separator="AND">
-                    pc.cost_rules LIKE CONCAT('%', #{keyword}, '%')
+                    pc.cost_describe LIKE CONCAT('%', #{keyword}, '%')
                 </foreach>
             </if>
             <if test="costParam.agreementStatus != null and costParam.agreementStatus != ''">