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

Merge remote-tracking branch 'origin/master'

wanghao 3 месяцев назад
Родитель
Сommit
63b5f83c37
34 измененных файлов с 794 добавлено и 220 удалено
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/ReceiverSettlementReportDto.java
  2. 14 11
      commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java
  3. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/IncomeAndExpenseVo.java
  4. 10 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  5. 10 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  6. 43 48
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DaJiaCrawlerQuoteResultsVoBuild.java
  7. 2 2
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java
  8. 78 46
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java
  9. 1 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  10. 0 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java
  11. 1 1
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/entity/po/HtCrawlerOrder.java
  12. 2 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  13. 2 11
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java
  14. 4 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeAuditService.java
  15. 57 5
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  16. 4 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java
  17. 4 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  18. 2 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java
  19. 0 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java
  20. 2 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java
  21. 32 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java
  22. 51 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java
  23. 2 2
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  24. 19 1
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  25. 2 2
      tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java
  26. 2 1
      tenant/organization/src/main/java/com/jzg/organization/controller/UserAccountController.java
  27. 14 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  28. 1 1
      tenant/organization/src/main/java/com/jzg/organization/service/PtlSchemeService.java
  29. 18 1
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  30. 10 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  31. 356 70
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  32. 1 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java
  33. 2 0
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  34. 42 3
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

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

@@ -49,4 +49,7 @@ public class ReceiverSettlementReportDto {
 
     @Schema(description = "未结算总计")
     private String unSettledAmount;
+
+    @Schema(description = "已结算发票的发票号")
+    private String invoiceIds;
 }

+ 14 - 11
commons/src/main/java/com/jzg/commons/entity/finance/vo/BatchModifyVo.java

@@ -28,17 +28,17 @@ public class BatchModifyVo {
     @Schema(description = "商业手续费比例")
     private BigDecimal sySuperviseCostsProportion;
 
-//    @Schema(description = "驾意手续费比例")
-//    private BigDecimal jySuperviseCostsProportion;
-//
-//    @Schema(description = "交强跟单费比例")
-//    private BigDecimal jqOtherCostsProportion;
-//
-//    @Schema(description = "商业跟单费比例")
-//    private BigDecimal syOtherCostsProportion;
-//
-//    @Schema(description = "驾意跟单费比例")
-//    private BigDecimal jyOtherCostsProportion;
+    @Schema(description = "驾意手续费比例")
+    private BigDecimal jySuperviseCostsProportion;
+
+    @Schema(description = "交强跟单费比例")
+    private BigDecimal jqOtherCostsProportion;
+
+    @Schema(description = "商业跟单费比例")
+    private BigDecimal syOtherCostsProportion;
+
+    @Schema(description = "驾意跟单费比例")
+    private BigDecimal jyOtherCostsProportion;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Schema(description = "签单时间")
@@ -53,4 +53,7 @@ public class BatchModifyVo {
     @Schema(description = "对接人手机号")
     private String contractPhone;
 
+    @Schema(description = "修改标识 1-手续费 2-跟单费 3-驾意险 4-所有都改")
+    private String updateFlag;
+
 }

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

@@ -59,5 +59,8 @@ public class IncomeAndExpenseVo {
 
         @Schema(description = "银行卡号")
         private String bankCardNum;
+
+        @Schema(description = "驳回原因")
+        private String rejectReason;
     }
 }

+ 10 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -291,6 +291,16 @@ public class RequestComponent {
                 .headers(setHeaders(headers))
                 .retrieve()
                 .toEntity(responseClass)
+                .timeout(Duration.ofSeconds(60))
+                .onErrorMap(ReadTimeoutException.class, ex ->
+                        new WebClientResponseException(
+                                504,
+                                "第三方接口读取超时:" + url,
+                                HttpHeaders.EMPTY,
+                                null,
+                                null
+                        )
+                )
                 .block();
     }
 

+ 10 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java

@@ -419,6 +419,16 @@ public class DateUtil {
     private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private static final DateTimeFormatter OUTPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
 
+    /**
+     * 获取投保日期的下一天0点(北京时间)并转为UTC ISO8601格式
+     * 驾意险起保日期默认为投保日期的下一天的0点
+     */
+    public static String getNextDayMidnightUtc() {
+        LocalDate tomorrow = LocalDate.now().plusDays(1);
+        String beijingTime = tomorrow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
+        return toUtcDateTime(beijingTime);
+    }
+
     /**
      * 将北京时间(yyyy-MM-dd HH:mm:ss)转换为UTC时间(ISO8601格式)
      */

+ 43 - 48
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DaJiaCrawlerQuoteResultsVoBuild.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.dajia.crawler.build;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
@@ -16,8 +17,11 @@ import com.jzg.quotation.dajia.crawler.entity.request.quote.BusinessInsuranceDTO
 import com.jzg.quotation.dajia.crawler.entity.request.quote.CompulsoryInsuranceDTO;
 import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerOrderListRevisedResponse;
 import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerSaveResponse;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.springframework.util.ObjectUtils;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -29,6 +33,8 @@ import java.util.stream.Collectors;
  **/
 public final class DaJiaCrawlerQuoteResultsVoBuild {
 
+    private static final Logger log = LogManager.getLogger(DaJiaCrawlerQuoteResultsVoBuild.class);
+
     private DaJiaCrawlerQuoteResultsVoBuild() {
         throw new IllegalStateException("Utility class");
     }
@@ -71,6 +77,7 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         quoteResultsVo.setCiEndDate(compulsoryInsuranceProductInfo.getEndDate());
         quoteResultsVo.setBiStartDate(productInfo.getStartDate());
         quoteResultsVo.setBiEndDate(productInfo.getEndDate());
+        log.info("构建返回信息:{}",JSONObject.toJSONString(quoteResultsVo));
         return quoteResultsVo;
     }
 
@@ -156,9 +163,14 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         BusinessInsuranceDTO businessInsurance = daJiaCrawlerSaveResponse.getBusinessInsurance(); // 商业险
         if (!ObjectUtils.isEmpty(compulsoryInsurance)) {
             scoreVo.setJqLossRation(StringUtils.isNotEmpty(compulsoryInsurance.getCoefficientInfo().getLossRatioCi()) ? compulsoryInsurance.getCoefficientInfo().getLossRatioCi() : null);
+            scoreVo.setCiClaims(String.valueOf(new BigDecimal(compulsoryInsurance.getCoefficientInfo().getLastPolicyNum()).intValue()));
+            scoreVo.setJqRenewal(compulsoryInsurance.getCoefficientInfo().getRenewalFrequency());
         }
-        if (!ObjectUtils.isEmpty(businessInsurance)) {
+        boolean sy = CollectionUtil.isNotEmpty(businessInsurance.getItemKinds());
+        if (sy) {
             scoreVo.setSyLossRation(StringUtils.isNotEmpty(businessInsurance.getCoefficientInfo().getLossRatioBi()) ? businessInsurance.getCoefficientInfo().getLossRatioBi() : null);
+            scoreVo.setBiClaims(String.valueOf(new BigDecimal(businessInsurance.getCoefficientInfo().getLastPolicyNum()).intValue()));
+            scoreVo.setSyRenewal(businessInsurance.getCoefficientInfo().getRenewalFrequency());
         }
         // 总赔付率 违章评分 高速风险分
         String carIllegalScore;
@@ -175,13 +187,9 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         CompulsoryInsuranceDTO.CoefficientInfoDTO coefficientInfo = daJiaCrawlerSaveResponse.getCompulsoryInsurance().getCoefficientInfo();
         JSONArray scoreArray = new JSONArray();
         scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","交强定价评分")
-                .fluentPut("scoreKey","jqPubScores")
-                .fluentPut("score",compulsoryInsurance.getCoefficientInfo().getLossRatioCi()));
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业定价评分")
-                .fluentPut("scoreKey","syPubScores")
-                .fluentPut("score",businessInsurance.getCoefficientInfo().getLossRatioBi()));
+                .fluentPut("scoreName","交强类型评分")
+                .fluentPut("scoreKey","pubScores")
+                .fluentPut("score",compulsoryInsurance.getCoefficientInfo().getPubScores()));
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","违章评分")
                 .fluentPut("scoreKey","carIllegalScore")
@@ -191,54 +199,41 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
                 .fluentPut("scoreKey","highwayScore")
                 .fluentPut("score",highwayScore));
         scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","醉酒驾驶行为违法次数")
-                .fluentPut("scoreKey","drunkTotalCoef")
-                .fluentPut("score",coefficientInfo.getDrunkTotalCoef()));
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","理赔调整系数")
-                .fluentPut("scoreKey","claimAdjustValue")
-                .fluentPut("score",coefficientInfo.getClaimAdjustValue()));
-        scoreVo.setScoreJson(scoreArray);
+                .fluentPut("scoreName","上年保单出险次数")
+                .fluentPut("scoreKey","lastPolicyNum")
+                .fluentPut("score",coefficientInfo.getLastPolicyNum()));
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","交强险手续费")
                 .fluentPut("scoreKey","handFeeCi")
                 .fluentPut("score",coefficientInfo.getHandFeeCi()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业险手续费")
-                .fluentPut("scoreKey","handFeeBi")
-                .fluentPut("score",coefficientInfo.getHandFeeBi()));
-        scoreVo.setScoreJson(scoreArray);
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","续保次数")
                 .fluentPut("scoreKey","renewalFrequency")
                 .fluentPut("score",coefficientInfo.getRenewalFrequency()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","违法调整系数")
-                .fluentPut("scoreKey","carIllegalScore")
-                .fluentPut("score",coefficientInfo.getCarIllegalScore()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业险连续承保年数")
-                .fluentPut("scoreKey","insureYears")
-                .fluentPut("score",coefficientInfo.getInsureYears()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业险建议折扣")
-                .fluentPut("scoreKey","suggestedDiscount")
-                .fluentPut("score",coefficientInfo.getSuggestedDiscount()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","无赔款优待系数")
-                .fluentPut("scoreKey","totalCoefNum")
-                .fluentPut("score",coefficientInfo.getTotalCoefNum()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","无赔优系数级别")
-                .fluentPut("scoreKey","claimAdjustLvl")
-                .fluentPut("score",coefficientInfo.getClaimAdjustLvl()));
-        scoreVo.setScoreJson(scoreArray);
+        if (sy){
+            BusinessInsuranceDTO.CoefficientInfoDTO coefficientInfo1 = businessInsurance.getCoefficientInfo();
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","商业险建议折扣")
+                    .fluentPut("scoreKey","entireDiscount")
+                    .fluentPut("score",coefficientInfo1.getEntireDiscount()));
+            scoreVo.setScoreJson(scoreArray);
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","商业险手续费")
+                    .fluentPut("scoreKey","handFeeBi")
+                    .fluentPut("score",coefficientInfo1.getHandFeeBi()));
+            scoreVo.setScoreJson(scoreArray);
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","无赔款优待系数")
+                    .fluentPut("scoreKey","totalCoefNum")
+                    .fluentPut("score",coefficientInfo1.getTotalCoefNum()));
+            scoreVo.setScoreJson(scoreArray);
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","商业类型评分")
+                    .fluentPut("scoreKey","pubScores")
+                    .fluentPut("score",coefficientInfo1.getPubScores()));
+            scoreVo.setScoreJson(scoreArray);
+         }
         return scoreVo;
     }
