Explorar o código

Merge remote-tracking branch 'origin/master'

lixiaolong hai 3 meses
pai
achega
5810fae88a
Modificáronse 36 ficheiros con 664 adicións e 289 borrados
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesAddParam.java
  2. 5 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java
  3. 8 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/ExportSuperviseSettlementExcelDto.java
  4. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRules.java
  5. 13 13
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  6. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/AgreementRulesVo.java
  7. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/IncomeAndExpenseVo.java
  8. 74 4
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  9. 10 2
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java
  10. 2 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerRequestComponent.java
  11. 18 28
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiInsurancePlanRequest.java
  12. 1 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQuoteRequest.java
  13. 4 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiJointSalesResponse.java
  14. 63 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java
  15. 6 5
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java
  16. 51 25
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerProposalNoSaveRequest.java
  17. 20 6
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  18. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java
  19. 17 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java
  20. 11 10
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  21. 7 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java
  22. 32 11
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java
  23. 45 11
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  24. 3 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java
  25. 1 1
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerCacheComponent.java
  26. 89 59
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerRequestComponent.java
  27. 46 68
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerQuoteProcessServiceImpl.java
  28. 17 20
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java
  29. 18 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  30. 8 8
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  31. 9 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  32. 2 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java
  33. 1 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  34. 38 7
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  35. 18 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java
  36. 11 1
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

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