+
 }

+ 2 - 2
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java

@@ -150,7 +150,7 @@ public class HengBangCrawlerRequestComponent {
         headers.set(HttpHeaders.ACCEPT, "*/*");
         headers.set(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencode;charset=utf-8");
         headers.set(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36");
-        headers.set(HttpHeaders.AUTHORIZATION, getAuthorization(username));
+        headers.set(HttpHeaders.AUTHORIZATION, RequestConstant.BEARER + getAuthorization(username));
         HbCrawlerQueryUserInfoResponse response = requestComponent.get(RequestUrl.QUERY_USER_INFO.getRequestUrl(hbCrawlerProperties.getBaseUrl()) + "/" + username, param, RequestUrl.QUERY_USER_INFO.getRequestDescription(), HbCrawlerQueryUserInfoResponse.class, headers);
         return response;
     }
@@ -298,7 +298,7 @@ public class HengBangCrawlerRequestComponent {
         req.setHbEncV("1");
         try {
             ObjectMapper mapper = new ObjectMapper();
-            mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
+            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
             String json = mapper.writeValueAsString(calculationRequest);
             log.info("提交报价数据请求参数: {}", json);
             req.setHbEncD(HengBangAESUtil.encryptStr(json));

+ 78 - 46
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java

@@ -13,6 +13,7 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 
@@ -81,20 +82,21 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         this.clauseType = "2";
         List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
         this.risktype = "0";
-        this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
         if (Objects.nonNull(quoteVo.getCiRiskInfoVo())) {
             this.begintimeCi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
-            this.begintimeAccident = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
+            this.begintimeAccident = DateUtil.getNextDayMidnightUtc();
             this.risktype = "1";
         }
         if (CollUtil.isNotEmpty(kindInfoVoList)) {
             this.epersonliabilityList = getEpersonliabilityList(kindInfoVoList, depreciationPrice);
             this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
-            this.begintimeAccident = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
+            this.begintimeAccident = DateUtil.getNextDayMidnightUtc();
             this.risktype = "2";
         } else {
             this.epersonliabilityList = new ArrayList<>();
         }
+        // 驾意险列表需在 accidentEpolicyFlag 之前赋值
+        this.accidentInsuranceList = getAccidentInsuranceList(quoteVo.getBiRiskInfoVo(), quoteVo.getAccidentalDrivings());
         this.plyappno = plyappno;
         this.ecarshiptaxPart = "投保人";
         this.taxonomyCode = "02";
@@ -102,14 +104,14 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         this.endtimeBi = "";
         this.endtimeCi = "";
         this.expdisc = "";
-        this.accidentEpolicyFlag = "Y";
+        // 有驾意险时传"Y",无驾意险时传""(与javadoc示例对齐)
+        this.accidentEpolicyFlag = this.accidentInsuranceList.isEmpty() ? "" : "Y";
         this.effectfLag = null;
         this.ecarChargingPosts = new ArrayList<>();
         this.carInsureDevices = new ArrayList<>();
         this.outofwarrantytype = "N";
         this.drivingtype = "";
-        this.endtimeAccident = "";
-        this.accidentInsuranceList = getAccidentInsuranceList(quoteVo.getBiRiskInfoVo(), quoteVo.getAccidentalDrivings());
+        this.endtimeAccident = null;
     }
 
     public List<EpersonliabilityDTO> getEpersonliabilityList(List<KindInfoVo> kindInfoVoList, String depreciationPrice) {
@@ -120,25 +122,58 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
             epersonliabilityDTO.setLiabname(kindInfoVo.getKindName());
             // kindcode "101"(机动车损失保险)的保额必须使用车辆折旧价(实际价值),
             // 否则保司会校验"协商价格范围建议在实际价值上下30%浮动"并拒绝
+            // 注意:正确请求中kindcode "101"/"102"/"115"不包含unitAmount/quantity字段
             if ("101".equals(kindInfoVo.getKindCode()) && depreciationPrice != null) {
-                epersonliabilityDTO.setLiabamt(depreciationPrice);
-                epersonliabilityDTO.setUnitAmount(depreciationPrice);
+                epersonliabilityDTO.setLiabamt(parseNumeric(depreciationPrice));
+            } else if (Arrays.asList("102", "115").contains(kindInfoVo.getKindCode())) {
+                epersonliabilityDTO.setLiabamt(parseNumeric(kindInfoVo.getAmount()));
             } else if (!"116".equals(kindInfoVo.getKindCode())) {
                 // kindcode "116"不需要liabamt和unitAmount
-                epersonliabilityDTO.setLiabamt(kindInfoVo.getAmount());
-                epersonliabilityDTO.setUnitAmount(kindInfoVo.getUnitAmount());
+                Object liabamt = parseNumeric(kindInfoVo.getAmount());
+                epersonliabilityDTO.setLiabamt(liabamt);
+                Object unitAmount = parseNumeric(kindInfoVo.getUnitAmount());
+                // "103"(司机)/"104"(乘客)在正确请求中必须有unitAmount,数据缺失时兜底为liabamt
+                if (unitAmount == null && Arrays.asList("103", "104").contains(kindInfoVo.getKindCode())) {
+                    unitAmount = liabamt;
+                }
+                epersonliabilityDTO.setUnitAmount(unitAmount);
             }
             if ("116".equals(kindInfoVo.getKindCode())) {
                 // 道路救援服务特约条款:只需要serviceTimes字段
                 epersonliabilityDTO.setServiceTimes(kindInfoVo.getServiceTimes() != null ? kindInfoVo.getServiceTimes() : "2");
             } else {
-                epersonliabilityDTO.setQuantity(kindInfoVo.getQuantity() != null ? kindInfoVo.getQuantity() : "4");
+                // kindInfoVo有quantity才设置,否则不传(避免默认值"4"篡改司机险等正确值)
+                // "103"(司机)正确请求中quantity=1,数据缺失时兜底
+                String qty = kindInfoVo.getQuantity();
+                if (qty != null) {
+                    epersonliabilityDTO.setQuantity(parseNumeric(qty));
+                } else if ("103".equals(kindInfoVo.getKindCode())) {
+                    epersonliabilityDTO.setQuantity(1);
+                }
             }
             epersonliabilityDTOList.add(epersonliabilityDTO);
         }
         return epersonliabilityDTOList;
     }
 
+    /**
+     * 将字符串解析为数值类型,确保Jackson序列化为数字而非字符串
+     */
+    private static Object parseNumeric(String value) {
+        if (value == null) {
+            return null;
+        }
+        try {
+            if (value.contains(".")) {
+                return new java.math.BigDecimal(value);
+            } else {
+                return Long.valueOf(value);
+            }
+        } catch (NumberFormatException e) {
+            return value;
+        }
+    }
+
     public List<AccidentInsuranceDTO> getAccidentInsuranceList(RiskInfoVo biRiskInfoVo, List<AccidentalDrivingVo> accidentalDrivings) {
         if (accidentalDrivings == null || accidentalDrivings.isEmpty()) {
             return new ArrayList<>();
@@ -154,15 +189,9 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         AccidentInsuranceDTO dto = new AccidentInsuranceDTO();
         dto.setNonriskcode(vo.getProductCode().split("_")[1]);
         dto.setProgramcode(vo.getProductCode());
-        dto.setProgramname(vo.getProductName());
-        if (biRiskInfoVo != null && StringUtils.isNotBlank(biRiskInfoVo.getStartDate()) && StringUtils.isNotBlank(biRiskInfoVo.getEndDate())) {
-            dto.setBegintime(DateUtil.toUtcDateTime(DateUtil.getCurrentDate(1) + " 00:00:00"));
-            dto.setEndtime(DateUtil.toUtcDateTime(DateUtil.getNextYearDateStrTranfer(DateUtil.getCurrentDate(1) + " 00:00:00")));
-        }
-        dto.setCompanycode("0107");
-        dto.setRelationcarowner("a");
-        dto.setSuminsured("525000");
-        dto.setSumgrosspremium(vo.getPremium());
+        // programname/companycode/begintime/endtime/relationcarowner 正确请求中均不包含,移除以避免保司API 500
+        dto.setSuminsured(parseNumeric("525000"));
+        dto.setSumgrosspremium(parseNumeric(vo.getPremium()));
         dto.setIfdefault(true);
         dto.setBuynum(vo.getQuantity());
         dto.setGgriskprogramclauselist(getGgriskprogramclauseList(vo.getProductCode().split("_")[1], vo.getProductCode()));
@@ -243,11 +272,11 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         detail1.setSerialno(1);
         detail1.setKindcode("1119066");
         detail1.setKindname("机动车辆驾乘意外伤害保险意外身故保险责任(2024款)");
-        detail1.setKindrate("0.098");
-        detail1.setKindunitinsured("50000");
-        detail1.setKindsuminsured("250000");
-        detail1.setKindunitpremium("4.9");
-        detail1.setKindgrosspremium("54");
+        detail1.setKindrate(parseNumeric("0.098"));
+        detail1.setKindunitinsured(parseNumeric("50000"));
+        detail1.setKindsuminsured(parseNumeric("250000"));
+        detail1.setKindunitpremium(parseNumeric("4.9"));
+        detail1.setKindgrosspremium(parseNumeric("54"));
         list.add(detail1);
 
         // 机动车辆驾乘意外伤害保险意外残疾保险责任(2024款)
@@ -257,11 +286,11 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         detail2.setSerialno(2);
         detail2.setKindcode("1119067");
         detail2.setKindname("机动车辆驾乘意外伤害保险意外残疾保险责任(2024款)");
-        detail2.setKindrate("0.09166");
-        detail2.setKindunitinsured("30000");
-        detail2.setKindsuminsured("240000");
-        detail2.setKindunitpremium("2.75");
-        detail2.setKindgrosspremium("22");
+        detail2.setKindrate(parseNumeric("0.09166"));
+        detail2.setKindunitinsured(parseNumeric("30000"));
+        detail2.setKindsuminsured(parseNumeric("240000"));
+        detail2.setKindunitpremium(parseNumeric("2.75"));
+        detail2.setKindgrosspremium(parseNumeric("22"));
         list.add(detail2);
 
         // 附加机动车辆驾乘意外伤害医疗保险(2024款)
@@ -271,11 +300,11 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         detail3.setSerialno(3);
         detail3.setKindcode("1119065");
         detail3.setKindname("附加机动车辆驾乘意外伤害医疗保险(2024款)");
-        detail3.setKindrate("1.0001");
-        detail3.setKindunitinsured("3000");
-        detail3.setKindsuminsured("24000");
-        detail3.setKindunitpremium("3");
-        detail3.setKindgrosspremium("24");
+        detail3.setKindrate(parseNumeric("1.0001"));
+        detail3.setKindunitinsured(parseNumeric("3000"));
+        detail3.setKindsuminsured(parseNumeric("24000"));
+        detail3.setKindunitpremium(parseNumeric("3"));
+        detail3.setKindgrosspremium(parseNumeric("24"));
         list.add(detail3);
 
         return list;
@@ -311,12 +340,13 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private static final long serialVersionUID = 4972640996367640469L;
 
         private String kindcode;
-        private String liabamt;
+        // 使用Object类型确保liabamt序列化为数字而非字符串,匹配保司API期望的数字类型
+        private Object liabamt;
         private String liabname;
         private String model = "0";
-        private String quantity;
+        private Object quantity;
         private String serviceTimes;
-        private String unitAmount;
+        private Object unitAmount;
     }
 
     @Data
@@ -333,8 +363,9 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private String programname;
         private String companycode;
         private String resourcetype;
-        private String suminsured;
-        private String sumgrosspremium;
+        // 使用Object类型确保序列化为数字而非字符串,匹配保司API期望的数字类型
+        private Object suminsured;
+        private Object sumgrosspremium;
         private String sumuwpricetaxtotal;
         private Boolean ifdefault;
         private String seatcount;
@@ -353,7 +384,7 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private String risk1205field;
         private String risk1283items;
         private String drivingtype;
-        private String relationcarowner = "a";
+        private String relationcarowner;
     }
 
     @Data
@@ -407,11 +438,12 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private Integer serialno;
         private String kindcode;
         private String kindname;
-        private String kindrate;
-        private String kindunitinsured;
-        private String kindsuminsured;
-        private String kindunitpremium;
-        private String kindgrosspremium;
+        // 使用Object类型确保序列化为数字,匹配保司API期望的数字类型
+        private Object kindrate;
+        private Object kindunitinsured;
+        private Object kindsuminsured;
+        private Object kindunitpremium;
+        private Object kindgrosspremium;
         private String itemDetailCode;
         private String itemDetailName;
         private String kindInd;

+ 1 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -240,6 +240,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                 .filter(e -> StrUtil.isNotEmpty(e.getProductCode()))
                 .forEach(e -> accidentList.add(HbCrawlerCalculationRequest.convertToAccidentInsuranceDTO(quoteVo.getBiRiskInfoVo(), e)));
         calculationRequest.setAccidentInsuranceList(accidentList);
+        calculationRequest.setAccidentEpolicyFlag(accidentList.isEmpty() ? "" : "Y");
     }
 
     // 重复投保提取时间

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java


+ 1 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/entity/po/HtCrawlerOrder.java

@@ -30,7 +30,7 @@ public class HtCrawlerOrder {
     private String ciCategory;
 
     /**
-     * 核保额外需要的参数  交强评分
+     * 核保额外需要的参数  商业评分
      */
     private String biCategory;
 }

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

@@ -358,7 +358,7 @@ public class QuoteVerificationAspect {
         BigDecimal exportPercent = convertPercent(costType.getExport());
 
         // 计算应收金额
-        BigDecimal taxablePremium = premium.multiply(taxFactor);
+        BigDecimal taxablePremium = premium.divide(taxFactor,5,RoundingMode.HALF_EVEN);
 
         // 计算应付金额(保费 * 出口比例,保留2位小数)
         BigDecimal payable = premium.multiply(exportPercent.setScale(5, RoundingMode.DOWN));
@@ -368,7 +368,7 @@ public class QuoteVerificationAspect {
         BigDecimal commission = taxablePremium.multiply(commissionRatio).setScale(5, RoundingMode.HALF_EVEN);
         BigDecimal follow = taxablePremium.multiply(followRatio).setScale(5, RoundingMode.HALF_EVEN);
         setCommission.accept(insFeeOrders, commission);
-        setFollow.accept(insFeeOrders, commission);
+        setFollow.accept(insFeeOrders, follow);
         // modify by lipf, 2026年6月16日15:35:09  加投比例,不需要根据平台/私有进行1.06的计算
 
         BigDecimal addAmount = premium.multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN);

+ 2 - 11
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java

@@ -139,19 +139,11 @@ public class InsFeeAuditController {
     @Operation(summary = "审核订单")
     public HttpResult<String> verifyOrder(@RequestBody VerifyOrderParam param){
         try{
-            insFeeAuditService.verifyOrder(param);
+            return insFeeAuditService.verifyOrder(param);
         }catch (Exception e){
             log.info("审核订单发生异常:param=[{}], e", JSONUtil.toJsonStr(param), e);
             return HttpResult.error(e.getMessage(),param.getOrderNo());
         }
-        // add by lipf ,2026年6月13日14:50:24 这里将orderNo 作为result的data传回去。 在记录订单轨迹的时候使用
-        if("1".equals(Objects.toString(param.getAuditStatus(),"") )){
-            return HttpResult.ok("订单审核成功",param.getOrderNo());
-        }else if("2".equals(Objects.toString(param.getAuditStatus(),""))){
-            return HttpResult.ok("订单审核驳回成功",param.getOrderNo());
-        }else{
-            return HttpResult.ok("订单审核状态不支持。"+param.getAuditStatus(),param.getOrderNo());
-        }
     }
 
     /**
@@ -196,8 +188,7 @@ public class InsFeeAuditController {
     @PostMapping("/saveCostInfo")
     @Operation(summary = "保存调整的费用")
     public HttpResult<String> saveCostInfo(@RequestBody PtlAgreementCostRatioVo param){
-        insFeeAuditService.saveCostInfo(param);
-        return HttpResult.ok();
+        return insFeeAuditService.saveCostInfo(param);
     }
 
     /**

+ 4 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeAuditService.java

@@ -79,7 +79,7 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
      * 审核订单
      * @param param
      */
-    void verifyOrder(VerifyOrderParam param);
+    HttpResult<String> verifyOrder(VerifyOrderParam param);
 
     /**
      * 设置为疑问订单
@@ -98,9 +98,11 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
 
     /**
      * 保存调整的费用
+     *
      * @param param
+     * @return HttpResult<String> 费用调整的结果,可能保存失败
      */
-    void saveCostInfo(PtlAgreementCostRatioVo param);
+    HttpResult<String> saveCostInfo(PtlAgreementCostRatioVo param);
 
     /**
      * 导出订单审核列表

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

@@ -56,6 +56,7 @@ import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.util.*;
@@ -415,10 +416,10 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
      */
     @Override
     @GlobalTransactional(rollbackFor = Exception.class)
-    public void verifyOrder(VerifyOrderParam param) {
+    public HttpResult<String> verifyOrder(VerifyOrderParam param) {
         String systemCode = baseController.getSystemCode();
         String userId = baseController.getUserId();
-        log.info("订单费用审核.systemCode=[{}], param=[{}]",systemCode, JSONUtil.toJsonStr(param));
+        log.info("订单费用审核.systemCode=[{}],userId=[{}],param=[{}]",systemCode,userId, JSONUtil.toJsonStr(param));
         InsFeeAudit audit = this.getById(param.getOrderNo());
         if(audit == null){
             throw new ServiceException("要审核的订单不存在");
@@ -445,7 +446,6 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }
         InsFeeOrders feeOrders = null;
         SysUserAccount userAccount = null;
-        String jzgInfoId = null;
         if(param.getAuditStatus().equals(1)){
             StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.SUCCESS_AUDIT,audit.getAuditStatus()+"");
             audit.setAuditStatus(stateFailResult.getCurrentState());
@@ -518,6 +518,14 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }catch (Exception e){
             log.error("保存合伙人佣金计算异常:{}",e.getMessage(), e);
         }
+        // add by lipf ,2026年6月13日14:50:24 这里将orderNo 作为result的data传回去。 在记录订单轨迹的时候使用
+        if("1".equals(Objects.toString(param.getAuditStatus(),"") )){
+            return HttpResult.ok("订单审核成功",param.getOrderNo());
+        }else if("2".equals(Objects.toString(param.getAuditStatus(),""))){
+            return HttpResult.ok("订单审核驳回成功",param.getOrderNo());
+        }else{
+            return HttpResult.ok("订单审核状态不支持。"+param.getAuditStatus(),param.getOrderNo());
+        }
     }
 
     /**
@@ -811,8 +819,16 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     }
 
     @Override
-    public void saveCostInfo(PtlAgreementCostRatioVo param) {
-        log.info("保存调整后的费用:param=[{}]", JSONUtil.toJsonStr(param));
+    public HttpResult<String> saveCostInfo(PtlAgreementCostRatioVo param) {
+        String systemCode = baseController.getSystemCode();
+        String userName = baseController.getUserName();
+        log.info("保存调整后的费用:systemCode=[{}], userName=[{}],param=[{}]", systemCode, userName, JSONUtil.toJsonStr(param));
+        // add by lipf, 2026年6月22日10:15:51 已经审核通过的订单不能在让调整费用,否则会造成费用不一致。 会影响很多地方
+        String orderNo = param.getOrderNo();
+        HttpResult<String> validateRes = this.validateOrderCheck(orderNo);
+        if(validateRes.isFail()){
+            return validateRes;
+        }
         try {
             feeOrdersService.calcCosts(param);
         } catch (ReflectiveOperationException e) {
@@ -822,6 +838,36 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         // 保存比例调整记录
         InsFeeOrderRecord record = new InsFeeOrderRecord(param);
         recordService.updateById(record);
+        return HttpResult.ok();
+    }
+
+    /**
+     * 校验订单是否审核通过,如果审核通过,则不让修改费用
+     *
+     * @param orderNo 订单号
+     * @author lipf
+     * @date 2026/6/22 10:16
+     */
+    private HttpResult<String> validateOrderCheck(String orderNo) {
+        InsFeeAudit audit = this.getById(orderNo);
+        if(audit == null){
+            String msg = String.format("订单%s不存在审核记录,无法修改", orderNo);
+            log.info(msg);
+            return HttpResult.error(msg);
+        }
+        if(audit.getAuditStatus() > 0){
+            String msg;
+            if(1  ==  audit.getAuditStatus()){
+                msg = String.format("订单%s已经审核通过,无法修改",orderNo);
+            } else if(2  ==  audit.getAuditStatus()){
+                msg = String.format("订单%s已经审核驳回,无法修改",orderNo);
+            }else{
+                msg = String.format("订单%s不是未审核状态,无法修改",orderNo);
+            }
+            log.info(msg);
+            return HttpResult.error(msg);
+        }
+        return HttpResult.ok();
     }
 
     @Override
@@ -837,6 +883,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     @Override
     public String exportAuditList(FeeAuditParam param) {
         List<FeeAuditVo> result = queryList(param);
+        for (FeeAuditVo feeAuditVo : result) {
+            feeAuditVo.setTotalPayablePremium(feeAuditVo.getTotalPayablePremium().setScale(2, RoundingMode.HALF_UP));
+            feeAuditVo.setJyPayablePremium(feeAuditVo.getJyPayablePremium().setScale(2, RoundingMode.HALF_UP));
+            feeAuditVo.setSyPayablePremium(feeAuditVo.getSyPayablePremium().setScale(2, RoundingMode.HALF_UP));
+            feeAuditVo.setJqPayablePremium(feeAuditVo.getJqPayablePremium().setScale(2, RoundingMode.HALF_UP));
+        }
 
         // 调用动态导出
         return exportBaseService.upLoadFile(

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

@@ -16,6 +16,7 @@ import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.BigDecimalUtil;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.client.OrgClient;
 import com.jzg.quotation.summary.mapper.InsFeeOrdersMapper;
@@ -180,8 +181,9 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         // 出口直接乘
         BigDecimal export = premium.multiply(exportRatio).setScale(scale, RoundingMode.HALF_EVEN);
         BigDecimal exportKeepPoint = premium.multiply(exportKeepPointRatio).setScale(scale, RoundingMode.HALF_EVEN);
-        // 留点比例直接乘, modify by lipf ,留点比例在infFeeOrder中计算得到。这里直接使用 2026年6月16日17:32:09
-        BigDecimal keepPoint = premium.multiply(keepPointRatio).setScale(scale, RoundingMode.HALF_EVEN);
+        // 留点比例直接乘, modify by lipf ,留点比例在infFeeOrder中计算得到。这里直接使用 2026年6月16日17:32:09, 为了保持金额一致,留点比例不适用百分比乘积,而是使用金额相减
+        // BigDecimal keepPoint = premium.multiply(keepPointRatio).setScale(scale, RoundingMode.HALF_EVEN);
+        BigDecimal keepPoint = BigDecimalUtil.subtract(BigDecimalUtil.add(commission,addThrow),export);
 
         // 赋值到实体(自动匹配 jq / sy / jy)
         if ("jq".equals(type)) {

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

@@ -1357,10 +1357,10 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 //            PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrdersVo.getInsOrders().getAgreementId());
 //            resultVo.setCostRatio(new PtlAgreementCostRatioVo(ptlAgreementCostTypeList, ptlAgreement));
             resultVo.setCostRatio(new PtlAgreementCostRatioVo(insFeeOrders));
-            // add by lipf, 手动计算留点比例的费用 2026年6月11日11:31:39
-            insFeeOrders.setJqKeepPointPremium(BigDecimalUtil.divide( BigDecimalUtil.multiply(insFeeOrders.getJqPremium(),resultVo.getCostRatio().getJqKeepPointRatio()),new BigDecimal(100)));
-            insFeeOrders.setSyKeepPointPremium(BigDecimalUtil.divide(BigDecimalUtil.multiply(insFeeOrders.getSyPremium(),resultVo.getCostRatio().getSyKeepPointRatio()),new BigDecimal(100)));
-            insFeeOrders.setJyKeepPointPremium(BigDecimalUtil.divide(BigDecimalUtil.multiply(insFeeOrders.getJyPremium(),resultVo.getCostRatio().getJyKeepPointRatio()),new BigDecimal(100)));
+            // add by lipf, 手动计算留点比例的费用 2026年6月11日11:31:39. modify by lipf, 留点比例直接从ins_fee_orders中获取 2026年6月22日17:32:46
+//            insFeeOrders.setJqKeepPointPremium(BigDecimalUtil.divide( BigDecimalUtil.multiply(insFeeOrders.getJqPremium(),resultVo.getCostRatio().getJqKeepPointRatio()),new BigDecimal(100)));
+//            insFeeOrders.setSyKeepPointPremium(BigDecimalUtil.divide(BigDecimalUtil.multiply(insFeeOrders.getSyPremium(),resultVo.getCostRatio().getSyKeepPointRatio()),new BigDecimal(100)));
+//            insFeeOrders.setJyKeepPointPremium(BigDecimalUtil.divide(BigDecimalUtil.multiply(insFeeOrders.getJyPremium(),resultVo.getCostRatio().getJyKeepPointRatio()),new BigDecimal(100)));
             resultVo.setInsFeeOrders(new InsFeeOrdersVo(insFeeOrders));
         }
         //权益信息

+ 2 - 1
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java

@@ -137,8 +137,9 @@ public class TkCrawlerQuoteResultsBuild {
         // 设置总费用
         BigDecimal ci = premium.getJqPremium() == null ? BigDecimal.ZERO : premium.getJqPremium();
         BigDecimal bi = premium.getSyPremium() == null ? BigDecimal.ZERO : premium.getSyPremium();
+        BigDecimal jyx = premium.getJyxPremium() == null ? BigDecimal.ZERO : premium.getJyxPremium();
         BigDecimal vv = preciseInitResult.getCarTax().getSumPayment() == null ? BigDecimal.ZERO : preciseInitResult.getCarTax().getSumPayment();
-        BigDecimal total = ci.add(bi).add(vv);
+        BigDecimal total = ci.add(bi).add(jyx).add(vv);
         quoteResultsVo.getCosts().setSumPremium(total.toPlainString());
         // 折扣
         quoteResultsVo.getScoreVo().setJqAdjustRate(preciseInitResult.getCiDisCount() != null ? preciseInitResult.getCiDisCount().toString() : null);

+ 0 - 1
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java

@@ -928,7 +928,6 @@ public class TKHttpAPIService {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("Actiontype", actionType);
-        httpHeaders.add("carssToken", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXFNYXAiOiJ7XCJmcm9tXCI6XCJ0cGxhdFwiLFwidXNlck5hbWVcIjpcImYyMThlOThlYzBiMmI5Y2IwNTdiNTc1YWNmNzY5YzYyMVwifSIsImlzcyI6InRrLmNuIiwiZXhwIjoxNzc5MTUwNzU4fQ.VOyNqFK-cQ79QsJA4iF1xnjMqYZRYH5IfhqrfIWg6OA");
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
 

+ 2 - 1
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java

@@ -1107,11 +1107,12 @@ public class TKSimpleService {
         // 公司系统的驾意险参数为空证明没有选择驾意险
         if (CollectionUtils.isNotEmpty(accidentalDrivings)) {
             for (AccidentalDrivingVo accidentalDriving : accidentalDrivings) {
-                if (carPlanInfoMap.isEmpty() || accidentalDriving.getRiskCode() == null) {
+                if (carPlanInfoMap.isEmpty() || accidentalDriving.getProductCode() == null) {
                     continue;
                 }
                 TKCarPlanInfo tkCarPlanInfo = carPlanInfoMap.get(accidentalDriving.getProductCode());
                 driverAccidentVo.setIsSelect("1");
+                driverAccidentVo.setQuantity(accidentalDriving.getQuantity());
                 driverAccidentVo.setSelectPlanCode(tkCarPlanInfo.getPlanCode());
                 driverAccidentVo.setQuoteAmountCN(tkCarPlanInfo.getPlanName());
                 driverAccidentVo.setPremium(new BigDecimal(tkCarPlanInfo.getSumPremium()));

+ 32 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java

@@ -8,6 +8,8 @@ import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerQuotationSaveResponse;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerRiskManagementResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -68,6 +70,24 @@ public class TaiShanCrawlerQuoteResultsVoBuild {
         }
 
         if(riskResponse != null && riskResponse.getResult() != null){
+            // 续保标识逻辑:renewalClass不为空时jq_renewalflag=1,否则=0;sy_renewalflag始终为空
+            String renewalClass = riskResponse.getResult().getRenewalClass();
+            String jqRenewalflag = (renewalClass != null && !renewalClass.isEmpty()) ? "1" : "0";
+            String syRenewalflag = "";
+//            scoreJson.add(new JSONObject()
+//                    .fluentPut("scoreName","交强续保标识")
+//                    .fluentPut("scoreKey","jq_renewalflag")
+//                    .fluentPut("jq_renewalflag", jqRenewalflag));
+//            scoreJson.add(new JSONObject()
+//                    .fluentPut("scoreName","商业续保标识")
+//                    .fluentPut("scoreKey","sy_renewalflag")
+//                    .fluentPut("sy_renewalflag", syRenewalflag));
+
+            // 交强续保
+            quoteResultsVo.getScoreVo().setJqRenewal(convertRenewalFlag(jqRenewalflag));
+            // 商业续保
+            quoteResultsVo.getScoreVo().setSyRenewal(convertRenewalFlag(syRenewalflag));
+
             scoreJson.add(new JSONObject()
                     .fluentPut("scoreName","泰山分")
                     .fluentPut("scoreKey","ctsScore")
@@ -186,4 +206,16 @@ public class TaiShanCrawlerQuoteResultsVoBuild {
 //            quoteResultsVo.getCosts().setNiPremium(unAutoPremium.getPremium());
 //        }
     }
+
+    private static String convertRenewalFlag(String renewalFlag) {
+        if (!StringUtils.hasText(renewalFlag)) {
+            return null;
+        }
+        // RenewalEnum 枚举值
+        if (renewalFlag.equals("0")) {
+            return String.valueOf(RenewalEnum.Renewal.getCode());
+        } else {
+            return String.valueOf(RenewalEnum.Transfer.getCode());
+        }
+    }
 }

+ 51 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java

@@ -11,12 +11,13 @@ import com.jzg.quotation.taishan.crawler.properties.TaiShanCrawlerProperties;
 import com.jzg.quotation.commons.component.RequestComponent;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
-import org.springframework.util.ObjectUtils;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
 
 import java.util.Map;
 import java.util.Objects;
@@ -173,6 +174,55 @@ public class TaiShanCrawlerRequestComponent {
         return response;
     }
 
+    /**
+     * 车型查询(带登录状态检查)
+     *
+     * @param request
+     * @param headers
+     * @return TaiShanCrawlerCarResponse
+     */
+    public TaiShanCrawlerCarResponse queryCarModelsWithCheck(TaiShanCrawlerCarRequest request, HttpHeaders headers) {
+        // 1. 请求体 JSON
+        String jsonString = com.alibaba.fastjson.JSON.toJSONString(request);
+        log.info("车型搜索参数:{}", jsonString);
+        // 2. 执行 POST
+        ResponseEntity<String> responseEntity;
+        try {
+            responseEntity = requestComponent.post(
+                    RequestUrl.CAR.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                    jsonString,
+                    String.class,
+                    headers);
+        } catch (WebClientResponseException e) {
+            // 检查是否是 500 错误且响应体为空(账号掉线)
+            if (e.getStatusCode().value() == 500 &&
+                    (e.getResponseBodyAsString() == null || e.getResponseBodyAsString().isEmpty())) {
+                log.error("账号掉线,请重新登录后重新报价");
+                throw new SystemException("账号掉线,请重新登录后重新报价");
+            }
+            throw e;
+        }
+        // 3. 获取响应
+        String responseBody = responseEntity.getBody();
+
+        // 3.1 检查500错误且响应体为空(账号掉线)
+        if (responseEntity.getStatusCode().value() == 500 &&
+                (responseBody == null || responseBody.isEmpty())) {
+            log.error("账号掉线,请重新登录后重新报价");
+            throw new SystemException("账号掉线,请重新登录后重新报价");
+        }
+
+        log.info("响应内容 {}", responseBody);
+        // 4. 反序列化
+        TaiShanCrawlerCarResponse response = com.alibaba.fastjson.JSON.parseObject(responseBody, TaiShanCrawlerCarResponse.class);
+
+        // 5. 判断返回码
+        if ("200".equals(response.getCode())) {
+            return response;
+        }
+        throw new SystemException(response.getMessage());
+    }
+
     /**
      * 获取车辆实际价值
      *

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

@@ -99,8 +99,8 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
         HttpHeaders headers = taiShanCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), parameters.getComCode());
         // 2.0 车型查询
         TaiShanCrawlerCarRequest taiShanCrawlerCarRequest = new TaiShanCrawlerCarRequest(quoteVo,parameters.getComCode());
-        //车型查询
-        TaiShanCrawlerCarResponse taiShanCrawlerCarResponse = taiShanCrawlerRequestComponent.queryCarModels(taiShanCrawlerCarRequest, headers);
+        //车型查询(带登录状态检查)
+        TaiShanCrawlerCarResponse taiShanCrawlerCarResponse = taiShanCrawlerRequestComponent.queryCarModelsWithCheck(taiShanCrawlerCarRequest, headers);
         // 2.1 获取相同的车型
         List<TaiShanCrawlerCarResponse.CarModelInfo> models = taiShanCrawlerCarResponse.getResult();
         TaiShanCrawlerCarResponse.CarModelInfo modelsDTO = CarModelsFilterUtils.to(models, quoteVo.getCarInfoVo());

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

@@ -447,7 +447,7 @@ public class ReceivableController {
         try{
             List<String> orderNos = receivablePageIds.stream().map(InsPlyIncomeOrder::getOrderNo).distinct().toList();
             totalReceivablePremium = receivableService.queryAllTotalReceivablePremium(orderNos);
-            totalReceivablePremium = totalReceivablePremium.setScale(2, RoundingMode.HALF_DOWN);
+            totalReceivablePremium = totalReceivablePremium.setScale(5, RoundingMode.HALF_DOWN);
         }catch (Exception e){
             log.error("统计总的应收异常",e);
         }
@@ -573,6 +573,24 @@ public class ReceivableController {
         return HttpResult.ok(receivableService.deleteSettlementById(id) ? "删除成功":"删除失败");
     }
 
+    /**
+     * 删除平台结算记录
+     *
+     * @author lipf
+     * @date 2026/6/22 16:18
+     */
+    @DeleteMapping("/deletePlatformSettlementById/{id}")
+    @Operation(summary = "删除平台结算记录")
+    public HttpResult<String> deletePlatformSettlementById(@PathVariable String id){
+        return receivableService.deletePlatformSettlementById(id);
+    }
+
+    @DeleteMapping("/deleteFollowSettlementById/{id}")
+    @Operation(summary = "删除跟单结算记录")
+    public HttpResult<Boolean> deleteFollowSettlementById(@PathVariable String id) {
+        return HttpResult.ok(receivableService.deleteFollowSettlementById(id) ? "删除成功":"删除失败");
+    }
+
 
     @PostMapping("exportSuperviseSettlementExcel")
     @Operation(summary = "导出应收手续费结算记录excel文件")

+ 2 - 2
tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java

@@ -107,8 +107,8 @@ public class SchemeController {
 
     @Operation(summary = "获取方案结果")
     @GetMapping("/getSchemeResult")
-    public HttpResult getSchemeResult(String companyId,String productId,String seatCount){
-         SchemeResultVo schemeResultVo = ptlSchemeService.getSchemeResult(companyId,productId,seatCount);
+    public HttpResult getSchemeResult(String companyId,String productId,String seatCount,String energyType,String vehicleType,String carnature){
+         SchemeResultVo schemeResultVo = ptlSchemeService.getSchemeResult(companyId,productId,seatCount,energyType,vehicleType,carnature);
         return HttpResult.ok(schemeResultVo);
     }
 

+ 2 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/UserAccountController.java

@@ -9,6 +9,7 @@ import com.jzg.commons.entity.dto.IncomeAndExpenseParam;
 import com.jzg.commons.entity.dto.SysUserAccountPageParam;
 import com.jzg.commons.entity.dto.SysUserAccountParam;
 import com.jzg.commons.entity.po.SysUserAccount;
+import com.jzg.commons.entity.vo.IncomeAndExpenseVo;
 import com.jzg.commons.entity.vo.SysUserAccountVo;
 import com.jzg.commons.entity.vo.UserAccountStatisVo;
 import com.jzg.organization.service.SysUserAccountIncomeLogService;
@@ -91,7 +92,7 @@ public class UserAccountController {
 
     @Operation(summary = "收支记录")
     @PostMapping("/getIncomeAndExpense")
-    public HttpResult getIncomeAndExpense(@RequestBody IncomeAndExpenseParam param){
+    public HttpResult<List<IncomeAndExpenseVo>> getIncomeAndExpense(@RequestBody IncomeAndExpenseParam param){
         return HttpResult.ok(userAccountService.getIncomeAndExpense(param));
     }
 

+ 14 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java

@@ -204,6 +204,11 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      */
     Map<String, Object> getJqSumReceivable(@Param("orderNos") List<String> orderNos);
 
+    /**
+     * 获取应收交强的总金额
+     */
+    Map<String, Object> getIncomeJqSumReceivable(@Param("orderNos") List<String> orderNos);
+
     /**
      * 获取开票记录
      */
@@ -258,4 +263,13 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
     List<InsPlyIncomeDto> queryFollowIncome(@Param("startYear") Integer startYear,
                                             @Param("endYear") Integer endYear,
                                             @Param("systemCode")  String systemCode);
+
+    /**
+     * 查询发票结算的金额
+     *
+     * @author lipf
+     * @date 2026/6/22 15:47
+     */
+    BigDecimal querySettledAmountByInvoiceIds(@Param("invoiceIdList") List<String> invoiceIdList);
+
 }

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

@@ -80,7 +80,7 @@ public interface PtlSchemeService extends IService<PtlScheme> {
      * @param productId
      * @return
      */
-    public SchemeResultVo getSchemeResult(String companyId,String productId,String seatCount);
+    public SchemeResultVo getSchemeResult(String companyId,String productId,String seatCount,String energyType,String vehicleType,String carnature);
 
     List<InsBusinessInsuranceVo> getBusinessInsuranceListByKindType(String kindCode);
 

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

@@ -426,10 +426,18 @@ public interface ReceivableService extends IService<InsPlyIncome> {
 
     /**
      * 删除结算记录
+     *
+     * @param settlementId
+     * @return
+     */
+    boolean deleteSettlementById(String settlementId);
+
+    /**
+     * 删除跟单结算记录
      * @param id
      * @return
      */
-    boolean deleteSettlementById(String id);
+    boolean deleteFollowSettlementById(String id);
 
     /**
      * 查询所有订单的应收总额
@@ -484,4 +492,13 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      * @date 2026/6/11 9:33
      */
     int updateSettlementStatus(String invoiceId);
+
+    /**
+     * 平台协议结算
+     *
+     * @param id 平台协议结算记录的序号
+     * @author lipf
+     * @date 2026/6/22 11:40
+     */
+    HttpResult<String> deletePlatformSettlementById(String id);
 }

+ 10 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

@@ -49,6 +49,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -493,7 +494,7 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
     }
 
     @Override
-    public SchemeResultVo getSchemeResult(String companyId, String productId, String seatCount) {
+    public SchemeResultVo getSchemeResult(String companyId, String productId, String seatCount,String energyType,String vehicleType,String carnature) {
         log.info("根据保司Id和产品id查询协议信息。 companyId=[{}],productId=[{}]", companyId, productId);
         List<SchemeResultVo.SchemeVo> schemeInsuranceInfo = ptlSchemeMapper.getSchemeInsuranceInfo(companyId, productId);
         List<SchemeResultVo.SchemeVo> schemeDrivingInfo = ptlSchemeMapper.getSchemeDrivingInfo(companyId, productId);
@@ -584,6 +585,14 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
             optionalScheme.getKinds().removeIf(kind -> "J1".equals(kind.getKindCode()));
         }
 
+        //过滤 能源类型 使用性质 车辆种类
+        List<PtlScheme> ptlSchemes = ptlSchemeMapper.selectList(new LambdaQueryWrapper<PtlScheme>().
+                eq(PtlScheme::getCompanyId, companyId).eq(PtlScheme::getEnergyType, energyType).
+                like(PtlScheme::getCarnature, carnature).like(PtlScheme::getVehicleType, vehicleType).
+                eq(PtlScheme::getProductId, productId).eq(PtlScheme::getIsDelete, 0));
+        Map<String, PtlScheme> collectPtlSchemes = ptlSchemes.stream().collect(Collectors.toMap(PtlScheme::getId, Function.identity()));
+        AssertionUtils.isFail(collectPtlSchemes.isEmpty(), "没有可报价的方案配置信息");
+        schemeResultVo.getSchemes().stream().filter(s -> !collectPtlSchemes.containsKey(s.getId()));
         return schemeResultVo;
     }
 

+ 356 - 70
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -25,6 +25,7 @@ import com.jzg.commons.entity.finance.po.*;
 import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
 import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
@@ -59,6 +60,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.math.RoundingMode;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -200,6 +202,10 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      */
     @Override
     public HttpResult<List<ContractVO>> queryReceivableContact(InvoicingVo invoicingVo) {
+        List<String> incomeIds = invoicingVo.getIncomeIds();
+        if(CollUtil.isEmpty(incomeIds)){
+            return HttpResult.error("请勾选未结算的订单数据");
+        }
         List<InsPlyIncome> insPlyIncomes = baseMapper.queryIncomeByIds(invoicingVo);
         List<ContractVO> contractVOS = insPlyIncomes.stream().map(action -> new ContractVO(action.getContactPerson(), action.getContactPersonPhone())).distinct().toList();
         log.info("根据订单编号查询得到的对接人信息[{}]个", CollUtil.size(contractVOS));
@@ -763,8 +769,11 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 .map(String::trim)
                 .distinct() // 可选,去重
                 .collect(Collectors.toList());
+        // 根据tz要求将从ins_fee_order查费用信息改为从income表查
+        Map<String, Object> map = baseMapper.getIncomeJqSumReceivable(orderNos);
+
         // 修改后(返回总手续费 = 交强险+商业险+驾意险 手续费之和)
-        Map<String, Object> map = baseMapper.getJqSumReceivable(orderNos);
+//        Map<String, Object> map = baseMapper.getJqSumReceivable(orderNos);
         if(map == null){
             // 订单不存在的时候,直接返回0
             log.info("订单不存在。 orderNos=[{}]", JSONUtil.toJsonStr(orderNos));
@@ -1462,34 +1471,43 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return importExcelResultVo;
     }
 
+
+    /**
+     * 平台协议结算
+     *
+     * @param settlementId 平台协议结算记录的序号
+     * @author lipf
+     * @date 2026/6/22 11:40
+     */
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean deleteSettlementById(String id) {
-        log.info("私有协议-结算记录-删除: id=[{}]",id);
-        InsPlyIncomeInvoiceSettlement settlement = insPlyIncomeInvoiceSettlementMapper.selectById(id);
+    public HttpResult<String> deletePlatformSettlementById(String settlementId) {
+        log.info("平台删除结算记录。settlementId=[{}]",settlementId);
+        InsPlyIncomeInvoiceSettlement settlement = insPlyIncomeInvoiceSettlementMapper.selectById(settlementId);
         if(settlement == null){
+            log.info("平台删除结算记录.序号为[{}]的结算记录不存在", settlementId);
             throw new SystemException("结算记录不存在");
         }
         String invoiceId = settlement.getInvoiceId();
         if (StrUtil.isBlank(invoiceId)){
             throw new SystemException("结算记录id不存在");
         }
-        insPlyIncomeInvoiceMapper.update(null,
-                new LambdaUpdateWrapper<InsPlyIncomeInvoice>()
-                        .set(InsPlyIncomeInvoice::getStatus,"0").eq(InsPlyIncomeInvoice::getId,invoiceId));
-
+        insPlyIncomeInvoiceMapper.deleteById(invoiceId);
         // 查询中间表:使用 QueryWrapper,增加逻辑删除过滤
         LambdaQueryWrapper<InsPlyIncomeInvoiceLink> linkQueryWrapper = new LambdaQueryWrapper<>();
         linkQueryWrapper.eq(InsPlyIncomeInvoiceLink::getInvoiceId, invoiceId);
         linkQueryWrapper.eq(InsPlyIncomeInvoiceLink::getIsDelete, SETTLE_STATUS_RESET);
         List<InsPlyIncomeInvoiceLink> linkList = insPlyIncomeInvoiceLinkMapper.selectList(linkQueryWrapper);
 
+        if(CollUtil.isNotEmpty(linkList)){
+            for (InsPlyIncomeInvoiceLink insPlyIncomeInvoiceLink : linkList) {
+                insPlyIncomeInvoiceLinkMapper.deleteByInvoiceId(insPlyIncomeInvoiceLink.getInvoiceId());
+            }
+        }
         // 提取incomeId列表
-        List<String> incomeIdList = linkList.stream()
+        List<String> incomeIds = linkList.stream()
                 .map(InsPlyIncomeInvoiceLink::getIncomeId)
                 .distinct()
                 .collect(Collectors.toList());
-
         // 构造更新条件,增加主表逻辑删除过滤
         LambdaUpdateWrapper<InsPlyIncome> incomeUpdateWrapper = new LambdaUpdateWrapper<>();
         incomeUpdateWrapper.set(InsPlyIncome::getSettlementStatus, SETTLE_STATUS_RESET)
@@ -1498,10 +1516,89 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 .set(InsPlyIncome::getJySuperviseSettlement, SETTLE_STATUS_RESET)
                 .set(InsPlyIncome::getJyOtherSettlement, SETTLE_STATUS_RESET)
                 .eq(InsPlyIncome::getIsDelete, SETTLE_STATUS_RESET)
-                .in(InsPlyIncome::getId, incomeIdList);
+                .in(InsPlyIncome::getId, incomeIds);
 
         // 执行更新
         baseMapper.update(null, incomeUpdateWrapper);
+        insPlyIncomeInvoiceSettlementMapper.deleteById(settlementId);
+        return HttpResult.ok("删除结算记录成功");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteSettlementById(String settlementId) {
+        log.info("私有协议-结算记录-删除: id=[{}]", settlementId);
+        InsPlyIncomeInvoiceSettlement settlement = insPlyIncomeInvoiceSettlementMapper.selectById(settlementId);
+        if(settlement == null){
+            log.info("序号为[{}]的结算记录不存在", settlementId);
+            throw new SystemException("结算记录不存在");
+        }
+        String invoiceId = settlement.getInvoiceId();
+        if (StrUtil.isBlank(invoiceId)){
+            throw new SystemException("结算记录id不存在");
+        }
+        insPlyIncomeInvoiceMapper.update(null,
+                new LambdaUpdateWrapper<InsPlyIncomeInvoice>()
+                        .set(InsPlyIncomeInvoice::getStatus,"0").eq(InsPlyIncomeInvoice::getId,invoiceId));
+
+        // 查询中间表:使用 QueryWrapper,增加逻辑删除过滤
+        LambdaQueryWrapper<InsPlyIncomeInvoiceLink> linkQueryWrapper = new LambdaQueryWrapper<>();
+        linkQueryWrapper.eq(InsPlyIncomeInvoiceLink::getInvoiceId, invoiceId);
+        linkQueryWrapper.eq(InsPlyIncomeInvoiceLink::getIsDelete, SETTLE_STATUS_RESET);
+        List<InsPlyIncomeInvoiceLink> linkList = insPlyIncomeInvoiceLinkMapper.selectList(linkQueryWrapper);
+
+        LambdaUpdateWrapper<InsPlyIncome> incomeUpdateWrapper = new LambdaUpdateWrapper<>();
+        if (CollUtil.isNotEmpty(linkList)){
+            // 提取incomeId列表
+            List<String> incomeIdList = linkList.stream()
+                    .map(InsPlyIncomeInvoiceLink::getIncomeId)
+                    .distinct()
+                    .collect(Collectors.toList());
+
+            // 构造更新条件,增加主表逻辑删除过滤
+            incomeUpdateWrapper.set(InsPlyIncome::getSettlementStatus, SETTLE_STATUS_RESET)
+                    .set(InsPlyIncome::getSuperviseSettlement, SETTLE_STATUS_RESET)
+                    .set(InsPlyIncome::getOtherSettlement, SETTLE_STATUS_RESET)
+                    .set(InsPlyIncome::getJySuperviseSettlement, SETTLE_STATUS_RESET)
+                    .set(InsPlyIncome::getJyOtherSettlement, SETTLE_STATUS_RESET)
+                    .eq(InsPlyIncome::getIsDelete, SETTLE_STATUS_RESET)
+                    .in(InsPlyIncome::getId, incomeIdList);
+            // 执行更新
+            baseMapper.update(null, incomeUpdateWrapper);
+        }
+        return insPlyIncomeInvoiceSettlementMapper.deleteById(settlementId) > 0;
+    }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteFollowSettlementById(String id) {
+        log.info("私有协议-结算记录-删除: id=[{}]",id);
+        InsPlyIncomeInvoiceSettlement settlement = insPlyIncomeInvoiceSettlementMapper.selectById(id);
+        if(settlement == null){
+            throw new SystemException("结算记录不存在");
+        }
+        String invoiceId = settlement.getInvoiceId();
+        if (StrUtil.isBlank(invoiceId)){
+            throw new SystemException("结算记录id不存在");
+        }
+        insPlyIncomeInvoiceMapper.update(null,
+                new LambdaUpdateWrapper<InsPlyIncomeInvoice>()
+                        .set(InsPlyIncomeInvoice::getStatus,"0").eq(InsPlyIncomeInvoice::getId,invoiceId));
+
+        // 查询中间表:使用 QueryWrapper,增加逻辑删除过滤
+        LambdaQueryWrapper<InsPlyFollowInvoiceLink> linkQueryWrapper = new LambdaQueryWrapper<>();
+        linkQueryWrapper.eq(InsPlyFollowInvoiceLink::getInvoiceId, invoiceId);
+        linkQueryWrapper.eq(InsPlyFollowInvoiceLink::getIsDelete, SETTLE_STATUS_RESET);
+        List<InsPlyFollowInvoiceLink> linkList = insPlyFollowInvoiceLinkMapper.selectList(linkQueryWrapper);
+
+        if (CollUtil.isNotEmpty(linkList)){
+            // 删除中间表
+            List<String> followLinkIds = linkList.stream().map(InsPlyFollowInvoiceLink::getId).collect(Collectors.toList());
+            insPlyFollowInvoiceLinkMapper.deleteByIds(followLinkIds);
+
+            // 删除跟单表
+            List<String> followIds = linkList.stream().map(InsPlyFollowInvoiceLink::getFollowId).collect(Collectors.toList());
+            insFeeFollowOrderMapper.deleteByIds(followIds);
+        }
         return insPlyIncomeInvoiceSettlementMapper.deleteById(id) > 0;
     }
 
@@ -2166,68 +2263,243 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      * @date 2026/5/27 20:25
      */
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public boolean batchModify(BatchModifyVo batchModifyVo) {
         log.info("批量修改应收订单: batchModifyVo=[{}]", JSONUtil.toJsonStr(batchModifyVo));
         List<String> incomeIds = batchModifyVo.getIncomeIds();
-        if(CollUtil.isEmpty(incomeIds)) {
+        if (CollUtil.isEmpty(incomeIds)) {
             throw new ServiceException("请勾选要批量修改的应收订单");
         }
-        List<String> insOrders = new ArrayList<>();
-        for (String incomeId : batchModifyVo.getIncomeIds()) {
-            InsPlyIncome insPlyIncomeSource = baseMapper.selectById(incomeId);
-            if(insPlyIncomeSource == null) {
-                log.info("批量修改应收订单。序号为[{}]的应收订单不存在", incomeId);
-                continue;
+
+        // 一次性查询所有需要修改的记录
+        List<InsPlyIncome> incomeList = baseMapper.selectBatchIds(incomeIds);
+        if (CollUtil.isEmpty(incomeList)) {
+            throw new ServiceException("未找到需要修改的应收订单");
+        }
+
+        // 收集订单号
+        List<String> orderNos = incomeList.stream()
+                .map(InsPlyIncome::getOrderNo)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        // 批量获取税率
+        Map<String, BigDecimal> taxRateMap = orderNos.stream()
+                .collect(Collectors.toMap(
+                        orderNo -> orderNo,
+                        this::obtainTaxRate,
+                        (v1, v2) -> v1 // 如果有重复,保留第一个
+                ));
+
+        // 准备批量更新的实体列表
+        List<InsPlyIncome> updateList = new ArrayList<>();
+
+        for (InsPlyIncome income : incomeList) {
+            BigDecimal taxRate = taxRateMap.getOrDefault(income.getOrderNo(), BigDecimal.ONE);
+            InsPlyIncome updateIncome = new InsPlyIncome();
+            updateIncome.setId(income.getId());
+
+            boolean hasUpdate = false;
+            String updateFlag = batchModifyVo.getUpdateFlag();
+
+            // 根据 updateFlag 处理不同的更新逻辑
+            if ("1".equals(updateFlag)) {
+                // 修改手续费
+                hasUpdate = handleSuperviseCosts(updateIncome, income, batchModifyVo, taxRate);
+            } else if ("2".equals(updateFlag)) {
+                // 修改跟单费
+                hasUpdate = handleOtherCosts(updateIncome, income, batchModifyVo, taxRate);
+            } else if ("3".equals(updateFlag)) {
+                // 修改驾意险费用
+                hasUpdate = handleJyCosts(updateIncome, income, batchModifyVo, taxRate);
+            } else if ("4".equals(updateFlag)) {
+                // 修改所有
+                boolean superviseUpdated = handleSuperviseCosts(updateIncome, income, batchModifyVo, taxRate);
+                boolean otherUpdated = handleOtherCosts(updateIncome, income, batchModifyVo, taxRate);
+                boolean jyUpdated = handleJyCosts(updateIncome, income, batchModifyVo, taxRate);
+                hasUpdate = superviseUpdated || otherUpdated || jyUpdated;
             }
-            insOrders.add(insPlyIncomeSource.getOrderNo());
-            BigDecimal taxRate = this.obtainTaxRate(insPlyIncomeSource.getOrderNo());
-            if (Objects.nonNull(batchModifyVo.getJqSuperviseCostsProportion()) && batchModifyVo.getJqSuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
-                // modify by lipf 2026年6月18日09:36:01 转换为百分比
-                BigDecimal jqSuperviseCostsProportion = BigDecimalUtil.divide(batchModifyVo.getJqSuperviseCostsProportion(), new BigDecimal(100)) ;
-                BigDecimal superviseReceivablePremium = BigDecimalUtil.divide(BigDecimalUtil.multiply(new BigDecimal(Objects.toString(insPlyIncomeSource.getJqPremium(),"0") ), jqSuperviseCostsProportion), taxRate) ;
-                BigDecimal jqReceivePremiun = BigDecimalUtil.add(superviseReceivablePremium, BigDecimalUtil.toZero(insPlyIncomeSource.getInsFeeOrders()  == null? null:  insPlyIncomeSource.getInsFeeOrders().getJqFollowPremium()));
-                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
-                        .set(InsPlyIncome::getJqSuperviseCostsProportion, jqSuperviseCostsProportion)
-                        .set(InsPlyIncome::getJqSuperviseCostsPremiums, superviseReceivablePremium)
-                        .set(InsPlyIncome::getJqReceivablePremium,jqReceivePremiun)
-                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
-            }
-            if (Objects.nonNull(batchModifyVo.getSySuperviseCostsProportion()) && batchModifyVo.getSySuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
-                // modify by lipf 2026年6月18日09:36:01 转换为百分比
-                BigDecimal sySuperviseCostsProportion = BigDecimalUtil.divide(batchModifyVo.getSySuperviseCostsProportion(), new BigDecimal(100)) ;
-                BigDecimal sySuperviseReceivablePremium = BigDecimalUtil.divide(BigDecimalUtil.multiply(new BigDecimal(Objects.toString(insPlyIncomeSource.getSyPremium(),"0")), sySuperviseCostsProportion), taxRate) ;
-                BigDecimal syReceivePremiun = BigDecimalUtil.add(sySuperviseReceivablePremium, BigDecimalUtil.toZero(insPlyIncomeSource.getInsFeeOrders() != null? insPlyIncomeSource.getInsFeeOrders().getSyFollowPremium() : null));
-                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
-                        .set(InsPlyIncome::getSySuperviseCostsProportion, sySuperviseCostsProportion)
-                        .set(InsPlyIncome::getSySuperviseCostsPremiums, sySuperviseReceivablePremium)
-                        .set(InsPlyIncome::getSyReceivablePremium,syReceivePremiun)
-                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
-            }
-            if (batchModifyVo.getSigningTime() != null){
-                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
-                        .set(InsPlyIncome::getSigningTime, batchModifyVo.getSigningTime())
-                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
-
-            }
-            if(StrUtil.isNotEmpty(batchModifyVo.getContractUserName())){
-                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
-                        .set(InsPlyIncome::getContactPerson, batchModifyVo.getContractUserName())
-                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
-
-            }
-            if(StrUtil.isNotEmpty(batchModifyVo.getContractPhone())){
-                baseMapper.update(null, new LambdaUpdateWrapper<InsPlyIncome>()
-                        .set(InsPlyIncome::getContactPersonPhone, batchModifyVo.getContractPhone())
-                        .in(InsPlyIncome::getId, batchModifyVo.getIncomeIds()));
-            }
-        }
-        batchModifyVo.setOrderNos(insOrders);
+
+            // 处理公共字段更新
+            if (batchModifyVo.getSigningTime() != null) {
+                updateIncome.setSigningTime(batchModifyVo.getSigningTime());
+                hasUpdate = true;
+            }
+            if (StrUtil.isNotEmpty(batchModifyVo.getContractUserName())) {
+                updateIncome.setContactPerson(batchModifyVo.getContractUserName());
+                hasUpdate = true;
+            }
+            if (StrUtil.isNotEmpty(batchModifyVo.getContractPhone())) {
+                updateIncome.setContactPersonPhone(batchModifyVo.getContractPhone());
+                hasUpdate = true;
+            }
+
+            if (hasUpdate) {
+                updateList.add(updateIncome);
+            }
+        }
+
+        // 批量更新
+        if (CollUtil.isNotEmpty(updateList)) {
+            this.updateBatchById(updateList);
+        }
+
+        // 更新关联订单
+        batchModifyVo.setOrderNos(orderNos);
         HttpResult<String> updateOrdersRes = insFeeOrdersClient.updateOrdersBatch(batchModifyVo);
         log.info("更新车险订单的结果:updateOrdersRes=[{}]", JSONUtil.toJsonStr(updateOrdersRes));
         return true;
     }
 
+    /**
+     * 处理手续费更新
+     */
+    private boolean handleSuperviseCosts(InsPlyIncome updateIncome, InsPlyIncome sourceIncome,
+                                         BatchModifyVo batchModifyVo, BigDecimal taxRate) {
+        boolean hasUpdate = false;
+
+        if (Objects.nonNull(batchModifyVo.getJqSuperviseCostsProportion()) &&
+                batchModifyVo.getJqSuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+
+            BigDecimal proportion = batchModifyVo.getJqSuperviseCostsProportion().divide(new BigDecimal(100), 4, RoundingMode.HALF_UP);
+            BigDecimal premium = calculatePremium(sourceIncome.getJqPremium(), proportion, taxRate);
+            BigDecimal receivable = calculateReceivable(premium, sourceIncome.getInsFeeOrders(), "jqFollow");
+
+            updateIncome.setJqSuperviseCostsProportion(proportion.toString());
+            updateIncome.setJqSuperviseCostsPremiums(premium.toString());
+            updateIncome.setJqReceivablePremium(receivable.toString());
+            hasUpdate = true;
+        }
+
+        if (Objects.nonNull(batchModifyVo.getSySuperviseCostsProportion()) &&
+                batchModifyVo.getSySuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+
+            BigDecimal proportion = batchModifyVo.getSySuperviseCostsProportion().divide(new BigDecimal(100), 4, RoundingMode.HALF_UP);
+            BigDecimal premium = calculatePremium(sourceIncome.getSyPremium(), proportion, taxRate);
+            BigDecimal receivable = calculateReceivable(premium, sourceIncome.getInsFeeOrders(), "syFollow");
+
+            updateIncome.setSySuperviseCostsProportion(proportion.toString());
+            updateIncome.setSySuperviseCostsPremiums(premium.toString());
+            updateIncome.setSyReceivablePremium(receivable.toString());
+            hasUpdate = true;
+        }
+
+        return hasUpdate;
+    }
+
+    /**
+     * 处理跟单费更新
+     */
+    private boolean handleOtherCosts(InsPlyIncome updateIncome, InsPlyIncome sourceIncome,
+                                     BatchModifyVo batchModifyVo, BigDecimal taxRate) {
+        boolean hasUpdate = false;
+
+        if (Objects.nonNull(batchModifyVo.getJqOtherCostsProportion()) &&
+                batchModifyVo.getJqOtherCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+
+            BigDecimal proportion = batchModifyVo.getJqOtherCostsProportion().divide(new BigDecimal(100), 4, RoundingMode.HALF_UP);
+            BigDecimal premium = calculatePremium(sourceIncome.getJqPremium(), proportion, taxRate);
+            BigDecimal receivable = calculateReceivable(premium, sourceIncome.getInsFeeOrders(), "jqCommission");
+
+            updateIncome.setJqOtherCostsProportion(proportion.toString());
+            updateIncome.setJqOtherCostsPremiums(premium.toString());
+            updateIncome.setJqReceivablePremium(receivable.toString());
+            hasUpdate = true;
+        }
+
+        if (Objects.nonNull(batchModifyVo.getSyOtherCostsProportion()) &&
+                batchModifyVo.getSyOtherCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+
+            BigDecimal proportion = batchModifyVo.getSyOtherCostsProportion().divide(new BigDecimal(100), 4, RoundingMode.HALF_UP);
+            BigDecimal premium = calculatePremium(sourceIncome.getSyPremium(), proportion, taxRate);
+            BigDecimal receivable = calculateReceivable(premium, sourceIncome.getInsFeeOrders(), "syCommission");
+
+            updateIncome.setSyOtherCostsProportion(proportion.toString());
+            updateIncome.setSyOtherCostsPremiums(premium.toString());
+            updateIncome.setSyReceivablePremium(receivable.toString());
+            hasUpdate = true;
+        }
+
+        return hasUpdate;
+    }
+
+    /**
+     * 处理驾意险费用更新
+     */
+    private boolean handleJyCosts(InsPlyIncome updateIncome, InsPlyIncome sourceIncome,
+                                  BatchModifyVo batchModifyVo, BigDecimal taxRate) {
+        boolean hasUpdate = false;
+
+        if (Objects.nonNull(batchModifyVo.getJySuperviseCostsProportion()) &&
+                batchModifyVo.getJySuperviseCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+
+            BigDecimal proportion = batchModifyVo.getJySuperviseCostsProportion().divide(new BigDecimal(100));
+            BigDecimal premium = calculatePremium(sourceIncome.getJyPremium(), proportion, taxRate);
+            BigDecimal receivable = calculateReceivable(premium, sourceIncome.getInsFeeOrders(), "jyCommission");
+
+            updateIncome.setJySuperviseCostsProportion(proportion.toString());
+            updateIncome.setJySuperviseCostsPremiums(premium.toString());
+            updateIncome.setJyReceivablePremium(receivable.toString());
+            hasUpdate = true;
+        }
+
+        if (Objects.nonNull(batchModifyVo.getJyOtherCostsProportion()) &&
+                batchModifyVo.getJyOtherCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
+
+            BigDecimal proportion = batchModifyVo.getJyOtherCostsProportion().divide(new BigDecimal(100));
+            BigDecimal premium = calculatePremium(sourceIncome.getJyPremium(), proportion, taxRate);
+            BigDecimal receivable = calculateReceivable(premium, sourceIncome.getInsFeeOrders(), "jyFollow");
+
+            updateIncome.setJyOtherCostsProportion(proportion.toString());
+            updateIncome.setJyOtherCostsPremiums(premium.toString());
+            updateIncome.setJyReceivablePremium(receivable.toString());
+            hasUpdate = true;
+        }
+
+        return hasUpdate;
+    }
+
+    /**
+     * 计算保费
+     */
+    private BigDecimal calculatePremium(String premiumStr, BigDecimal proportion, BigDecimal taxRate) {
+        BigDecimal premium = new BigDecimal(Objects.toString(premiumStr, "0"));
+        return premium.multiply(proportion).divide(taxRate, 2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 计算应收金额
+     */
+    private BigDecimal calculateReceivable(BigDecimal premium, InsFeeOrders insFeeOrders, String type) {
+        BigDecimal followPremium = BigDecimal.ZERO;
+
+        if (insFeeOrders != null) {
+            switch (type) {
+                case "jqFollow":
+                    followPremium = BigDecimalUtil.toZero(insFeeOrders.getJqFollowPremium());
+                    break;
+                case "syFollow":
+                    followPremium = BigDecimalUtil.toZero(insFeeOrders.getSyFollowPremium());
+                    break;
+                case "jqCommission":
+                    followPremium = BigDecimalUtil.toZero(insFeeOrders.getJqCommissionPremium());
+                    break;
+                case "syCommission":
+                    followPremium = BigDecimalUtil.toZero(insFeeOrders.getSyCommissionPremium());
+                    break;
+                case "jyCommission":
+                    followPremium = BigDecimalUtil.toZero(insFeeOrders.getJyCommissionPremium());
+                    break;
+                case "jyFollow":
+                    followPremium = BigDecimalUtil.toZero(insFeeOrders.getJyFollowPremium());
+                    break;
+            }
+        }
+
+        return premium.add(followPremium);
+    }
+
     /**
      * 处理跟单费开票业务
      * 包含:创建发票主表记录、批量创建跟单订单明细、建立发票与明细的关联关系
@@ -2562,8 +2834,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         vo.setPartnerCompanyId(partnerCompanyId);
         vo.setReceivablePremium(receivable);
         vo.setInvoiced(invoiced);
-        // 未开票金额 = 应收保费 - 已开票金额
-        vo.setUninvoiced(receivable.subtract(invoiced));
+        vo.setUninvoiced(BigDecimal.ZERO);
 
         // --- 查询数据库获取对账信息 ---
         // 构造查询条件:年、月、合作方ID
@@ -2578,6 +2849,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             vo.setReconciliationAmount(dbOrder.getReconciliationAmount());
             vo.setFalselyIncreasedDifference(dbOrder.getFalselyIncreasedDifference());
             vo.setFalselyIncreasedReason(dbOrder.getFalselyIncreasedReason());
+            // 未开票金额 = 应收保费 - 已开票金额,这是原逻辑
+            // 现在按wwq的要求改成:未开票金额 = 对账金额 - 已开票金额
+            vo.setUninvoiced(dbOrder.getReconciliationAmount().subtract(invoiced));
         } else {
             // 数据库无记录,使用默认值或DTO里的值
             vo.setReconciliationAmount(null);
@@ -3312,8 +3586,6 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         Map<String, BigDecimal> sxfInvoicedAmountMap = calRes.stream().collect(Collectors.toMap(CalRes::getCompanyId, CalRes::getAmount, (o1,o2)->o1));
         calRes = baseMapper.queryInvoicedAmount(systemCode, List.of(2, 4), queryVo.getInvoiceStartTime(), queryVo.getInvoiceEndTime(), queryVo.getAgreementType());
         Map<String, BigDecimal> gdfInvoicedAmountMap = calRes.stream().collect(Collectors.toMap(CalRes::getCompanyId, CalRes::getAmount, (o1,o2)->o1));
-        calRes = baseMapper.queryInvoicedAmount(systemCode, List.of(4, 6), queryVo.getInvoiceStartTime(), queryVo.getInvoiceEndTime(), queryVo.getAgreementType());
-        Map<String, BigDecimal> ptInvoicedAmountMap =calRes.stream().collect(Collectors.toMap(CalRes::getCompanyId, CalRes::getAmount, (o1,o2)->o1));
 
         // 结算费用 
         List<CalRes> sxfList = baseMapper.querySettledAmount(systemCode, queryVo.getInvoiceStartTime(), queryVo.getInvoiceEndTime(), queryVo.getAgreementType(), CollUtil.newArrayList("1", "3"));
@@ -3329,13 +3601,14 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             companySuperviseSettlementReportDto.setSxfInvoicedAmount(Objects.toString(sxf,BigDecimal.ZERO+""));
             BigDecimal gdf = gdfInvoicedAmountMap.getOrDefault(companyId, BigDecimal.ZERO);
             companySuperviseSettlementReportDto.setGdfInvoicedAmount(Objects.toString(gdf,BigDecimal.ZERO+""));
-            BigDecimal pt = ptInvoicedAmountMap.getOrDefault(companyId, BigDecimal.ZERO);
-            companySuperviseSettlementReportDto.setPtInvoicedAmount(Objects.toString(pt,BigDecimal.ZERO+""));
+            // 平台就没有未结算的,只要结算就是已结算的
+            companySuperviseSettlementReportDto.setPtInvoicedAmount(companySuperviseSettlementReportDto.getTotalReceivable());
 
             CompanySuperviseSettlementReportDto dto;
             dto = companyMap.get(companyId);
             companySuperviseSettlementReportDto.setSxfUnInvoicedAmount(BigDecimalUtil.subtract(new BigDecimal(dto.getSuperviseFee()),sxf).toString());
             companySuperviseSettlementReportDto.setGdfUnInvoicedAmount(BigDecimalUtil.subtract(new BigDecimal(dto.getFollowFee()),gdf).toString());
+            companySuperviseSettlementReportDto.setPtUnInvoicedAmount(BigDecimal.ZERO.toString());
 
             BigDecimal sxfS = sxfSettledAmountMap.getOrDefault(companyId, BigDecimal.ZERO);
             BigDecimal gdfS = gdfSettledAmountMap.getOrDefault(companyId, BigDecimal.ZERO);
@@ -3563,6 +3836,18 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                     action.setCompanyName(esmInsCompany.getNameSimple());
                 }
                 action.setCompanyALlName(allCompanyHierarchyPaths.get(action.getCompanyId()));
+                String invoiceIds = action.getInvoiceIds();
+                if(StrUtil.isNotEmpty(invoiceIds)){
+                    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());
+                }else{
+                    action.setSettledAmount("0");
+                    action.setUnSettledAmount(BigDecimalUtil.subtract(new BigDecimal(action.getTotalReceivable()),BigDecimal.ZERO).toString());
+                }
             }).toList();
             receiverSettlementReport.setRecords(records);
         }
@@ -3572,7 +3857,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportReceiverSettlementReportExcel(Page page, SettlementReportQueryVo settlementReportQueryVo) {
         settlementReportQueryVo.setSystemCode(baseController.getSystemCode());
-        Page<ReceiverSettlementReportDto> receiverSettlementReport = baseMapper.getReceiverSettlementReport(page, settlementReportQueryVo);
+        // modify by lipf 2026年6月22日16:24:15 无法通过一个sql查询出所有要求的数据, 只能通过多个sql对数据进行聚合
+        Page<ReceiverSettlementReportDto> receiverSettlementReport = this.receiverSettlementReport(page, settlementReportQueryVo);
         List<ReceiverSettlementReportDto> receiverSettlementReportDtos = receiverSettlementReport.getRecords();
         EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), ReceiverSettlementReportDto.class, receiverSettlementReportDtos, "对接人结算报表");
     }

+ 1 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java

@@ -310,6 +310,7 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             item.setCreateTime(auditing.getCreateTime());
             item.setStatus(auditing.getAuditingStatus().toString());
             item.setRemark("提现支出");
+            item.setRejectReason(auditing.getRejectReason());
             item.setBankName(auditing.getBankName());
             item.setUserName(userMap.getOrDefault(auditing.getUserId(), new SysUser()).getUsername());
             item.setBankCardNum(auditing.getBankCardNum());

+ 2 - 0
tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml

@@ -177,6 +177,8 @@
             <if test="productId != null">
                 AND c.product_id = #{productId}
             </if>
+            AND
+            NOW() BETWEEN c.effective_time AND c.failure_time
         </where>
     </select>
 

+ 42 - 3
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -1270,6 +1270,25 @@
         </where>
     </select>
 
+    <select id="getIncomeJqSumReceivable" resultType="java.util.Map">
+        SELECT
+        sum( jq_supervise_costs_premiums ) AS jqCommissionPremium,
+        sum( sy_supervise_costs_premiums ) AS syCommissionPremium,
+        sum( jy_supervise_costs_premiums ) AS jyCommissionPremium,
+        sum( jq_other_costs_premiums ) AS jqFollowPremium,
+        sum( sy_other_costs_premiums ) AS syFollowPremium,
+        sum( jy_other_costs_premiums ) AS jyFollowPremium
+        FROM
+        ins_ply_income
+        <where>
+            is_delete = 0
+            AND order_no IN
+            <foreach collection="orderNos" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+
     <select id="getInvoiceRecordList" resultType="com.jzg.commons.entity.finance.vo.InvoiceRecordResult">
         SELECT
         ipii.id,
@@ -1594,6 +1613,7 @@
         ORDER BY  eic.name
     </select>
 
+    <!-- invoice 表是income表  聚合得到的,因此,不能将income left jion invoide, 后对invoice的金额进行求和 2026年6月22日15:39:34  -->
     <select id="getReceiverSettlementReport" resultType="com.jzg.commons.entity.finance.dto.ReceiverSettlementReportDto">
         SELECT
         ipi.contact_person AS receiver,
@@ -1606,10 +1626,11 @@
         ) AS totalReceivable,
         --SUM(CASE WHEN ipii.`status` = 1 AND ipii.invoice_type in (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS settledSuperviseFee,
         -- SUM(CASE WHEN ipii.`status` = 1 AND ipii.invoice_type in (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS settledFollowFee,
-        SUM(CASE WHEN ipii.`status` = 1 AND ipii.invoice_type IN (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS settledAmount,
-        --SUM(CASE WHEN ipii.`status` = 0 AND ipii.invoice_type in (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS unSettledSuperviseFee
+        -- SUM(CASE WHEN ipii.`status` = 1 AND ipii.invoice_type IN (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS settledAmount,
+        -- SUM(CASE WHEN ipii.`status` = 0 AND ipii.invoice_type in (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS unSettledSuperviseFee
         -- ,SUM(CASE WHEN ipii.`status` = 0 AND ipii.invoice_type in (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS unSettledFollowFee,
-        SUM(CASE WHEN ipii.`status` = 0 AND ipii.invoice_type IN (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS unSettledAmount
+        -- SUM(CASE WHEN ipii.`status` = 0 AND ipii.invoice_type IN (5,6) THEN ipii.receivable_supervise_premium ELSE 0 END) AS unSettledAmount,
+        GROUP_CONCAT(distinct ipii.id) as invoice_ids
         FROM
         ins_ply_income ipi
         LEFT JOIN ins_ply_income_invoice_link ipil ON ipi.id = ipil.income_id AND ipil.is_delete = 0
@@ -1624,6 +1645,12 @@
             <if test="settlementReportQueryVo.receiver != null and settlementReportQueryVo.receiver != ''">
                 AND ipi.contact_person = #{settlementReportQueryVo.receiver}
             </if>
+            <if test="settlementReportQueryVo.invoiceTypes != null and settlementReportQueryVo.invoiceTypes.size() > 0" >
+                and ipii.invoice_type in
+                <foreach collection="settlementReportQueryVo.invoiceTypes" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
             <if test="settlementReportQueryVo.startTime != null and settlementReportQueryVo.startTime != ''">
                 AND ipi.signing_time BETWEEN #{settlementReportQueryVo.startTime} AND #{settlementReportQueryVo.endTime}
                 AND (ipii.invoice_time BETWEEN #{settlementReportQueryVo.startTime} AND #{settlementReportQueryVo.endTime}
@@ -1781,5 +1808,17 @@
             </if>
         </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
+        <where>
+            <if test="invoiceIdList != null and invoiceIdList.size() > 0">
+                and ipiis.invoice_id in
+                <foreach collection="invoiceIdList" item="item" open="(" separator="," close=")">
+                    ${item}
+                </foreach>
+            </if>
+        </where>
+    </select>
 
 </mapper>

Некоторые файлы не были показаны из-за большого количества измененных файлов