@@ -21,6 +21,9 @@ public class AgreementRulesAddParam {
     @Schema(description = "生效截止时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
     @Schema(description = "规则属性")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;
 

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java

@@ -2,6 +2,7 @@ package com.jzg.commons.entity.dto;
 
 import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttrLink;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -27,6 +28,10 @@ public class AgreementRulesEditParam {
     @Schema(description = "生效截止时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
+    @NotEmpty(message = "规则属性不能为空")
     @Schema(description = "规则属性(单条模式)")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;
 

+ 8 - 0
commons/src/main/java/com/jzg/commons/entity/finance/dto/ExportSuperviseSettlementExcelDto.java

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.finance.dto;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -19,10 +20,12 @@ public class ExportSuperviseSettlementExcelDto {
     private String settlementId;
 
     @Schema(description = "结算状态")
+    @ExcelProperty(value = "结算状态")
     private String settlementStatus;
 
     // 结算状态转义
     @Schema(description = "结算状态")
+    @ExcelProperty(value = "结算状态")
     private String settlementStatusName;
 
     @Schema(description = "保险公司")
@@ -30,6 +33,7 @@ public class ExportSuperviseSettlementExcelDto {
     private String companyName;
 
     @Schema(description = "保险公司序号")
+    @ExcelIgnore
     private String companyId;
 
     @Schema(description = "开票方")
@@ -42,6 +46,7 @@ public class ExportSuperviseSettlementExcelDto {
 
     // 应收项转义
     @Schema(description = "应收项")
+    @ExcelProperty(value = "应收项")
     private String invoiceTypeName;
 
     @Schema(description = "税点")
@@ -73,12 +78,15 @@ public class ExportSuperviseSettlementExcelDto {
     private String invoiceId;
 
     @Schema(description = "附件id")
+    @ExcelIgnore
     private String fileId;
 
     @Schema(description = "附件url")
+    @ExcelIgnore
     private String fileUrl;
 
     @Schema(description = "订单号")
+    @ExcelProperty(value = "订单号")
     private String orderNo;
 
 }

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

@@ -29,6 +29,9 @@ public class PtlAgreementUndwrtRules extends BaseModel {
     @Schema(description = "生效结束时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

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

@@ -371,20 +371,20 @@ public class QuoteEchoVo extends QuoteVo {
             }
         });
         // 添加交强险种信息
-//        if(ProductsType.isContainDj(insOrdersVo.getProductId())){
-//            KindInfoVo jqKindInfoVo = new KindInfoVo();
-//            jqKindInfoVo.setKindCode("J1");
-//            jqKindInfoVo.setKindName("机动车交通事故责任强制保险");
-//            if(Objects.nonNull(insOrdersVo.getInsOrdersCosts().getJqPremium())) {
-//                jqKindInfoVo.setPremium(insOrdersVo.getInsOrdersCosts().getJqPremium().toString());
-//            }
-//            jqKindInfoVo.setAmount("200000");
-//            jqKindInfoVo.setServiceTimes("200000");
-//            jqKindInfoVo.setUnitAmount("200000");
-//            insOrdersVo.getKindInfoVo().add(0,jqKindInfoVo);
-//        }
+        if(ProductsType.isContainDj(insOrdersVo.getProductId())){
+            KindInfoVo jqKindInfoVo = new KindInfoVo();
+            jqKindInfoVo.setKindCode("J1");
+            jqKindInfoVo.setKindName("机动车交通事故责任强制保险");
+            if(Objects.nonNull(insOrdersVo.getInsOrdersCosts().getJqPremium())) {
+                jqKindInfoVo.setPremium(insOrdersVo.getInsOrdersCosts().getJqPremium().toString());
+            }
+            jqKindInfoVo.setAmount("200000");
+            jqKindInfoVo.setServiceTimes("200000");
+            jqKindInfoVo.setUnitAmount("200000");
+            insOrdersVo.getKindInfoVo().add(0,jqKindInfoVo);
+        }
         // 移除交强
-        insOrdersVo.getKindInfoVo().removeIf(item -> "J1".equals(item.getKindCode()));
+//        insOrdersVo.getKindInfoVo().removeIf(item -> "J1".equals(item.getKindCode()));
 
         this.setKindInfoVo(insOrdersVo.getKindInfoVo());
         this.setAccidentalDrivings(insOrdersVo.getAccidentalDrivings());

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

@@ -29,6 +29,9 @@ public class AgreementRulesVo extends BaseModel {
     @Schema(description = "生效截止时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

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

@@ -53,5 +53,11 @@ public class IncomeAndExpenseVo {
 
         @Schema(description = "银行名称")
         private String bankName;
+
+        @Schema(description = "用户名")
+        private String userName;
+
+        @Schema(description = "银行卡号")
+        private String bankCardNum;
     }
 }

+ 74 - 4
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.ansheng.crawler.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -33,7 +34,11 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -56,6 +61,14 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     private final AnShengCrawlerQuoteProcessService anShengCrawlerQuoteProcessService;
 
+
+    /** 最大重试次数:获取支付链接 */
+    private static final int MAX_PAY_LINK_RETRY = 15;
+    /** 每次重试间隔休眠毫秒:3秒 */
+    private static final long RETRY_SLEEP_MILLIS = 3000L;
+
+
+
     @Override
     public void login(LoginBase loginBase) {
         anShengCrawlerLoginService.login(loginBase.getUsername(), loginBase.getPassword());
@@ -221,7 +234,15 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         saveThePolicyNumber(ordersNo, applyApplicationResponse);
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(ordersNo);
-        if (!applyApplicationResponse.getCode().equals(200)) {
+
+        PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
+        if (applyApplicationResponse.getCode().equals(200)) {
+            PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+            paymentLinkVo.setOrder(underwritingVo.getOrder());
+            paymentLinkResultsVo = loopAcquisitionPaymentLink(paymentLinkVo);
+        }
+
+        if (!applyApplicationResponse.getCode().equals(200) && StringUtils.isEmpty(paymentLinkResultsVo.getPaymentLink())) {
             underwritingResultsVo.setUnderwritingResult(applyApplicationResponse.getMessage());
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
             return underwritingResultsVo;
@@ -231,12 +252,62 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
             if (anShengCrawlerOrder.getNiInfos().size() > 0) {
                 underwritingResultsVo.setJyApplyNo(anShengCrawlerOrder.getNiInfos().get(0).getNiPolicyNumber());
             }
+            underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         }
-        underwritingResultsVo.setPaymentLink("");
         return underwritingResultsVo;
     }
 
+    /**
+     * 循环重试获取支付链接
+     * @param paymentLinkVo 请求参数
+     * @return 支付链接结果
+     */
+    private PaymentLinkResultsVo loopAcquisitionPaymentLink(PaymentLinkVo paymentLinkVo) {
+        if (paymentLinkVo == null || paymentLinkVo.getOrder() == null) {
+            log.error("获取支付链接入参为空");
+            return new PaymentLinkResultsVo();
+        }
+        String ordersNo = paymentLinkVo.getOrder().getOrdersNo();
+        PaymentLinkResultsVo linkResult = null;
+        for (int retryCount = 0; retryCount < MAX_PAY_LINK_RETRY; retryCount++) {
+            try {
+                linkResult = getPaymentLink(paymentLinkVo);
+                log.info("订单[{}]第{}次获取支付链接,返回结果:{}", ordersNo, retryCount + 1, JSONObject.toJSONString(linkResult));
+                if (linkResult != null && StrUtil.isNotBlank(linkResult.getPaymentLink())) {
+                    log.info("订单[{}]第{}次成功获取支付链接", ordersNo, retryCount + 1);
+                    break;
+                }
+            } catch (Exception e) {
+                log.error("订单[{}]第{}次调用获取支付链接接口异常", ordersNo, retryCount + 1, e);
+            }
+            if (retryCount != MAX_PAY_LINK_RETRY - 1) {
+                boolean sleepSuccess = sleep(RETRY_SLEEP_MILLIS);
+                if (!sleepSuccess) {
+                    log.warn("订单[{}]支付链接重试休眠被中断,终止重试", ordersNo);
+                    break;
+                }
+            }
+        }
+        return linkResult == null ? new PaymentLinkResultsVo() : linkResult;
+    }
+
+    /**
+     * @param millis 休眠毫秒数
+     * @return true=正常休眠完成;false=被中断
+     */
+    private boolean sleep(long millis) {
+        try {
+            TimeUnit.MILLISECONDS.sleep(millis);
+            return true;
+        } catch (InterruptedException ie) {
+            Thread.currentThread().interrupt();
+            return false;
+        }
+    }
+
+
+
     /**
      * 保存投保单号
      *
@@ -276,7 +347,6 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         // 获取支付链接
         AnShengCrawlerPaymentRequest anShengCrawlerPaymentRequest = new AnShengCrawlerPaymentRequest(anShengCrawlerOrder, userDetailResponse.getDepartmentCode(), anShengCrawlerOrder.getTotalPremium());
         String paymentUrl = anShengCrawlerRequestComponent.payment(anShengCrawlerPaymentRequest, httpHeaders);
-        log.info("获取安盛支付二维码地址长度:{}", StringUtils.isNotEmpty(paymentUrl) ? paymentUrl.length() : "无法获取支付链接");
         return new PaymentLinkResultsVo(true, paymentUrl, "");
     }
 

+ 10 - 2
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java

@@ -105,8 +105,16 @@ public class DaDiCrawlerQuoteResultVoBuild {
         int sumPayment = daDiQuoteResponse.getInsurancePlan().getTax().getSumPayment();
         quoteResultsVo.getCosts().setVvTax(String.valueOf(sumPayment));
         //设置非车保费
-        int niPremium = daDiQuoteResponse.getInsurancePlan().getBusinessDuePremium();
-        quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
+        if (!daDiQuoteResponse.getInsurancePlan().getAccidentInsure().isEmpty()) {
+            int niPremium = daDiQuoteResponse.getInsurancePlan().getAccidentInsure().get(0).getWealthAccPremium();
+            quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
+        }else if (!daDiQuoteResponse.getInsurancePlan().getHealthInsurance().isEmpty()) {
+            int niPremium = daDiQuoteResponse.getInsurancePlan().getHealthInsurance().get(0).getWealthAccPremium();
+            quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
+        }else  if (!daDiQuoteResponse.getInsurancePlan().getPropertyInsurance().isEmpty()) {
+            int niPremium = daDiQuoteResponse.getInsurancePlan().getHealthInsurance().get(0).getWealthAccPremium();
+            quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
+        }
 
         //总保费
         int sumPremium = trafficDuePremium + businessDuePremium + sumPayment;

+ 2 - 1
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerRequestComponent.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.dadi.crawler.component;
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
@@ -440,7 +441,7 @@ public class DaDiCrawlerRequestComponent {
         String url = RequestUrl.CALCULATION_PREMIUM.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
 
         DaDiQuoteRequest daDiQuoteRequest = new DaDiQuoteRequest(quoteVo, orderId, checks, daDiVehicleChannelRequest.getComCode(), daDiInsurancePlanRequest, carModelRequest, daDiVehicleChannelRequest);
-        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiQuoteRequest));
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiQuoteRequest, SerializerFeature.DisableCircularReferenceDetect));
         String responseBody = networkRequest.doPost(url, requestBody, headers);
         log.info("\n----------------------> 获取报价信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
         DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);

+ 18 - 28
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiInsurancePlanRequest.java

@@ -259,17 +259,17 @@ public class DaDiInsurancePlanRequest extends DaDiBaseRequest {
     /**
      * 意外险投保信息(可为空)
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> accidentInsure;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> accidentInsure = new ArrayList<>();
 
     /**
      * 健康险投保信息(可为空)
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> healthInsure;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> healthInsure = new ArrayList<>();
 
     /**
      * 财产险投保信息(可为空)
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> propertyInsure;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> propertyInsure = new ArrayList<>();
 
     /**
      * 总保费
@@ -279,17 +279,17 @@ public class DaDiInsurancePlanRequest extends DaDiBaseRequest {
     /**
      * 意外险方案
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> accidentInsurance;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> accidentInsurance = new ArrayList<>();
 
     /**
      * 健康险方案
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> healthInsurance;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> healthInsurance = new ArrayList<>();
 
     /**
      * 财产险方案
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> propertyInsurance;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> propertyInsurance = new ArrayList<>();
 
     /**
      * 再保险项
@@ -454,41 +454,31 @@ public class DaDiInsurancePlanRequest extends DaDiBaseRequest {
                 this.wealthAccSeatCount = quoteVo.getCarInfoVo().getSeatCount();
             }
 
-            DaDiJointSalesResponse.InsuranceDTO insuranceListDTO;
-            // 按产品分类拆分到意外险/健康险/财产险
-            List<DaDiJointSalesResponse.InsuranceDTO> accidentList = new ArrayList<>();
-            List<DaDiJointSalesResponse.InsuranceDTO> healthList = new ArrayList<>();
-            List<DaDiJointSalesResponse.InsuranceDTO> propertyList = new ArrayList<>();
-
-
             for (AccidentalDrivingVo accidentalDriving : accidentalDrivings) {
                 for (Map.Entry<String, List<DaDiJointSalesResponse.InsuranceDTO>> stringListEntry : jointSales.toMap().entrySet()) {
                     for (DaDiJointSalesResponse.InsuranceDTO insuranceDTO : stringListEntry.getValue()) {
-                        if (accidentalDriving.getProductCode().equals(insuranceDTO.getFormulaGroupCode())) {
-                            if (accidentalDriving.getProductCode().equals(insuranceDTO.getFormulaGroupCode())) {
-                                insuranceListDTO = insuranceDTO;
-                                insuranceListDTO.setFormulaGroupCode(insuranceDTO.getFormulaGroupCode());
-                                insuranceListDTO.setFormulaGroupName(insuranceDTO.getFormulaGroupName());
-                                insuranceListDTO.setIsNingdeEraVehicleBatteryCheck(insuranceDTO.getIsNingdeEraVehicleBatteryCheck());
+                        for (DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO jointSalesSolutionVO : insuranceDTO.getJointSalesSolutionVOS()) {
+                            if (accidentalDriving.getProductCode().equals(jointSalesSolutionVO.getFormulaCode())) {
+                                jointSalesSolutionVO.setFormulaGroupCode(insuranceDTO.getFormulaGroupCode());
+                                jointSalesSolutionVO.setFormulaGroupName(insuranceDTO.getFormulaGroupName());
+                                jointSalesSolutionVO.setIsNingdeEraVehicleBatteryCheck(insuranceDTO.getIsNingdeEraVehicleBatteryCheck());
                                 if (stringListEntry.getKey().equals("accidentInsurance")) {
-                                    accidentList.add(insuranceListDTO);
+                                    accidentInsurance.add(jointSalesSolutionVO);
+                                    accidentInsure.add(jointSalesSolutionVO);
                                 } else if (stringListEntry.getKey().equals("healthInsurance")) {
-                                    healthList.add(insuranceListDTO);
+                                    healthInsurance.add(jointSalesSolutionVO);
+                                    healthInsure.add(jointSalesSolutionVO);
                                 } else if (stringListEntry.getKey().equals("propertyInsurance")) {
-                                    propertyList.add(insuranceListDTO);
+                                    propertyInsurance.add(jointSalesSolutionVO);
+                                    propertyInsure.add(jointSalesSolutionVO);
                                 }
+                                break;
                             }
                         }
                     }
                 }
             }
 
-            this.accidentInsurance = accidentList;
-            this.healthInsurance = healthList;
-            this.propertyInsurance = propertyList;
-            this.accidentInsure = accidentList.isEmpty() ? null : accidentList;
-            this.healthInsure = healthList.isEmpty() ? null : healthList;
-            this.propertyInsure = propertyList.isEmpty() ? null : propertyList;
         } else {
             this.wealthAccChecked = "0";
             this.accidentInsurance = new ArrayList<>();

+ 1 - 1
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQuoteRequest.java

@@ -129,7 +129,7 @@ public class DaDiQuoteRequest extends DaDiBaseRequest {
     /**
      * 投保方案
      */
-    private Object insurancePlan;
+    private DaDiInsurancePlanRequest insurancePlan;
 
     /**
      * 车主信息

+ 4 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiJointSalesResponse.java

@@ -57,10 +57,14 @@ public class DaDiJointSalesResponse extends DaDiBaseResponse{
             private String formulaCode;
             @SerializedName("scene")
             private String scene;
+            @SerializedName("isNingdeEraVehicleBatteryCheck")
+            private String isNingdeEraVehicleBatteryCheck;
             @SerializedName("customElement")
             private String customElement;
             @SerializedName("formulaName")
             private String formulaName;
+            @SerializedName("formulaGroupCode")
+            private String formulaGroupCode;
             @SerializedName("formulaGroupName")
             private String formulaGroupName;
             @SerializedName("productCode")

+ 63 - 1
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java

@@ -140,8 +140,13 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
         private String trafficProductCode;
         @SerializedName("accidentInsurance")
         private String accidentInsurance;
+        @SerializedName("accidentInsure")
+        private List<AccidentInsureDTO> accidentInsure;
         @SerializedName("healthInsurance")
-        private String healthInsurance;
+        private List<AccidentInsureDTO> healthInsurance;
+        @SerializedName("propertyInsurance")
+        private List<AccidentInsureDTO> propertyInsurance;
+
 
         @NoArgsConstructor
         @Data
@@ -183,6 +188,63 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
             }
 
         }
+
+        @NoArgsConstructor
+        @Data
+        public static class AccidentInsureDTO {
+            @SerializedName("forms")
+            private List<FormsDTO> forms;
+            @SerializedName("isShowInsured")
+            private String isShowInsured;
+            @SerializedName("jointSalesSolutionItems")
+            private List<JointSalesSolutionItemsDTO> jointSalesSolutionItems;
+            @SerializedName("policyNature")
+            private String policyNature;
+            @SerializedName("wealthAccPremium")
+            private int wealthAccPremium;
+
+            @NoArgsConstructor
+            @Data
+            public static class FormsDTO {
+                @SerializedName("customformcontent")
+                private String customformcontent;
+                @SerializedName("customformtitle")
+                private String customformtitle;
+                @SerializedName("formcategory")
+                private String formcategory;
+                @SerializedName("id")
+                private int id;
+                @SerializedName("plandefid")
+                private long plandefid;
+                @SerializedName("planformid")
+                private String planformid;
+                @SerializedName("productelementcode")
+                private String productelementcode;
+                @SerializedName("productelementid")
+                private String productelementid;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class JointSalesSolutionItemsDTO {
+                @SerializedName("defaultAmount")
+                private int defaultAmount;
+                @SerializedName("defaultValue")
+                private int defaultValue;
+                @SerializedName("insureUnit")
+                private String insureUnit;
+                @SerializedName("kindCode")
+                private String kindCode;
+                @SerializedName("kindName")
+                private String kindName;
+                @SerializedName("linkSeats")
+                private int linkSeats;
+                @SerializedName("subsidyAmount")
+                private String subsidyAmount;
+                @SerializedName("subsidyDay")
+                private String subsidyDay;
+            }
+        }
     }
 
     @NoArgsConstructor

+ 6 - 5
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java

@@ -24,7 +24,6 @@ import com.jzg.quotation.dajia.crawler.component.DaJiaCrawlerRequestComponent;
 import com.jzg.quotation.dajia.crawler.entity.DaJiaCrawlerConfigureParameters;
 import com.jzg.quotation.dajia.crawler.entity.po.DaJiaCrawlerOrder;
 import com.jzg.quotation.dajia.crawler.entity.request.*;
-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.request.quote.ProposalInfoDTO;
 import com.jzg.quotation.dajia.crawler.entity.response.*;
@@ -163,11 +162,12 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
             String startTime = extractDuplicateEndTime(message);
             String endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
             CompulsoryInsuranceDTO compulsoryInsuranceDTO = daJiaCrawlerPriceRequest.getCompulsoryInsurance();
-            BusinessInsuranceDTO businessInsuranceDTO = daJiaCrawlerPriceRequest.getBusinessInsurance();
+
             compulsoryInsuranceDTO.getProductInfo().setStartDate(startTime);
             compulsoryInsuranceDTO.getProductInfo().setEndDate(endTime);
-            businessInsuranceDTO.getProductInfo().setStartDate(startTime);
-            businessInsuranceDTO.getProductInfo().setEndDate(endTime);
+//            BusinessInsuranceDTO businessInsuranceDTO = daJiaCrawlerPriceRequest.getBusinessInsurance();
+//            businessInsuranceDTO.getProductInfo().setStartDate(startTime);
+//            businessInsuranceDTO.getProductInfo().setEndDate(endTime);
             crawlerPriceResponse = daJiaCrawlerRequestComponent.price(daJiaCrawlerPriceRequest, headers);
         }
         String lastPolicyNo = crawlerPriceResponse.getCompulsoryInsurance().getProductInfo().getLastPolicyNo();
@@ -177,12 +177,13 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         log.info("报价返回参数:{}", JSONObject.toJSONString(crawlerPriceResponse));
         // 3.1 保存订单到保险公司系统
         DaJiaCrawlerSaveRequest daJiaCrawlerSaveRequest = new DaJiaCrawlerSaveRequest(crawlerPriceResponse, userCode, quoteVo);
+        log.info("大家保存数据:{}", JSONObject.toJSONString(daJiaCrawlerSaveRequest));
         DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse = daJiaCrawlerRequestComponent.save(daJiaCrawlerSaveRequest, headers);
         log.info("daJiaCrawlerSaveResponse:{}", JSONObject.toJSONString(daJiaCrawlerSaveResponse));
         // 3.2 初始化订单数据
         DaJiaCrawlerInitDataRequest daJiaCrawlerInitDataRequest = new DaJiaCrawlerInitDataRequest(daJiaCrawlerSaveResponse.getCompulsoryInsurance(), daJiaCrawlerSaveResponse.getBusinessInsurance());
         daJiaCrawlerRequestComponent.initData(daJiaCrawlerInitDataRequest, headers);
-
+        log.info("大家初始化数据:{}", JSONObject.toJSONString(daJiaCrawlerInitDataRequest));
         // 4.0 缓存订单数据供后续操作使用
         daJiaCrawlerCacheComponent.cacheDaJiaCrawlerSaveResponse(daJiaCrawlerSaveResponse, daJiaCrawlerSaveResponse.getProposalInfo().getOrderNo());
 

+ 51 - 25
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerProposalNoSaveRequest.java

@@ -49,49 +49,75 @@ public class GuoRenCrawlerProposalNoSaveRequest implements Serializable {
     }
 
     /**
-     * 从试算响应中提取报价ID,回填到保存请求的bc字段中
+     * 从试算响应中提取报价ID及关键字段,回填到保存请求中
      * 解决保司合规规则"报价ID缺失"问题
      */
     private void fillProposalNoFromResponse(GuoRenCrawlerCalculationPremiumData response) {
         if (response == null) {
             return;
         }
-        // 1. 从响应的BC中回填proposalNo到请求的BC
+        // 1. 从响应的BC中回填关键字段到请求的BC
         GuoRenCrawlerCalculationPremiumData.BcDTO responseBc = response.getBc();
-        if (responseBc != null) {
-            // 回填BC.prpTmain.proposalNo
-            if (responseBc.getPrpTmain() != null && StringUtils.hasText(responseBc.getPrpTmain().getProposalNo())) {
-                String bcProposalNo = responseBc.getPrpTmain().getProposalNo();
-                String bcDemandNo = responseBc.getPrpTmain().getDemandNo();
-                if (this.bc.getPrpTmain() != null) {
-                    this.bc.getPrpTmain().setProposalNo(bcProposalNo);
-                    this.bc.getPrpTmain().setDemandNo(bcDemandNo);
-                }
-                if (this.bc.getPrpTitemCar() != null) {
-                    this.bc.getPrpTitemCar().setProposalNo(bcProposalNo);
-                }
+        if (responseBc != null && responseBc.getPrpTmain() != null && this.bc.getPrpTmain() != null) {
+            String bcProposalNo = responseBc.getPrpTmain().getProposalNo();
+            String bcDemandNo = responseBc.getPrpTmain().getDemandNo();
+            String bcCertiNo = responseBc.getPrpTmain().getCertiNo();
+            String bcCarsonlyid = responseBc.getPrpTmain().getCarsonlyid();
+            if (StringUtils.hasText(bcProposalNo)) {
+                this.bc.getPrpTmain().setProposalNo(bcProposalNo);
+            }
+            if (StringUtils.hasText(bcDemandNo)) {
+                this.bc.getPrpTmain().setDemandNo(bcDemandNo);
+            }
+            if (StringUtils.hasText(bcCertiNo)) {
+                this.bc.getPrpTmain().setCertiNo(bcCertiNo);
+                this.bc.getPrpTmain().setCertino1(bcCertiNo);
+            }
+            if (StringUtils.hasText(bcCarsonlyid)) {
+                this.bc.getPrpTmain().setCarsonlyid(bcCarsonlyid);
+            }
+            if (this.bc.getPrpTitemCar() != null && StringUtils.hasText(bcProposalNo)) {
+                this.bc.getPrpTitemCar().setProposalNo(bcProposalNo);
             }
         }
-        // 2. 从响应的CI中回填proposalNo到ciInsureDemand
+        // 2. 从响应的CI中回填proposalNo/demandNo,并传播到子对象
         GuoRenCrawlerCalculationPremiumData.CiDTO responseCi = response.getCi();
-        if (responseCi != null && responseCi.getPrpTmain() != null
-                && StringUtils.hasText(responseCi.getPrpTmain().getProposalNo())) {
+        if (responseCi != null && responseCi.getPrpTmain() != null) {
             String ciProposalNo = responseCi.getPrpTmain().getProposalNo();
-            String demandNo = responseCi.getPrpTmain().getDemandNo();
+            String ciDemandNo = responseCi.getPrpTmain().getDemandNo();
+            // 回填ciInsureDemand
             if (this.ci != null && this.ci.getCiInsureDemand() != null) {
-                this.ci.getCiInsureDemand().setProposalNo(ciProposalNo);
-                this.ci.getCiInsureDemand().setDemandNo(demandNo);
+                if (StringUtils.hasText(ciProposalNo)) {
+                    this.ci.getCiInsureDemand().setProposalNo(ciProposalNo);
+                }
+                if (StringUtils.hasText(ciDemandNo)) {
+                    this.ci.getCiInsureDemand().setDemandNo(ciDemandNo);
+                }
+            }
+            // 传播demandNo到ciCarShipTaxQGDemandSchema
+            if (this.ci != null && this.ci.getCiCarShipTaxQGDemandSchema() != null) {
+                String effectiveDemandNo = StringUtils.hasText(ciDemandNo) ? ciDemandNo
+                        : (this.ci.getCiInsureDemand() != null ? this.ci.getCiInsureDemand().getDemandNo() : null);
+                if (StringUtils.hasText(effectiveDemandNo)) {
+                    this.ci.getCiCarShipTaxQGDemandSchema().setDemandNo(effectiveDemandNo);
+                }
+                if (StringUtils.hasText(ciProposalNo)) {
+                    this.ci.getCiCarShipTaxQGDemandSchema().setProposalNo(ciProposalNo);
+                }
             }
         }
-        // 3. 从响应的BI中回填proposalNo到ciInsureDemand
+        // 3. 从响应的BI中回填proposalNo/demandNo到ciInsureDemand
         GuoRenCrawlerCalculationPremiumData.BiDTO responseBi = response.getBi();
-        if (responseBi != null && responseBi.getPrpTmain() != null
-                && StringUtils.hasText(responseBi.getPrpTmain().getProposalNo())) {
+        if (responseBi != null && responseBi.getPrpTmain() != null) {
             String biProposalNo = responseBi.getPrpTmain().getProposalNo();
             String biDemandNo = responseBi.getPrpTmain().getDemandNo();
             if (this.bi != null && this.bi.getCiInsureDemand() != null) {
-                this.bi.getCiInsureDemand().setProposalNo(biProposalNo);
-                this.bi.getCiInsureDemand().setDemandNo(biDemandNo);
+                if (StringUtils.hasText(biProposalNo)) {
+                    this.bi.getCiInsureDemand().setProposalNo(biProposalNo);
+                }
+                if (StringUtils.hasText(biDemandNo)) {
+                    this.bi.getCiInsureDemand().setDemandNo(biDemandNo);
+                }
             }
         }
     }

+ 20 - 6
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java

@@ -111,7 +111,7 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
     public HttpHeaders getHeaders(String username) {
         HttpHeaders headers = new HttpHeaders();
         String token = guoRenCrawlerCacheComponent.getToken(username);
-//        String token = "eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3Nzg5MjY2MDB9.UYGTs0DQgbZJinMWJExUV18JhfJW23JonveQVVq6N5Muy_vu6Py8pL-AI5Ohv0BDoCCfdOD7SjLmiCqGy4uU9130O1_QlLzyxsriiBKUPXPJKbipftpqSdjYyFSgfNSIySO99hs005Ip89HnkaT34ephMA-C8jyyxGShQdNkuxI";
+//        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3ODEyNDU1NDJ9.YsfJuQ58NaPa-7aUrYjh0SdvRkxhsiejP648H39j6h1PztC0b5Rdb8GOi5oGkVew_CI-T5j0VeaYfSFF-DrqrT_LReqtbl-iM0_OeN8acFLNcXbhfv80mRz1HqPZrUXrwngS-8Q6eF42gOJVxAX_nSFNdJpX5977A3_KJdmVbxs";
         if (!StringUtils.hasText(token)) {
             throw new TokenExpireException("500", "国任财险账号登录过期,请重新登录");
         }
@@ -215,11 +215,25 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
                 calculationPremium.getCi().getPrpTmain().getProposalNo());
         crawlerCalculationPremiumRequest.getCi().setCiInsureDemand(calculationPremium.getCi().getCiInsureDemand());
         crawlerCalculationPremiumRequest.getCi().setPrptengageList(calculationPremium.getCi().getPrptengageList());
-        // BC也需要回填proposalNo
-        if (calculationPremium.getBc() != null && calculationPremium.getBc().getPrpTmain() != null
-                && org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getProposalNo())) {
-            crawlerCalculationPremiumRequest.getBc().getPrpTmain().setProposalNo(
-                    calculationPremium.getBc().getPrpTmain().getProposalNo());
+        // BC也需要回填proposalNo/demandNo/certiNo/carsonlyid
+        if (calculationPremium.getBc() != null && calculationPremium.getBc().getPrpTmain() != null) {
+            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getProposalNo())) {
+                crawlerCalculationPremiumRequest.getBc().getPrpTmain().setProposalNo(
+                        calculationPremium.getBc().getPrpTmain().getProposalNo());
+            }
+            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getDemandNo())) {
+                crawlerCalculationPremiumRequest.getBc().getPrpTmain().setDemandNo(
+                        calculationPremium.getBc().getPrpTmain().getDemandNo());
+            }
+            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getCertiNo())) {
+                String certiNo = calculationPremium.getBc().getPrpTmain().getCertiNo();
+                crawlerCalculationPremiumRequest.getBc().getPrpTmain().setCertiNo(certiNo);
+                crawlerCalculationPremiumRequest.getBc().getPrpTmain().setCertino1(certiNo);
+            }
+            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getCarsonlyid())) {
+                crawlerCalculationPremiumRequest.getBc().getPrpTmain().setCarsonlyid(
+                        calculationPremium.getBc().getPrpTmain().getCarsonlyid());
+            }
         }
         if (crawlerCalculationPremiumRequest.getBi().getPrpTmain() != null) {
             crawlerCalculationPremiumRequest.getBi().getPrpTmain().setDemandNo(demandNoBi);

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java

@@ -32,7 +32,7 @@ public class AsyncGetPayLink {
     @Async("asyncTaskExecutor")
     public void paymentLink(QuotationBaseService quoteService,OrderBase order, String companyCode ){
         try {
-            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)
+            if (StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)
                     || StringUtils.equals(CompanyConstants.TSBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.HTIC.getCompanyCode(),companyCode)
             ){
                 PaymentLinkVo paymentLinkVo = new PaymentLinkVo();

+ 17 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java

@@ -9,6 +9,8 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.QrBarcodeConfig;
+import com.jzg.commons.entity.quote.vo.aggregated.PaymentLinkVo;
+import com.jzg.commons.entity.quote.vo.base.OrderBase;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.LocalDateTimeUtils;
@@ -51,6 +53,7 @@ public class QrCodeController extends BaseController {
     private final InsOrdersCarInfoService insOrdersCarInfoService;
     private final InsOrdersRiskService insOrdersRiskService;
     private final PlatformClient platformClient;
+    private final UnifyOrderManager unifyOrderManager;
     //二维码生成地址
     @Value("${qrcode.genAddress}")
     private String qrCodeGenAddress;
@@ -60,7 +63,7 @@ public class QrCodeController extends BaseController {
 
     @GetMapping(value = "/getQrCode")
     @Operation(summary = "获取二维码")
-    public ModelAndView getQrCode(@NotBlank(message = "订单号号不能为空") @RequestParam("orderNo") String orderNo) {
+    public ModelAndView getQrCode(@NotBlank(message = "订单号号不能为空") @RequestParam("orderNo") String orderNo) throws Exception {
         // 获取保存支付url
         InsOrders orders = insOrdersService.getById(orderNo);
         List<InsOrdersCarUserInfo> carUserInfoList = insOrdersCarUserInfoService.getByOrderId(orderNo);
@@ -96,6 +99,13 @@ public class QrCodeController extends BaseController {
 
         InsOrdersQrcode ordersQrcode = insOrdersQrcodeService.getOneOrSave(orders);
         if(ordersQrcode.getJumpUrl() == null || ordersQrcode.getJumpUrl().isEmpty()){
+            // 尝试获取支付连接
+            PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+            OrderBase orderBase = new OrderBase();
+            orderBase.setOrdersNo(orderNo);
+            paymentLinkVo.setOrder(orderBase);
+            HttpResult httpResult = unifyOrderManager.getPaymentLink(paymentLinkVo);
+
             throw new SystemException("订单不存在支付连接");
         }
 
@@ -203,7 +213,12 @@ public class QrCodeController extends BaseController {
                     }
                 } else {
                     // 本身就是 base64
-                    finalQrUrl = "data:image/png;base64," + jumpUrl;
+                    boolean isBase64Image = jumpUrl.startsWith("data:image/");
+                    if(!isBase64Image) {
+                        finalQrUrl = "data:image/png;base64," + jumpUrl;
+                    }else{
+                        finalQrUrl = jumpUrl;
+                    }
                 }
 
                 qrCodeVo.setQrCodeUrl(finalQrUrl);

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

@@ -42,10 +42,7 @@ import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.entity.rights.vo.InsOrderRightsInfoVo;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.exception.SystemException;
-import com.jzg.commons.util.AssertionUtils;
-import com.jzg.commons.util.DateTimeUtils;
-import com.jzg.commons.util.MinioUtils;
-import com.jzg.commons.util.StringUtils;
+import com.jzg.commons.util.*;
 import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.quotation.commons.client.OrgClient;
 import com.jzg.quotation.commons.client.PartnerDistributionClient;
@@ -1375,15 +1372,19 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         // 费用信息
         InsFeeOrders insFeeOrders = insFeeOrdersMapper.selectOne(new LambdaQueryWrapper<InsFeeOrders>()
                 .eq(InsFeeOrders::getOrderNo, ordersNo));
-        String systemCode = getSystemCode();
         // 比例信息
         if (insFeeOrders != null) {
-            resultVo.setInsFeeOrders(new InsFeeOrdersVo(insFeeOrders));
-            // modify by lipf,  resultVo.setCostRatio(new PtlAgreementCostRatioVo(ptlAgreementCostTypeList, ptlAgreement)); 这一行代码被注视掉,那么上面两个查询也就没有必要调用了
-            // List<PtlAgreementCostTypeVo> ptlAgreementCostTypeList = orgClient.queryByCostId(insFeeOrders.getCostId());
-            //PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrdersVo.getInsOrders().getAgreementId());
-            //resultVo.setCostRatio(new PtlAgreementCostRatioVo(ptlAgreementCostTypeList, ptlAgreement));
+            // modify by lipf,
+            //resultVo.setCostRatio(new PtlAgreementCostRatioVo(ptlAgreementCostTypeList, ptlAgreement)); 这一行代码被注视掉,那么上面两个查询也就没有必要调用了
+//            List<PtlAgreementCostTypeVo> ptlAgreementCostTypeList = orgClient.queryByCostId(insFeeOrders.getCostId());
+//            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)));
+            resultVo.setInsFeeOrders(new InsFeeOrdersVo(insFeeOrders));
         }
         //权益信息
         InsOrderRightsInfoVo insOrderRightsInfoVo = insOrderRightsInfoService.queryByOrderNo(ordersNo);

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

@@ -7,6 +7,8 @@ import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.taiping.crawler.build.TaiPingCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.taiping.crawler.component.TaiPingCrawlerCacheComponent;
@@ -40,6 +42,11 @@ public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
         taiPingCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
         HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();

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

@@ -17,6 +17,9 @@ import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
 public class TaiShanCrawlerQuoteRequestVoBuild {
 
     public static TaiShanCrawlerQuotationRequest toQuotationDto(QuoteVo quoteVo, TaiShanCrawlerCarResponse.CarModelInfo modelsDTO, String currentValue, TaiShanCrawlerConfigureParameters parameters, TaiShanCrawlerDeptResponse taiShanCrawlerDeptResponse, AttributionInformationVo attributionInformationVo, String policyPersonId, String insuredPersonId) {
@@ -240,7 +243,17 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
         int seatNumber = Integer.parseInt(modelsDTO.getNewSeatNumber());
 
         for (KindInfoVo infoVo : kindInfoVoList) {
-            String kindCode = infoVo.getKindCode();
+            // 注意:kindCode是泰山编码(如030006),platformKindCode才是掌柜编码(如A)
+            // switch使用掌柜编码匹配,与Python insurance_Map的key一致
+            String kindCode = infoVo.getPlatformKindCode();
+            log.info("泰山报价-险种编码: kindCode(泰山)={}, amount={}, platformKindCode(掌柜)={}", infoVo.getKindCode(), infoVo.getAmount(), kindCode);
+
+            // 跳过不在商业险映射表中的险种(如交强险等),与Python insurance_Map一致
+            if (!BUSINESS_KIND_CODES.contains(kindCode)) {
+                log.info("泰山报价-跳过非商业险种: platformKindCode={}", kindCode);
+                continue;
+            }
+
             TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind itemKind;
 
             // 获取对应险种的模板默认值(与Python insurance_Map对应)
@@ -249,6 +262,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                 case "A":
                     itemKind = buildDefaultItemKind("030006", "机动车损失保险", 1);
                     itemKind.setAmount(actualValue);
+                    itemKind.setIndemLmt(actualValue);
                     itemKind.setDeductible("375001");
                     break;
 
@@ -260,7 +274,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setIndemLmtLvl("306006018"); // 默认200万以上
                     for (String[] limit : THIRD_LIMIT_AMT) {
                         double cnameVal = extractNumberFromWan(limit[0]);
-                        if (cnameVal == Double.parseDouble(infoVo.getAmount())) {
+                        if (Math.abs(cnameVal - Double.parseDouble(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmtLvl(limit[1]);
                             break;
                         }
@@ -270,12 +284,11 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                 // D3: 车上人员责任险(驾驶人)
                 case "D3":
                     itemKind = buildDefaultItemKind("030001", "车上人员责任险(驾驶人)", 3);
-                    itemKind.setAmount(Integer.parseInt(infoVo.getAmount()));
+                    itemKind.setAmount(infoVo.getAmount());
                     itemKind.setLiabDaysLmt(1);
                     // 匹配医保外医疗费用档次以获取indemLmtLvl(与Python一致)
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
-                            itemKind.setAmount(infoVo.getAmount());
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmt(actualValue);
                             itemKind.setIndemLmtLvl(med[1]);
                             break;
@@ -291,7 +304,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setPerAmt(d4Amount);
                     itemKind.setLiabDaysLmt(seatNumber - 1);
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmt(actualValue);
                             itemKind.setIndemLmtLvl(med[1]);
                             break;
@@ -305,7 +318,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setAmount(infoVo.getAmount());
                     itemKind.setIndemLmt(infoVo.getAmount());
                     for (String[] scratch : CAR_SCRATCH_LEVELS) {
-                        if (Float.parseFloat(scratch[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (Math.abs(Float.parseFloat(scratch[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmtLvl(scratch[1]);
                             break;
                         }
@@ -326,9 +339,9 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setIndemLmt("500000");
                     itemKind.setIndemLmtLvl("390N27"); // 默认50万
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setAmount(infoVo.getAmount());
-                            itemKind.setIndemLmt(infoVo.getAmount());
+                            itemKind.setIndemLmt(actualValue);
                             itemKind.setIndemLmtLvl(med[1]);
                             break;
                         }
@@ -342,7 +355,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setIndemLmt("500000");
                     itemKind.setIndemLmtLvl("390N27"); // 默认50万
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmtLvl(med[1]);
                             itemKind.setAmount(infoVo.getAmount());
                             itemKind.setIndemLmt(infoVo.getAmount());
@@ -360,7 +373,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setPerAmt("500000");
                     itemKind.setIndemLmtLvl("390N27"); // 默认50万
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setAmount(Integer.parseInt(infoVo.getAmount()) * (seatNumber - 1));
                             itemKind.setIndemLmt(infoVo.getAmount());
                             itemKind.setLiabDaysLmt(seatNumber - 1);
@@ -435,6 +448,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
 
                 default:
                     // 未识别的险种,回退原有逻辑填充
+                    log.warn("泰山报价-未识别的险种编码: kindCode={}, 走fallback逻辑", kindCode);
                     itemKind = fallbackBuildItemKind(infoVo, kindList.size());
                     break;
             }
@@ -564,6 +578,13 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
 
     // ==================== Python 档位静态常量(与 tsbxitem.py 保持一致) ====================
 
+    /** 商业险种编码集合(与Python insurance_Map的key一致),用于过滤非商业险种 */
+    private static final Set<String> BUSINESS_KIND_CODES = new HashSet<>(Arrays.asList(
+            "A", "B", "D3", "D4", "G1", "L", "F",
+            "SY_FJ_YBW1", "SY_FJ_YBW2", "SY_FJ_YBW3",
+            "MJ1", "MJ2", "BD", "TY4"
+    ));
+
     /** 【第三者责任险】限额档次 */
     private static final List<String[]> THIRD_LIMIT_AMT = Arrays.asList(
             new String[]{"10万元", "306006005"},

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

@@ -233,6 +233,22 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
                         itemKind.setBefPremium(res.getBefPremium());
                         itemKind.setBefAnnPrm(res.getBefAnnPrm());
                         itemKind.setBasePrm(res.getBasePrm());
+                        itemKind.setPureRiskPremium(res.getPureRiskPremium());
+                        // 覆盖报价响应中的其他关键字段(与Python直接使用price_res['result']作为save数据一致)
+                        itemKind.setIndemLmtLvl(res.getIndemLmtLvl());
+                        itemKind.setDisCoef(res.getDisCoef());
+                        itemKind.setDuctDiscount(res.getDuctDiscount());
+                        itemKind.setDeductibleRatio(res.getDeductibleRatio());
+                        itemKind.setAfterPremiumYear(res.getAfterPremiumYear());
+                        itemKind.setCalcPrm(res.getCalcPrm());
+                        itemKind.setResvNumberRoad(res.getResvNumberRoad());
+                        itemKind.setResvNumberDriver(res.getResvNumberDriver());
+                        itemKind.setAbsoluteDeductible(res.getAbsoluteDeductible());
+                        itemKind.setResvNumAutonomy(res.getResvNumAutonomy());
+                        itemKind.setAmtVar(res.getAmtVar());
+                        itemKind.setPrmVar(res.getPrmVar());
+                        itemKind.setPkId(res.getPkId());
+                        itemKind.setSeqNo(res.getSeqNo());
                     }
                 });
             }
@@ -286,7 +302,7 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
      */
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
-        log.info("underwritingVo:{}", JSON.toJSONString(underwritingVo));
+        log.info("TaiShan-underwritingVo:{}", JSON.toJSONString(underwritingVo));
         // 1.0 获取认证信息和用户配置
         AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
         TaiShanCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaiShanCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
@@ -302,16 +318,33 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         if ("200".equals(taiShanCrawlerUnderwritingResponse.getCode())) {
-            //核保成功
-            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-            underwritingResultsVo.setJqApplyNo(taiShanCrawlerUnderwritingResponse.getResult().getJqAppNo());
-            underwritingResultsVo.setSyApplyNo(taiShanCrawlerUnderwritingResponse.getResult().getSyAppNo());
-
-            // 获取缴费地址
-            PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
-            paymentLinkVo.setOrder(underwritingVo.getOrder());
-            PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
-            underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+            String retMsg = "";
+            TaiShanCrawlerUnderwritingResponse.Result result = taiShanCrawlerUnderwritingResponse.getResult();
+            if(result != null){
+                retMsg = result.getRetMsg();
+            }
+            log.info("TaiShan-retMsg:{}", JSON.toJSONString(retMsg));
+            if(org.apache.commons.lang3.StringUtils.isNotBlank(retMsg)){
+                if(retMsg.contains("重新提交")){
+                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+//                    StringBuilder sb = new StringBuilder();
+//                    if (null != taiShanCrawlerUnderwritingResponse.getMessage()) {
+//                        sb.append(String.format("错误信息:%s", taiShanCrawlerUnderwritingResponse.getMessage()));
+//                    }
+                    underwritingResultsVo.setUnderwritingResult(retMsg);
+                }else if(retMsg.contains("核保通过")){
+                    //核保成功
+                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+                    underwritingResultsVo.setJqApplyNo(taiShanCrawlerUnderwritingResponse.getResult().getJqAppNo());
+                    underwritingResultsVo.setSyApplyNo(taiShanCrawlerUnderwritingResponse.getResult().getSyAppNo());
+
+                    // 获取缴费地址
+                    PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                    paymentLinkVo.setOrder(underwritingVo.getOrder());
+                    PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                    underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+                }
+            }
         } else {//核保失败
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
             StringBuilder sb = new StringBuilder();
@@ -320,6 +353,7 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
             }
             underwritingResultsVo.setUnderwritingResult(sb.toString());
         }
+        log.info("TaiShan-underwritingResultsVo:{}", JSON.toJSONString(underwritingResultsVo));
         return underwritingResultsVo;
     }
 

+ 3 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java

@@ -192,6 +192,9 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                     coverageDTO.setQuantity(seatCount - 1);
                     coverageDTO.setAmount(String.valueOf(new BigDecimal(kindInfoVo.getUnitAmount()).multiply(new BigDecimal(coverageDTO.getQuantity()))));
                 }
+                if (kindInfoVo.getKindCode().equals("54") || kindInfoVo.getKindCode().equals("55") || kindInfoVo.getKindCode().equals("56") || kindInfoVo.getKindCode().equals("57")) {
+                    coverageDTO.setQuantity(Integer.parseInt(kindInfoVo.getServiceTimes()));
+                }
                 coverageDTO.setValidDate(biRiskInfoVo.getStartDate());
                 coverageDTO.setExpiryDate(biRiskInfoVo.getEndDate());
                 coverageDTOList.add(coverageDTO);

+ 1 - 1
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerCacheComponent.java

@@ -69,7 +69,7 @@ public class ZiJinCrawlerCacheComponent {
         String authorization = token;
         authorizationMap.put(AUTHORIZATION, authorization);
         authorizationMap.put(USER_CODE, userCode);
-        RMap<Object, Object> map = redissonClient.getMap(ZIJIN_AUTHORIZATION + userName);
+        RMap<Object, Object> map = redissonClient.getMap(ZIJIN_AUTHORIZATION + userCode);
         map.putAll(authorizationMap);
         map.expire(Duration.ofHours(ZIJIN_AUTHORIZATION_TIME));
         return authorization;

+ 89 - 59
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerRequestComponent.java

@@ -2,18 +2,18 @@ package com.jzg.quotation.zijin.crawler.component;
 
 import com.alibaba.fastjson2.JSON;
 import com.google.zxing.NotFoundException;
-import com.jzg.commons.exception.SystemException;
-import com.jzg.quotation.zijin.crawler.enums.RequestUrl;
+import com.jzg.quotation.commons.component.RequestComponent;
+import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.zijin.crawler.entity.request.*;
 import com.jzg.quotation.zijin.crawler.entity.response.*;
+import com.jzg.quotation.zijin.crawler.enums.RequestUrl;
 import com.jzg.quotation.zijin.crawler.properties.ZiJinCrawlerProperties;
-import com.jzg.quotation.zijin.crawler.util.*;
-import com.jzg.quotation.commons.component.RequestComponent;
+import com.jzg.quotation.zijin.crawler.util.DESEncryption;
+import com.jzg.quotation.zijin.crawler.util.RS6Item;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
@@ -21,7 +21,10 @@ import org.springframework.util.MultiValueMap;
 import org.springframework.util.StringUtils;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @description: 紫金财险爬虫请求组件
@@ -39,9 +42,10 @@ public class ZiJinCrawlerRequestComponent {
 
     private final RequestComponent requestComponent;
 
-
     private final ZiJinCrawlerProperties ziJinCrawlerProperties;
 
+    private final ExteriorUtilsRequest exteriorUtilsRequest;
+
     /**
      * 获取验证码
      *
@@ -52,7 +56,7 @@ public class ZiJinCrawlerRequestComponent {
         ZiJinCrawlerCaptchaResponse ziJinCrawlerCaptchaResponse = null;
         try {
             if (frequency <= 0) {
-                //throw new SystemException("验证码请求频次异常");
+                // throw new SystemException("验证码请求频次异常");
                 ziJinCrawlerCaptchaResponse = new ZiJinCrawlerCaptchaResponse();
                 ziJinCrawlerCaptchaResponse.setRtnCode("500");
                 ziJinCrawlerCaptchaResponse.setRtnMsg("验证码请求频次异常");
@@ -69,9 +73,11 @@ public class ZiJinCrawlerRequestComponent {
             ziJinCrawlerCaptchaResponse = responseEntity.getBody();
             log.info("获取验证码接口响应内容:{}", JSON.toJSONString(ziJinCrawlerCaptchaResponse));
             String captchaImg = ziJinCrawlerCaptchaResponse.getCaptchaImg();
-            String captcha = captchaImg.split(",")[1].trim();
+            // String captcha = captchaImg.split(",")[1].trim();
             // 识别验证码的内容
-            String captchaContent = CaptchaUtil.performOCR(captcha);
+            // String captchaContent = CaptchaUtil.performOCR(captcha);
+            // 识别验证码
+            String captchaContent = exteriorUtilsRequest.captchaIdentify(captchaImg);
             log.info("验证码内容:{}", captchaContent);
             ziJinCrawlerCaptchaResponse.setCaptchaContent(captchaContent);
         } catch (Exception e) {
@@ -110,7 +116,7 @@ public class ZiJinCrawlerRequestComponent {
 
         HttpHeaders httpHeaders = setHttpHeaders();
         httpHeaders.setContentLength(289);
-        //需要单独设置这个
+        // 需要单独设置这个
         httpHeaders.set("Authorization", token);
         httpHeaders.set("loginToken", token);
         String jsonString = JSON.toJSONString(ziJinCrawlerCheckCaptchaRequest);
@@ -119,7 +125,7 @@ public class ZiJinCrawlerRequestComponent {
     }
 
     /**
-     * 校验token
+     * 校验token(Python没有这个接口)
      *
      * @param ziJinCrawlerCheckTokenRequest
      * @param token
@@ -127,12 +133,12 @@ public class ZiJinCrawlerRequestComponent {
      */
     public ZiJinCrawlerCheckTokenResponse checkToken(ZiJinCrawlerCheckTokenRequest ziJinCrawlerCheckTokenRequest, String token) throws IOException {
         log.info("ziJinCrawlerCheckTokenRequest请求参数的值:{}", JSON.toJSONString(ziJinCrawlerCheckTokenRequest));
-
         HttpHeaders httpHeaders = setHttpHeaders();
         httpHeaders.setContentLength(66);
-        //需要单独设置这个
+        // 需要单独设置这个
         httpHeaders.set("Authorization", token);
         httpHeaders.set("loginToken", token);
+
         String jsonString = JSON.toJSONString(ziJinCrawlerCheckTokenRequest);
         ResponseEntity<ZiJinCrawlerCheckTokenResponse> responseEntity = requestComponent.post(RequestUrl.CHECK_TOKEN.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerCheckTokenResponse.class, httpHeaders);
         return responseEntity.getBody();
@@ -150,9 +156,9 @@ public class ZiJinCrawlerRequestComponent {
         ZiJinCrawlerCaptchaResponse captcha = captcha(CIRCULATE_NUMBER);
         // 登录存入缓存当中
         ZiJinCrawlerAuthenticateRequest request = new ZiJinCrawlerAuthenticateRequest(captcha, username, password);
-        //ZiJinCrawlerBaseRequest crawlerBaseRequest = new ZiJinCrawlerBaseRequest(request);
+        // ZiJinCrawlerBaseRequest crawlerBaseRequest = new ZiJinCrawlerBaseRequest(request);
         ZiJinCrawlerBaseRequest crawlerBaseRequest = null;
-        //return requestComponent.objectPost(RequestUrl.AUTHENTICATE.getRequestUrl(""), crawlerBaseRequest, ZiJinCrawlerBaseResponse.class);
+        // return requestComponent.objectPost(RequestUrl.AUTHENTICATE.getRequestUrl(""), crawlerBaseRequest, ZiJinCrawlerBaseResponse.class);
         return null;
     }
 
@@ -165,7 +171,7 @@ public class ZiJinCrawlerRequestComponent {
      * @return 获取渠道信息响应
      */
     public ZiJinCrawlerGetSaleInfoResponse getSaleInfo(String operatorCode, HttpHeaders headers) {
-        //String url = RequestUrl.GET_SALE_INFO.getRequestUrl("") + operatorCode;
+        // String url = RequestUrl.GET_SALE_INFO.getRequestUrl("") + operatorCode;
         String url = "";
         MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
         map.add("operatorCode", operatorCode);
@@ -181,8 +187,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerCarResponse
      */
     public ZiJinCrawlerCarResponse car(ZiJinCrawlerCarRequest ziJinCrawlerCarRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerCarRequest);
         log.info("ziJinCrawlerCarRequest请求参数的值:{}", jsonString);
@@ -198,8 +204,9 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerCarResponse
      */
     public ZiJinCrawlerGetOrderNoResponse getOrderNo(ZiJinCrawlerGetOrderNoRequest ziJinCrawlerGetOrderNoRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
+
         String jsonString = JSON.toJSONString(ziJinCrawlerGetOrderNoRequest);
         log.info("ziJinCrawlerGetOrderNoRequest请求参数的值:{}", jsonString);
         ResponseEntity<ZiJinCrawlerGetOrderNoResponse> responseEntity = requestComponent.post(RequestUrl.GET_ORDER_NUMBER.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerGetOrderNoResponse.class, httpHeaders);
@@ -214,8 +221,9 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerGetCarActualValueResponse
      */
     public ZiJinCrawlerGetCarActualValueResponse getCarActualValue(ZiJinCrawlerGetCarActualValueRequest ziJinCrawlerGetCarActualValueRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
+
         String jsonString = JSON.toJSONString(ziJinCrawlerGetCarActualValueRequest);
         log.info("ziJinCrawlerGetCarActualValueRequest请求参数的值:{}", jsonString);
         ResponseEntity<ZiJinCrawlerGetCarActualValueResponse> responseEntity = requestComponent.post(RequestUrl.GET_ACTUAL_VALUE.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerGetCarActualValueResponse.class, httpHeaders);
@@ -230,10 +238,17 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerGetTaxRegistryNumberResponse
      */
     public ZiJinCrawlerGetTaxRegistryNumberResponse getTaxRegistryNumber(String comCode, HttpHeaders headers) throws IOException {
-        HttpHeaders httpHeaders = setHttpHeaders();
-        String url = RequestUrl.GET_TAX_REGISTRY_NUMBER.getRequestUrl(ziJinCrawlerProperties.getBaseUrl());
-        log.info("获取税务登记证号请求URL:{}", url);
-        ZiJinCrawlerGetTaxRegistryNumberResponse response = requestComponent.get(url, new LinkedMultiValueMap<>(), "", ZiJinCrawlerGetTaxRegistryNumberResponse.class, httpHeaders);
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
+        httpHeaders.remove("Cache-Control");
+        httpHeaders.remove("Content-Length");
+        httpHeaders.remove("Origin");
+        httpHeaders.remove("Pragma");
+        httpHeaders.remove("content-type");
+
+        LinkedMultiValueMap<String, String> parameterMap = new LinkedMultiValueMap<>();
+        parameterMap.add("comCode", comCode);
+        ZiJinCrawlerGetTaxRegistryNumberResponse response = requestComponent.get(RequestUrl.GET_TAX_REGISTRY_NUMBER.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), parameterMap, "", ZiJinCrawlerGetTaxRegistryNumberResponse.class, httpHeaders);
         log.info("获取税务登记证号响应:{}", JSON.toJSONString(response));
         return response;
     }
@@ -246,8 +261,9 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerQuotationResponse
      */
     public ZiJinCrawlerQuotationResponse quotation(ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
+
         String jsonString = JSON.toJSONString(ziJinCrawlerQuotationRequest);
         log.info("ziJinCrawlerQuotationRequest请求参数的值:{}", jsonString);
         ResponseEntity<ZiJinCrawlerQuotationResponse> post = requestComponent.post(RequestUrl.PRICE.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerQuotationResponse.class, httpHeaders);
@@ -258,13 +274,13 @@ public class ZiJinCrawlerRequestComponent {
      * 验证码(报价出现转保标志)
      *
      * @param ziJinCrawlerRecognizeCodesRequest
-     * @param headers 请求头
+     * @param headers                           请求头
      * @return ZiJinCrawlerRecognizeCodesResponse
      */
     public ZiJinCrawlerRecognizeCodesResponse recognizeCodes(List<ZiJinCrawlerRecognizeCodesRequest> ziJinCrawlerRecognizeCodesRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
-        httpHeaders.set("Content-Type", "application/json");
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
+
         String jsonString = JSON.toJSONString(ziJinCrawlerRecognizeCodesRequest);
         log.info("ziJinCrawlerRecognizeCodesRequest请求参数的值:{}", jsonString);
         ResponseEntity<ZiJinCrawlerRecognizeCodesResponse> post = requestComponent.post(RequestUrl.SKIP_SING.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerRecognizeCodesResponse.class, httpHeaders);
@@ -279,8 +295,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerSaveQuoteInformationResponse
      */
     public ZiJinCrawlerSaveQuoteInfoResponse saveQuoteInformation(ZiJinCrawlerSaveQuoteInfoRequest ziJinCrawlerSaveQuoteInfoRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerSaveQuoteInfoRequest);
         log.info("ziJinCrawlerSaveQuoteInfoRequest请求参数的值:{}", jsonString);
@@ -288,7 +304,7 @@ public class ZiJinCrawlerRequestComponent {
         return responseEntity.getBody();
     }
 
-     /**
+    /**
      * 保存投保单
      *
      * @param ziJinCrawlerSaveProposalRequest
@@ -296,8 +312,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerSaveProposalResponse
      */
     public ZiJinCrawlerSaveProposalResponse saveProposal(ZiJinCrawlerSaveProposalRequest ziJinCrawlerSaveProposalRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerSaveProposalRequest);
         log.info("ziJinCrawlerSaveProposalRequest请求参数的值:{}", jsonString);
@@ -314,8 +330,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerUnderwritingResponse
      */
     public ZiJinCrawlerUnderwritingResponse underwriting(ZiJinCrawlerUnderwritingRequest ziJinCrawlerUnderwritingRequest, HttpHeaders headers) throws Exception {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerUnderwritingRequest);
         log.info("ziJinCrawlerUnderwritingRequest请求参数的值:{}", jsonString);
@@ -332,8 +348,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerImageUploadResponse
      */
     public ZiJinCrawlerImageUploadResponse uploadImage(ZiJinCrawlerImageUploadRequest ziJinCrawlerImageUploadRequest, HttpHeaders headers) throws Exception {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerImageUploadRequest);
         log.info("ziJinCrawlerImageUploadRequest请求参数的值:{}", jsonString);
@@ -348,8 +364,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerImageUploadResponse
      */
     public ZiJinCrawlerImageUploadInfoListResponse uploadImageInfoList(ZiJinCrawlerUploadImageInfoListRequest ziJinCrawlerUploadImageInfoListRequest, HttpHeaders headers) throws Exception {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerUploadImageInfoListRequest);
         log.info("ziJinCrawlerUploadImageInfoListRequest请求参数的值:{}", jsonString);
@@ -358,7 +374,6 @@ public class ZiJinCrawlerRequestComponent {
     }
 
 
-
     /**
      * 获取支付链接
      *
@@ -367,8 +382,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerPaymentLinkResponse
      */
     public ZiJinCrawlerPaymentLinkResponse payment(ZiJinCrawlerPaymentLinkRequest ziJinCrawlerPaymentLinkRequest, HttpHeaders headers) throws NotFoundException, IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerPaymentLinkRequest);
         log.info("ziJinCrawlerPaymentLinkRequest请求参数的值:{}", jsonString);
@@ -384,8 +399,8 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerQueryOrderStatusResponse
      */
     public ZiJinCrawlerQueryOrderStatusResponse queryOrderStatus(ZiJinCrawlerQueryOrderStatusRequest ziJinCrawlerQueryOrderStatusRequest, HttpHeaders headers) throws IOException {
-        //设置headers
-        HttpHeaders httpHeaders = setHttpHeaders();
+        String token = headers.getFirst("Authorization");
+        HttpHeaders httpHeaders = setHttpHeaders(token);
 
         String jsonString = JSON.toJSONString(ziJinCrawlerQueryOrderStatusRequest);
         log.info("ziJinCrawlerQueryOrderStatusRequest请求参数的值:{}", jsonString);
@@ -454,7 +469,7 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerQueryCarPolicyListResponse
      */
     public ZiJinCrawlerQueryCarPolicyListResponse queryCarPolicyList(ZiJinCrawlerQueryCarPolicyListRequest ziJinCrawlerQueryCarPolicyListRequest) throws IOException {
-        //设置headers
+        // 设置headers
         HttpHeaders httpHeaders = setHttpHeaders1();
 
         String jsonString = JSON.toJSONString(ziJinCrawlerQueryCarPolicyListRequest);
@@ -471,7 +486,7 @@ public class ZiJinCrawlerRequestComponent {
      * @return ZiJinCrawlerDownloadResponse
      */
     public ZiJinCrawlerDownloadPolicyResponse electronPolicyIODownload(ZiJinCrawlerDownloadPolicyRequest ziJinCrawlerDownloadPolicyRequest) throws IOException {
-        //设置headers
+        // 设置headers
         HttpHeaders httpHeaders = setHttpHeaders();
 
         String jsonString = JSON.toJSONString(ziJinCrawlerDownloadPolicyRequest);
@@ -501,17 +516,18 @@ public class ZiJinCrawlerRequestComponent {
      * @throws IOException
      */
     @NotNull
-    private static HttpHeaders setHttpHeaders() throws IOException {
+    private HttpHeaders setHttpHeaders() throws IOException {
+        return setHttpHeaders(null);
+    }
+
+    @NotNull
+    private HttpHeaders setHttpHeaders(String token) throws IOException {
         HttpHeaders headers = new HttpHeaders();
-        //headers.setContentType(MediaType.APPLICATION_JSON);
-        //获取cookie的值
         String cookie = getCookie();
         headers.set("Cookie", "csrfToken=CrwLEmSfUevAb8PcN7kXff-I; "+ cookie);
-        // 设置请求头
         headers.set("Accept", "application/json, text/plain, */*, application/problem+json");
-        //headers.set("Accept-Encoding", "gzip, deflate, br, zstd");
+        // headers.set("Accept-Encoding", "gzip, deflate, br, zstd");
         headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
-        headers.set("Authorization", "FD385C99C9B35B64EF84590AACA95380");
         headers.set("Cache-Control", "no-cache");
         headers.set("Connection", "keep-alive");
         headers.set("Content-Length", "23");
@@ -524,17 +540,31 @@ public class ZiJinCrawlerRequestComponent {
         headers.set("Sec-Fetch-Site", "same-origin");
         headers.set("Tokentype", "DEFULT");
         headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36");
-        headers.set("loginToken", "FD385C99C9B35B64EF84590AACA95380");
         headers.set("sec-ch-ua", "\"Google Chrome\";v=\"141\", \"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"141\"");
         headers.set("sec-ch-ua-mobile", "?0");
         headers.set("sec-ch-ua-platform", "\"Windows\"");
         headers.set("x-csrf-token", "CrwLEmSfUevAb8PcN7kXff-I");
         headers.set("content-type", "application/json");
+        if (StringUtils.hasText(token)) {
+            headers.set("Authorization", token);
+            headers.set("loginToken", token);
+        }
         return headers;
     }
 
+    /**
+     * 构建带有authorization的HTTP请求头
+     *
+     * @param authorization 认证token
+     * @return HttpHeaders
+     * @throws IOException
+     */
+    public HttpHeaders buildHttpHeaders(String authorization) throws IOException {
+        return setHttpHeaders(authorization);
+    }
+
     @NotNull
-    private HttpHeaders setHttpHeaders1(){
+    private HttpHeaders setHttpHeaders1() {
         try {
             HttpHeaders headers = new HttpHeaders();
             String cookie = getCookie();

+ 46 - 68
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerQuoteProcessServiceImpl.java

@@ -10,19 +10,18 @@ import com.jzg.quotation.zijin.crawler.entity.ZiJinCrawlerTokenInfo;
 import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerCheckCaptchaRequest;
 import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerCheckTokenRequest;
 import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerCommonLoginRequest;
-import com.jzg.quotation.zijin.crawler.entity.response.*;
+import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerCaptchaResponse;
+import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerCheckCaptchaResponse;
+import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerCheckTokenResponse;
+import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerCommonLoginResponse;
 import com.jzg.quotation.zijin.crawler.service.ZiJinCrawlerQuoteProcessService;
-import com.jzg.quotation.zijin.crawler.util.DESEncryption;
-import com.jzg.quotation.zijin.crawler.util.RS6Item;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
-import java.util.Map;
-import java.util.Optional;
 
 /**
  * @description: 紫金财险爬虫报价流程服务实现
@@ -41,6 +40,9 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
     // 登陆次数
     public static final int LOGINS_NUMBER = 3;
 
+    private final String USER_NAME = "214003053";
+    private final String PASSWORD = "Jieke896.";
+
     /**
      * 登录
      *
@@ -68,15 +70,7 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
 
             // 3、校验验证码并获取token
             ZiJinCrawlerCheckCaptchaRequest ziJinCrawlerCheckCaptchaRequest = new ZiJinCrawlerCheckCaptchaRequest();
-            ZiJinCrawlerTokenInfo ziJinCrawlerTokenInfo = new ZiJinCrawlerTokenInfo();
-            ziJinCrawlerTokenInfo.setLoginComCode(ziJinCrawlerCommonLoginResponse.getData().getData().get(0).getComCode());
-            ziJinCrawlerTokenInfo.setUserCode(username);
-            ZiJinCrawlerTokenInfo.Attach attach = new ZiJinCrawlerTokenInfo.Attach();
-            attach.setLoginComName(ziJinCrawlerCommonLoginResponse.getData().getData().get(0).getComName());
-            attach.setLoginflag("common");
-            attach.setUserCode(username);
-            attach.setAccountType("9");
-            ziJinCrawlerTokenInfo.setAttach(attach);
+            ZiJinCrawlerTokenInfo ziJinCrawlerTokenInfo = getZiJinCrawlerTokenInfo(username, ziJinCrawlerCommonLoginResponse);
             log.info("ziJinCrawlerTokenInfo对象的值:{}", JSON.toJSONString(ziJinCrawlerTokenInfo));
             // 设置校验验证码请求参数
             ziJinCrawlerCheckCaptchaRequest.setTokenInfo(JSON.toJSONString(ziJinCrawlerTokenInfo));
@@ -91,23 +85,23 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
                 // 获取token
                 String token = ziJinCrawlerCheckCaptchaResponse.getData().getToken();
                 // 4、校验token
-                ZiJinCrawlerCheckTokenRequest ziJinCrawlerCheckTokenRequest = new ZiJinCrawlerCheckTokenRequest();
-                ziJinCrawlerCheckTokenRequest.setExpirationType("H5");
-                ziJinCrawlerCheckTokenRequest.setToken(token);
-
-                ZiJinCrawlerCheckTokenResponse ziJinCrawlerCheckTokenResponse = ziJinCrawlerRequestComponent.checkToken(ziJinCrawlerCheckTokenRequest, token);
-                log.info("校验token响应:{}", JSON.toJSONString(ziJinCrawlerCheckTokenResponse));
-                if (ziJinCrawlerCheckTokenResponse.isValid()) {
-                    String userName = ziJinCrawlerCheckTokenResponse.getUserName();
-                    String tokenInfo = ziJinCrawlerCheckTokenResponse.getTokenInfo();
-                    ZiJinCrawlerTokenInfo ziJinCrawlerTokenInfo1 = JSON.parseObject(tokenInfo, ZiJinCrawlerTokenInfo.class);
-                    String userCode = ziJinCrawlerTokenInfo1.getUserCode();
-                    // 缓存用户信息
-                    return ziJinCrawlerCacheComponent.cacheAuthorization(token, userCode, userName);
-                } else {
-                    log.error("校验token失败,响应:{}", JSON.toJSONString(ziJinCrawlerCheckTokenResponse));
-                    return ziJinCrawlerCheckTokenResponse.getMsg();
-                }
+                // ZiJinCrawlerCheckTokenRequest ziJinCrawlerCheckTokenRequest = new ZiJinCrawlerCheckTokenRequest();
+                // ziJinCrawlerCheckTokenRequest.setExpirationType("H5");
+                // ziJinCrawlerCheckTokenRequest.setToken(token);
+                // ZiJinCrawlerCheckTokenResponse ziJinCrawlerCheckTokenResponse = ziJinCrawlerRequestComponent.checkToken(ziJinCrawlerCheckTokenRequest, token);
+                // log.info("校验token响应:{}", JSON.toJSONString(ziJinCrawlerCheckTokenResponse));
+                // if (ziJinCrawlerCheckTokenResponse.isValid()) {
+                //     String userName = ziJinCrawlerCheckTokenResponse.getUserName();
+                //     String tokenInfo = ziJinCrawlerCheckTokenResponse.getTokenInfo();
+                //     ZiJinCrawlerTokenInfo ziJinCrawlerTokenInfo1 = JSON.parseObject(tokenInfo, ZiJinCrawlerTokenInfo.class);
+                //     String userCode = ziJinCrawlerTokenInfo1.getUserCode();
+                //     // 缓存用户信息
+                //     return ziJinCrawlerCacheComponent.cacheAuthorization(token, userCode, userName);
+                // } else {
+                //     log.error("校验token失败,响应:{}", JSON.toJSONString(ziJinCrawlerCheckTokenResponse));
+                //     return ziJinCrawlerCheckTokenResponse.getMsg();
+                // }
+                return ziJinCrawlerCacheComponent.cacheAuthorization(token, username, "");
             } else {
                 log.error("校验验证码并获取token失败,响应:{}", JSON.toJSONString(ziJinCrawlerCheckCaptchaResponse));
                 throw new SystemException("校验验证码并获取token失败");
@@ -118,6 +112,20 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
         }
     }
 
+    @NotNull
+    private ZiJinCrawlerTokenInfo getZiJinCrawlerTokenInfo(String username, ZiJinCrawlerCommonLoginResponse ziJinCrawlerCommonLoginResponse) {
+        ZiJinCrawlerTokenInfo ziJinCrawlerTokenInfo = new ZiJinCrawlerTokenInfo();
+        ziJinCrawlerTokenInfo.setLoginComCode(ziJinCrawlerCommonLoginResponse.getData().getData().get(0).getComCode());
+        ziJinCrawlerTokenInfo.setUserCode(username);
+        ZiJinCrawlerTokenInfo.Attach attach = new ZiJinCrawlerTokenInfo.Attach();
+        attach.setLoginComName(ziJinCrawlerCommonLoginResponse.getData().getData().get(0).getComName());
+        attach.setLoginflag("common");
+        attach.setUserCode(username);
+        attach.setAccountType("9");
+        ziJinCrawlerTokenInfo.setAttach(attach);
+        return ziJinCrawlerTokenInfo;
+    }
+
     /**
      * 获取请求头
      *
@@ -129,47 +137,17 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
     public HttpHeaders getHeaders(String username, String password) {
         String authorization = ziJinCrawlerCacheComponent.getAuthorization(username);
         log.info("authorization:{}", authorization);
-        /*if (authorization == null) {
-            login(username, password);
-            authorization = ziJinCrawlerCacheComponent.getAuthorization(username);
-        }*/
+        if (authorization == null) {
+            // TODO: 暂时硬编码,后续调整
+            login(USER_NAME, PASSWORD);
+            authorization = ziJinCrawlerCacheComponent.getAuthorization(USER_NAME);
+        }
 
-        HttpHeaders headers = new HttpHeaders();
-        headers.set("Authorization", authorization);
-        headers.set("Content-Type", "application/json");
-        headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
-        // 获取cookie的值
-        String cookie = null;
         try {
-            cookie = ZiJinCrawlerRequestComponent.getCookie();
+            return ziJinCrawlerRequestComponent.buildHttpHeaders(authorization);
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
-        headers.set("Cookie", "csrfToken=CrwLEmSfUevAb8PcN7kXff-I; " + cookie);
-        // 设置请求头
-        headers.set("Accept", "application/json, text/plain, */*, application/problem+json");
-        // headers.set("Accept-Encoding", "gzip, deflate, br, zstd");
-        headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
-        headers.set("Authorization", "1B0234C742C12BD632AA5027EB3A501A");
-        headers.set("Cache-Control", "no-cache");
-        headers.set("Connection", "keep-alive");
-        headers.set("Content-Length", "23");
-        headers.set("Host", "kscd.zking.com");
-        headers.set("Origin", "https://kscd.zking.com");
-        headers.set("Pragma", "no-cache");
-        headers.set("Referer", "https://kscd.zking.com/app/vehicle/proposal/commonlogin");
-        headers.set("Sec-Fetch-Dest", "empty");
-        headers.set("Sec-Fetch-Mode", "cors");
-        headers.set("Sec-Fetch-Site", "same-origin");
-        headers.set("Tokentype", "DEFULT");
-        // headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36");
-        headers.set("loginToken", "1B0234C742C12BD632AA5027EB3A501A");
-        headers.set("sec-ch-ua", "\"Google Chrome\";v=\"141\", \"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"141\"");
-        headers.set("sec-ch-ua-mobile", "?0");
-        headers.set("sec-ch-ua-platform", "\"Windows\"");
-        headers.set("x-csrf-token", "CrwLEmSfUevAb8PcN7kXff-I");
-
-        return headers;
     }
 
     @Override

+ 17 - 20
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java

@@ -118,9 +118,6 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         log.info("headers参数的值:{}", JSON.toJSONString(headers));
 
-        String authorization = "FD385C99C9B35B64EF84590AACA95380";
-        headers.set("Authorization", authorization);
-
         String userCode = ziJinCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
         log.info("userCode:{}", userCode);
 
@@ -209,9 +206,9 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             // 设置车载设备保费列表(空列表)
             ziJinCrawlerQuotationRequest.setCarDevicePremiumDtoList(new ArrayList<>());
             // 报价
-            log.info("ziJinCrawlerQuotationRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerQuotationRequest));
+            log.info("ziJinCrawlerQuotationRequest参数:{}", JSON.toJSONString(ziJinCrawlerQuotationRequest));
             ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
-            log.info("ziJinCrawlerQuotationResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
+            log.info("ziJinCrawlerQuotationResponse响应:{}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
             // 设置紫金财险爬虫订单号,后面保存到数据库中
             ziJinCrawlerQuotationResponse.setOrderNo(ziJinCrawlerGetOrderNoResponse.getOrderNo());
 
@@ -227,7 +224,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                     // 修改交强险起保时间
                     ziJinCrawlerQuotationRequest.getBaseInfo().setStartDateCI(TimeProcessing.dateTimeToDate(startTime));
                     ziJinCrawlerQuotationRequest.getBaseInfo().setEndDateCI(TimeProcessing.minusDays(TimeProcessing.dateTimeToDate(newEndTime), 1));
-                    log.info("紫金报价重复投保参数: startTime={}, endTime={}", startTime, newEndTime);
+                    log.info("紫金报价重复投保日期参数: startTime={}, endTime={}", startTime, newEndTime);
                     ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
                     log.info("紫金报价重复投保后响应: {}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
                 }
@@ -237,11 +234,12 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             if (ResponseCode.R_0001.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode())) {
                 if (ziJinCrawlerQuotationResponse.getBasePart() != null) {
                     ZiJinCrawlerRecognizeCodesResponse ziJinCrawlerRecognizeCodesResponse = ziJinCrawlerRequestComponent.recognizeCodes(ZiJinCrawlerQuoteRequestBuild.buildRecognizeCodesRequests(ziJinCrawlerQuotationResponse), headers);
-                    log.info("ziJinCrawlerRecognizeCodesResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerRecognizeCodesResponse));
+                    log.info("ziJinCrawlerRecognizeCodesResponse响应:{}", JSON.toJSONString(ziJinCrawlerRecognizeCodesResponse));
                     // 验证码通过后再次调用报价接口
                     if (ResponseCode.R_0000.getCode().equals(ziJinCrawlerRecognizeCodesResponse.getRtnCode())) {
                         ZiJinCrawlerQuoteRequestBuild.buildReQuote(ziJinCrawlerQuotationResponse, ziJinCrawlerRecognizeCodesResponse, ziJinCrawlerQuotationRequest);
                         ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
+                        log.info("紫金报价转保标志ziJinCrawlerQuotationResponse响应: {}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
                     }
                 }
             }
@@ -254,9 +252,9 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 // 报价成功
                 // 保存报价信息
                 ZiJinCrawlerSaveQuoteInfoRequest ziJinCrawlerSaveQuoteInfoRequest = ziJinCrawlerSaveQuoteInfoRequestBuild.buildSaveQuoteInfoRequest(quoteVo, ziJinCrawlerQuotationRequest, ziJinCrawlerQuotationResponse);
-                log.info("ziJinCrawlerSaveQuoteInfoRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoRequest));
+                log.info("ziJinCrawlerSaveQuoteInfoRequest参数:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoRequest));
                 ZiJinCrawlerSaveQuoteInfoResponse ziJinCrawlerSaveQuoteInfoResponse = ziJinCrawlerRequestComponent.saveQuoteInformation(ziJinCrawlerSaveQuoteInfoRequest, headers);
-                log.info("ziJinCrawlerSaveQuoteInfoResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoResponse));
+                log.info("ziJinCrawlerSaveQuoteInfoResponse响应:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoResponse));
 
                 // 保存投保单
                 ZiJinCrawlerSaveProposalRequest ziJinCrawlerSaveProposalRequest = new ZiJinCrawlerSaveProposalRequest();
@@ -1086,8 +1084,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      * @param headers      请求头
      * @return ZiJinCrawlerQuotationRequest.TaxRelifInfo
      */
-    private ZiJinCrawlerQuotationRequest.TaxRelifInfo buildTaxRelifInfo(QuoteVo quoteVo,
-                                                                        ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo, String comCode, HttpHeaders headers) {
+    private ZiJinCrawlerQuotationRequest.TaxRelifInfo buildTaxRelifInfo(QuoteVo quoteVo, ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo, String comCode, HttpHeaders headers) {
         ZiJinCrawlerQuotationRequest.TaxRelifInfo taxRelifInfo = new ZiJinCrawlerQuotationRequest.TaxRelifInfo();
 
         // 只有投保交强险时才构建完整的税务信息
@@ -1095,15 +1092,15 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
 
         // 获取税务登记证号
-        String taxRegistryNumber = "91140100MAE72CK690";
-        // try {
-        //     ZiJinCrawlerGetTaxRegistryNumberResponse taxResponse = ziJinCrawlerRequestComponent.getTaxRegistryNumber(comCode, headers);
-        //     if (taxResponse != null && StringUtils.hasLength(taxResponse.getData())) {
-        //         taxRegistryNumber = taxResponse.getData();
-        //     }
-        // } catch (Exception e) {
-        //     log.error("获取税务登记证号失败: {}", e.getMessage());
-        // }
+        String taxRegistryNumber = "";
+        try {
+            ZiJinCrawlerGetTaxRegistryNumberResponse taxResponse = ziJinCrawlerRequestComponent.getTaxRegistryNumber(comCode, headers);
+            if (taxResponse != null && StringUtils.hasLength(taxResponse.getData())) {
+                taxRegistryNumber = taxResponse.getData();
+            }
+        } catch (Exception e) {
+            log.error("获取税务登记证号失败: {}", e.getMessage());
+        }
 
         // 设置税务信息
         taxRelifInfo.setTaxRelifFlag(quoteVo.getVehicleAndVesselTaxVo().getTaxRelifFlag());// 1 正常缴税 2 免税 3 减税 4 已完税 5 不征

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

@@ -663,6 +663,24 @@ public class ReceivableController {
         return receivableService.companySuperviseSettlementReport(settlementReportQueryVo);
     }
 
+    /**
+     * 设置指定发票为结算完成状态
+     *
+     * @param invoiceId 发票序号
+     * @author lipf
+     * @date 2026/6/11 9:33
+     */
+    @PostMapping("updateSettlementStatus")
+    public HttpResult<String> updateSettlementStatus(@RequestParam("id") String invoiceId){
+        int count = receivableService.updateSettlementStatus(invoiceId);
+        if(count>0){
+            return HttpResult.ok("订单被标记为结算完成");
+        }else{
+            // 可能已经被其他人标记为结算完成
+            return HttpResult.ok("操作完成");
+        }
+    }
+
     @PostMapping("receiverSettlementReport")
     @Operation(summary = "对接人结算报表")
     public HttpResult<Page<ReceiverSettlementReportDto>> receiverSettlementReport(@RequestBody SettlementReportQueryVo settlementReportQueryVo) {

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

@@ -3,10 +3,7 @@ package com.jzg.organization.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.finance.dto.*;
-import com.jzg.commons.entity.finance.po.InsPlyIncome;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceLink;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeVO;
+import com.jzg.commons.entity.finance.po.*;
 import com.jzg.commons.entity.finance.vo.InvoiceRecordQueryVo;
 import com.jzg.commons.entity.finance.vo.InvoiceRecordResult;
 import com.jzg.commons.entity.finance.vo.InvoicingVo;
@@ -211,7 +208,8 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      * @author lipf
      * @date 2026/6/1 16:57
      */
-    List<CompanySuperviseSettlementReportDto> queryCumulativeAccountsReceivable(@Param("systemCode") String systemCode);
+    List<CompanySuperviseSettlementReportDto> queryCumulativeAccountsReceivable(@Param("systemCode") String systemCode,
+                                                                                @Param("agreementType") String agreementType);
 
     /**
      * 查询已开票金额
@@ -226,7 +224,8 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
     List<CalRes> queryInvoicedAmount(@Param("systemCode") String systemCode,
                                      @Param("invoiceType") List<Integer> invoiceType,
                                      @Param("invoiceStartDate") String invoiceStartDate,
-                                     @Param("invoiceEndDate") String invoiceEndDate);
+                                     @Param("invoiceEndDate") String invoiceEndDate,
+                                     @Param("agreementType") String agreementType);
 
     /**
      * 查询已结算金额
@@ -235,8 +234,9 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      * @return List<CalRes>
      */
     List<CalRes> querySettledAmount(@Param("systemCode") String systemCode,
-                                               @Param("settledStartDate") String settledStartDate,
-                                               @Param("settledEndDate") String settledEndDate);
+                                    @Param("settledStartDate") String settledStartDate,
+                                    @Param("settledEndDate") String settledEndDate,
+                                    @Param("agreementType") String agreementType);
 
     /**
      * 查询

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

@@ -457,4 +457,13 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      * @return
      */
     Page<ExportSuperviseSettlementExcelDto> followSettlementExcel(Page page, SettlementQueryVo settlementQueryVo);
+
+    /**
+     * 设置指定发票为结算完成状态
+     *
+     * @param invoiceId 发票序号
+     * @author lipf
+     * @date 2026/6/11 9:33
+     */
+    int updateSettlementStatus(String invoiceId);
 }

+ 2 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java

@@ -208,6 +208,7 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         rules.setOrderNum(orderNum);
         rules.setStartTime(param.getStartTime());
         rules.setEndTime(param.getEndTime());
+        rules.setInputDescription(param.getInputDescription());
         rules.setAgreementId(param.getAgreementId());
         rules.setParentId(parentId);
         return rules;
@@ -356,8 +357,7 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         // 获取费用因子属性(公共逻辑,仅查询一次)
         List<PtlAgreementUndwrtRulesAttr> attrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
         Map<String, PtlAgreementUndwrtRulesAttr> attrMap = attrList.stream()
-                .filter(attr -> attr.getCompanyIds().equals("all"))
-                .filter(attr -> attr.getCompanyIds().equals(agreement.getCompanyId()))
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(agreement.getCompanyId()))
                 .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
 
         // 确定需要处理的规则ID列表

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

@@ -302,8 +302,7 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
         // 获取费用因子属性
         List<PtlAgreementUndwrtRulesAttr> attrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList(companyId);
         Map<String, PtlAgreementUndwrtRulesAttr> attrMap = attrList.stream()
-                .filter(attr -> attr.getCompanyIds().equals("all"))
-                .filter(attr -> attr.getCompanyIds().equals(companyId))
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(companyId))
                 .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
         List<PtlAgreementUndwrtRulesAttr> newAttrList = new ArrayList<>();
         linkList.forEach(link -> {

+ 38 - 7
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -1458,6 +1458,16 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public boolean deleteSettlementById(String id) {
         log.info("私有协议-结算记录-删除: id=[{}]",id);
+        InsPlyIncomeInvoiceSettlement settlement = insPlyIncomeInvoiceSettlementMapper.selectById(id);
+        if(settlement == null){
+            return false;
+        }
+        String invoiceId = settlement.getInvoiceId();
+        if(StrUtil.isNotEmpty(invoiceId)){
+            insPlyIncomeInvoiceMapper.update(null,
+                    new LambdaUpdateWrapper<InsPlyIncomeInvoice>()
+                            .set(InsPlyIncomeInvoice::getStatus,"0").eq(InsPlyIncomeInvoice::getId,invoiceId));
+        }
         return insPlyIncomeInvoiceSettlementMapper.deleteById(id) > 0;
     }
 
@@ -2786,7 +2796,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      * @return
      */
     @Override
-    public void exportSuperviseSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) {
+    public void exportSuperviseSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
+        verifyUploadPath();
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.superviseSettlementExcelDtos(page, settlementQueryVo);
         // 补充、转换列表的数据
         supplementaryListData(exportSuperviseSettlementExcelDtos);
@@ -2801,7 +2812,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      * @return
      */
     @Override
-    public void exportPlatformSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) {
+    public void exportPlatformSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
+        verifyUploadPath();
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.platformSettlementExcelDtos(page, settlementQueryVo);
         // 补充、转换列表的数据
         supplementaryListData(exportSuperviseSettlementExcelDtos);
@@ -3094,7 +3106,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         log.info("保险公司结算报表查询-区分租户并且按照日期进行过滤:systemCode=[{}],queryVo=[{}]", systemCode, JSONUtil.toJsonStr(queryVo));
         // 1. 先将有数据的保险公司进行汇总
         // 累计应收金额, 应收手续费(手续费), 应收手续费(手续费)
-        List<CompanySuperviseSettlementReportDto> allCompaniesIncomeDatas = baseMapper.queryCumulativeAccountsReceivable(systemCode);
+        List<CompanySuperviseSettlementReportDto> allCompaniesIncomeDatas = baseMapper.queryCumulativeAccountsReceivable(systemCode, queryVo.getAgreementType());
         allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().peek(action-> action.setId(action.getCompanyId())).toList();
         // for test, 查看一家公司的数据,将不可变对象变成 可变对象
 //        allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().filter(action-> "1738811735599338932".equals(action.getCompanyId())).toList();
@@ -3153,15 +3165,15 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         // 已开票(跟单费)
 
         List<CalRes> calRes;
-        calRes = baseMapper.queryInvoicedAmount(systemCode, List.of(1, 3), queryVo.getInvoiceStartTime(), queryVo.getInvoiceEndTime());
+        calRes = baseMapper.queryInvoicedAmount(systemCode, List.of(1, 3), queryVo.getInvoiceStartTime(), queryVo.getInvoiceEndTime(), queryVo.getAgreementType());
         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());
+        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());
+        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));
 
         // 结算费用 
-        calRes = baseMapper.querySettledAmount(systemCode, queryVo.getInvoiceStartTime(), queryVo.getInvoiceEndTime());
+        calRes = baseMapper.querySettledAmount(systemCode, queryVo.getInvoiceStartTime(), queryVo.getInvoiceEndTime(), queryVo.getAgreementType());
         Map<String, BigDecimal> sxfSettledAmountMap = calRes.stream().collect(Collectors.toMap(CalRes::getCompanyId, CalRes::getSxfSettlement, (o1,o2)->o1));
         Map<String, BigDecimal> gdfSettledAmountMap = calRes.stream().collect(Collectors.toMap(CalRes::getCompanyId, CalRes::getGdfSettlement, (o1,o2)->o1));
 
@@ -3576,5 +3588,24 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         log.info(msg);
         return HttpResult.ok(msg);
     }
+
+    /**
+     * 设置指定发票为结算完成状态
+     *
+     * @param invoiceId 发票序号
+     * @author lipf
+     * @date 2026/6/11 9:33
+     */
+    @Override
+    public int updateSettlementStatus(String invoiceId) {
+        String userName = baseController.getUserName();
+        String systemCode = baseController.getSystemCode();
+        log.info("租户[{}]下的用户[{}]标识发票[{}]为结算完成", systemCode, userName, invoiceId);
+        return insPlyIncomeInvoiceMapper.update(null, new LambdaUpdateWrapper<InsPlyIncomeInvoice>()
+                .set(InsPlyIncomeInvoice::getStatus,"1")
+                .set(InsPlyIncomeInvoice::getUpdateBy,userName)
+                .set(InsPlyIncomeInvoice::getUpdateTime, LocalDateTime.now())
+                .eq(InsPlyIncomeInvoice::getId, invoiceId));
+    }
 }
 

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

@@ -1,7 +1,9 @@
 package com.jzg.organization.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.core.base.BaseController;
@@ -25,6 +27,7 @@ import java.time.LocalDateTime;
 import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -263,6 +266,15 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
         
         List<SysAmountAuditing> sysAmountAuditingList = sysAmountAuditingService.list(auditingWrapper);
 
+        // 批量查询用户信息
+        Set<String> collect = sysAmountAuditingList.stream().map(SysAmountAuditing::getUserId).collect(Collectors.toSet());
+        QueryWrapper<SysUser> idSet = new QueryWrapper<SysUser>().in("id", collect);
+        List<SysUser> list = sysUserService.list(idSet);
+        Map<String, SysUser> userMap = new HashMap<>();
+        if (CollUtil.isNotEmpty(list)){
+            userMap = list.stream().collect(Collectors.toMap(SysUser::getId, Function.identity()));
+        }
+
         // 构建订单收入查询参数(手动设置时间,避免类型转换问题)
         InsFeeOrdersParam feeOrdersParam = new InsFeeOrdersParam();
         feeOrdersParam.setUserId(sysUserJzgInfo.getUserId());
@@ -295,6 +307,8 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             item.setStatus(auditing.getAuditingStatus().toString());
             item.setRemark("提现支出");
             item.setBankName(auditing.getBankName());
+            item.setUserName(userMap.getOrDefault(auditing.getUserId(), new SysUser()).getUsername());
+            item.setBankCardNum(auditing.getBankCardNum());
             allRecords.add(item);
         }
         // 处理收入记录
@@ -307,6 +321,8 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             item.setRemark("车险收入");
             item.setLicenseNo(insFeeOrders.getLicenseNo());
             item.setBankName(null);
+            item.setUserName(null);
+            item.setBankCardNum(null);
             allRecords.add(item);
         }
         // 处理分销收入记录
@@ -325,6 +341,8 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             item.setRemark("分销收入");
             item.setLicenseNo(insFeeOrders.getLicenseNo());
             item.setBankName(null);
+            item.setUserName(null);
+            item.setBankCardNum(null);
             allRecords.add(item);
         }
         // 排序

+ 11 - 1
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -1612,6 +1612,9 @@
         <where>
             ipi.is_delete = 0
             and ipi.system_code = #{systemCode}
+            <if test="agreementType != null and agreementType != ''">
+                AND ipi.agreement_type = #{agreementType}
+            </if>
         </where>
         group by
         eic.parent_id,
@@ -1647,7 +1650,11 @@
             ins_ply_income ipi
             where
             ipi.is_delete = 0
-            and ipi.system_code = #{systemCode})
+            and ipi.system_code = #{systemCode}
+            <if test="agreementType != null and agreementType != ''">
+                AND ipi.agreement_type = #{agreementType}
+            </if>
+            )
             <if test="invoiceType != null and !invoiceType.isEmpty()">
                 AND ipii.invoice_type IN
                 <foreach collection="invoiceType" item="item" open="(" separator="," close=")">
@@ -1694,6 +1701,9 @@
             <if test="settledEndDate != null and settledEndDate != ''">
                 AND ipi.settlement_time &lt; cast('${settledEndDate}' as datetime)
             </if>
+            <if test="agreementType != null and agreementType != ''">
+                AND ipi.agreement_type = #{agreementType}
+            </if>
         </where>
         ) a
         group by  a.company_id