浏览代码

Merge branch 'master' into wrq_dev

wangrq 4 月之前
父节点
当前提交
0cf6a68a42
共有 39 个文件被更改,包括 1781 次插入 和 408 次删除
  1. 19 0
      commons/src/main/java/com/jzg/commons/entity/dto/CostCalculateRespVO.java
  2. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/ExportSuperviseSettlementExcelDto.java
  3. 8 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  4. 7 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java
  5. 36 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeInvoiceVO.java
  6. 39 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceAndSettlementVo.java
  7. 1 1
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoicingVo.java
  8. 22 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/PlatformSettlementVo.java
  9. 4 2
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrderReadPdf.java
  10. 8 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java
  11. 1 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  12. 1 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerCacheComponent.java
  13. 2 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerGetTokenImpl.java
  14. 4 4
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java
  15. 29 15
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java
  16. 11 5
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeAuditService.java
  17. 2 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java
  18. 2 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java
  19. 50 29
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  20. 69 31
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java
  21. 6 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  22. 29 29
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml
  23. 9 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java
  24. 1 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/service/Impl/ZiJinApiRequestImpl.java
  25. 6 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java
  26. 21 6
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerRequestComponent.java
  27. 6 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerGetOrderNoRequest.java
  28. 24 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerQuotationRequest.java
  29. 29 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerQuoteProcessServiceImpl.java
  30. 975 167
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java
  31. 12 0
      tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementDispatchController.java
  32. 57 15
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  33. 1 1
      tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java
  34. 10 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementDispatchService.java
  35. 25 4
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  36. 25 7
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementDispatchServiceImpl.java
  37. 1 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  38. 192 17
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  39. 34 67
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

+ 19 - 0
commons/src/main/java/com/jzg/commons/entity/dto/CostCalculateRespVO.java

@@ -0,0 +1,19 @@
+package com.jzg.commons.entity.dto;
+
+import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(description = "纯费用计算-出参")
+public class CostCalculateRespVO {
+
+    @Schema(description = "费用订单信息")
+    private InsFeeOrders insFeeOrders;
+
+    @Schema(description = "费用比例信息")
+    private PtlAgreementCostRatioVo costRatio;
+}

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

@@ -74,4 +74,7 @@ public class ExportSuperviseSettlementExcelDto {
     @Schema(description = "附件url")
     @Schema(description = "附件url")
     private String fileUrl;
     private String fileUrl;
 
 
+    @Schema(description = "订单号")
+    private String orderNo;
+
 }
 }

+ 8 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java

@@ -206,6 +206,14 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("驾意跟单位是否已经结算")
     @ExcelProperty("驾意跟单位是否已经结算")
     private String jyOtherSettlement;
     private String jyOtherSettlement;
 
 
+    @Schema(description = "平台协议车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议车险应收是否已经结算")
+    private String platformSuperviseSettlement;
+
+    @Schema(description = "平台协议非车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议非车险应收是否已经结算")
+    private String platformOtherSettlement;
+
     @Schema(description = "维护人工号")
     @Schema(description = "维护人工号")
     @ExcelProperty("维护人工号")
     @ExcelProperty("维护人工号")
     private String leaderId;
     private String leaderId;

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

@@ -6,6 +6,7 @@ import lombok.Data;
 
 
 import java.io.Serial;
 import java.io.Serial;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Objects;
 import java.util.Objects;
 
 
 @Data
 @Data
@@ -44,6 +45,12 @@ public class InsPlyIncomeInvoice extends BaseModel {
     @Schema(description = "税点")
     @Schema(description = "税点")
     private String taxPoint;
     private String taxPoint;
 
 
+    @Schema(description = "开票号/发票号")
+    private String invoiceNo;
+
+    @Schema(description = "开票时间")
+    private LocalDateTime invoiceTime;
+
     @Schema(description = "状态")
     @Schema(description = "状态")
     private String status;
     private String status;
 
 

+ 36 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InsPlyIncomeInvoiceVO.java

@@ -0,0 +1,36 @@
+package com.jzg.commons.entity.finance.vo;
+
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoice;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "财务应收开票表")
+public class InsPlyIncomeInvoiceVO extends InsPlyIncomeInvoice {
+
+    @Serial
+    private static final long serialVersionUID = 6982290696670953095L;
+    @Schema(description = "是否能开票")
+    private boolean canInvoice;
+
+    @Schema(description = "不能开票的原因")
+    private String errMsg;
+
+    /**
+     * 发票对应的应收订单的序号
+     * @date 2026/5/26 11:35
+     */
+    private List<String> incomeIds;
+
+    /**
+     * 发票对应的应收订单的序号
+     * @date 2026/5/26 11:35
+     */
+    private List<String> orderNos;
+
+}

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceAndSettlementVo.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 结算Vo
+ */
+@Data
+@Schema(description = "结算Vo")
+public class InvoiceAndSettlementVo {
+
+    /**
+     * 开票的相关信息
+     */
+    private InsPlyIncomeInvoiceVO invoiceVO;
+
+    @Schema(description = "开票id")
+    private String invoicingId;
+
+    @Schema(description = "实收金额")
+    private BigDecimal actualReceivedAmount;
+
+    @Schema(description = "收款日期")
+    private String receivePaymentDate;
+
+    @Schema(description = "回款差额")
+    private BigDecimal paymentDifference;
+
+    @Schema(description = "差额原因")
+    private String paymentReason;
+
+    @Schema(description = "附加id")
+    private List<String> attachmentIds;
+}

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

@@ -21,7 +21,7 @@ public class InvoicingVo {
     @Schema(description = "开票的保司id")
     @Schema(description = "开票的保司id")
     private String companyId;
     private String companyId;
 
 
-    // 开票类型 1:手续费 2:跟单费 3:驾意手续费 4::驾意跟单费
+    // 开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
     @Schema(description = "开票类型")
     @Schema(description = "开票类型")
     private String invoiceType;
     private String invoiceType;
 
 

+ 22 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/PlatformSettlementVo.java

@@ -0,0 +1,22 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 结算Vo
+ */
+@Data
+@Schema(description = "平台结算Vo")
+public class PlatformSettlementVo {
+
+    @Schema(description = "结算Vo")
+    private SettlementVo settlementVo;
+
+    @Schema(description = "开票id")
+    private InvoicingVo invoicingVo;
+}

+ 4 - 2
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrderReadPdf.java

@@ -1,7 +1,7 @@
 package com.jzg.commons.entity.orders.po;
 package com.jzg.commons.entity.orders.po;
 
 
-import java.io.Serializable;
-import java.util.Date;
+import java.io.Serial;
+
 
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -17,6 +17,8 @@ import lombok.Data;
 @Schema(description = "保单读取信息配置表")
 @Schema(description = "保单读取信息配置表")
 public class InsOrderReadPdf extends BaseModel {
 public class InsOrderReadPdf extends BaseModel {
 
 
+    @Serial
+    private static final long serialVersionUID = -1427629070694065554L;
     @Schema(description = "主键")
     @Schema(description = "主键")
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private String id;
     private String id;

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

@@ -14,6 +14,7 @@ import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerCalculate
 import com.jzg.quotation.commons.component.ConversionOfQuoteInformation;
 import com.jzg.quotation.commons.component.ConversionOfQuoteInformation;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.List;
 
 
 
 
@@ -62,7 +63,13 @@ public final class AnShengCrawlerQuoteResultsVoBuild {
                 buildKindInfo(quoteResultsVo.getKindInfoVo(), contract.getPolicyCoverages());
                 buildKindInfo(quoteResultsVo.getKindInfoVo(), contract.getPolicyCoverages());
             }
             }
         });
         });
-
+        QuoteResultsVo.CostsVo costs = quoteResultsVo.getCosts();
+        BigDecimal bi = costs.getBiPremium() == null ? BigDecimal.ZERO : new BigDecimal(costs.getBiPremium());
+        BigDecimal ci = costs.getCiPremium() == null ? BigDecimal.ZERO : new BigDecimal(costs.getCiPremium());
+        BigDecimal vv = costs.getVvTax() == null ? BigDecimal.ZERO : new BigDecimal(costs.getVvTax());
+        BigDecimal total = bi.add(ci).add(vv);
+        String totalStr = total.toPlainString();
+        costs.setSumPremium(totalStr);
         quoteResultsVo.setScoreVo(buildScoreVo(calculatePremiumApply));
         quoteResultsVo.setScoreVo(buildScoreVo(calculatePremiumApply));
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         return quoteResultsVo;
         return quoteResultsVo;

+ 1 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java

@@ -239,6 +239,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
         CarModelQueryResponse.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getVehicleList(), carInfoVo);
         CarModelQueryResponse.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getVehicleList(), carInfoVo);
 
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        underwritingResultsVo.setCompanyOrderNo(underwritingVo.getInsOrders().getCompanyOrderNo());
         // 核保
         // 核保
         SubmitRequest submitRequest = new SubmitRequest(underwritingVo,vehicle, parameters);
         SubmitRequest submitRequest = new SubmitRequest(underwritingVo,vehicle, parameters);
         SubmitResponse submitResponse = chengTaiRequestApiComponent.submit(submitRequest,apiUrl);
         SubmitResponse submitResponse = chengTaiRequestApiComponent.submit(submitRequest,apiUrl);

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerCacheComponent.java

@@ -26,7 +26,7 @@ public class HuaNongCrawlerCacheComponent {
     // 授权信息
     // 授权信息
     public static final String AUTHORIZATION = "hunong:crawler:authorization:";
     public static final String AUTHORIZATION = "hunong:crawler:authorization:";
 
 
-    public static final long AUTHORIZATION_TIME = 3L;
+    public static final long AUTHORIZATION_TIME = 1L;
 
 
     public static final String TOKEN = "TOKEN";
     public static final String TOKEN = "TOKEN";
 
 

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

@@ -43,9 +43,9 @@ public class HuaNongCrawlerGetTokenImpl implements HuaNongCrawlerGetToken {
                               Predicate<T> validator) {
                               Predicate<T> validator) {
         try {
         try {
             T data = cacheSupplier.get();
             T data = cacheSupplier.get();
-            /*if (validator.test(data)) {
+            if (validator.test(data)) {
                 return data;
                 return data;
-            }*/
+            }
             huaNongCrawlerQuoteProcessService.login(username, password,deviceId, false);
             huaNongCrawlerQuoteProcessService.login(username, password,deviceId, false);
             T newData = cacheSupplier.get();
             T newData = cacheSupplier.get();
             if (!validator.test(newData)) {
             if (!validator.test(newData)) {

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

@@ -151,14 +151,14 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
 
 
     private void authorization(String username, String password,String deviceId, boolean isFirst) {
     private void authorization(String username, String password,String deviceId, boolean isFirst) {
         // 判断是否在首次登录(协议、账号)
         // 判断是否在首次登录(协议、账号)
-        if (!isFirst) {
+        /*if (!isFirst) {
             huaNongCrawlerCacheComponent.isAccountLockout(username);
             huaNongCrawlerCacheComponent.isAccountLockout(username);
-        }
+        }*/
         HuaNongCrawlerLoginResponse login = attemptLoginWithRetry(username, password,deviceId);
         HuaNongCrawlerLoginResponse login = attemptLoginWithRetry(username, password,deviceId);
         // 判断是否在首次登录(协议、账号)
         // 判断是否在首次登录(协议、账号)
-        if (!isFirst) {
+        /*if (!isFirst) {
             huaNongCrawlerCacheComponent.accountLockout(username);
             huaNongCrawlerCacheComponent.accountLockout(username);
-        }
+        }*/
        /* String s = extractErrorMessage(login);
        /* String s = extractErrorMessage(login);
         throw new SystemException(s);*/
         throw new SystemException(s);*/
     }
     }

+ 29 - 15
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.orders.vo.AuditCostInfoVo;
 import com.jzg.commons.entity.orders.vo.AuditCostInfoVo;
@@ -37,7 +38,7 @@ public class InsFeeAuditController {
 
 
     /**
     /**
      * 订单列表分页
      * 订单列表分页
-     * @return
+     * @return HttpResult<Page<FeeAuditVo>>
      */
      */
     @PostMapping("/auditList")
     @PostMapping("/auditList")
     @Operation(summary = "订单审核列表分页")
     @Operation(summary = "订单审核列表分页")
@@ -49,7 +50,7 @@ public class InsFeeAuditController {
 
 
     /**
     /**
      * 订单列表分页
      * 订单列表分页
-     * @return
+     * @return HttpResult<String>
      */
      */
     @PostMapping("/exportAuditList")
     @PostMapping("/exportAuditList")
     @Operation(summary = "导出订单审核列表")
     @Operation(summary = "导出订单审核列表")
@@ -71,11 +72,11 @@ public class InsFeeAuditController {
 
 
     /**
     /**
      * 判断领取按钮是否锁定
      * 判断领取按钮是否锁定
-     * @return
+     * @return HttpResult<Boolean>
      */
      */
     @GetMapping("/isLock")
     @GetMapping("/isLock")
     @Operation(summary = "判断领取按钮是否锁定")
     @Operation(summary = "判断领取按钮是否锁定")
-    public HttpResult isLock(String orderNo){
+    public HttpResult<Boolean> isLock(String orderNo){
         return HttpResult.ok(insFeeAuditService.isLock(orderNo));
         return HttpResult.ok(insFeeAuditService.isLock(orderNo));
     }
     }
 
 
@@ -93,23 +94,25 @@ public class InsFeeAuditController {
 
 
     /**
     /**
      * 放弃审核订单
      * 放弃审核订单
-     * @return
+     * @return HttpResult<String>
      */
      */
     @PostMapping("/auditCancel")
     @PostMapping("/auditCancel")
     @Operation(summary = "放弃领取审核订单")
     @Operation(summary = "放弃领取审核订单")
-    public HttpResult auditCancel(@RequestParam("orderNo") String orderNo){
+    public HttpResult<String> auditCancel(@RequestParam("orderNo") String orderNo){
         insFeeAuditService.auditCancel(orderNo);
         insFeeAuditService.auditCancel(orderNo);
         return HttpResult.ok("已放弃审核订单");
         return HttpResult.ok("已放弃审核订单");
     }
     }
 
 
     /**
     /**
      * 更新签单时间
      * 更新签单时间
-     * @return
+     *
+     * @return HttpResult<String>
      */
      */
     @PostMapping("/updateSigningTime")
     @PostMapping("/updateSigningTime")
     @Operation(summary = "更新签单时间")
     @Operation(summary = "更新签单时间")
-    public HttpResult updateSigningTime(@RequestParam("orderNo") String orderNo){
-        insFeeAuditService.updateSigningTime(orderNo);
+    public HttpResult<String> updateSigningTime(@RequestParam("orderNo") String orderNo){
+        String userName = baseController.getUserName();
+        insFeeAuditService.updateSigningTime(orderNo, userName);
         return HttpResult.ok();
         return HttpResult.ok();
     }
     }
 
 
@@ -150,10 +153,10 @@ public class InsFeeAuditController {
 
 
     /**
     /**
      * 取消疑问订单
      * 取消疑问订单
-     * @return
+     * @return HttpResult<String>
      */
      */
     @PostMapping("/updateToUnQuestionOrder")
     @PostMapping("/updateToUnQuestionOrder")
-    @Operation(summary = "设置为疑问订单")
+    @Operation(summary = "取消疑问订单")
     public HttpResult<String> updateToUnQuestionOrder(@RequestParam("orderNo") String orderNo){
     public HttpResult<String> updateToUnQuestionOrder(@RequestParam("orderNo") String orderNo){
         insFeeAuditService.updateToQuestionOrder(orderNo,"0", "");
         insFeeAuditService.updateToQuestionOrder(orderNo,"0", "");
         return HttpResult.ok("已取消疑问订单,可前往待审核订单列表查看");
         return HttpResult.ok("已取消疑问订单,可前往待审核订单列表查看");
@@ -161,24 +164,35 @@ public class InsFeeAuditController {
 
 
     /**
     /**
      * 订单审核费用详情
      * 订单审核费用详情
-     * @return
+     * @return HttpResult<List<AuditCostInfoVo>>
      *
      *
      */
      */
     @GetMapping("/auditCostInfo")
     @GetMapping("/auditCostInfo")
     @Operation(summary = "订单审核费用详情")
     @Operation(summary = "订单审核费用详情")
-    public HttpResult auditCostInfo(String orderNo){
+    public HttpResult<List<AuditCostInfoVo>> auditCostInfo(String orderNo){
         List<AuditCostInfoVo> costInfoVos = insFeeAuditService.auditCostInfo(orderNo);
         List<AuditCostInfoVo> costInfoVos = insFeeAuditService.auditCostInfo(orderNo);
         return HttpResult.ok(costInfoVos);
         return HttpResult.ok(costInfoVos);
     }
     }
 
 
     /**
     /**
      * 保存调整的费用
      * 保存调整的费用
-     * @return
+     * @return HttpResult<String>
      */
      */
     @PostMapping("/saveCostInfo")
     @PostMapping("/saveCostInfo")
     @Operation(summary = "保存调整的费用")
     @Operation(summary = "保存调整的费用")
-    public HttpResult saveCostInfo(@RequestBody PtlAgreementCostRatioVo param){
+    public HttpResult<String> saveCostInfo(@RequestBody PtlAgreementCostRatioVo param){
         insFeeAuditService.saveCostInfo(param);
         insFeeAuditService.saveCostInfo(param);
         return HttpResult.ok();
         return HttpResult.ok();
     }
     }
+
+    /**
+     * 保存调整的费用
+     * @return HttpResult<CostCalculateRespVO>
+     */
+    @PostMapping("/computedCostInfo")
+    @Operation(summary = "计算调整的费用")
+    public HttpResult<CostCalculateRespVO> computedCostInfo(@RequestBody PtlAgreementCostRatioVo param){
+        CostCalculateRespVO costCalculateRespVO = insFeeAuditService.computedCostInfo(param);
+        return HttpResult.ok(costCalculateRespVO);
+    }
 }
 }

+ 11 - 5
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeAuditService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.summary.service;
 
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.orders.po.InsFeeAudit;
 import com.jzg.commons.entity.orders.po.InsFeeAudit;
@@ -35,9 +36,10 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
     void feeAuditAdd(InsOrders orders);
     void feeAuditAdd(InsOrders orders);
 
 
     /**
     /**
-     * 订单详情
-     * @param orderNo
-     * @return
+     * 根据订单号查询订单详情
+     *
+     * @param orderNo 订单编号
+     * @return QuoteEchoVo 订单详情
      */
      */
     QuoteEchoVo auditInfo(String orderNo);
     QuoteEchoVo auditInfo(String orderNo);
 
 
@@ -64,9 +66,11 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
 
 
     /**
     /**
      * 更新签单时间
      * 更新签单时间
-     * @param orderNo
+     *
+     * @param orderNo  订单号(jzg系统内部的车险订单号)
+     * @param userName 操作用户
      */
      */
-    void updateSigningTime(String orderNo);
+    void updateSigningTime(String orderNo, String userName);
 
 
     /**
     /**
      * 审核订单
      * 审核订单
@@ -101,4 +105,6 @@ public interface InsFeeAuditService extends IService<InsFeeAudit> {
      * @return
      * @return
      */
      */
     String exportAuditList(FeeAuditParam param);
     String exportAuditList(FeeAuditParam param);
+
+    CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo param);
 }
 }

+ 2 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.summary.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.InsFeeOrdersParam;
 import com.jzg.commons.entity.dto.InsFeeOrdersParam;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
@@ -24,5 +25,5 @@ public interface InsFeeOrdersService extends IService<InsFeeOrders> {
 
 
     HttpResult updateAvailableAmount(String orderNo,BigDecimal availableAmount);
     HttpResult updateAvailableAmount(String orderNo,BigDecimal availableAmount);
 
 
-
+    CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo param);
 }
 }

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

@@ -128,8 +128,8 @@ public interface InsOrdersService extends IService<InsOrders> {
     /**
     /**
      * 查询订单详情
      * 查询订单详情
      *
      *
-     * @param ordersNo
-     * @return
+     * @param ordersNo 订单号
+     * @return QuoteEchoVo 订单详情
      */
      */
     QuoteEchoVo getOrderDetail(String ordersNo);
     QuoteEchoVo getOrderDetail(String ordersNo);
 
 

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

@@ -11,6 +11,7 @@ import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.account.po.SysUserAccountIncomeLog;
 import com.jzg.commons.entity.account.po.SysUserAccountIncomeLog;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.FeeAuditParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.dto.VerifyOrderParam;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.orders.po.*;
@@ -136,29 +137,30 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             param.setCompanyIdList(companyIdList);
             param.setCompanyIdList(companyIdList);
         }
         }
         Page<FeeAuditVo> page = baseMapper.queryPage(param.getPage(), param);
         Page<FeeAuditVo> page = baseMapper.queryPage(param.getPage(), param);
-        // 循环每条数据,查询 ins_fee_orders 并计算权益金额
-        if (CollUtil.isNotEmpty(page.getRecords())) {
-            Map<String, String> allCompanyHierarchyPaths = esmInsCompanyClient.getAllCompanyHierarchyPaths();
-            for (FeeAuditVo feeAuditVo : page.getRecords()) {
-                String allCompany =  allCompanyHierarchyPaths.get(Objects.toString(feeAuditVo.getCompanyId(),""));
-                feeAuditVo.setCompanyALlName(allCompany);
-                // 查询订单的 ins_fee_orders 数据
-                InsFeeOrders insFeeOrders = feeOrdersService.getById(feeAuditVo.getOrderNo());
-                if (insFeeOrders != null) {
-                    // 权益金额 = (交强出口费用 + 商业出口费用 + 驾意出口费用) - (交强出口留点费用 + 商业出口留点费用 + 驾意出口留点费用)
-                    BigDecimal exportTotal = Optional.ofNullable(insFeeOrders.getJqExportPremium()).orElse(BigDecimal.ZERO)
-                            .add(Optional.ofNullable(insFeeOrders.getSyExportPremium()).orElse(BigDecimal.ZERO))
-                            .add(Optional.ofNullable(insFeeOrders.getJyExportPremium()).orElse(BigDecimal.ZERO));
-
-                    BigDecimal exportKeepPointTotal = Optional.ofNullable(insFeeOrders.getJqExportKeepPointPremium()).orElse(BigDecimal.ZERO)
-                            .add(Optional.ofNullable(insFeeOrders.getSyExportKeepPointPremium()).orElse(BigDecimal.ZERO))
-                            .add(Optional.ofNullable(insFeeOrders.getJyExportKeepPointPremium()).orElse(BigDecimal.ZERO));
-
-                    BigDecimal equityAmount = exportTotal.subtract(exportKeepPointTotal);
-                    feeAuditVo.setEquityAmount(equityAmount);
-                }else{
-                    feeAuditVo.setEquityAmount(BigDecimal.ZERO);
-                }
+        if(CollUtil.isEmpty(page.getRecords())){
+            return page;
+        }
+        Map<String, String> allCompanyHierarchyPaths = esmInsCompanyClient.getAllCompanyHierarchyPaths();
+        for (FeeAuditVo feeAuditVo : page.getRecords()) {
+            String allCompany =  allCompanyHierarchyPaths.get(Objects.toString(feeAuditVo.getCompanyId(),""));
+            feeAuditVo.setCompanyALlName(allCompany);
+            // 循环每条数据,查询 ins_fee_orders 并计算权益金额
+            // 查询订单的 ins_fee_orders 数据
+            InsFeeOrders insFeeOrders = feeOrdersService.getById(feeAuditVo.getOrderNo());
+            if (insFeeOrders != null) {
+                // 权益金额 = (交强出口费用 + 商业出口费用 + 驾意出口费用) - (交强出口留点费用 + 商业出口留点费用 + 驾意出口留点费用)
+                BigDecimal exportTotal = Optional.ofNullable(insFeeOrders.getJqExportPremium()).orElse(BigDecimal.ZERO)
+                        .add(Optional.ofNullable(insFeeOrders.getSyExportPremium()).orElse(BigDecimal.ZERO))
+                        .add(Optional.ofNullable(insFeeOrders.getJyExportPremium()).orElse(BigDecimal.ZERO));
+
+                BigDecimal exportKeepPointTotal = Optional.ofNullable(insFeeOrders.getJqExportKeepPointPremium()).orElse(BigDecimal.ZERO)
+                        .add(Optional.ofNullable(insFeeOrders.getSyExportKeepPointPremium()).orElse(BigDecimal.ZERO))
+                        .add(Optional.ofNullable(insFeeOrders.getJyExportKeepPointPremium()).orElse(BigDecimal.ZERO));
+
+                BigDecimal equityAmount = exportTotal.subtract(exportKeepPointTotal);
+                feeAuditVo.setEquityAmount(equityAmount);
+            }else{
+                feeAuditVo.setEquityAmount(BigDecimal.ZERO);
             }
             }
         }
         }
 
 
@@ -225,6 +227,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         this.save(insFeeAudit);
         this.save(insFeeAudit);
     }
     }
 
 
+    /**
+     * 根据订单号查询订单详情
+     *
+     * @param orderNo 订单编号
+     * @return QuoteEchoVo 订单详情
+     */
     @Override
     @Override
     public QuoteEchoVo auditInfo(String orderNo) {
     public QuoteEchoVo auditInfo(String orderNo) {
         //险种和订单类型以及业务员对应的管理员
         //险种和订单类型以及业务员对应的管理员
@@ -317,11 +325,19 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         return exists;
         return exists;
     }
     }
 
 
+    /**
+     * 更新签单时间
+     *
+     * @param orderNo  订单号(jzg系统内部的车险订单号)
+     * @param userName 操作用户
+     */
     @Override
     @Override
-    public void updateSigningTime(String orderNo) {
+    public void updateSigningTime(String orderNo, String userName) {
+        log.info("用户[{}]更新订单[{}]的签单时间",userName,orderNo);
         InsOrders orders = insOrdersService.getById(orderNo);
         InsOrders orders = insOrdersService.getById(orderNo);
         // 查询电子保单路径
         // 查询电子保单路径
         InsOrdersPdfUrl pdfUrl = ordersPdfUrlService.getById(orderNo);
         InsOrdersPdfUrl pdfUrl = ordersPdfUrlService.getById(orderNo);
+        log.info("订单[{}]没有生成电子表单",orderNo);
         AssertionUtils.isFail(Objects.isNull(pdfUrl), "未生成电子保单!");
         AssertionUtils.isFail(Objects.isNull(pdfUrl), "未生成电子保单!");
         String url = null;
         String url = null;
         int type = 0;
         int type = 0;
@@ -366,8 +382,6 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }
         }
         //更新时间表
         //更新时间表
         insOrdersService.updateById(orders);
         insOrdersService.updateById(orders);
-
-
     }
     }
 
 
     @Override
     @Override
@@ -668,7 +682,8 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
 
     @Override
     @Override
     public void updateToQuestionOrder(String orderNo, String status, String problemReason) {
     public void updateToQuestionOrder(String orderNo, String status, String problemReason) {
-        log.info("更新订单的疑问状态。 orderNo=[{}],status=[{}], problemReason=[{}]",orderNo,status,problemReason);
+        String userName = baseController.getUserName();
+        log.info("用户[{}]更新订单的疑问状态。orderNo=[{}],status=[{}], problemReason=[{}]",userName, orderNo,status,problemReason);
         InsFeeAudit audit = this.getById(orderNo);
         InsFeeAudit audit = this.getById(orderNo);
         if(audit.getAuditStatus() > 0){
         if(audit.getAuditStatus() > 0){
             AssertionUtils.isFail(true, "订单已审核刷新订单详情页!");
             AssertionUtils.isFail(true, "订单已审核刷新订单详情页!");
@@ -677,7 +692,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         if(StringUtils.isBlank(audit.getReceiveUser())){
         if(StringUtils.isBlank(audit.getReceiveUser())){
             AssertionUtils.isFail(true, "请领取订单后再进行审核退出详情页,返回待审核订单列表!");
             AssertionUtils.isFail(true, "请领取订单后再进行审核退出详情页,返回待审核订单列表!");
         }
         }
-        String userName = baseController.getUserName();
+
         if (!userName.equals(audit.getReceiveUser())) {
         if (!userName.equals(audit.getReceiveUser())) {
             AssertionUtils.isFail(true, "订单已被"+audit.getReceiveUser()+"领取返回待审核订单列表!");
             AssertionUtils.isFail(true, "订单已被"+audit.getReceiveUser()+"领取返回待审核订单列表!");
         }
         }
@@ -719,10 +734,11 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
 
     @Override
     @Override
     public void saveCostInfo(PtlAgreementCostRatioVo param) {
     public void saveCostInfo(PtlAgreementCostRatioVo param) {
+        log.info("保存调整后的费用:param=[{}]", JSONUtil.toJsonStr(param));
         try {
         try {
             feeOrdersService.calcCosts(param);
             feeOrdersService.calcCosts(param);
         } catch (ReflectiveOperationException e) {
         } catch (ReflectiveOperationException e) {
-            e.printStackTrace();
+            log.error("调整订单费用时,计算异常",e);
             throw new SystemException("费用计算异常:"+ e.getMessage());
             throw new SystemException("费用计算异常:"+ e.getMessage());
         }
         }
         // 保存比例调整记录
         // 保存比例调整记录
@@ -730,6 +746,11 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         recordService.updateById(record);
         recordService.updateById(record);
     }
     }
 
 
+    @Override
+    public CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo param) {
+        return feeOrdersService.computedCostInfo(param);
+    }
+
     /**
     /**
      * 导出订单审核列表
      * 导出订单审核列表
      * @param param
      * @param param

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

@@ -1,9 +1,11 @@
 package com.jzg.quotation.summary.service.impl;
 package com.jzg.quotation.summary.service.impl;
 
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostCalculateRespVO;
 import com.jzg.commons.entity.dto.InsFeeOrdersParam;
 import com.jzg.commons.entity.dto.InsFeeOrdersParam;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCosts;
 import com.jzg.commons.entity.orders.po.InsOrdersCosts;
@@ -19,6 +21,8 @@ import com.jzg.quotation.summary.service.InsOrdersCostsService;
 import com.jzg.quotation.summary.service.InsOrdersService;
 import com.jzg.quotation.summary.service.InsOrdersService;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -26,7 +30,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 import java.lang.reflect.Method;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
-import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -36,6 +39,8 @@ import java.util.List;
 
 
 @Service
 @Service
 public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, InsFeeOrders> implements InsFeeOrdersService {
 public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, InsFeeOrders> implements InsFeeOrdersService {
+
+    private static final Logger log = LoggerFactory.getLogger(InsFeeOrdersServiceImpl.class);
     @Resource
     @Resource
     private InsOrdersService insOrdersService;
     private InsOrdersService insOrdersService;
 
 
@@ -62,19 +67,35 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
     }
     }
 
 
     @Override
     @Override
-    public InsFeeOrders calcCosts(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) throws ReflectiveOperationException {
+    public CostCalculateRespVO computedCostInfo(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) {
+        // 常量定义 保留小数5位
+        InsFeeOrders insFeeOrders = getInsFeeOrders(ptlAgreementCostRatioVo);
+        // 拼接返回值
+        CostCalculateRespVO costCalculateRespVO = new CostCalculateRespVO();
+        costCalculateRespVO.setInsFeeOrders(insFeeOrders);
+        costCalculateRespVO.setCostRatio(new PtlAgreementCostRatioVo(insFeeOrders));
+        return costCalculateRespVO;
+    }
+
+
+    @Override
+    public InsFeeOrders calcCosts(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) {
+        InsFeeOrders insFeeOrders = getInsFeeOrders(ptlAgreementCostRatioVo);
+        log.info("调整后费用.参数[{}]真实结果是[{}]", JSONUtil.toJsonStr(ptlAgreementCostRatioVo), JSONUtil.toJsonStr(insFeeOrders));
+        // 保存比例
+        this.updateById(insFeeOrders);
+        return insFeeOrders;
+    }
+
+    private InsFeeOrders getInsFeeOrders(PtlAgreementCostRatioVo ptlAgreementCostRatioVo) {
         // 常量定义 保留小数5位
         // 常量定义 保留小数5位
         final int SCALE = 5;
         final int SCALE = 5;
-        final RoundingMode ROUNDING_MODE = RoundingMode.HALF_EVEN;
-        final BigDecimal ONE_HUNDRED = new BigDecimal("100");
         final BigDecimal TAX_RATE = new BigDecimal("1.06");
         final BigDecimal TAX_RATE = new BigDecimal("1.06");
 
 
         // 获取订单信息
         // 获取订单信息
         InsOrders insOrders = insOrdersService.getById(ptlAgreementCostRatioVo.getOrderNo());
         InsOrders insOrders = insOrdersService.getById(ptlAgreementCostRatioVo.getOrderNo());
         // 获取订单费用信息
         // 获取订单费用信息
         InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
         InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
-
-        String systemCode = getSystemCode();
         // 获取协议信息
         // 获取协议信息
         PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrders.getAgreementId());
         PtlAgreement ptlAgreement = orgClient.getByAgreementId(insOrders.getAgreementId());
         // 获取费用信息
         // 获取费用信息
@@ -89,11 +110,12 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         BigDecimal jyPremium = insOrdersCosts.getJyPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getJyPremium();
         BigDecimal jyPremium = insOrdersCosts.getJyPremium() == null ? BigDecimal.ZERO : insOrdersCosts.getJyPremium();
 
 
         // 更新对象中的比例字段
         // 更新对象中的比例字段
-        saveRatio(ptlAgreementCostRatioVo, insFeeOrders);
+        copyRatio(ptlAgreementCostRatioVo, insFeeOrders);
 
 
         // 核心:规则重新计算所有费用
         // 核心:规则重新计算所有费用
         // 1. 交强险
         // 1. 交强险
-        calculatePremiumByRule(insFeeOrders, "jq", jqPremium,
+        calculatePremiumByRule(insFeeOrders,
+                "jq", jqPremium,
                 insFeeOrders.getJqCommissionRatio(), insFeeOrders.getJqInletRatio(), insFeeOrders.getJqFollowRatio(),
                 insFeeOrders.getJqCommissionRatio(), insFeeOrders.getJqInletRatio(), insFeeOrders.getJqFollowRatio(),
                 insFeeOrders.getJqAdditionalRatio(), insFeeOrders.getJqKeepPointRatio(), insFeeOrders.getJqExportRatio(), insFeeOrders.getJqExportKeepPointRatio(),
                 insFeeOrders.getJqAdditionalRatio(), insFeeOrders.getJqKeepPointRatio(), insFeeOrders.getJqExportRatio(), insFeeOrders.getJqExportKeepPointRatio(),
                 withTax, TAX_RATE, SCALE);
                 withTax, TAX_RATE, SCALE);
@@ -116,9 +138,6 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
 
 
         insFeeOrders.setTotalPayablePremium(scale(totalPayable, SCALE));
         insFeeOrders.setTotalPayablePremium(scale(totalPayable, SCALE));
         insFeeOrders.setTotalReceivablePremium(scale(totalReceivable, SCALE));
         insFeeOrders.setTotalReceivablePremium(scale(totalReceivable, SCALE));
-
-        // 保存比例
-        this.updateById(insFeeOrders);
         return insFeeOrders;
         return insFeeOrders;
     }
     }
 
 
@@ -267,31 +286,50 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
     }
     }
 
 
     // 保存比例
     // 保存比例
-    private void saveRatio(PtlAgreementCostRatioVo ptlAgreementCostRatioVo, InsFeeOrders insFeeOrders) {
+    private void copyRatio(PtlAgreementCostRatioVo ptlAgreementCostRatioVo, InsFeeOrders insFeeOrders) {
         // 手续费比例
         // 手续费比例
-        insFeeOrders.setJqCommissionRatio(covertPercent(ptlAgreementCostRatioVo.getJqCommissionRatio()));
-        insFeeOrders.setSyCommissionRatio(covertPercent(ptlAgreementCostRatioVo.getSyCommissionRatio()));
-        insFeeOrders.setJyCommissionRatio(covertPercent(ptlAgreementCostRatioVo.getJyCommissionRatio()));
+        BigDecimal jqCommissionRatio = covertPercent(ptlAgreementCostRatioVo.getJqCommissionRatio());
+        BigDecimal syCommissionRatio = covertPercent(ptlAgreementCostRatioVo.getSyCommissionRatio());
+        BigDecimal jyCommissionRatio = covertPercent(ptlAgreementCostRatioVo.getJyCommissionRatio());
+        insFeeOrders.setJqCommissionRatio(jqCommissionRatio);
+        insFeeOrders.setSyCommissionRatio(syCommissionRatio);
+        insFeeOrders.setJyCommissionRatio(jyCommissionRatio);
         // 入口比例
         // 入口比例
-        insFeeOrders.setJqInletRatio(covertPercent(ptlAgreementCostRatioVo.getJqInletRatio()));
-        insFeeOrders.setSyInletRatio(covertPercent(ptlAgreementCostRatioVo.getSyInletRatio()));
-        insFeeOrders.setJyInletRatio(covertPercent(ptlAgreementCostRatioVo.getJyInletRatio()));
+        BigDecimal jqInletRatio = covertPercent(ptlAgreementCostRatioVo.getJqInletRatio());
+        BigDecimal syInletRatio = covertPercent(ptlAgreementCostRatioVo.getSyInletRatio());
+        BigDecimal jyInletRatio = covertPercent(ptlAgreementCostRatioVo.getJyInletRatio());
+        insFeeOrders.setJqInletRatio(jqInletRatio);
+        insFeeOrders.setSyInletRatio(syInletRatio);
+        insFeeOrders.setJyInletRatio(jyInletRatio);
         // 跟单比例
         // 跟单比例
-        insFeeOrders.setJqFollowRatio(insFeeOrders.getJqInletRatio().subtract(insFeeOrders.getJqCommissionRatio()));
-        insFeeOrders.setSyFollowRatio(insFeeOrders.getSyInletRatio().subtract(insFeeOrders.getSyCommissionRatio()));
-        insFeeOrders.setJyFollowRatio(insFeeOrders.getJyInletRatio().subtract(insFeeOrders.getJyCommissionRatio()));
+        BigDecimal jqFollowRatio = jqInletRatio.subtract(jqCommissionRatio);
+        BigDecimal syFollowRatio = syInletRatio.subtract(syCommissionRatio);
+        BigDecimal jyFollowRatio = jyInletRatio.subtract(jyCommissionRatio);
+        insFeeOrders.setJqFollowRatio(jqFollowRatio);
+        insFeeOrders.setSyFollowRatio(syFollowRatio);
+        insFeeOrders.setJyFollowRatio(jyFollowRatio);
         // 加投比例
         // 加投比例
-        insFeeOrders.setJqAdditionalRatio(covertPercent(ptlAgreementCostRatioVo.getJqAdditionalRatio()));
-        insFeeOrders.setSyAdditionalRatio(covertPercent(ptlAgreementCostRatioVo.getSyAdditionalRatio()));
-        insFeeOrders.setJyAdditionalRatio(covertPercent(ptlAgreementCostRatioVo.getJyAdditionalRatio()));
-        // 留点比例
-        insFeeOrders.setJqKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getJqKeepPointRatio()));
-        insFeeOrders.setSyKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getSyKeepPointRatio()));
-        insFeeOrders.setJyKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getJyKeepPointRatio()));
+        BigDecimal jqAdditionalRatio = covertPercent(ptlAgreementCostRatioVo.getJqAdditionalRatio());
+        BigDecimal syAdditionalRatio = covertPercent(ptlAgreementCostRatioVo.getSyAdditionalRatio());
+        BigDecimal jyAdditionalRatio = covertPercent(ptlAgreementCostRatioVo.getJyAdditionalRatio());
+        insFeeOrders.setJqAdditionalRatio(jqAdditionalRatio);
+        insFeeOrders.setSyAdditionalRatio(syAdditionalRatio);
+        insFeeOrders.setJyAdditionalRatio(jyAdditionalRatio);
         // 出口比例
         // 出口比例
-        insFeeOrders.setJqExportRatio(covertPercent(ptlAgreementCostRatioVo.getJqExportRatio()));
-        insFeeOrders.setSyExportRatio(covertPercent(ptlAgreementCostRatioVo.getSyExportRatio()));
-        insFeeOrders.setJyExportRatio(covertPercent(ptlAgreementCostRatioVo.getJyExportRatio()));
+        BigDecimal jqExportRatio = covertPercent(ptlAgreementCostRatioVo.getJqExportRatio());
+        BigDecimal syExportRatio = covertPercent(ptlAgreementCostRatioVo.getSyExportRatio());
+        BigDecimal jyExportRatio = covertPercent(ptlAgreementCostRatioVo.getJyExportRatio());
+        insFeeOrders.setJqExportRatio(jqExportRatio);
+        insFeeOrders.setSyExportRatio(syExportRatio);
+        insFeeOrders.setJyExportRatio(jyExportRatio);
+        // 需求:入口 + 加投 - 出口 = 留点
+        BigDecimal jqKeepPointRatio = jqInletRatio.add(jqAdditionalRatio).subtract(jqExportRatio);
+        BigDecimal syKeepPointRatio = syInletRatio.add(syAdditionalRatio).subtract(syExportRatio);
+        BigDecimal jyKeepPointRatio = jyInletRatio.add(jyAdditionalRatio).subtract(jyExportRatio);
+        // 留点比例
+        insFeeOrders.setJqKeepPointRatio(jqKeepPointRatio);
+        insFeeOrders.setSyKeepPointRatio(syKeepPointRatio);
+        insFeeOrders.setJyKeepPointRatio(jyKeepPointRatio);
         // 出口留点比例
         // 出口留点比例
         insFeeOrders.setJqExportKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getJqExportKeepPointRatio()));
         insFeeOrders.setJqExportKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getJqExportKeepPointRatio()));
         insFeeOrders.setSyExportKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getSyExportKeepPointRatio()));
         insFeeOrders.setSyExportKeepPointRatio(covertPercent(ptlAgreementCostRatioVo.getSyExportKeepPointRatio()));

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

@@ -1298,7 +1298,12 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
 
     }
     }
 
 
-
+    /**
+     * 查询订单详情
+     *
+     * @param ordersNo 订单号
+     * @return QuoteEchoVo 订单详情
+     */
     @Override
     @Override
     public QuoteEchoVo getOrderDetail(String ordersNo) {
     public QuoteEchoVo getOrderDetail(String ordersNo) {
         log.info("获取订单详情.ordersNo=[{}]", ordersNo);
         log.info("获取订单详情.ordersNo=[{}]", ordersNo);

+ 29 - 29
tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml

@@ -27,20 +27,21 @@
     </sql>
     </sql>
     <select id="queryPage" resultType="com.jzg.commons.entity.orders.vo.FeeAuditVo">
     <select id="queryPage" resultType="com.jzg.commons.entity.orders.vo.FeeAuditVo">
         SELECT
         SELECT
-            ifa.order_no as orderNo,
-            io.company_id,
-            io.company_name as companyName,
-            ioci.license_no AS licenseNo,
-            iocui.name as insurName,
-            CASE io.entry_status
-            WHEN 1 THEN '车险出单'
-            WHEN 2 THEN '代客录单'
-            WHEN 3 THEN '补录订单'
-            ELSE ''
-            END AS order_type,
-            suji.name as name,
-            su.mobile as mobile,
-            CASE suji.type_attr
+                qsu.username ,    -- 业务员登录账号
+        ifa.order_no as orderNo,
+        io.company_id,
+        io.company_name as companyName,
+        ioci.license_no AS licenseNo,
+        iocui.name as insurName,
+        CASE io.entry_status
+        WHEN 1 THEN '车险出单'
+        WHEN 2 THEN '代客录单'
+        WHEN 3 THEN '补录订单'
+        ELSE ''
+        END AS order_type,
+        suji.name as name,
+        qsu.mobile as mobile,
+        CASE suji.type_attr
                 WHEN 1 THEN '前线人员'
                 WHEN 1 THEN '前线人员'
                 WHEN 2 THEN '后线人员'
                 WHEN 2 THEN '后线人员'
                 WHEN 3 THEN '合伙人'
                 WHEN 3 THEN '合伙人'
@@ -65,19 +66,18 @@
                 WHEN 1 THEN '是'
                 WHEN 1 THEN '是'
                 ELSE ''
                 ELSE ''
                 END AS isProblem,
                 END AS isProblem,
-            io.order_source
-        FROM ins_fee_audit ifa
-        LEFT JOIN ins_orders as io on ifa.order_no = io.id
-        LEFT JOIN ins_orders_car_info as ioci on io.id = ioci.order_no
-        LEFT JOIN ins_orders_car_user_info as iocui on io.id = iocui.order_no and iocui.policy_person_type = 3
-        LEFT JOIN sys_user qsu on qsu.mobile = io.real_quote_user_id
-        LEFT JOIN sys_user_jzg_info suji ON suji.user_id = qsu.id and suji.system_code = #{param.systemCode}
-        LEFT JOIN sys_user su on su.id = io.real_quote_user_id
-        LEFT JOIN sys_dept sd on suji.dept_id = sd.id
-        LEFT JOIN ptl_agreement pa on io.agreement_id = pa.id
-        LEFT JOIN sys_user sua on sua.id = pa.custodian_id
-        LEFT JOIN ins_orders_costs ioc on ioc.order_no = io.id
-        LEFT JOIN ins_orders_external_policy ioep on ioep.order_no = io.id
+                io.order_source
+                FROM ins_fee_audit ifa
+                LEFT JOIN ins_orders as io on ifa.order_no = io.id
+                LEFT JOIN ins_orders_car_info as ioci on io.id = ioci.order_no
+                LEFT JOIN ins_orders_car_user_info as iocui on io.id = iocui.order_no and iocui.policy_person_type = 3
+                LEFT JOIN sys_user qsu on qsu.mobile = io.real_quote_user_id
+                LEFT JOIN sys_user_jzg_info suji ON suji.user_id = qsu.id and suji.system_code = #{param.systemCode}
+                LEFT JOIN sys_dept sd on suji.dept_id = sd.id
+                LEFT JOIN ptl_agreement pa on io.agreement_id = pa.id
+                LEFT JOIN sys_user sua on sua.id = pa.custodian_id
+                LEFT JOIN ins_orders_costs ioc on ioc.order_no = io.id
+                LEFT JOIN ins_orders_external_policy ioep on ioep.order_no = io.id
         <where>
         <where>
             <choose>
             <choose>
                 <when test="param.receiveUser != null and param.receiveUser != ''">
                 <when test="param.receiveUser != null and param.receiveUser != ''">
@@ -106,7 +106,7 @@
                 and suji.type_attr = #{param.attrType}
                 and suji.type_attr = #{param.attrType}
             </if>
             </if>
             <if test="param.salesman != null and param.salesman != ''">
             <if test="param.salesman != null and param.salesman != ''">
-                and (su.username = #{param.salesman} or su.mobile = #{param.salesman})
+                and (qsu.username = #{param.salesman} or qsu.mobile = #{param.salesman})
             </if>
             </if>
             <if test="param.orderStatus != null ">
             <if test="param.orderStatus != null ">
                 and io.order_status = #{param.orderStatus}
                 and io.order_status = #{param.orderStatus}
@@ -192,7 +192,7 @@
                 END AS attrType,
                 END AS attrType,
                io.signing_time as signingTime,
                io.signing_time as signingTime,
                io.create_time as quotationTime, sua.username as dockingPerson,
                io.create_time as quotationTime, sua.username as dockingPerson,
-               pa.agreement_abbreviation as agreementName,io.product_name as productName,
+               pa.agreement_abbreviation as agreementName,io.product_id, io.product_name as productName,
                ioc.jq_premium as jqPremium, ioc.sy_premium as syPremium, ioc.jy_premium as jyPremium,
                ioc.jq_premium as jqPremium, ioc.sy_premium as syPremium, ioc.jy_premium as jyPremium,
                ioc.sum_premium as sumPremium,sd.name as deptName,ifa.create_time as createTime,
                ioc.sum_premium as sumPremium,sd.name as deptName,ifa.create_time as createTime,
                ifa.create_by as createBy,io.pay_time as payTime, ifa.audit_time as auditTime,
                ifa.create_by as createBy,io.pay_time as payTime, ifa.audit_time as auditTime,

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

@@ -25,6 +25,7 @@ import lombok.RequiredArgsConstructor;
 
 
 import java.io.Serial;
 import java.io.Serial;
 import java.io.Serializable;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.*;
 
 
@@ -180,6 +181,14 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                 coverageDTO.setAmount(kindInfoVo.getAmount());
                 coverageDTO.setAmount(kindInfoVo.getAmount());
                 coverageDTO.setUnitAmount(Integer.parseInt(kindInfoVo.getUnitAmount()));
                 coverageDTO.setUnitAmount(Integer.parseInt(kindInfoVo.getUnitAmount()));
                 coverageDTO.setQuantity(Objects.isNull(kindInfoVo.getQuantity()) ? 0 : Integer.parseInt(kindInfoVo.getQuantity()));
                 coverageDTO.setQuantity(Objects.isNull(kindInfoVo.getQuantity()) ? 0 : Integer.parseInt(kindInfoVo.getQuantity()));
+                Integer seatCount = Integer.parseInt(quoteVo.getCarInfoVo().getSeatCount());
+                if (kindInfoVo.getKindCode().equals("041")) {
+                    coverageDTO.setQuantity(1);
+                }
+                if (kindInfoVo.getKindCode().equals("044")) {
+                    coverageDTO.setQuantity(seatCount - 1);
+                    coverageDTO.setAmount(String.valueOf(new BigDecimal(kindInfoVo.getUnitAmount()).multiply(new BigDecimal(coverageDTO.getQuantity()))));
+                }
                 coverageDTO.setValidDate(biRiskInfoVo.getStartDate());
                 coverageDTO.setValidDate(biRiskInfoVo.getStartDate());
                 coverageDTO.setExpiryDate(biRiskInfoVo.getEndDate());
                 coverageDTO.setExpiryDate(biRiskInfoVo.getEndDate());
                 coverageDTOList.add(coverageDTO);
                 coverageDTOList.add(coverageDTO);

+ 1 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/service/Impl/ZiJinApiRequestImpl.java

@@ -96,6 +96,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
         // 车型查询
         // 车型查询
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         ModelQueryRequest modelQueryRequest = new ModelQueryRequest(parameters, carInfoVo.getVinNo(), carInfoVo.getBrandName());
         ModelQueryRequest modelQueryRequest = new ModelQueryRequest(parameters, carInfoVo.getVinNo(), carInfoVo.getBrandName());
+        logger.info("modelQueryRequest:{}", JSON.toJSONString(modelQueryRequest));
         ModelQueryResponse modelQueryResponse = ziJinApiRequestComponent.modelQuery(modelQueryRequest, httpHeaders);
         ModelQueryResponse modelQueryResponse = ziJinApiRequestComponent.modelQuery(modelQueryRequest, httpHeaders);
         logger.info("紫金请求/modelQuery车型查询接口,结果为:{}", JSON.toJSONString(modelQueryResponse));
         logger.info("紫金请求/modelQuery车型查询接口,结果为:{}", JSON.toJSONString(modelQueryResponse));
         // 过滤车型
         // 过滤车型

+ 6 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java

@@ -1,11 +1,14 @@
 package com.jzg.quotation.zijin.crawler.build;
 package com.jzg.quotation.zijin.crawler.build;
 
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerQuotationResponse;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerQuotationResponse;
+import lombok.extern.slf4j.Slf4j;
+
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
@@ -16,6 +19,7 @@ import java.util.stream.Collectors;
  * @author:
  * @author:
  * @date:
  * @date:
  **/
  **/
+@Slf4j
 public class ZiJinCrawlerQuoteResultsVoBuild {
 public class ZiJinCrawlerQuoteResultsVoBuild {
 
 
     /**
     /**
@@ -55,6 +59,8 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         buildPremium(quoteResultsVo, ziJinCrawlerQuotationResponse);
         buildPremium(quoteResultsVo, ziJinCrawlerQuotationResponse);
         //设置报价状态:带核保
         //设置报价状态:带核保
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
+
+        log.info("quoteResultsVo参数的值:{}", JSON.toJSONString(quoteResultsVo));
         return quoteResultsVo;
         return quoteResultsVo;
     }
     }
 
 

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

@@ -172,7 +172,6 @@ public class ZiJinCrawlerRequestComponent {
         return DESEncryption.decryptStrToObject(daJiaCrawlerBaseResponse.getResult(), ZiJinCrawlerGetSaleInfoResponse.class);
         return DESEncryption.decryptStrToObject(daJiaCrawlerBaseResponse.getResult(), ZiJinCrawlerGetSaleInfoResponse.class);
     }
     }
 
 
-
     /**
     /**
      * 查询车辆信息
      * 查询车辆信息
      *
      *
@@ -222,6 +221,23 @@ public class ZiJinCrawlerRequestComponent {
         return responseEntity.getBody();
         return responseEntity.getBody();
     }
     }
 
 
+    /**
+     * 获取税务登记证号
+     *
+     * @param comCode 保险公司代码
+     * @param headers 请求头
+     * @return ZiJinCrawlerGetTaxRegistryNumberResponse
+     */
+    public ZiJinCrawlerGetTaxRegistryNumberResponse getTaxRegistryNumber(String comCode, HttpHeaders headers) throws IOException {
+        HttpHeaders httpHeaders = setHttpHeaders();
+        String url = RequestUrl.GET_TAX_REGISTRY_NUMBER.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()) + "?comCode=" + comCode;
+        log.info("获取税务登记证号请求URL:{}", url);
+        ResponseEntity<ZiJinCrawlerGetTaxRegistryNumberResponse> responseEntity = requestComponent.post(url, null, ZiJinCrawlerGetTaxRegistryNumberResponse.class, httpHeaders);
+        ZiJinCrawlerGetTaxRegistryNumberResponse response = responseEntity.getBody();
+        log.info("获取税务登记证号响应:{}", JSON.toJSONString(response));
+        return response;
+    }
+
     /**
     /**
      * 报价
      * 报价
      *
      *
@@ -241,7 +257,7 @@ public class ZiJinCrawlerRequestComponent {
     /**
     /**
      * 保存报价信息
      * 保存报价信息
      *
      *
-     * @param ziJinCrawlerSaveQuoteInformationRequest
+     * @param ziJinCrawlerSaveQuoteInfoRequest
      * @param headers
      * @param headers
      * @return ZiJinCrawlerSaveQuoteInformationResponse
      * @return ZiJinCrawlerSaveQuoteInformationResponse
      */
      */
@@ -417,8 +433,7 @@ public class ZiJinCrawlerRequestComponent {
     /**
     /**
      * 下载保单
      * 下载保单
      *
      *
-     * @param request 下载保单实体
-     * @param headers 请求头
+     * @param ziJinCrawlerDownloadPolicyRequest
      * @return ZiJinCrawlerDownloadResponse
      * @return ZiJinCrawlerDownloadResponse
      */
      */
     public ZiJinCrawlerDownloadPolicyResponse electronPolicyIODownload(ZiJinCrawlerDownloadPolicyRequest ziJinCrawlerDownloadPolicyRequest) throws IOException {
     public ZiJinCrawlerDownloadPolicyResponse electronPolicyIODownload(ZiJinCrawlerDownloadPolicyRequest ziJinCrawlerDownloadPolicyRequest) throws IOException {
@@ -462,7 +477,7 @@ public class ZiJinCrawlerRequestComponent {
         headers.set("Accept", "application/json, text/plain, */*, application/problem+json");
         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("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
-        headers.set("Authorization", "1B0234C742C12BD632AA5027EB3A501A");
+        headers.set("Authorization", "FD385C99C9B35B64EF84590AACA95380");
         headers.set("Cache-Control", "no-cache");
         headers.set("Cache-Control", "no-cache");
         headers.set("Connection", "keep-alive");
         headers.set("Connection", "keep-alive");
         headers.set("Content-Length", "23");
         headers.set("Content-Length", "23");
@@ -475,7 +490,7 @@ public class ZiJinCrawlerRequestComponent {
         headers.set("Sec-Fetch-Site", "same-origin");
         headers.set("Sec-Fetch-Site", "same-origin");
         headers.set("Tokentype", "DEFULT");
         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("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("loginToken", "FD385C99C9B35B64EF84590AACA95380");
         headers.set("sec-ch-ua", "\"Google Chrome\";v=\"141\", \"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"141\"");
         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-mobile", "?0");
         headers.set("sec-ch-ua-platform", "\"Windows\"");
         headers.set("sec-ch-ua-platform", "\"Windows\"");

+ 6 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerGetOrderNoRequest.java

@@ -94,4 +94,10 @@ public class ZiJinCrawlerGetOrderNoRequest implements Serializable {
      */
      */
     @JsonProperty("terminalIdType")
     @JsonProperty("terminalIdType")
     private String terminalIdType;
     private String terminalIdType;
+
+    /**
+     * IAC车辆代码(行业车型编码)
+     */
+    @JsonProperty("iacVehicleCode")
+    private String iacVehicleCode;
 }
 }

+ 24 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerQuotationRequest.java

@@ -546,6 +546,30 @@ public class ZiJinCrawlerQuotationRequest implements Serializable {
          */
          */
         @JsonProperty("serviceTimes")
         @JsonProperty("serviceTimes")
         private String serviceTimes;
         private String serviceTimes;
+
+        /**
+         * 价值(车损险使用)
+         */
+        @JsonProperty("value")
+        private String value;
+
+        /**
+         * 单位保额
+         */
+        @JsonProperty("unitAmount")
+        private String unitAmount;
+
+        /**
+         * 数量(座位数)
+         */
+        @JsonProperty("quantity")
+        private Integer quantity;
+
+        /**
+         * 绝对免赔率
+         */
+        @JsonProperty("deductibleRate")
+        private Integer deductibleRate;
     }
     }
 
 
     /**
     /**

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

@@ -136,6 +136,35 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
         headers.set("Authorization", authorization);
         headers.set("Authorization", authorization);
         headers.set("Content-Type", "application/json");
         headers.set("Content-Type", "application/json");
         headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
         headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
+
+
+
+        //获取cookie的值
+//        String cookie = getCookie();
+//        headers.set("Cookie", 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;
         return headers;
     }
     }
 
 

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

@@ -7,8 +7,7 @@ import com.google.zxing.NotFoundException;
 import java.util.Arrays;
 import java.util.Arrays;
 
 
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
-import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
-import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
@@ -29,9 +28,9 @@ import com.jzg.quotation.zijin.crawler.entity.response.*;
 import com.jzg.quotation.zijin.crawler.service.ZiJinCrawlerRequest;
 import com.jzg.quotation.zijin.crawler.service.ZiJinCrawlerRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpHeaders;
-import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.util.StringUtils;
 
 
 import java.io.IOException;
 import java.io.IOException;
@@ -88,12 +87,18 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      */
      */
     @Override
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
     public QuoteResultsVo quote(QuoteVo quoteVo) {
+        log.info("紫金爬虫");
         log.info("quote入参的值:{}", JSON.toJSONString(quoteVo));
         log.info("quote入参的值:{}", JSON.toJSONString(quoteVo));
         // 归属信息
         // 归属信息
         AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
         AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
         log.info("attributionInformationVo参数的值:{}", JSON.toJSONString(attributionInformationVo));
         log.info("attributionInformationVo参数的值:{}", JSON.toJSONString(attributionInformationVo));
 
 
         HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         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());
         String userCode = ziJinCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
         log.info("userCode:{}", userCode);
         log.info("userCode:{}", userCode);
 
 
@@ -104,22 +109,28 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         // 1.2 构建归属信息(机构、套餐、渠道信息)
         // 1.2 构建归属信息(机构、套餐、渠道信息)
         //ProposalInfoDTO proposalInfoDTO = boHaiBuildingAttributionInformation.build(parameters, userCode, headers);
         //ProposalInfoDTO proposalInfoDTO = boHaiBuildingAttributionInformation.build(parameters, userCode, headers);
         try {
         try {
+            String comCode = "2140000601";
+
             // 查询车辆信息
             // 查询车辆信息
             ZiJinCrawlerCarRequest ziJinCrawlerCarRequest = new ZiJinCrawlerCarRequest();
             ZiJinCrawlerCarRequest ziJinCrawlerCarRequest = new ZiJinCrawlerCarRequest();
             ziJinCrawlerCarRequest.setChannelCode("KSCD_PROD");
             ziJinCrawlerCarRequest.setChannelCode("KSCD_PROD");
-            ziJinCrawlerCarRequest.setComCode("2140000601");
+            ziJinCrawlerCarRequest.setComCode(comCode);
             ziJinCrawlerCarRequest.setLicenseNo(quoteVo.getCarInfoVo().getLicenseNo());
             ziJinCrawlerCarRequest.setLicenseNo(quoteVo.getCarInfoVo().getLicenseNo());
             ziJinCrawlerCarRequest.setVin(quoteVo.getCarInfoVo().getVinNo());
             ziJinCrawlerCarRequest.setVin(quoteVo.getCarInfoVo().getVinNo());
             ZiJinCrawlerCarResponse ziJinCrawlerCarResponse = ziJinCrawlerRequestComponent.car(ziJinCrawlerCarRequest, headers);
             ZiJinCrawlerCarResponse ziJinCrawlerCarResponse = ziJinCrawlerRequestComponent.car(ziJinCrawlerCarRequest, headers);
             log.info("ziJinCrawlerCarResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerCarResponse));
             log.info("ziJinCrawlerCarResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerCarResponse));
 
 
             // 车辆和交通查询(获取订单号)
             // 车辆和交通查询(获取订单号)
-            ZiJinCrawlerGetOrderNoRequest ziJinCrawlerGetOrderNoRequest = buildGetOrderNoRequest();
+            ZiJinCrawlerGetOrderNoRequest ziJinCrawlerGetOrderNoRequest = buildGetOrderNoRequest(quoteVo, parameters, attributionInformationVo.getConfigInfo(), ziJinCrawlerCarResponse);
+            log.info("ziJinCrawlerGetOrderNoRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerGetOrderNoRequest));
+            String modelCode = ziJinCrawlerGetOrderNoRequest.getModelCode();// 车辆模型代码
+            String iacVehicleCode = ziJinCrawlerGetOrderNoRequest.getIacVehicleCode();//IAC车辆代码(行业车型编码)
             ZiJinCrawlerGetOrderNoResponse ziJinCrawlerGetOrderNoResponse = ziJinCrawlerRequestComponent.getOrderNo(ziJinCrawlerGetOrderNoRequest, headers);
             ZiJinCrawlerGetOrderNoResponse ziJinCrawlerGetOrderNoResponse = ziJinCrawlerRequestComponent.getOrderNo(ziJinCrawlerGetOrderNoRequest, headers);
             log.info("ziJinCrawlerGetOrderNoResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerGetOrderNoResponse));
             log.info("ziJinCrawlerGetOrderNoResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerGetOrderNoResponse));
 
 
             //获取车辆实际价值
             //获取车辆实际价值
             ZiJinCrawlerGetCarActualValueRequest ziJinCrawlerGetCarActualValueRequest = buildGetCarActualValueRequest(quoteVo);
             ZiJinCrawlerGetCarActualValueRequest ziJinCrawlerGetCarActualValueRequest = buildGetCarActualValueRequest(quoteVo);
+            log.info("ziJinCrawlerGetCarActualValueRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerGetCarActualValueRequest));
             ZiJinCrawlerGetCarActualValueResponse ziJinCrawlerGetCarActualValueResponse = ziJinCrawlerRequestComponent.getCarActualValue(ziJinCrawlerGetCarActualValueRequest, headers);
             ZiJinCrawlerGetCarActualValueResponse ziJinCrawlerGetCarActualValueResponse = ziJinCrawlerRequestComponent.getCarActualValue(ziJinCrawlerGetCarActualValueRequest, headers);
             log.info("ziJinCrawlerGetCarActualValueResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerGetCarActualValueResponse));
             log.info("ziJinCrawlerGetCarActualValueResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerGetCarActualValueResponse));
 
 
@@ -130,39 +141,48 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             ziJinCrawlerQuotationRequest.setBaseInfo(baseInfo);
             ziJinCrawlerQuotationRequest.setBaseInfo(baseInfo);
 
 
             // 设置车主信息
             // 设置车主信息
-            ziJinCrawlerQuotationRequest.setCarOwnerInfo(buildCarOwnerInfo());
+            ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = buildCarOwnerInfo(quoteVo);
+            ziJinCrawlerQuotationRequest.setCarOwnerInfo(carOwnerInfo);
 
 
-            // 设置保险标志
+            // 设置保险标志(固定"0")
             ziJinCrawlerQuotationRequest.setInsuranceSign("0");
             ziJinCrawlerQuotationRequest.setInsuranceSign("0");
 
 
             // 设置被保险人列表
             // 设置被保险人列表
-            ziJinCrawlerQuotationRequest.setInsuredList(buildInsuredList());
+            ziJinCrawlerQuotationRequest.setInsuredList(buildInsuredList(quoteVo, carOwnerInfo));
 
 
-            // 设置订单ID
-            ziJinCrawlerQuotationRequest.setOrderId("8aaa2c189a3d3d79019a48d1745253d1");
-            // 设置订单来源
+            // 设置订单ID - 从getOrderNo接口返回的动态获取
+            ziJinCrawlerQuotationRequest.setOrderId(ziJinCrawlerGetOrderNoResponse.getOrderId());
+            // 设置订单来源(固定"KSCD_PROD")
             ziJinCrawlerQuotationRequest.setOrderOrigin("KSCD_PROD");
             ziJinCrawlerQuotationRequest.setOrderOrigin("KSCD_PROD");
-            // 设置需求单校验标志
+            // 设置需求单校验标志(固定"1")
             ziJinCrawlerQuotationRequest.setDemandNoCheckFlag("1");
             ziJinCrawlerQuotationRequest.setDemandNoCheckFlag("1");
-            // 设置产品代码
+            // 设置产品代码(固定"CAR20190517"-机动车保险代码)
             ziJinCrawlerQuotationRequest.setProductCode("CAR20190517");
             ziJinCrawlerQuotationRequest.setProductCode("CAR20190517");
-            // 设置产品名称
+            // 设置产品名称(固定"机动车保险")
             ziJinCrawlerQuotationRequest.setProductName("机动车保险");
             ziJinCrawlerQuotationRequest.setProductName("机动车保险");
 
 
             // 设置减税信息
             // 设置减税信息
-            ziJinCrawlerQuotationRequest.setTaxRelifInfo(buildTaxRelifInfo());
+            //ziJinCrawlerQuotationRequest.setTaxRelifInfo(buildTaxRelifInfo(quoteVo, carOwnerInfo, comCode, headers));
 
 
             // 设置险种列表
             // 设置险种列表
-            ziJinCrawlerQuotationRequest.setItemKindList(buildItemKindList());
+            Double actualValue = null;
+            if (ziJinCrawlerGetCarActualValueResponse != null && StringUtils.hasLength(ziJinCrawlerGetCarActualValueResponse.getActualValue())) {
+                actualValue = Double.parseDouble(ziJinCrawlerGetCarActualValueResponse.getActualValue());
+            }
+            ziJinCrawlerQuotationRequest.setItemKindList(buildItemKindList(quoteVo, actualValue));
 
 
             // 设置附加保单信息列表
             // 设置附加保单信息列表
-            ziJinCrawlerQuotationRequest.setCarPolicySubInfoList(buildCarPolicySubInfoList());
+            ziJinCrawlerQuotationRequest.setCarPolicySubInfoList(buildCarPolicySubInfoList(quoteVo));
 
 
             // 设置车辆信息
             // 设置车辆信息
-            ziJinCrawlerQuotationRequest.setVehicleInfo(buildVehicleInfo());
+            ziJinCrawlerQuotationRequest.setVehicleInfo(buildVehicleInfo(quoteVo, actualValue, modelCode, iacVehicleCode));
 
 
             // 设置盈利数据列表
             // 设置盈利数据列表
-            ziJinCrawlerQuotationRequest.setProfitDataList(buildProfitDataList());
+            ziJinCrawlerQuotationRequest.setProfitDataList(buildProfitDataList(quoteVo));
+
+
+
+
 
 
             // 设置税务字段
             // 设置税务字段
             ziJinCrawlerQuotationRequest.setTaxFields("identifyNumber,taxpayerIdentifier,taxpayerName,taxRegistryNumber");
             ziJinCrawlerQuotationRequest.setTaxFields("identifyNumber,taxpayerIdentifier,taxpayerName,taxRegistryNumber");
@@ -171,6 +191,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             // 设置车载设备保费列表(空列表)
             // 设置车载设备保费列表(空列表)
             ziJinCrawlerQuotationRequest.setCarDevicePremiumDtoList(new ArrayList<>());
             ziJinCrawlerQuotationRequest.setCarDevicePremiumDtoList(new ArrayList<>());
 
 
+            log.info("ziJinCrawlerQuotationRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerQuotationRequest));
             ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
             ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
             log.info("ziJinCrawlerQuotationResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
             log.info("ziJinCrawlerQuotationResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
 
 
@@ -182,7 +203,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 //报价成功
                 //报价成功
                 //保存报价信息
                 //保存报价信息
                 ZiJinCrawlerSaveQuoteInfoRequest ziJinCrawlerSaveQuoteInfoRequest = buildSaveQuoteInfoRequest();
                 ZiJinCrawlerSaveQuoteInfoRequest ziJinCrawlerSaveQuoteInfoRequest = buildSaveQuoteInfoRequest();
-
+                log.info("ziJinCrawlerSaveQuoteInfoRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoRequest));
                 ZiJinCrawlerSaveQuoteInfoResponse ziJinCrawlerSaveQuoteInfoResponse = ziJinCrawlerRequestComponent.saveQuoteInformation(ziJinCrawlerSaveQuoteInfoRequest, headers);
                 ZiJinCrawlerSaveQuoteInfoResponse ziJinCrawlerSaveQuoteInfoResponse = ziJinCrawlerRequestComponent.saveQuoteInformation(ziJinCrawlerSaveQuoteInfoRequest, headers);
                 log.info("ziJinCrawlerSaveQuoteInfoResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoResponse));
                 log.info("ziJinCrawlerSaveQuoteInfoResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoResponse));
 
 
@@ -190,6 +211,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 ZiJinCrawlerSaveProposalRequest ziJinCrawlerSaveProposalRequest = new  ZiJinCrawlerSaveProposalRequest();
                 ZiJinCrawlerSaveProposalRequest ziJinCrawlerSaveProposalRequest = new  ZiJinCrawlerSaveProposalRequest();
                 ziJinCrawlerSaveProposalRequest.setOrderNo(ziJinCrawlerGetOrderNoResponse.getOrderNo());
                 ziJinCrawlerSaveProposalRequest.setOrderNo(ziJinCrawlerGetOrderNoResponse.getOrderNo());
                 ziJinCrawlerSaveProposalRequest.setProposalCheckNo(ziJinCrawlerQuotationResponse.getBasePart().getProposalCheckNo());
                 ziJinCrawlerSaveProposalRequest.setProposalCheckNo(ziJinCrawlerQuotationResponse.getBasePart().getProposalCheckNo());
+                log.info("ziJinCrawlerSaveProposalRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalRequest));
                 ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse = ziJinCrawlerRequestComponent.saveProposal(ziJinCrawlerSaveProposalRequest, headers);
                 ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse = ziJinCrawlerRequestComponent.saveProposal(ziJinCrawlerSaveProposalRequest, headers);
                 log.info("ziJinCrawlerSaveProposalResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalResponse));
                 log.info("ziJinCrawlerSaveProposalResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalResponse));
 
 
@@ -480,24 +502,130 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      *
      *
      * @return ZiJinCrawlerGetOrderNoRequest
      * @return ZiJinCrawlerGetOrderNoRequest
      */
      */
-    private ZiJinCrawlerGetOrderNoRequest buildGetOrderNoRequest() {
+//    private ZiJinCrawlerGetOrderNoRequest buildGetOrderNoRequest() {
+//        ZiJinCrawlerGetOrderNoRequest request = new ZiJinCrawlerGetOrderNoRequest();
+//        request.setBrandName("荣威CSA6452NEAQ多用途乘用车");
+//        request.setLicenseNo("晋HJW581");
+//        request.setOperatorCode("214000151");
+//        request.setOrderOrigin("KSCD_PROD");
+//        request.setProposalAreaCode("140000");
+//        request.setProposalCityCode("140000");
+//        request.setUserComCode("2140000601");
+//        request.setVinNo("LSJA24U69MS091895");
+//        request.setModelCode("RWD1598SQQ");
+//        request.setProductCode("CAR20190517");
+//        request.setProductName("机动车保险");
+//        request.setTerminalId("KSCD");
+//        request.setTerminalIdType("Vue-PC");
+//        return request;
+//    }
+
+
+    /**
+     * 构建获取订单号请求对象
+     * 参数来源对照Python get_orderid_orderno方法:
+     * brandName -> 车型匹配后的vehicleName
+     * licenseNo -> quoteVo车牌号
+     * operatorCode -> 配置参数userCode
+     * proposalAreaCode -> configInfo中的proposalAreaCode
+     * proposalCityCode -> configInfo中的proposalCityCode
+     * userComCode -> 配置参数comCode
+     * vinNo -> quoteVo车架号
+     * modelCode -> 车型匹配后的vehicleCode
+     *
+     * @param quoteVo 报价实体
+     * @param parameters 配置参数
+     * @param configInfo 归属配置信息
+     * @param carResponse 车辆查询响应
+     * @return ZiJinCrawlerGetOrderNoRequest
+     */
+    private ZiJinCrawlerGetOrderNoRequest buildGetOrderNoRequest(QuoteVo quoteVo, ZiJinCrawlerConfigureParameters parameters,
+                                                                  Map<String, String> configInfo, ZiJinCrawlerCarResponse carResponse) {
         ZiJinCrawlerGetOrderNoRequest request = new ZiJinCrawlerGetOrderNoRequest();
         ZiJinCrawlerGetOrderNoRequest request = new ZiJinCrawlerGetOrderNoRequest();
-        request.setBrandName("荣威CSA6452NEAQ多用途乘用车");
-        request.setLicenseNo("晋HJW581");
-        request.setOperatorCode("214000151");
+
+        // 从车辆查询响应中匹配车型,获取brandName和modelCode
+        // 对应Python: brandName = PPcarinfo['vehicleName'], modelCode = PPcarinfo['vehicleCode']
+        String brandName = "";
+        String modelCode = "";
+        String iacVehicleCode = "";
+        if (carResponse != null && carResponse.getVehicleModelInfoList() != null && !carResponse.getVehicleModelInfoList().isEmpty()) {
+            // 按purchasePrice和seatCount匹配车型,与Python逻辑一致
+            String purchasePrice = quoteVo.getCarInfoVo().getPurchasePrice();//新车购置价[元]
+            String seatCount = quoteVo.getCarInfoVo().getSeatCount();//座位数[座]
+            ZiJinCrawlerCarResponse.VehicleModelInfo matchedModel = null; //车辆型号信息类
+            for (ZiJinCrawlerCarResponse.VehicleModelInfo model : carResponse.getVehicleModelInfoList()) {
+                if (purchasePrice != null && model.getPurchasePrice() != null
+                        && Double.parseDouble(model.getPurchasePrice()) == Double.parseDouble(purchasePrice)
+                        && model.getSeat() != null && seatCount != null
+                        && Double.parseDouble(model.getSeat()) >= Double.parseDouble(seatCount)) {
+                    matchedModel = model;
+                    break;
+                }
+            }
+            // 如果没有匹配到,且只有一个车型,则使用该车型(与Python逻辑一致)
+            if (matchedModel == null && carResponse.getVehicleModelInfoList().size() == 1) {
+                ZiJinCrawlerCarResponse.VehicleModelInfo onlyModel = carResponse.getVehicleModelInfoList().get(0);
+                if (onlyModel.getSeat() != null && seatCount != null
+                        && Double.parseDouble(onlyModel.getSeat()) >= Double.parseDouble(seatCount)) {
+                    matchedModel = onlyModel;
+                }
+            }
+            if(matchedModel == null){
+                List<ZiJinCrawlerCarResponse.VehicleModelInfo> vehicleModelInfoList = carResponse.getVehicleModelInfoList();
+                List<String> vehicleNameList =vehicleModelInfoList.stream().map(ZiJinCrawlerCarResponse.VehicleModelInfo::getVehicleName).distinct().collect(Collectors.toList());
+                List<String> vehicleCodeList =vehicleModelInfoList.stream().map(ZiJinCrawlerCarResponse.VehicleModelInfo::getVehicleCode).distinct().collect(Collectors.toList());
+                List<String> iacVehicleCodeList =vehicleModelInfoList.stream().map(ZiJinCrawlerCarResponse.VehicleModelInfo::getIacVehicleCode).distinct().collect(Collectors.toList());
+
+                if(CollectionUtils.isNotEmpty(vehicleNameList)
+                        && CollectionUtils.isNotEmpty(vehicleCodeList)
+                        && CollectionUtils.isNotEmpty(iacVehicleCodeList)
+                        && vehicleNameList.size() == 1
+                        && vehicleCodeList.size() == 1
+                        && iacVehicleCodeList.size() == 1
+                ){
+                    matchedModel = new ZiJinCrawlerCarResponse.VehicleModelInfo();
+                    matchedModel.setVehicleName(vehicleNameList.get(0));
+                    matchedModel.setVehicleCode(vehicleCodeList.get(0));
+                    matchedModel.setIacVehicleCode(iacVehicleCodeList.get(0));
+                }
+            }
+
+            if (matchedModel != null) {
+                brandName = matchedModel.getVehicleName();
+                modelCode = matchedModel.getVehicleCode();
+                iacVehicleCode = matchedModel.getIacVehicleCode();
+            }
+        }
+
+        request.setBrandName(brandName);
+        request.setLicenseNo(quoteVo.getCarInfoVo().getLicenseNo());
+        // operatorCode对应Python: operatorCode = self.baseInfo['handler1Code']
+        request.setOperatorCode(parameters.getUserCode());
         request.setOrderOrigin("KSCD_PROD");
         request.setOrderOrigin("KSCD_PROD");
-        request.setProposalAreaCode("140000");
-        request.setProposalCityCode("140000");
-        request.setUserComCode("2140000601");
-        request.setVinNo("LSJA24U69MS091895");
-        request.setModelCode("RWD1598SQQ");
+        // proposalAreaCode对应Python: proposalAreaCode = self.get_areacode(userComCode)
+        request.setProposalAreaCode(configInfo.getOrDefault("proposalAreaCode", ""));
+        // proposalCityCode对应Python: proposalCityCode = proposalAreaCode
+        request.setProposalCityCode(configInfo.getOrDefault("proposalCityCode", configInfo.getOrDefault("proposalAreaCode", "")));
+        // userComCode对应Python: userComCode = self.baseInfo['comCode']
+        request.setUserComCode(parameters.getComCode());
+        request.setVinNo(quoteVo.getCarInfoVo().getVinNo());
+        request.setModelCode(modelCode);
         request.setProductCode("CAR20190517");
         request.setProductCode("CAR20190517");
         request.setProductName("机动车保险");
         request.setProductName("机动车保险");
         request.setTerminalId("KSCD");
         request.setTerminalId("KSCD");
         request.setTerminalIdType("Vue-PC");
         request.setTerminalIdType("Vue-PC");
+
+        //
+        //request.setBrandName("哈弗CC6460AZ04B多用途乘用车");//品牌名称
+        //request.setModelCode("CC6460AZ04B");//车型代码
+        request.setOperatorCode("214000151");//操作员编号
+        request.setUserComCode("2140000601");//用户公司代码
+        request.setIacVehicleCode(iacVehicleCode);//IAC车辆代码(行业车型编码)
+
         return request;
         return request;
     }
     }
 
 
+
     /**
     /**
      * 构建获取车辆实际价值请求对象
      * 构建获取车辆实际价值请求对象
      *
      *
@@ -566,57 +694,218 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      *
      *
      * @return ZiJinCrawlerQuotationRequest.CarOwnerInfo
      * @return ZiJinCrawlerQuotationRequest.CarOwnerInfo
      */
      */
-    private ZiJinCrawlerQuotationRequest.CarOwnerInfo buildCarOwnerInfo() {
+//    private ZiJinCrawlerQuotationRequest.CarOwnerInfo buildCarOwnerInfo() {
+//        ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = new ZiJinCrawlerQuotationRequest.CarOwnerInfo();
+//        carOwnerInfo.setCarOwner("王婧");//车主姓名
+//        carOwnerInfo.setOwnerIdentifyNumber("14092519990322002X");//车主证件号码
+//        carOwnerInfo.setOwnerIdentifyType("01");//车主证件类型(01-身份证)
+//        carOwnerInfo.setVehicleOwnerNature("1");//车主性质(1-个人)
+//        return carOwnerInfo;
+//    }
+
+
+    /**
+     * 构建车主信息对象
+     * 参数来源对照Python get_owner_info方法:
+     * carOwner -> quoteVo车主姓名
+     * ownerIdentifyNumber -> quoteVo车主证件号码
+     * ownerIdentifyType -> 根据证件类型映射(01-身份证)
+     * vehicleOwnerNature -> 根据人员类型映射(1-个人, 5-企业)
+     * ownerAddress -> quoteVo车主地址
+     *
+     * @param quoteVo 报价实体
+     * @return ZiJinCrawlerQuotationRequest.CarOwnerInfo
+     */
+    private ZiJinCrawlerQuotationRequest.CarOwnerInfo buildCarOwnerInfo(QuoteVo quoteVo) {
         ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = new ZiJinCrawlerQuotationRequest.CarOwnerInfo();
         ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = new ZiJinCrawlerQuotationRequest.CarOwnerInfo();
-        carOwnerInfo.setCarOwner("王婧");
-        carOwnerInfo.setOwnerIdentifyNumber("14092519990322002X");
-        carOwnerInfo.setOwnerIdentifyType("01");
-        carOwnerInfo.setVehicleOwnerNature("1");
+        
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+        if (ownersInfo != null) {
+            carOwnerInfo.setCarOwner(ownersInfo.getName());//车主姓名
+            carOwnerInfo.setOwnerIdentifyNumber(ownersInfo.getIdentifyNumber());//车主证件号码
+            
+            // 根据证件类型映射车主性质和证件类型代码
+            String identifyType = ownersInfo.getIdentifyType();
+            String personType = ownersInfo.getPersonType();
+            
+            // 证件类型映射,参考Python get_owner_i方法
+            // 个人类型(1) -> vehicleOwnerNature="1"
+            // 企业类型(2) -> vehicleOwnerNature="5"
+            if ("2".equals(personType)) {
+                // 企业
+                carOwnerInfo.setVehicleOwnerNature("5");
+                // 企业证件类型映射
+                carOwnerInfo.setOwnerIdentifyType(mapEnterpriseIdentifyType(identifyType));
+            } else {
+                // 个人(默认)
+                carOwnerInfo.setVehicleOwnerNature("1");
+                carOwnerInfo.setOwnerIdentifyType("01");//01-身份证
+            }
+        }
+        
         return carOwnerInfo;
         return carOwnerInfo;
     }
     }
 
 
+
+    /**
+     * 企业证件类型映射
+     * 参考Python get_owner_i方法中的IDType映射
+     *
+     * @param identifyType 证件类型
+     * @return 映射后的证件类型代码
+     */
+    private String mapEnterpriseIdentifyType(String identifyType) {
+        if (identifyType == null) {
+            return "11";//默认工商注册号码
+        }
+        // 证件类型映射:工商注册号码->11, 统一社会信用代码->73, 组织机构代码->71
+        switch (identifyType) {
+            case "11": //工商注册号码
+            case "2":  //企业类型默认
+                return "11";
+            case "73": //统一社会信用代码
+                return "73";
+            case "71": //组织机构代码
+                return "71";
+            default:
+                return "11";//默认工商注册号码
+        }
+    }
+
+//    /**
+//     * 构建被保险人列表
+//     *
+//     * @return List<ZiJinCrawlerQuotationRequest.InsuredList>
+//     */
+//    private List<ZiJinCrawlerQuotationRequest.InsuredList> buildInsuredList() {
+//        List<ZiJinCrawlerQuotationRequest.InsuredList> insuredList = new ArrayList<>();
+//
+//        // 第一个被保险人
+//        ZiJinCrawlerQuotationRequest.InsuredList insured1 = new ZiJinCrawlerQuotationRequest.InsuredList();
+//        insured1.setInsuredName("王婧");
+//        insured1.setInsuredNature("3");
+//        insured1.setIdentifyType("01");
+//        insured1.setIdentifyNumber("14092519990322002X");
+//        insured1.setSex("2");
+//        insured1.setInsuredType("1");
+//        insured1.setMobile("18840186946");
+//        insured1.setPostCode("030053");
+//        insured1.setInsuredFlag(2);
+//        insuredList.add(insured1);
+//
+//        // 第二个被保险人
+//        ZiJinCrawlerQuotationRequest.InsuredList insured2 = new ZiJinCrawlerQuotationRequest.InsuredList();
+//        insured2.setInsuredName("王婧");
+//        insured2.setInsuredNature("3");
+//        insured2.setIdentifyType("01");
+//        insured2.setIdentifyNumber("14092519990322002X");
+//        insured2.setSex("2");
+//        insured2.setInsuredType("1");
+//        insured2.setMobile("18840186946");
+//        insured2.setPostCode("030053");
+//        insured2.setInsuredFlag(1);
+//        insuredList.add(insured2);
+//        return insuredList;
+//    }
+
+    /**
+     * 构建被保险人列表
+     *
+     * @return List<ZiJinCrawlerQuotationRequest.InsuredList>
+     */
     /**
     /**
      * 构建被保险人列表
      * 构建被保险人列表
+     * 参数来源对照Python get_insuredList_info方法:
+     * insuredList包含两个对象:投保人(insuredFlag=2)和被保人(insuredFlag=1)
      *
      *
+     * @param quoteVo 报价实体
+     * @param carOwnerInfo 车主信息(用于判断与车主关系)
      * @return List<ZiJinCrawlerQuotationRequest.InsuredList>
      * @return List<ZiJinCrawlerQuotationRequest.InsuredList>
      */
      */
-    private List<ZiJinCrawlerQuotationRequest.InsuredList> buildInsuredList() {
+    private List<ZiJinCrawlerQuotationRequest.InsuredList> buildInsuredList(QuoteVo quoteVo, 
+            ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo) {
         List<ZiJinCrawlerQuotationRequest.InsuredList> insuredList = new ArrayList<>();
         List<ZiJinCrawlerQuotationRequest.InsuredList> insuredList = new ArrayList<>();
 
 
-        // 第一个被保险人
-        ZiJinCrawlerQuotationRequest.InsuredList insured1 = new ZiJinCrawlerQuotationRequest.InsuredList();
-        insured1.setInsuredName("王婧");
-        insured1.setInsuredNature("3");
-        insured1.setIdentifyType("01");
-        insured1.setIdentifyNumber("14092519990322002X");
-        insured1.setSex("2");
-        insured1.setInsuredType("1");
-        insured1.setMobile("18840186946");
-        insured1.setPostCode("030053");
-        insured1.setInsuredFlag(2);
-        insuredList.add(insured1);
-
-        // 第二个被保险人
-        ZiJinCrawlerQuotationRequest.InsuredList insured2 = new ZiJinCrawlerQuotationRequest.InsuredList();
-        insured2.setInsuredName("王婧");
-        insured2.setInsuredNature("3");
-        insured2.setIdentifyType("01");
-        insured2.setIdentifyNumber("14092519990322002X");
-        insured2.setSex("2");
-        insured2.setInsuredType("1");
-        insured2.setMobile("18840186946");
-        insured2.setPostCode("030053");
-        insured2.setInsuredFlag(1);
-        insuredList.add(insured2);
+        CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();//投保人
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();//被保人
+        
+        // 获取车主性质,用于判断投保人/被保人类型
+        String vehicleOwnerNature = carOwnerInfo != null ? carOwnerInfo.getVehicleOwnerNature() : "1";
+        
+        // 1. 构建投保人信息 (insuredFlag=2)
+        if (policyHolderInfo != null) {
+            ZiJinCrawlerQuotationRequest.InsuredList policyHolder = new ZiJinCrawlerQuotationRequest.InsuredList();
+            buildInsuredItem(policyHolder, policyHolderInfo, 2, vehicleOwnerNature, 
+                    carOwnerInfo != null ? carOwnerInfo.getOwnerIdentifyNumber() : null);
+            insuredList.add(policyHolder);
+        }
+
+        // 2. 构建被保人信息 (insuredFlag=1)
+        if (insuredPersonInfo != null) {
+            ZiJinCrawlerQuotationRequest.InsuredList insuredPerson = new ZiJinCrawlerQuotationRequest.InsuredList();
+            buildInsuredItem(insuredPerson, insuredPersonInfo, 1, vehicleOwnerNature, 
+                    carOwnerInfo != null ? carOwnerInfo.getOwnerIdentifyNumber() : null);
+            insuredList.add(insuredPerson);
+        }
+
         return insuredList;
         return insuredList;
     }
     }
 
 
+    /**
+     * 构建单个被保险人对象
+     *
+     * @param insuredItem 被保险人对象
+     * @param customerInfo 客户信息
+     * @param insuredFlag 被保险人标志(1-被保人, 2-投保人)
+     * @param vehicleOwnerNature 车主性质(1-个人, 5-企业)
+     * @param ownerIdentifyNumber 车主证件号码(用于判断与车主关系)
+     */
+    private void buildInsuredItem(ZiJinCrawlerQuotationRequest.InsuredList insuredItem, 
+            CustomerInfoVo customerInfo, int insuredFlag, String vehicleOwnerNature, 
+            String ownerIdentifyNumber) {
+        insuredItem.setInsuredName(customerInfo.getName());
+        insuredItem.setIdentifyNumber(customerInfo.getIdentifyNumber());
+        
+        // 证件类型映射
+        String identifyType = customerInfo.getIdentifyType();
+        String personType = customerInfo.getPersonType();
+        if ("2".equals(personType)) {
+            // 企业
+            insuredItem.setIdentifyType(mapEnterpriseIdentifyType(identifyType));
+        } else {
+            // 个人(默认)
+            insuredItem.setIdentifyType("01");//01-身份证
+        }
+        
+        // 性别映射
+        String gender = customerInfo.getGender();
+        insuredItem.setSex("男".equals(gender) ? "1" : "2");
+        
+        // 根据车主性质设置投保人/被保人类型
+        // 个人车主("1"): 投保人/被保人都是自然人
+        // 企业车主("5"): 投保人是法人,被保人是自然人
+        if ("5".equals(vehicleOwnerNature) && insuredFlag == 2) {
+            // 企业车主的投保人
+            insuredItem.setInsuredNature("4");//4-法人或其他组织
+            insuredItem.setInsuredType("2");
+        } else {
+            // 个人车主或被保人
+            insuredItem.setInsuredNature("3");//3-自然人
+            insuredItem.setInsuredType("1");
+        }
+        
+        insuredItem.setMobile(customerInfo.getMobile());
+        insuredItem.setPostCode(StringUtils.hasLength(customerInfo.getPostCode()) ? 
+                customerInfo.getPostCode() : "030000");
+        insuredItem.setInsuredFlag(insuredFlag);
+    }
+
     /**
     /**
      * 构建减税信息对象
      * 构建减税信息对象
      *
      *
      * @return ZiJinCrawlerQuotationRequest.TaxRelifInfo
      * @return ZiJinCrawlerQuotationRequest.TaxRelifInfo
      */
      */
-    private ZiJinCrawlerQuotationRequest.TaxRelifInfo buildTaxRelifInfo() {
+    private ZiJinCrawlerQuotationRequest.TaxRelifInfo buildTaxRelifInfo2() {
         ZiJinCrawlerQuotationRequest.TaxRelifInfo taxRelifInfo = new ZiJinCrawlerQuotationRequest.TaxRelifInfo();
         ZiJinCrawlerQuotationRequest.TaxRelifInfo taxRelifInfo = new ZiJinCrawlerQuotationRequest.TaxRelifInfo();
         taxRelifInfo.setTaxRelifFlag("1");
         taxRelifInfo.setTaxRelifFlag("1");
         taxRelifInfo.setTaxpayerName("王婧");
         taxRelifInfo.setTaxpayerName("王婧");
@@ -627,167 +916,686 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         return taxRelifInfo;
         return taxRelifInfo;
     }
     }
 
 
+
+    /**
+     * 构建减税信息对象
+     *
+     * @param quoteVo 报价实体
+     * @param carOwnerInfo 车主信息
+     * @param comCode 保险公司代码
+     * @param headers 请求头
+     * @return ZiJinCrawlerQuotationRequest.TaxRelifInfo
+     */
+    private ZiJinCrawlerQuotationRequest.TaxRelifInfo buildTaxRelifInfo(QuoteVo quoteVo, 
+            ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo, String comCode, HttpHeaders headers) {
+        ZiJinCrawlerQuotationRequest.TaxRelifInfo taxRelifInfo = new ZiJinCrawlerQuotationRequest.TaxRelifInfo();
+        
+        // 只有投保交强险时才构建完整的税务信息
+        // 交强险riskCode为"0507"
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        
+        // 获取税务登记证号
+        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("1");// 1 正常缴税 2 免税 3 减税 4 已完税 5 不征
+        
+        if (carOwnerInfo != null) {
+            taxRelifInfo.setTaxpayerName(carOwnerInfo.getCarOwner());//纳税人姓名
+            taxRelifInfo.setTaxpayerIdentifier(carOwnerInfo.getOwnerIdentifyType());//纳税人标识(证件类型)
+            taxRelifInfo.setIdentifyNumber(carOwnerInfo.getOwnerIdentifyNumber());//证件号码
+        }
+        
+        taxRelifInfo.setTaxRegistryNumber(taxRegistryNumber);//税务登记证号
+        
+        // 整备质量(公斤转吨)
+        if (carInfoVo != null && StringUtils.hasLength(carInfoVo.getCompleteKerbMass())) {
+            String completeKerbMassTon = carInfoVo.completeKerbMassToTonCount();
+            taxRelifInfo.setCompleteKerbMass(completeKerbMassTon);
+        }
+        
+        return taxRelifInfo;
+    }
+
+
     /**
     /**
      * 构建险种列表
      * 构建险种列表
+     * 根据交强险和商业险的险种信息动态构建险种列表
      *
      *
+     * @param quoteVo 报价实体
+     * @param actualValue 车辆实际价值
      * @return List<ZiJinCrawlerQuotationRequest.ItemKindList>
      * @return List<ZiJinCrawlerQuotationRequest.ItemKindList>
      */
      */
-    private List<ZiJinCrawlerQuotationRequest.ItemKindList> buildItemKindList() {
+    private List<ZiJinCrawlerQuotationRequest.ItemKindList> buildItemKindList(QuoteVo quoteVo, Double actualValue) {
         List<ZiJinCrawlerQuotationRequest.ItemKindList> itemKindList = new ArrayList<>();
         List<ZiJinCrawlerQuotationRequest.ItemKindList> itemKindList = new ArrayList<>();
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
+        
+        // 获取座位数
+        int seatCount = 5;
+        if (carInfoVo != null && StringUtils.hasLength(carInfoVo.getSeatCount())) {
+            seatCount = Integer.parseInt(carInfoVo.getSeatCount());
+        }
 
 
-        // 交通事故强制责任险
-        ZiJinCrawlerQuotationRequest.ItemKindList itemKind1 = new ZiJinCrawlerQuotationRequest.ItemKindList();
-        itemKind1.setAmount("200000");
-        itemKind1.setKindCode("BZ");
-        itemKind1.setKindName("交通事故强制责任险");
-        itemKind1.setRiskCode("0590");
-        itemKind1.setBenchMarkPremium("950.0000");
-        itemKind1.setBasePremium("950.0000");
-        itemKindList.add(itemKind1);
-
-        // 机动车第三者责任保险
-        ZiJinCrawlerQuotationRequest.ItemKindList itemKind2 = new ZiJinCrawlerQuotationRequest.ItemKindList();
-        itemKind2.setAmount(2000000);
-        itemKind2.setKindCode("B");
-        itemKind2.setKindName("机动车第三者责任保险");
-        itemKind2.setRiskCode("050A");
-        itemKind2.setBenchMarkPremium("687.7600");
-        itemKind2.setBasePremium("515.8200");
-        itemKindList.add(itemKind2);
-
-        // 附加医保外用药责任险
-        ZiJinCrawlerQuotationRequest.ItemKindList itemKind3 = new ZiJinCrawlerQuotationRequest.ItemKindList();
-        itemKind3.setAmount("20000");
-        itemKind3.setKindCode("S1");
-        itemKind3.setKindName("附加医保外用药责任险(机动车第三者责任保险)");
-        itemKind3.setRiskCode("050A");
-        itemKind3.setBenchMarkPremium("28.3100");
-        itemKind3.setBasePremium("21.2300");
-        itemKindList.add(itemKind3);
+        // 1. 检查是否有交强险(riskCode='0507')
+        if (quoteVo.getCiRiskInfoVo() != null && "0507".equals(quoteVo.getCiRiskInfoVo().getRiskCode())) {
+            ZiJinCrawlerQuotationRequest.ItemKindList ciItem = new ZiJinCrawlerQuotationRequest.ItemKindList();
+            ciItem.setAmount("200000");
+            ciItem.setKindCode("BZ");
+            ciItem.setKindName("交通事故强制责任险");
+            ciItem.setRiskCode("0590");
+            itemKindList.add(ciItem);
+        }
+
+        // 2. 检查是否有商业险(riskCode='0510')
+        if (quoteVo.getBiRiskInfoVo() != null && "0510".equals(quoteVo.getBiRiskInfoVo().getRiskCode())) {
+            // 根据商业险险种列表构建
+            if (kindInfoVoList != null && !kindInfoVoList.isEmpty()) {
+                for (KindInfoVo kindItem : kindInfoVoList) {
+                    String zgKindCode = kindItem.getKindCode();
+                    ZiJinCrawlerQuotationRequest.ItemKindList zjItem = buildZiJinKindItem(zgKindCode, kindItem, seatCount, actualValue);
+                    if (zjItem != null) {
+                        itemKindList.add(zjItem);
+                    }
+                }
+            }
+        }
 
 
-        // 道路救援服务特约条款
-        ZiJinCrawlerQuotationRequest.ItemKindList itemKind4 = new ZiJinCrawlerQuotationRequest.ItemKindList();
-        itemKind4.setKindCode("T1");
-        itemKind4.setKindName("道路救援服务特约条款");
-        itemKind4.setRiskCode("050A");
-        itemKind4.setServiceTimes("2");
-        itemKind4.setBenchMarkPremium("0.0000");
-        itemKind4.setBasePremium("0.0000");
-        itemKindList.add(itemKind4);
         return itemKindList;
         return itemKindList;
     }
     }
 
 
+    /**
+     * 根据平台险种代码构建紫金险种对象
+     *
+     * @param zgKindCode 平台险种代码
+     * @param kindItem 平台险种信息
+     * @param seatCount 座位数
+     * @param actualValue 车辆实际价值
+     * @return ZiJinCrawlerQuotationRequest.ItemKindList
+     */
+    private ZiJinCrawlerQuotationRequest.ItemKindList buildZiJinKindItem(String zgKindCode, KindInfoVo kindItem, 
+            int seatCount, Double actualValue) {
+        ZiJinCrawlerQuotationRequest.ItemKindList item = new ZiJinCrawlerQuotationRequest.ItemKindList();
+        
+        switch (zgKindCode) {
+            case "A": // 机动车损失保险
+                item.setKindCode("A");
+                item.setKindName("机动车损失保险");
+                item.setRiskCode("050A");
+                item.setAmount(actualValue != null ? actualValue.longValue() : 0);
+                item.setValue("0");
+                break;
+                
+            case "B": // 机动车第三者责任保险
+                item.setKindCode("B");
+                item.setKindName("机动车第三者责任保险");
+                item.setRiskCode("050A");
+                if (StringUtils.hasLength(kindItem.getAmount())) {
+                    item.setAmount(Long.parseLong(kindItem.getAmount()));
+                }
+                break;
+                
+            case "D3": // 机动车车上人员责任保险(司机)
+                item.setKindCode("D3");
+                item.setKindName("机动车车上人员责任保险(司机)");
+                item.setRiskCode("050A");
+                if (StringUtils.hasLength(kindItem.getAmount())) {
+                    item.setAmount(Long.parseLong(kindItem.getAmount()));
+                    item.setUnitAmount(kindItem.getAmount());
+                }
+                item.setQuantity(1);
+                break;
+                
+            case "D4": // 机动车车上人员责任保险(乘客)
+                item.setKindCode("D4");
+                item.setKindName("机动车车上人员责任保险(乘客)");
+                item.setRiskCode("050A");
+                if (StringUtils.hasLength(kindItem.getAmount())) {
+                    long perSeatAmount = Long.parseLong(kindItem.getAmount());
+                    int passengerCount = seatCount - 1;
+                    item.setAmount(perSeatAmount * passengerCount);
+                    item.setUnitAmount(kindItem.getAmount());
+                    item.setQuantity(passengerCount);
+                }
+                break;
+                
+            case "L": // 附加车身划痕损失险
+                item.setKindCode("L");
+                item.setKindName("附加车身划痕损失险");
+                item.setRiskCode("050A");
+                item.setAmount(kindItem.getAmount());
+                break;
+                
+            case "BD": // 附加法定节假日限额翻倍险
+                item.setKindCode("B2");
+                item.setKindName("附加法定节假日限额翻倍险");
+                item.setRiskCode("050A");
+                if (StringUtils.hasLength(kindItem.getAmount())) {
+                    item.setAmount(Long.parseLong(kindItem.getAmount()));
+                }
+                break;
+                
+            case "SY_FJ_YBW1": // 附加医保外用药责任险(机动车第三者责任保险)
+                item.setKindCode("S1");
+                item.setKindName("附加医保外用药责任险(机动车第三者责任保险)");
+                item.setRiskCode("050A");
+                item.setAmount(kindItem.getAmount());
+                break;
+                
+            case "SY_FJ_YBW3": // 附加医保外用药责任险(司机)
+                item.setKindCode("S2");
+                item.setKindName("附加医保外用药责任险(机动车车上人员责任保险(司机))");
+                item.setRiskCode("050A");
+                if (StringUtils.hasLength(kindItem.getAmount())) {
+                    item.setAmount(Long.parseLong(kindItem.getAmount()));
+                }
+                break;
+                
+            case "SY_FJ_YBW2": // 附加医保外用药责任险(乘客)
+                item.setKindCode("S3");
+                item.setKindName("附加医保外用药责任险(机动车车上人员责任保险(乘客))");
+                item.setRiskCode("050A");
+                if (StringUtils.hasLength(kindItem.getAmount())) {
+                    long perSeatAmount = Long.parseLong(kindItem.getAmount());
+                    int passengerCount = seatCount - 1;
+                    item.setAmount(perSeatAmount * passengerCount);
+                    item.setUnitAmount(kindItem.getAmount());
+                    item.setQuantity(passengerCount);
+                }
+                break;
+                
+            case "TY1": // 道路救援服务特约条款
+                item.setKindCode("T1");
+                item.setKindName("道路救援服务特约条款");
+                item.setRiskCode("050A");
+                item.setServiceTimes(StringUtils.hasLength(kindItem.getServiceTimes()) ? 
+                        kindItem.getServiceTimes() : kindItem.getAmount());
+                break;
+                
+            case "TY2": // 车辆安全检测特约条款
+                item.setKindCode("T2");
+                item.setKindName("车辆安全检测特约条款");
+                item.setRiskCode("050A");
+                item.setServiceTimes(StringUtils.hasLength(kindItem.getServiceTimes()) ? 
+                        kindItem.getServiceTimes() : kindItem.getAmount());
+                break;
+                
+            case "TY3": // 代为驾驶服务特约条款
+                item.setKindCode("T3");
+                item.setKindName("代为驾驶服务特约条款");
+                item.setRiskCode("050A");
+                item.setServiceTimes(StringUtils.hasLength(kindItem.getServiceTimes()) ? 
+                        kindItem.getServiceTimes() : kindItem.getAmount());
+                break;
+                
+            case "TY4": // 代为送检服务特约条款
+                item.setKindCode("T4");
+                item.setKindName("代为送检服务特约条款");
+                item.setRiskCode("050A");
+                item.setServiceTimes(StringUtils.hasLength(kindItem.getServiceTimes()) ? 
+                        kindItem.getServiceTimes() : kindItem.getAmount());
+                break;
+                
+            case "MJ1": // 附加绝对免赔率特约险(车损险)
+                item.setKindCode("FA");
+                item.setKindName("附加绝对免赔率特约险(机动车损失保险)");
+                item.setRiskCode("050A");
+                item.setAmount(0);
+                if (StringUtils.hasLength(kindItem.getDeductibleRate())) {
+                    // 提取数字部分
+                    String deductibleRate = kindItem.getDeductibleRate().replaceAll("[^0-9]", "");
+                    item.setDeductibleRate(Integer.parseInt(deductibleRate));
+                }
+                break;
+                
+            case "MJ2": // 附加绝对免赔率特约条款(三者险)
+                item.setKindCode("FB");
+                item.setKindName("附加绝对免赔率特约险(机动车第三者责任保险)");
+                item.setRiskCode("050A");
+                item.setAmount(0);
+                if (StringUtils.hasLength(kindItem.getDeductibleRate())) {
+                    String deductibleRate = kindItem.getDeductibleRate().replaceAll("[^0-9]", "");
+                    item.setDeductibleRate(Integer.parseInt(deductibleRate));
+                }
+                break;
+                
+            case "MJ3": // 附加绝对免赔率特约险(司机)
+                item.setKindCode("FD3");
+                item.setKindName("附加绝对免赔率特约险(机动车车上人员责任保险(司机))");
+                item.setRiskCode("050A");
+                item.setAmount(0);
+                if (StringUtils.hasLength(kindItem.getDeductibleRate())) {
+                    String deductibleRate = kindItem.getDeductibleRate().replaceAll("[^0-9]", "");
+                    item.setDeductibleRate(Integer.parseInt(deductibleRate));
+                }
+                break;
+                
+            case "MJ4": // 附加绝对免赔率特约险(乘客)
+                item.setKindCode("FD4");
+                item.setKindName("附加绝对免赔率特约险(机动车车上人员责任保险(乘客))");
+                item.setRiskCode("050A");
+                item.setAmount(0);
+                if (StringUtils.hasLength(kindItem.getDeductibleRate())) {
+                    String deductibleRate = kindItem.getDeductibleRate().replaceAll("[^0-9]", "");
+                    item.setDeductibleRate(Integer.parseInt(deductibleRate));
+                }
+                break;
+                
+            default:
+                // 未知险种代码,返回null
+                return null;
+        }
+        
+        return item;
+    }
+
     /**
     /**
      * 构建附加保单信息列表
      * 构建附加保单信息列表
      *
      *
      * @return List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList>
      * @return List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList>
      */
      */
-    private List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList> buildCarPolicySubInfoList() {
-        List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList> carPolicySubInfoList = new ArrayList<>();
+//    private List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList> buildCarPolicySubInfoList() {
+//        List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList> carPolicySubInfoList = new ArrayList<>();
+//
+//        ZiJinCrawlerQuotationRequest.CarPolicySubInfoList carPolicySubInfo1 = new ZiJinCrawlerQuotationRequest.CarPolicySubInfoList();
+//        carPolicySubInfo1.setPlanName("山西9座以内非营业客车驾乘险10万档:36元/座-10万+1万+30元/天");
+//        carPolicySubInfo1.setInsureGradeNo("214000737028");
+//        carPolicySubInfo1.setIsUseInsured("1");
+//        carPolicySubInfo1.setQuantity("1");
+//        carPolicySubInfo1.setRiskCode("0737");
+//        carPolicySubInfo1.setRiskName("驾乘人员人身意外伤害保险");
+//        carPolicySubInfo1.setSumAmount(577000);
+//        carPolicySubInfo1.setSumPremium(180);
+//        carPolicySubInfo1.setActualPremium("180.00");
+//        carPolicySubInfo1.setProductCode("ZKICATM_GRDL_Plan");
+//        carPolicySubInfoList.add(carPolicySubInfo1);
+//        return carPolicySubInfoList;
+//    }
+
 
 
-        ZiJinCrawlerQuotationRequest.CarPolicySubInfoList carPolicySubInfo1 = new ZiJinCrawlerQuotationRequest.CarPolicySubInfoList();
-        carPolicySubInfo1.setPlanName("山西9座以内非营业客车驾乘险10万档:36元/座-10万+1万+30元/天");
-        carPolicySubInfo1.setInsureGradeNo("214000737028");
-        carPolicySubInfo1.setIsUseInsured("1");
-        carPolicySubInfo1.setQuantity("1");
-        carPolicySubInfo1.setRiskCode("0737");
-        carPolicySubInfo1.setRiskName("驾乘人员人身意外伤害保险");
-        carPolicySubInfo1.setSumAmount(577000);
-        carPolicySubInfo1.setSumPremium(180);
-        carPolicySubInfo1.setActualPremium("180.00");
-        carPolicySubInfo1.setProductCode("ZKICATM_GRDL_Plan");
-        carPolicySubInfoList.add(carPolicySubInfo1);
+    /**
+     * 构建附加保单信息列表
+     *
+     * @return List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList>
+     */
+    /**
+     * 构建附加保单信息列表(驾乘险)
+     * 参数来源对照Python get_fcx_main方法:
+     * 根据驾乘险列表动态构建附加保单信息
+     * 目前只支持 rideRiskCode == "0733"(紫金驾驶人意外伤害保险)
+     *
+     * @param quoteVo 报价实体
+     * @return List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList>
+     */
+    private List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList> buildCarPolicySubInfoList(QuoteVo quoteVo) {
+        List<ZiJinCrawlerQuotationRequest.CarPolicySubInfoList> carPolicySubInfoList = new ArrayList<>();
+        
+        List<AccidentalDrivingVo> accidentalDrivings = quoteVo.getAccidentalDrivings();
+        if (accidentalDrivings == null || accidentalDrivings.isEmpty()) {
+            return carPolicySubInfoList;
+        }
+        
+        for (AccidentalDrivingVo drivingInsurance : accidentalDrivings) {
+            String rideRiskCode = drivingInsurance.getRiskCode();
+            
+            // 目前只支持 rideRiskCode == "0733"(紫金驾驶人意外伤害保险)
+            if ("0733".equals(rideRiskCode)) {
+                ZiJinCrawlerQuotationRequest.CarPolicySubInfoList subInfo = buildRideRisk0733(drivingInsurance);
+                if (subInfo != null) {
+                    carPolicySubInfoList.add(subInfo);
+                }
+            }
+            // 其他风险代码暂未配置,Python中会抛出异常
+            // 这里暂时跳过,不抛出异常
+        }
+        
         return carPolicySubInfoList;
         return carPolicySubInfoList;
     }
     }
 
 
+    /**
+     * 构建紫金驾驶人意外伤害保险(riskCode=0733)信息
+     *
+     * @param drivingInsurance 驾乘险信息
+     * @return ZiJinCrawlerQuotationRequest.CarPolicySubInfoList
+     */
+    private ZiJinCrawlerQuotationRequest.CarPolicySubInfoList buildRideRisk0733(AccidentalDrivingVo drivingInsurance) {
+        ZiJinCrawlerQuotationRequest.CarPolicySubInfoList subInfo = new ZiJinCrawlerQuotationRequest.CarPolicySubInfoList();
+        
+        // 默认值
+        subInfo.setPlanName("全国家用驾驶人意外险50万档:160元-50万+5万+150元/天");
+        subInfo.setInsureGradeNo("200000733009");
+        subInfo.setIsUseInsured("1");
+        subInfo.setQuantity("1");
+        subInfo.setRiskCode("0733");
+        subInfo.setRiskName("紫金驾驶人意外伤害保险");
+        subInfo.setSumAmount(577000);
+        subInfo.setSumPremium(160);
+        subInfo.setProductCode("ZKICATM_Driver_Plan_Common");
+        
+        // 根据 planId(这里用 productCode 代替)匹配具体计划
+        String planId = drivingInsurance.getProductCode();
+        if (StringUtils.hasLength(planId)) {
+            switch (planId) {
+                case "214000733008":
+                    subInfo.setPlanName("山西驾驶20座(不含)以下非营业型客车(不包括摩托车、拖拉机、农用运输车、电瓶车)2.5万档:25元/车-2.5万+2500元");
+                    subInfo.setInsureGradeNo("214000733008");
+                    subInfo.setSumAmount(27500);
+                    subInfo.setSumPremium(25);
+                    break;
+                case "200000733007":
+                    subInfo.setPlanName("全国家用驾驶人意外险30万档:120元-30万+3万+100元/天");
+                    subInfo.setInsureGradeNo("200000733007");
+                    subInfo.setSumAmount(348000);
+                    subInfo.setSumPremium(120);
+                    break;
+                case "200000733009":
+                    // 默认值就是这个计划,无需修改
+                    break;
+                case "214000733004":
+                    subInfo.setPlanName("太原驾驶人意外险5万档:50元-5万+0.5万");
+                    subInfo.setInsureGradeNo("214000733004");
+                    subInfo.setSumAmount(55000);
+                    subInfo.setSumPremium(2607);
+                    break;
+                // 其他计划可以继续添加
+                default:
+                    // 使用默认值
+                    break;
+            }
+        }
+        
+        // 设置实际保费
+        if (subInfo.getSumPremium() != null) {
+            subInfo.setActualPremium(String.format("%.2f", subInfo.getSumPremium().doubleValue()));
+        }
+        
+        return subInfo;
+    }
+
+
+    /**
+     * 构建车辆信息对象
+     *
+     * @return ZiJinCrawlerQuotationRequest.VehicleInfo
+     */
+//    private ZiJinCrawlerQuotationRequest.VehicleInfo buildVehicleInfo() {
+//        ZiJinCrawlerQuotationRequest.VehicleInfo vehicleInfo = new ZiJinCrawlerQuotationRequest.VehicleInfo();
+//
+//        // 基础车辆信息
+//        vehicleInfo.setActualValue(73905.6);
+//        vehicleInfo.setAgreeActualValue(73905.6);
+//        vehicleInfo.setBrandName("荣威CSA6452NEAQ多用途乘用车");
+//        vehicleInfo.setCarKindCode("A0");
+//        vehicleInfo.setCarKindDetailId("KA");
+//        vehicleInfo.setCarLoanFlag("1");
+//        vehicleInfo.setCertificateDate("2021-11-01");
+//        vehicleInfo.setChgOwnerFlag("1");
+//        vehicleInfo.setCompletekerbmass(1539);
+//        vehicleInfo.setEcdemicVehicleFlag("0");
+//        vehicleInfo.setEngineNo("DNSM9070392");
+//
+//        // 日期相关
+//        vehicleInfo.setEnrollDate("2021-11-01");
+//        vehicleInfo.setUpdateEnrollDate("2021-11-01");
+//        vehicleInfo.setIssueDate("2025-10-16");
+//        vehicleInfo.setMakeDate("2025-10-16");
+//        vehicleInfo.setMakeDateJQ("2025-10-16");
+//
+//        // 车辆技术参数
+//        vehicleInfo.setExhaustCapacity(1490);
+//        vehicleInfo.setFuelType("0");
+//        vehicleInfo.setFuelTypeJY("D1");
+//        vehicleInfo.setNewEnergyFlag("0");
+//        vehicleInfo.setPower("133");
+//        vehicleInfo.setModelEnergyType("D1");
+//
+//        // 牌照和车辆识别
+//        vehicleInfo.setLicenseColorCode("01");
+//        vehicleInfo.setLicenseKindCode("02");
+//        vehicleInfo.setLicenseNo("晋HJW581");
+//        vehicleInfo.setLoanVehicleFlag("0");
+//        vehicleInfo.setModelCode("RWD1598SQQ");
+//        vehicleInfo.setNoLicenseFlag("1");
+//        vehicleInfo.setVehicleId("1");
+//        vehicleInfo.setVinNo("LSJA24U69MS091895");
+//
+//        // 车辆分类和用途
+//        vehicleInfo.setSeatCount(5);
+//        vehicleInfo.setUseNatureCode("85");
+//        vehicleInfo.setOriCarKindName("K33");
+//        vehicleInfo.setPlatVehicleCode("CRWARJUC0001");
+//        vehicleInfo.setVehicleStyleUniqueId("800004584");
+//
+//        // 价格和商业信息
+//        vehicleInfo.setPurchasePrice("103800");
+//        vehicleInfo.setSale4SFlag("0");
+//        vehicleInfo.setOriPurchasePrice("103800");
+//        vehicleInfo.setIsInvokeJingYou("1");
+//
+//        // 型号名称
+//        vehicleInfo.setPrintVehicleModelName("荣威CSA6452NEAQ多用途乘用车");
+//        vehicleInfo.setAliasName("荣威RX5 PLUS 330TGI 1.5T TST国潮智臻版");
+//        vehicleInfo.setOriBrandName("荣威CSA6452NEAQ多用途乘用车");
+//        vehicleInfo.setOriModelName("荣威CSA6452NEAQ多用途乘用车");
+//        vehicleInfo.setPrintModelName("荣威CSA6452NEAQ多用途乘用车");
+//
+//        return vehicleInfo;
+//    }
+
+
     /**
     /**
      * 构建车辆信息对象
      * 构建车辆信息对象
      *
      *
      * @return ZiJinCrawlerQuotationRequest.VehicleInfo
      * @return ZiJinCrawlerQuotationRequest.VehicleInfo
      */
      */
-    private ZiJinCrawlerQuotationRequest.VehicleInfo buildVehicleInfo() {
+    /**
+     * 构建车辆信息对象
+     * 参数来源对照Python get_car_info_main方法:
+     * - carInfoVo: 车辆基本信息
+     * - actualValue: 车辆实际价值(从API获取)
+     *
+     * @param quoteVo      报价实体
+     * @param actualValue  车辆实际价值
+     * @return VehicleInfo
+     */
+    private ZiJinCrawlerQuotationRequest.VehicleInfo buildVehicleInfo(QuoteVo quoteVo, Double actualValue, String modelCode, String iacVehicleCode) {
+        log.info("quoteVo参数的值:{}", JSON.toJSONString(quoteVo));
         ZiJinCrawlerQuotationRequest.VehicleInfo vehicleInfo = new ZiJinCrawlerQuotationRequest.VehicleInfo();
         ZiJinCrawlerQuotationRequest.VehicleInfo vehicleInfo = new ZiJinCrawlerQuotationRequest.VehicleInfo();
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+
+        if (carInfoVo == null) {
+            return vehicleInfo;
+        }
 
 
         // 基础车辆信息
         // 基础车辆信息
-        vehicleInfo.setActualValue(73905.6);
-        vehicleInfo.setAgreeActualValue(73905.6);
-        vehicleInfo.setBrandName("荣威CSA6452NEAQ多用途乘用车");
-        vehicleInfo.setCarKindCode("A0");
-        vehicleInfo.setCarKindDetailId("KA");
-        vehicleInfo.setCarLoanFlag("1");
-        vehicleInfo.setCertificateDate("2021-11-01");
-        vehicleInfo.setChgOwnerFlag("1");
-        vehicleInfo.setCompletekerbmass(1539);
+        if (actualValue != null) {
+            vehicleInfo.setActualValue(actualValue);
+            vehicleInfo.setAgreeActualValue(actualValue);
+        }
+        vehicleInfo.setBrandName(carInfoVo.getBrandName());
+        
+        // 车辆种类代码转换(A0->客车, A1->货车等)
+        String carKindCode = carInfoVo.getCarKindCode();
+        if (StringUtils.hasLength(carKindCode)) {
+            vehicleInfo.setCarKindCode(carKindCode);
+        }
+        
+        vehicleInfo.setCarKindDetailId(carInfoVo.getCarKindDetailIdCode());
+        
+        // 交强险过户标志
+        vehicleInfo.setCarLoanFlag(carInfoVo.isTransfer() ? "1" : "0");
+        
+        // 购车发票日期(使用注册日期)
+        vehicleInfo.setCertificateDate(carInfoVo.getRegisterDate());
+        
+        // 商业险过户标志
+        vehicleInfo.setChgOwnerFlag(carInfoVo.isTransferBi() ? "1" : "0");
+        
+        // 整备质量
+        if (StringUtils.hasLength(carInfoVo.getCompleteKerbMass())) {
+            vehicleInfo.setCompletekerbmass(Integer.parseInt(carInfoVo.getCompleteKerbMass()));
+        }
+        
+        // 外地车标志(默认0)
         vehicleInfo.setEcdemicVehicleFlag("0");
         vehicleInfo.setEcdemicVehicleFlag("0");
-        vehicleInfo.setEngineNo("DNSM9070392");
+        
+        vehicleInfo.setEngineNo(carInfoVo.getEngineNo());
 
 
         // 日期相关
         // 日期相关
-        vehicleInfo.setEnrollDate("2021-11-01");
-        vehicleInfo.setUpdateEnrollDate("2021-11-01");
-        vehicleInfo.setIssueDate("2025-10-16");
-        vehicleInfo.setMakeDate("2025-10-16");
-        vehicleInfo.setMakeDateJQ("2025-10-16");
+        vehicleInfo.setEnrollDate(carInfoVo.getRegisterDate());
+        vehicleInfo.setUpdateEnrollDate(carInfoVo.getRegisterDate());
+        vehicleInfo.setIssueDate(carInfoVo.getIssueDate());
+        
+        // 过户日期处理
+        if (carInfoVo.isTransferBi()) {
+            vehicleInfo.setMakeDate(carInfoVo.getRegisterDate());
+        }
+        if (carInfoVo.isTransfer()) {
+            vehicleInfo.setMakeDateJQ(carInfoVo.getRegisterDate());
+        }
 
 
         // 车辆技术参数
         // 车辆技术参数
-        vehicleInfo.setExhaustCapacity(1490);
-        vehicleInfo.setFuelType("0");
-        vehicleInfo.setFuelTypeJY("D1");
-        vehicleInfo.setNewEnergyFlag("0");
-        vehicleInfo.setPower("133");
-        vehicleInfo.setModelEnergyType("D1");
+        if (StringUtils.hasLength(carInfoVo.getDisplacement())) {
+            // displacement是升(L),需要转换为毫升(ml)
+            double displacement = Double.parseDouble(carInfoVo.getDisplacement());
+            vehicleInfo.setExhaustCapacity((int) (displacement * 1000));
+        }
+        
+        // 能源类型
+        vehicleInfo.setFuelType(carInfoVo.getEnergyTypeCode());
+        vehicleInfo.setFuelTypeJY(carInfoVo.getModelEnergyType());
+        
+        // 新能源标志
+        vehicleInfo.setNewEnergyFlag(carInfoVo.isNewEnergyMark() ? "1" : "0");
+        
+        vehicleInfo.setPower(carInfoVo.getPowerScale());
+        vehicleInfo.setModelEnergyType(carInfoVo.getModelEnergyType());
 
 
         // 牌照和车辆识别
         // 牌照和车辆识别
-        vehicleInfo.setLicenseColorCode("01");
-        vehicleInfo.setLicenseKindCode("02");
-        vehicleInfo.setLicenseNo("晋HJW581");
-        vehicleInfo.setLoanVehicleFlag("0");
-        vehicleInfo.setModelCode("RWD1598SQQ");
-        vehicleInfo.setNoLicenseFlag("1");
+        vehicleInfo.setLicenseColorCode(StringUtils.hasLength(carInfoVo.getLicenseColorCode()) ? carInfoVo.getLicenseColorCode() : "01");
+        vehicleInfo.setLicenseKindCode(StringUtils.hasLength(carInfoVo.getLicenseKindCode()) ? carInfoVo.getLicenseKindCode() : "02");
+        vehicleInfo.setLicenseNo(carInfoVo.getLicenseNo());
+        
+        // 贷款车标志
+        vehicleInfo.setLoanVehicleFlag(carInfoVo.isLoanStatus() ? "1" : "0");
+        
+        // 车型代码
+        vehicleInfo.setModelCode(modelCode);
+        
+        // 是否新车未上牌
+        vehicleInfo.setNoLicenseFlag("0".equals(carInfoVo.getIsRegistered()) ? "0" : "1");
+        
         vehicleInfo.setVehicleId("1");
         vehicleInfo.setVehicleId("1");
-        vehicleInfo.setVinNo("LSJA24U69MS091895");
+        vehicleInfo.setVinNo(carInfoVo.getVinNo());
 
 
         // 车辆分类和用途
         // 车辆分类和用途
-        vehicleInfo.setSeatCount(5);
-        vehicleInfo.setUseNatureCode("85");
-        vehicleInfo.setOriCarKindName("K33");
-        vehicleInfo.setPlatVehicleCode("CRWARJUC0001");
-        vehicleInfo.setVehicleStyleUniqueId("800004584");
+        if (StringUtils.hasLength(carInfoVo.getSeatCount())) {
+            vehicleInfo.setSeatCount(Integer.parseInt(carInfoVo.getSeatCount()));
+        }
+        
+        // 使用性质代码
+        vehicleInfo.setUseNatureCode(carInfoVo.getCarNatureCode());
+        vehicleInfo.setOriCarKindName(carInfoVo.getCarTypeCode());
+        
+        // 平台车辆代码
+        vehicleInfo.setPlatVehicleCode(iacVehicleCode);
+        
+        // 车型唯一ID
+        vehicleInfo.setVehicleStyleUniqueId("");
 
 
         // 价格和商业信息
         // 价格和商业信息
-        vehicleInfo.setPurchasePrice("103800");
+        vehicleInfo.setPurchasePrice(carInfoVo.getPurchasePrice());
         vehicleInfo.setSale4SFlag("0");
         vehicleInfo.setSale4SFlag("0");
-        vehicleInfo.setOriPurchasePrice("103800");
+        vehicleInfo.setOriPurchasePrice(carInfoVo.getPurchasePrice());
         vehicleInfo.setIsInvokeJingYou("1");
         vehicleInfo.setIsInvokeJingYou("1");
 
 
         // 型号名称
         // 型号名称
-        vehicleInfo.setPrintVehicleModelName("荣威CSA6452NEAQ多用途乘用车");
-        vehicleInfo.setAliasName("荣威RX5 PLUS 330TGI 1.5T TST国潮智臻版");
-        vehicleInfo.setOriBrandName("荣威CSA6452NEAQ多用途乘用车");
-        vehicleInfo.setOriModelName("荣威CSA6452NEAQ多用途乘用车");
-        vehicleInfo.setPrintModelName("荣威CSA6452NEAQ多用途乘用车");
+        vehicleInfo.setPrintVehicleModelName(carInfoVo.getBrandName());
+        vehicleInfo.setAliasName(carInfoVo.getBrandName());
+        vehicleInfo.setOriBrandName(carInfoVo.getBrandName());
+        vehicleInfo.setOriModelName(carInfoVo.getBrandName());
+        vehicleInfo.setPrintModelName(carInfoVo.getBrandName());
 
 
         return vehicleInfo;
         return vehicleInfo;
     }
     }
 
 
+
+    /**
+     * 构建盈利数据列表
+     *
+     * @return List<ZiJinCrawlerQuotationRequest.ProfitDataList>
+     */
+//    private List<ZiJinCrawlerQuotationRequest.ProfitDataList> buildProfitDataList() {
+//        List<ZiJinCrawlerQuotationRequest.ProfitDataList> profitDataList = new ArrayList<>();
+//
+//        // 第一个盈利数据项
+//        ZiJinCrawlerQuotationRequest.ProfitDataList profitData1 = new ZiJinCrawlerQuotationRequest.ProfitDataList();
+//        profitData1.setProfitCode("C31");
+//        profitData1.setProfitRate("1.05");
+//        profitDataList.add(profitData1);
+//
+//        // 第二个盈利数据项
+//        ZiJinCrawlerQuotationRequest.ProfitDataList profitData2 = new ZiJinCrawlerQuotationRequest.ProfitDataList();
+//        profitData2.setProfitCode("C32");
+//        profitData2.setProfitRate("1.000000");
+//        profitDataList.add(profitData2);
+//        return profitDataList;
+//    }
+
+
+    /**
+     * 构建盈利数据列表
+     *
+     * @return List<ZiJinCrawlerQuotationRequest.ProfitDataList>
+     */
     /**
     /**
      * 构建盈利数据列表
      * 构建盈利数据列表
+     * 参数来源对照Python代码:
+     * - coefficient: 自主定价系数,从 otherInfo 获取
+     * 只有当 coefficient 不为空且大于0时,才构建盈利数据列表
      *
      *
+     * @param quoteVo 报价实体
      * @return List<ZiJinCrawlerQuotationRequest.ProfitDataList>
      * @return List<ZiJinCrawlerQuotationRequest.ProfitDataList>
      */
      */
-    private List<ZiJinCrawlerQuotationRequest.ProfitDataList> buildProfitDataList() {
+    private List<ZiJinCrawlerQuotationRequest.ProfitDataList> buildProfitDataList(QuoteVo quoteVo) {
         List<ZiJinCrawlerQuotationRequest.ProfitDataList> profitDataList = new ArrayList<>();
         List<ZiJinCrawlerQuotationRequest.ProfitDataList> profitDataList = new ArrayList<>();
 
 
-        // 第一个盈利数据项
-        ZiJinCrawlerQuotationRequest.ProfitDataList profitData1 = new ZiJinCrawlerQuotationRequest.ProfitDataList();
-        profitData1.setProfitCode("C31");
-        profitData1.setProfitRate("1.05");
-        profitDataList.add(profitData1);
-
-        // 第二个盈利数据项
-        ZiJinCrawlerQuotationRequest.ProfitDataList profitData2 = new ZiJinCrawlerQuotationRequest.ProfitDataList();
-        profitData2.setProfitCode("C32");
-        profitData2.setProfitRate("1.000000");
-        profitDataList.add(profitData2);
+        // 获取自主定价系数
+        String coefficient = null;
+        if (quoteVo.getOtherInfo() != null) {
+            coefficient = quoteVo.getOtherInfo().getCoefficient();
+        }
+
+        // 只有当 coefficient 不为空且大于0时,才构建盈利数据列表
+        if (StringUtils.hasLength(coefficient)) {
+            try {
+                double coefficientValue = Double.parseDouble(coefficient);
+                if (coefficientValue > 0) {
+                    // 第一个盈利数据项 - 自主定价系数
+                    ZiJinCrawlerQuotationRequest.ProfitDataList profitData1 = new ZiJinCrawlerQuotationRequest.ProfitDataList();
+                    profitData1.setProfitCode("C31");
+                    profitData1.setProfitRate(coefficient);
+                    profitDataList.add(profitData1);
+
+                    // 第二个盈利数据项 - 固定值
+                    ZiJinCrawlerQuotationRequest.ProfitDataList profitData2 = new ZiJinCrawlerQuotationRequest.ProfitDataList();
+                    profitData2.setProfitCode("C32");
+                    profitData2.setProfitRate("1.000000");
+                    profitDataList.add(profitData2);
+                }
+            } catch (NumberFormatException e) {
+                // coefficient 不是有效数字,不构建盈利数据列表
+            }
+        }
+
         return profitDataList;
         return profitDataList;
     }
     }
 
 

+ 12 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementDispatchController.java

@@ -88,4 +88,16 @@ public class PtlAgreementDispatchController {
     public HttpResult updateDispatchName(String dispatchId,String name){
     public HttpResult updateDispatchName(String dispatchId,String name){
         return ptlAgreementDispatchService.updateDispatchName(dispatchId, name) ? HttpResult.ok("修改调度名称成功") : HttpResult.error("修改调度名称失败");
         return ptlAgreementDispatchService.updateDispatchName(dispatchId, name) ? HttpResult.ok("修改调度名称成功") : HttpResult.error("修改调度名称失败");
     }
     }
+
+    /**
+     * 删除后置处理动作
+     *
+     * @param afterActionId ptl_agreement_dispatch_after_action表的序号
+     * @author lipf
+     * @date 2026/5/26 15:22
+     */
+    @DeleteMapping("/deleteAfterActionById/{afterActionId}")
+    public HttpResult<String> deleteAfterActionById(@PathVariable("afterActionId") String afterActionId){
+        return ptlAgreementDispatchService.deleteAfterActionById(afterActionId);
+    }
 }
 }

+ 57 - 15
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -7,10 +7,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.finance.dto.CompanySuperviseSettlementReportDto;
 import com.jzg.commons.entity.finance.dto.CompanySuperviseSettlementReportDto;
 import com.jzg.commons.entity.finance.dto.ExportSuperviseSettlementExcelDto;
 import com.jzg.commons.entity.finance.dto.ExportSuperviseSettlementExcelDto;
 import com.jzg.commons.entity.finance.dto.ReceiverSettlementReportDto;
 import com.jzg.commons.entity.finance.dto.ReceiverSettlementReportDto;
-import com.jzg.commons.entity.finance.po.InsPlyIncome;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeOrder;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeVO;
+import com.jzg.commons.entity.finance.po.*;
 import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
 import com.jzg.commons.request.RequestSingleParam;
 import com.jzg.commons.request.RequestSingleParam;
@@ -25,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import java.io.IOException;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
@@ -149,24 +147,18 @@ public class ReceivableController {
 
 
     @PostMapping("commissionInvoicing")
     @PostMapping("commissionInvoicing")
     @Operation(summary = "手续费开票")
     @Operation(summary = "手续费开票")
-    public HttpResult commissionInvoicing(@RequestBody InvoicingVo invoicingVo){
-        // 设置手续费开票
-        //invoicingVo.setInvoiceType("1");
-//        boolean invoicingCheck = receivableService.invoicingCheck(invoicingVo);
-//        if(!invoicingCheck){
-//            return HttpResult.error("有订单占用");
-//        }
+    public HttpResult<InvoiceingResult> commissionInvoicing(@RequestBody InsPlyIncomeInvoiceVO invoicingVo){
         InvoiceingResult result = receivableService.addInvoicing(invoicingVo);
         InvoiceingResult result = receivableService.addInvoicing(invoicingVo);
         if (Objects.nonNull(result)){
         if (Objects.nonNull(result)){
-            return HttpResult.ok("开票成功",result);
+            return HttpResult.ok("开票成功,发票号是" + result.getInvoiceId() ,result);
         }
         }
         return HttpResult.error("开票失败");
         return HttpResult.error("开票失败");
     }
     }
 
 
     @PostMapping("otherInvoicing")
     @PostMapping("otherInvoicing")
     @Operation(summary = "跟单费开票")
     @Operation(summary = "跟单费开票")
-    public HttpResult otherInvoicing(@RequestBody InvoicingVo invoicingVo){
-        // 设置跟单费开票
+    public HttpResult<InvoiceingResult> otherInvoicing(@RequestBody InsPlyIncomeInvoiceVO invoicingVo){
+        // 开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
         invoicingVo.setInvoiceType("2");
         invoicingVo.setInvoiceType("2");
         InvoiceingResult result = receivableService.addInvoicing(invoicingVo);
         InvoiceingResult result = receivableService.addInvoicing(invoicingVo);
         if (Objects.nonNull(result)){
         if (Objects.nonNull(result)){
@@ -178,6 +170,9 @@ public class ReceivableController {
     @PostMapping("invoicingCheck")
     @PostMapping("invoicingCheck")
     @Operation(summary = "开票检测")
     @Operation(summary = "开票检测")
     public HttpResult<String> invoicingCheck(@RequestBody InvoicingVo invoicingVo) {
     public HttpResult<String> invoicingCheck(@RequestBody InvoicingVo invoicingVo) {
+//        if(1 == 1){
+//            return HttpResult.ok("无占用");
+//        }
         boolean result = receivableService.invoicingCheck(invoicingVo);
         boolean result = receivableService.invoicingCheck(invoicingVo);
         if(result){
         if(result){
             return HttpResult.ok("无占用");
             return HttpResult.ok("无占用");
@@ -187,6 +182,23 @@ public class ReceivableController {
         }
         }
     }
     }
 
 
+    /**
+     * 开票前计算应收金额等信息
+     *
+     * @param invoicingVo 获取订单编号等信息
+     * @author lipf
+     * @date 2026/5/26 10:45
+     */
+    @Operation(summary = "开票前计算应收金额等信息")
+    @PostMapping("/calBeforeInvoice")
+    public HttpResult<InsPlyIncomeInvoice> calBeforeInvoice(@RequestBody InvoicingVo invoicingVo){
+        InsPlyIncomeInvoiceVO insPlyIncomeInvoice = receivableService.calBeforeInvoice(invoicingVo);
+        if(!insPlyIncomeInvoice.isCanInvoice()){
+            return HttpResult.error(500,insPlyIncomeInvoice,insPlyIncomeInvoice.getErrMsg());
+        }
+        return HttpResult.ok(insPlyIncomeInvoice);
+    }
+
     @PostMapping("getReceivableCompany")
     @PostMapping("getReceivableCompany")
     @Operation(summary = "获取保险公司")
     @Operation(summary = "获取保险公司")
     public HttpResult getReceivableCompany(@RequestBody InvoicingVo invoicingVo){
     public HttpResult getReceivableCompany(@RequestBody InvoicingVo invoicingVo){
@@ -194,7 +206,7 @@ public class ReceivableController {
     }
     }
 
 
     @PostMapping("settlement")
     @PostMapping("settlement")
-    @Operation(summary = "结算")
+    @Operation(summary = "私有协议结算")
     public HttpResult<String> settlement(@RequestBody SettlementVo settlementVo){
     public HttpResult<String> settlement(@RequestBody SettlementVo settlementVo){
         try{
         try{
             boolean settlement = receivableService.settlement(settlementVo);
             boolean settlement = receivableService.settlement(settlementVo);
@@ -204,6 +216,36 @@ public class ReceivableController {
             return HttpResult.error(e.getMessage());
             return HttpResult.error(e.getMessage());
         }
         }
     }
     }
+    /**
+     * 开票并结算
+     *
+     * @author lipf
+     * @date 2026/5/26 11:57
+     */
+    @PostMapping("invoiceAndSettlement")
+    @Operation(summary = "开票并结算")
+    public HttpResult<String> invoiceAndSettlement(@RequestBody InvoiceAndSettlementVo settlementVo){
+        return receivableService.invoiceAndSettlement(settlementVo);
+    }
+
+    @PostMapping("platformSettlement")
+    @Operation(summary = "平台协议结算")
+    public HttpResult<String> platformSettlement(@RequestBody PlatformSettlementVo platformSettlementVo){
+        try{
+            boolean settlement = receivableService.platformSettlement(platformSettlementVo);
+            return settlement ? HttpResult.ok("结算成功") : HttpResult.error("结算失败");
+        }catch (Exception e){
+            log.error("结算失败",e);
+            return HttpResult.error(e.getMessage());
+        }
+    }
+
+    @PostMapping("getPlatformSettlementReceivableAmount")
+    @Operation(summary = "获取平台协议结算的应收金额")
+    public HttpResult<BigDecimal> getPlatformSettlementReceivableAmount(@RequestBody InvoicingVo invoicingVo){
+        BigDecimal receivableAmount = receivableService.getReceivableAmount(invoicingVo);
+        return HttpResult.ok(receivableAmount);
+    }
 
 
     @PostMapping("settlementList")
     @PostMapping("settlementList")
     @Operation(summary = "结算明细")
     @Operation(summary = "结算明细")

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

@@ -42,7 +42,7 @@ public class SchemeController {
 
 
     @Operation(summary = "获取方案")
     @Operation(summary = "获取方案")
     @GetMapping("/getScheme")
     @GetMapping("/getScheme")
-    public HttpResult getScheme(String id){
+    public HttpResult<PtlSchemeQueryVo> getScheme(String id){
         PtlSchemeQueryVo schemeList = ptlSchemeService.getScheme(id);
         PtlSchemeQueryVo schemeList = ptlSchemeService.getScheme(id);
         return HttpResult.ok(schemeList);
         return HttpResult.ok(schemeList);
     }
     }

+ 10 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementDispatchService.java

@@ -1,6 +1,7 @@
 package com.jzg.organization.service;
 package com.jzg.organization.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.agreement.dispatch.dto.PtlAgreementDispatch;
 import com.jzg.commons.entity.agreement.dispatch.dto.PtlAgreementDispatch;
 import com.jzg.commons.entity.agreement.dispatch.dto.PtlAgreementDispatchAfterAction;
 import com.jzg.commons.entity.agreement.dispatch.dto.PtlAgreementDispatchAfterAction;
 import com.jzg.commons.entity.agreement.dispatch.vo.PtlAgreementDispatchQuery;
 import com.jzg.commons.entity.agreement.dispatch.vo.PtlAgreementDispatchQuery;
@@ -62,4 +63,13 @@ public interface PtlAgreementDispatchService extends IService<PtlAgreementDispat
      * @return
      * @return
      */
      */
     public boolean updateDispatchName(String dispatchId,String name);
     public boolean updateDispatchName(String dispatchId,String name);
+
+    /**
+     * 删除后置处理动作
+     *
+     * @param afterActionId ptl_agreement_dispatch_after_action表的序号
+     * @author lipf
+     * @date 2026/5/26 15:22
+     */
+    HttpResult<String> deleteAfterActionById(String afterActionId);
 }
 }

+ 25 - 4
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.finance.dto.*;
 import com.jzg.commons.entity.finance.dto.*;
-import com.jzg.commons.entity.finance.po.InsPlyIncome;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
-import com.jzg.commons.entity.finance.po.InsPlyIncomeOrder;
+import com.jzg.commons.entity.finance.po.*;
 import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.EsmInsCompany;
@@ -76,7 +74,7 @@ public interface ReceivableService extends IService<InsPlyIncome> {
     /**
     /**
      * 添加开票
      * 添加开票
      */
      */
-    InvoiceingResult addInvoicing(InvoicingVo invoicingVo);
+    InvoiceingResult addInvoicing(InsPlyIncomeInvoiceVO invoicingVo);
 
 
     /**
     /**
      * 获取票据的实收金额
      * 获取票据的实收金额
@@ -321,4 +319,27 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      */
      */
     HttpResult<String> deleteIncomesByIds(List<Long> ids, String userName);
     HttpResult<String> deleteIncomesByIds(List<Long> ids, String userName);
 
 
+    /**
+     * 开票前计算应收金额等信息
+     *
+     * @param invoicingVo 获取订单编号等信息
+     * @author lipf
+     * @date 2026/5/26 10:45
+     */
+    InsPlyIncomeInvoiceVO calBeforeInvoice(InvoicingVo invoicingVo);
+
+    /**
+     * 开票并结算
+     *
+     * @param settlementVo 开票信息和结算信息
+     * @author lipf
+     * @date 2026/5/26 11:44
+     */
+    HttpResult<String> invoiceAndSettlement(InvoiceAndSettlementVo settlementVo);
+    /**
+     * 平台结算
+     * @param platformSettlementVo
+     * @return
+     */
+    boolean platformSettlement(PlatformSettlementVo platformSettlementVo);
 }
 }

+ 25 - 7
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementDispatchServiceImpl.java

@@ -121,8 +121,8 @@ public class PtlAgreementDispatchServiceImpl extends ServiceImpl<PtlAgreementDis
         PtlAgreementDispatchVo dispatchVos = new PtlAgreementDispatchVo();
         PtlAgreementDispatchVo dispatchVos = new PtlAgreementDispatchVo();
         List<String> dispatchIds = ptlAgreementDispatches.stream().map(PtlAgreementDispatch::getId).collect(Collectors.toList());
         List<String> dispatchIds = ptlAgreementDispatches.stream().map(PtlAgreementDispatch::getId).collect(Collectors.toList());
         if (!dispatchIds.isEmpty()) {
         if (!dispatchIds.isEmpty()) {
-            List<SysDict> dispatchBeforeActionDict = sysDictService.getByTypeCode("dispatch_before_action");
-            //List<SysDict> dispatchAfterActionDict = sysDictService.getByTypeCode("dispatch_after_action");
+            List<SysDict> beforeActionDicts = sysDictService.getByTypeCode("dispatch_before_action");
+            List<SysDict> afterActionsDicts = sysDictService.getByTypeCode("dispatch_after_action");
 
 
             // 查询保司所有的规则属性 然后进行分组
             // 查询保司所有的规则属性 然后进行分组
             List<PtlAgreementDispatchRulesAttrLink> ptlAgreementDispatchRulesAttrLinks = rulesAttrLinkMapper.selectList(new LambdaQueryWrapper<PtlAgreementDispatchRulesAttrLink>()
             List<PtlAgreementDispatchRulesAttrLink> ptlAgreementDispatchRulesAttrLinks = rulesAttrLinkMapper.selectList(new LambdaQueryWrapper<PtlAgreementDispatchRulesAttrLink>()
@@ -136,7 +136,7 @@ public class PtlAgreementDispatchServiceImpl extends ServiceImpl<PtlAgreementDis
             // 获取所有保司的动作
             // 获取所有保司的动作
             List<PtlAgreementDispatchAction> ptlAgreementDispatchActions = actionMapper.getActions(dispatchIds);
             List<PtlAgreementDispatchAction> ptlAgreementDispatchActions = actionMapper.getActions(dispatchIds);
             // 获取保司的报价失败之后的动作
             // 获取保司的报价失败之后的动作
-            List<PtlAgreementDispatchAfterAction> ptlAgreementDispatchAfterActions = afterActionMapper.getAfterActions(ptlAgreementDispatchQuery.getCompanyId());
+            List<PtlAgreementDispatchAfterAction> afterActions = afterActionMapper.getAfterActions(ptlAgreementDispatchQuery.getCompanyId());
             int index = 1;
             int index = 1;
             // add by lipf, 对协议配置中的字典序号进行转义 2026年5月20日16:43:34
             // add by lipf, 对协议配置中的字典序号进行转义 2026年5月20日16:43:34
             List<PtlAgreementUndwrtRulesDictLabal> ptlAgreementUndwrtRulesDictLabals = baseMapper.queryAllDictLabal();
             List<PtlAgreementUndwrtRulesDictLabal> ptlAgreementUndwrtRulesDictLabals = baseMapper.queryAllDictLabal();
@@ -189,7 +189,7 @@ public class PtlAgreementDispatchServiceImpl extends ServiceImpl<PtlAgreementDis
                 }
                 }
 
 
                 for(PtlAgreementDispatchAction action : actions){
                 for(PtlAgreementDispatchAction action : actions){
-                    SysDict sysDict = dispatchBeforeActionDict.stream().filter(x -> x.getValue().equals(action.getActionCode())).findFirst().orElse(null);
+                    SysDict sysDict = beforeActionDicts.stream().filter(x -> x.getValue().equals(action.getActionCode())).findFirst().orElse(null);
                     if(sysDict == null){
                     if(sysDict == null){
                         action.setActionName("未知动作");
                         action.setActionName("未知动作");
                     }else{
                     }else{
@@ -220,8 +220,8 @@ public class PtlAgreementDispatchServiceImpl extends ServiceImpl<PtlAgreementDis
                 dispatchVos.getDispatchVos().add(vo);
                 dispatchVos.getDispatchVos().add(vo);
             }
             }
 
 
-            for(PtlAgreementDispatchAfterAction afterAction : ptlAgreementDispatchAfterActions){
-                SysDict sysDict = dispatchBeforeActionDict.stream().filter(x -> x.getValue().equals(afterAction.getActionCode())).findFirst().orElse(null);
+            for(PtlAgreementDispatchAfterAction afterAction : afterActions){
+                SysDict sysDict = afterActionsDicts.stream().filter(x -> x.getValue().equals(afterAction.getActionCode())).findFirst().orElse(null);
                 if(sysDict == null){
                 if(sysDict == null){
                     afterAction.setActionName("未知动作");
                     afterAction.setActionName("未知动作");
                 }else{
                 }else{
@@ -245,7 +245,7 @@ public class PtlAgreementDispatchServiceImpl extends ServiceImpl<PtlAgreementDis
                     }
                     }
                 }
                 }
             }
             }
-            dispatchVos.setAfterActions(ptlAgreementDispatchAfterActions);
+            dispatchVos.setAfterActions(afterActions);
         }
         }
 
 
 
 
@@ -287,6 +287,24 @@ public class PtlAgreementDispatchServiceImpl extends ServiceImpl<PtlAgreementDis
         return false;
         return false;
     }
     }
 
 
+    /**
+     * 删除后置处理动作
+     *
+     * @param afterActionId ptl_agreement_dispatch_after_action表的序号
+     * @author lipf
+     * @date 2026/5/26 15:22
+     */
+    @Override
+    public HttpResult<String> deleteAfterActionById(String afterActionId) {
+        log.info("删除后置处理操作:afterActionId=[{}]",afterActionId);
+        PtlAgreementDispatchAfterAction ptlAgreementDispatchAfterAction = afterActionMapper.selectById(afterActionId);
+        if(ptlAgreementDispatchAfterAction == null) {
+            log.info("要删除的后置操作不存在. afterActionId=[{}]",afterActionId);
+            return HttpResult.error("要删除的后置操作不存在");
+        }
+        afterActionMapper.deleteById(afterActionId);
+        return HttpResult.ok("删除成功");
+    }
 }
 }
 
 
 
 

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

@@ -184,6 +184,7 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
 
 
     @Override
     @Override
     public PtlSchemeQueryVo getScheme(String id) {
     public PtlSchemeQueryVo getScheme(String id) {
+        log.info("根据方案id=[{}]获取方案信息(ptl_scheme_info)",id);
         //获取方案信息
         //获取方案信息
         PtlSchemeInfo ptlSchemeInfo = ptlSchemeInfoMapper.selectOne(new LambdaQueryWrapper<PtlSchemeInfo>()
         PtlSchemeInfo ptlSchemeInfo = ptlSchemeInfoMapper.selectOne(new LambdaQueryWrapper<PtlSchemeInfo>()
                 .eq(PtlSchemeInfo::getId, id));
                 .eq(PtlSchemeInfo::getId, id));

+ 192 - 17
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -128,6 +128,10 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     private static final String JY_INVOICING_COMMISSION_LOCK = "JY_INVOICING_COMMISSION_LOCK:";
     private static final String JY_INVOICING_COMMISSION_LOCK = "JY_INVOICING_COMMISSION_LOCK:";
     // 驾意险跟单费结算所
     // 驾意险跟单费结算所
     private static final String JY_INVOICING_OTHER_LOCK = "JY_INVOICING_OTHER_LOCK:";
     private static final String JY_INVOICING_OTHER_LOCK = "JY_INVOICING_OTHER_LOCK:";
+    // 平台车险结算锁
+    private static final String PT_INVOICING_COMMISSION_LOCK = "PT_INVOICING_COMMISSION_LOCK:";
+    // 平台非车险结算锁
+    private static final String PT_INVOICING_OTHER_LOCK = "PT_INVOICING_OTHER_LOCK:";
 
 
 
 
 //    @Override
 //    @Override
@@ -473,6 +477,34 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return invoiceIds;
         return invoiceIds;
     }
     }
 
 
+    /**
+     * 开票前计算应收金额等信息
+     *
+     * @param invoicingVo 获取订单编号等信息
+     * @author lipf
+     * @date 2026/5/26 10:45
+     */
+    @Override
+    public InsPlyIncomeInvoiceVO calBeforeInvoice(InvoicingVo invoicingVo) {
+        log.info("开票前校验并计算应收金额等金额。 invoicingVO=[{}]", JSONUtil.toJsonStr(invoicingVo));
+        InsPlyIncomeInvoiceVO invoice = new InsPlyIncomeInvoiceVO();
+        boolean b = this.invoicingCheck(invoicingVo);
+        if(!b){
+            List<String> invoiceIds = this.queryIncomeBindInvoice(invoicingVo);
+            invoice.setCanInvoice(false);
+            invoice.setErrMsg("订单已开票。发票序号是"+ invoiceIds.toString());
+            return invoice;
+        }
+        invoice.setCanInvoice(true);
+        BigDecimal receivableAmount = this.getReceivableAmount(invoicingVo);
+        log.info("根据订单号[{}]计算得到的应收金额是[{}]",JSONUtil.toJsonStr(invoicingVo),receivableAmount);
+        invoice.setReceivableSupervisePremium(receivableAmount);
+        invoice.setCompanyId(invoicingVo.getCompanyId());
+        invoice.setInvoiceTime(LocalDateTime.now());
+        invoice.setInvoiceType(invoicingVo.getInvoiceType());
+        return invoice;
+    }
+
     /**
     /**
      * 开票重复校验
      * 开票重复校验
      * 功能:DB+Redis双重校验,防止并发重复开票
      * 功能:DB+Redis双重校验,防止并发重复开票
@@ -495,12 +527,15 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             return false;
             return false;
         }
         }
 
 
+        // 开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
         // 3. 根据开票类型获取Redis锁前缀
         // 3. 根据开票类型获取Redis锁前缀
         String redisKeyPrefix = switch (invoicingVo.getInvoiceType()) {
         String redisKeyPrefix = switch (invoicingVo.getInvoiceType()) {
             case "1" -> CAR_INVOICING_COMMISSION_LOCK;
             case "1" -> CAR_INVOICING_COMMISSION_LOCK;
             case "2" -> CAR_INVOICING_OTHER_LOCK;
             case "2" -> CAR_INVOICING_OTHER_LOCK;
             case "3" -> JY_INVOICING_COMMISSION_LOCK;
             case "3" -> JY_INVOICING_COMMISSION_LOCK;
             case "4" -> JY_INVOICING_OTHER_LOCK;
             case "4" -> JY_INVOICING_OTHER_LOCK;
+            case "5" -> PT_INVOICING_COMMISSION_LOCK;
+            case "6" -> PT_INVOICING_OTHER_LOCK;
             default -> throw new SystemException("不支持的开票类型");
             default -> throw new SystemException("不支持的开票类型");
         };
         };
 
 
@@ -567,6 +602,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
 
     @Override
     @Override
     public BigDecimal getReceivableAmount(InvoicingVo invoicingVo) {
     public BigDecimal getReceivableAmount(InvoicingVo invoicingVo) {
+        log.info("获取订单的应收金额:invoicingVo=[{}]", JSONUtil.toJsonStr(invoicingVo));
         String invoiceType = invoicingVo.getInvoiceType();
         String invoiceType = invoicingVo.getInvoiceType();
         List<String> orderNos = invoicingVo.getOrderNos();
         List<String> orderNos = invoicingVo.getOrderNos();
         orderNos = orderNos.stream()
         orderNos = orderNos.stream()
@@ -596,6 +632,12 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         } else if (invoiceType.equals("4")) {
         } else if (invoiceType.equals("4")) {
             // 驾意险的总跟单费(jy_follow_premium)
             // 驾意险的总跟单费(jy_follow_premium)
             return jyFollowPremium;
             return jyFollowPremium;
+        } else if (invoiceType.equals("5")) {
+            // 交强的总手续费(jq_commission_premium) + 商业的总手续费(sy_commission_premium) + 交强的总跟单费(jq_follow_premium) + 商业的总跟单费(sy_follow_premium)
+            return jqCommissionPremium.add(syCommissionPremium).add(jqFollowPremium).add(syFollowPremium);
+        } else if (invoiceType.equals("6")) {
+            // 驾意险的总手续费(jy_commission_premium) + 驾意险的总跟单费(jy_follow_premium)
+            return jyCommissionPremium.add(jyFollowPremium);
         }
         }
         return null;
         return null;
     }
     }
@@ -603,34 +645,34 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     /**
     /**
      * 添加发票
      * 添加发票
      *
      *
-     * @param invoicingVo
-     * @return
+     * @param invoicingVo 开票相关的信息
+     * @return InvoiceingResult 开票的结果
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
-    public InvoiceingResult addInvoicing(InvoicingVo invoicingVo) {
+    public InvoiceingResult addInvoicing(InsPlyIncomeInvoiceVO invoicingVo) {
+        log.info("开票:invoicingVo=[{}]", JSONUtil.toJsonStr(invoicingVo));
         try {
         try {
-            invoicingVo.setReceivablePremium(this.getReceivableAmount(invoicingVo));
-
             InvoiceingResult result = new InvoiceingResult();
             InvoiceingResult result = new InvoiceingResult();
             InsPlyIncomeInvoice invoice = new InsPlyIncomeInvoice();
             InsPlyIncomeInvoice invoice = new InsPlyIncomeInvoice();
+            BeanUtils.copyProperties(invoicingVo, invoice);
             invoice.setId(IdGenerate.nextId());
             invoice.setId(IdGenerate.nextId());
             invoice.setCompanyId(invoicingVo.getCompanyId());
             invoice.setCompanyId(invoicingVo.getCompanyId());
             invoice.setInvoiceType(invoicingVo.getInvoiceType());
             invoice.setInvoiceType(invoicingVo.getInvoiceType());
-            // 开票类型  1 手续费  2 跟单费  3 驾意险手续费 4 驾意险跟单费
+            //  开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
             if("1".equals(invoicingVo.getInvoiceType()) || "2".equals(invoicingVo.getInvoiceType())){
             if("1".equals(invoicingVo.getInvoiceType()) || "2".equals(invoicingVo.getInvoiceType())){
                 invoice.setInvoiceRiskType("10");
                 invoice.setInvoiceRiskType("10");
+            }else if("5".equals(invoicingVo.getInvoiceType()) || "6".equals(invoicingVo.getInvoiceType())){
+                invoice.setInvoiceRiskType("30");
             }else{
             }else{
                 invoice.setInvoiceRiskType("20");
                 invoice.setInvoiceRiskType("20");
             }
             }
             invoice.setInvoiceParty(invoicingVo.getInvoiceParty());
             invoice.setInvoiceParty(invoicingVo.getInvoiceParty());
             invoice.setOverinflatedAmount(invoicingVo.getOverinflatedAmount());
             invoice.setOverinflatedAmount(invoicingVo.getOverinflatedAmount());
-            invoice.setReceivableSupervisePremium(invoicingVo.getReceivablePremium());
+            invoice.setReceivableSupervisePremium(invoicingVo.getReceivableSupervisePremium());
             invoice.setTaxPoint(invoicingVo.getTaxPoint());
             invoice.setTaxPoint(invoicingVo.getTaxPoint());
             insPlyIncomeInvoiceMapper.insert(invoice);
             insPlyIncomeInvoiceMapper.insert(invoice);
-
-            List<InsPlyIncomeInvoiceLink> invoicingLinkList = new ArrayList();
-
+            List<InsPlyIncomeInvoiceLink> invoicingLinkList = new ArrayList<InsPlyIncomeInvoiceLink>();
             invoicingVo.getIncomeIds().forEach(incomeId -> {
             invoicingVo.getIncomeIds().forEach(incomeId -> {
                 InsPlyIncomeInvoiceLink link = new InsPlyIncomeInvoiceLink();
                 InsPlyIncomeInvoiceLink link = new InsPlyIncomeInvoiceLink();
                 link.setId(IdGenerate.nextId());
                 link.setId(IdGenerate.nextId());
@@ -641,7 +683,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             });
             });
             insPlyIncomeInvoiceLinkMapper.insert(invoicingLinkList);
             insPlyIncomeInvoiceLinkMapper.insert(invoicingLinkList);
             result.setInvoiceId(invoice.getId());
             result.setInvoiceId(invoice.getId());
-            result.setSumPrice(null != invoicingVo.getReceivablePremium() ? invoicingVo.getReceivablePremium().toString() : null);
+            result.setSumPrice(null != invoicingVo.getReceivableSupervisePremium() ? invoicingVo.getReceivableSupervisePremium().toString() : null);
             return result;
             return result;
         } catch (Exception e) {
         } catch (Exception e) {
             log.info("开票异常.invoicingVo=[{}]",JSONUtil.toJsonStr(invoicingVo), e);
             log.info("开票异常.invoicingVo=[{}]",JSONUtil.toJsonStr(invoicingVo), e);
@@ -691,12 +733,141 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                         .in(InsPlyIncome::getId, invoiceIds)
                         .in(InsPlyIncome::getId, invoiceIds)
                         .set(InsPlyIncome::getJyOtherSettlement, "1"));
                         .set(InsPlyIncome::getJyOtherSettlement, "1"));
                 break;
                 break;
+            case "5":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId, invoiceIds)
+                        .set(InsPlyIncome::getPlatformSuperviseSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
+                break;
+            case "6":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId, invoiceIds)
+                        .set(InsPlyIncome::getPlatformOtherSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
+                break;
             default:
             default:
                 result = 0;
                 result = 0;
         }
         }
         return result > 0;
         return result > 0;
     }
     }
 
 
+    /**
+     * 开票并结算
+     *
+     * @param settlementVo 开票信息和结算信息
+     * @author lipf
+     * @date 2026/5/26 11:44
+     */
+    @Override
+    public HttpResult<String> invoiceAndSettlement(InvoiceAndSettlementVo settlementVo) {
+        log.info("开票并结算: settlementVo=[{}]", JSONUtil.toJsonStr(settlementVo));
+        InvoiceingResult result = this.addInvoicing(settlementVo.getInvoiceVO());
+        if (Objects.nonNull(result)){
+            SettlementVo settlementVo1 = new SettlementVo();
+            BeanUtils.copyProperties(settlementVo, settlementVo1);
+            settlementVo1.setInvoicingId(result.getInvoiceId());
+            boolean settlement = this.settlement(settlementVo1);
+            if(settlement){
+                return HttpResult.ok("开票并结算成功");
+            }else{
+                return HttpResult.error("开票成功但结算失败");
+            }
+        }
+        return HttpResult.error("开票失败");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean platformSettlement(PlatformSettlementVo platformSettlementVo) {
+        SettlementVo settlementVo = platformSettlementVo.getSettlementVo();
+        InvoicingVo invoicingVo = platformSettlementVo.getInvoicingVo();
+
+        log.info("平台结算:platformSettlement=[{}]", JSONUtil.toJsonStr(platformSettlementVo));
+        try {
+            // ============================开票逻辑============================
+            invoicingVo.setReceivablePremium(this.getReceivableAmount(invoicingVo));
+
+            InvoiceingResult result = new InvoiceingResult();
+            InsPlyIncomeInvoice invoice = new InsPlyIncomeInvoice();
+            invoice.setId(IdGenerate.nextId());
+            invoice.setCompanyId(invoicingVo.getCompanyId());
+            invoice.setInvoiceType(invoicingVo.getInvoiceType());
+            //  开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
+            if("1".equals(invoicingVo.getInvoiceType()) || "2".equals(invoicingVo.getInvoiceType())){
+                invoice.setInvoiceRiskType("10");
+            }else if("5".equals(invoicingVo.getInvoiceType()) || "6".equals(invoicingVo.getInvoiceType())){
+                invoice.setInvoiceRiskType("30");
+            }else{
+                invoice.setInvoiceRiskType("20");
+            }
+            invoice.setInvoiceParty(invoicingVo.getInvoiceParty());
+            invoice.setOverinflatedAmount(invoicingVo.getOverinflatedAmount());
+            invoice.setReceivableSupervisePremium(invoicingVo.getReceivablePremium());
+            invoice.setTaxPoint(invoicingVo.getTaxPoint());
+
+            List<InsPlyIncomeInvoiceLink> invoicingLinkList = new ArrayList();
+
+            invoicingVo.getIncomeIds().forEach(incomeId -> {
+                InsPlyIncomeInvoiceLink link = new InsPlyIncomeInvoiceLink();
+                link.setId(IdGenerate.nextId());
+                link.setInvoiceId(invoice.getId());
+                link.setIncomeId(incomeId);
+                link.setInvoiceType(invoicingVo.getInvoiceType());
+                invoicingLinkList.add(link);
+            });
+            insPlyIncomeInvoiceLinkMapper.insert(invoicingLinkList);
+            result.setInvoiceId(invoice.getId());
+            result.setSumPrice(null != invoicingVo.getReceivablePremium() ? invoicingVo.getReceivablePremium().toString() : null);
+
+            // ============================结算逻辑============================
+            // 实际已经收了的金额
+            BigDecimal actualReceivedAmount = this.getInvoicingAmount(settlementVo.getInvoicingId());
+
+            // 所有需要结算的金额
+            BigDecimal allToSettlement = invoice.getReceivableSupervisePremium().add(invoice.getOverinflatedAmount());
+            // 剩余的金额
+            BigDecimal surplusPremium = allToSettlement.subtract(actualReceivedAmount);
+            log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",
+                    settlementVo.getInvoicingId(), allToSettlement,actualReceivedAmount,settlementVo.getActualReceivedAmount());
+            // 校验是否超出了剩余的金额
+            AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
+
+            // 处理结算数据
+            // 未完全结算完成
+            InsPlyIncomeInvoiceSettlement settlement = new InsPlyIncomeInvoiceSettlement(invoice.getId(), settlementVo.getActualReceivedAmount(),
+                    DateTime.now(), settlementVo.getPaymentDifference(), settlementVo.getPaymentReason());
+            insPlyIncomeInvoiceSettlementMapper.insert(settlement);
+
+            if (CollectionUtils.isNotEmpty(settlementVo.getAttachmentIds())) {
+                // 添加发票附件
+                List<InsPlyIncomeInvoiceSettlementFile> files = new ArrayList<>();
+                for (String fileId : settlementVo.getAttachmentIds()) {
+                    InsPlyIncomeInvoiceSettlementFile file = new InsPlyIncomeInvoiceSettlementFile();
+                    file.setId(IdGenerate.nextId());
+                    file.setSettlementId(settlement.getId());
+                    file.setFileId(fileId);
+                    files.add(file);
+                }
+                insPlyIncomeInvoiceSettlementFileMapper.insert(files);
+            }
+
+            // 判断是否已经结算完成
+            if (surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) == 0) {
+                log.info("序号为[{}]的发票已经结算完成",invoice.getId());
+                // 更新发票状态
+                invoice.setStatus("1");
+                insPlyIncomeInvoiceMapper.insert(invoice);
+                // 判断是需要更新哪个字段
+                this.updateIncomeSettlementStatus(invoice.getInvoiceType(), invoicingVo.getIncomeIds());
+            }else{
+                log.info("invoiceId=[{}], 还剩[{}]钱没有结算",settlementVo.getInvoicingId(), surplusPremium.subtract(settlementVo.getActualReceivedAmount()));
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("平台结算异常. settlementVo=[{}]",JSONUtil.toJsonStr(settlementVo), e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public boolean settlement(SettlementVo settlementVo) {
     public boolean settlement(SettlementVo settlementVo) {
@@ -705,15 +876,15 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             // 获取应收的金额
             // 获取应收的金额
             InsPlyIncomeInvoice insPlyIncomeInvoice = insPlyIncomeInvoiceMapper.selectById(settlementVo.getInvoicingId());
             InsPlyIncomeInvoice insPlyIncomeInvoice = insPlyIncomeInvoiceMapper.selectById(settlementVo.getInvoicingId());
             AssertionUtils.isFail(Objects.isNull(insPlyIncomeInvoice), "发票数据不存在");
             AssertionUtils.isFail(Objects.isNull(insPlyIncomeInvoice), "发票数据不存在");
-            // 实际已经收的了金额
-            BigDecimal ctualReceivedAmount = this.getInvoicingAmount(settlementVo.getInvoicingId());
+            // 实际已经收了的金额
+            BigDecimal actualReceivedAmount = this.getInvoicingAmount(settlementVo.getInvoicingId());
 
 
             // 所有需要结算的金额
             // 所有需要结算的金额
             BigDecimal allToSettlement = insPlyIncomeInvoice.getReceivableSupervisePremium().add(insPlyIncomeInvoice.getOverinflatedAmount());
             BigDecimal allToSettlement = insPlyIncomeInvoice.getReceivableSupervisePremium().add(insPlyIncomeInvoice.getOverinflatedAmount());
             // 剩余的金额
             // 剩余的金额
-            BigDecimal surplusPremium = allToSettlement.subtract(ctualReceivedAmount);
+            BigDecimal surplusPremium = allToSettlement.subtract(actualReceivedAmount);
             log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",
             log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",
-                    settlementVo.getInvoicingId(), allToSettlement,ctualReceivedAmount,settlementVo.getActualReceivedAmount());
+                    settlementVo.getInvoicingId(), allToSettlement,actualReceivedAmount,settlementVo.getActualReceivedAmount());
             // 校验是否超出了剩余的金额
             // 校验是否超出了剩余的金额
             AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
             AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
 
 
@@ -724,6 +895,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             insPlyIncomeInvoiceSettlementMapper.insert(settlement);
             insPlyIncomeInvoiceSettlementMapper.insert(settlement);
 
 
             if (CollectionUtils.isNotEmpty(settlementVo.getAttachmentIds())) {
             if (CollectionUtils.isNotEmpty(settlementVo.getAttachmentIds())) {
+                log.info("结算的凭证是:settlementVo.getAttachmentIds()=[{}]", JSONUtil.toJsonStr(settlementVo.getAttachmentIds()));
                 // 添加发票附件
                 // 添加发票附件
                 List<InsPlyIncomeInvoiceSettlementFile> files = new ArrayList<>();
                 List<InsPlyIncomeInvoiceSettlementFile> files = new ArrayList<>();
                 for (String fileId : settlementVo.getAttachmentIds()) {
                 for (String fileId : settlementVo.getAttachmentIds()) {
@@ -779,7 +951,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             List<SuperviseExcelVo> dataList = listener.getDataList();
             List<SuperviseExcelVo> dataList = listener.getDataList();
             return dataList;
             return dataList;
         } catch (Exception e) {
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("导入excel异常。",e);
             return null;
             return null;
         }
         }
     }
     }
@@ -1080,7 +1252,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             // 数据库已存在 → 继续后续校验
             // 数据库已存在 → 继续后续校验
             // 判断已开票 / 已结算
             // 判断已开票 / 已结算
             if ("1".equals(existIncome.getSuperviseSettlement()) || "1".equals(existIncome.getOtherSettlement())
             if ("1".equals(existIncome.getSuperviseSettlement()) || "1".equals(existIncome.getOtherSettlement())
-                    || "1".equals(existIncome.getJySuperviseSettlement()) || "1".equals(existIncome.getJyOtherSettlement())) {
+                    || "1".equals(existIncome.getJySuperviseSettlement()) || "1".equals(existIncome.getJyOtherSettlement())
+                    || "1".equals(existIncome.getPlatformSuperviseSettlement()) || "1".equals(existIncome.getPlatformOtherSettlement())) {
                 failedNumber++;
                 failedNumber++;
                 vo.setErrorMessage("应收数据已结算");
                 vo.setErrorMessage("应收数据已结算");
                 failedExcel.add(vo);
                 failedExcel.add(vo);
@@ -1450,6 +1623,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 case "2" -> dto.setInvoiceType("跟单费");
                 case "2" -> dto.setInvoiceType("跟单费");
                 case "3" -> dto.setInvoiceType("驾意险手续费");
                 case "3" -> dto.setInvoiceType("驾意险手续费");
                 case "4" -> dto.setInvoiceType("驾意险跟单费");
                 case "4" -> dto.setInvoiceType("驾意险跟单费");
+                case "5" -> dto.setInvoiceType("平台协议车险应收");
+                case "6" -> dto.setInvoiceType("平台协议非车险应收");
             }
             }
             dto.setInvoiceTypeName(Constant.invoiceRiskTypeMap.get(Objects.toString(dto.getInvoiceType())));
             dto.setInvoiceTypeName(Constant.invoiceRiskTypeMap.get(Objects.toString(dto.getInvoiceType())));
             LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile> wrapper = new LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile>();
             LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile> wrapper = new LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile>();

+ 34 - 67
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -510,6 +510,7 @@
         ipii.invoice_type,
         ipii.invoice_type,
         ipii.invoice_party,
         ipii.invoice_party,
         ipii.tax_point,
         ipii.tax_point,
+        ipi.order_no as orderNo,
         ipiis.actual_received_amount,
         ipiis.actual_received_amount,
         ipiis.receive_payment_date,
         ipiis.receive_payment_date,
         ipiis.create_by ,
         ipiis.create_by ,
@@ -1209,75 +1210,41 @@
 
 
 
 
     <select id="selectAllCompanyReports" resultMap="BaseResultMap">
     <select id="selectAllCompanyReports" resultMap="BaseResultMap">
-
         SELECT
         SELECT
-        eic.id              AS company_id,
-        eic.parent_id       AS parent_id,
-        eic.name            AS company_name,
-
-        COALESCE(SUM(
-        ipi.jq_receivable_premium +
-        ipi.sy_receivable_premium +
-        ipi.jy_receivable_premium
-        ),0) AS total_receivable,
-
-        COALESCE(SUM(
-        ipi.jq_supervise_costs_premiums +
-        ipi.sy_supervise_costs_premiums +
-        ipi.jy_supervise_costs_premiums
-        ),0) AS supervise_fee,
-
-        COALESCE(SUM(
-        ipi.jq_other_costs_premiums +
-        ipi.sy_other_costs_premiums +
-        ipi.jy_other_costs_premiums
-        ),0) AS follow_fee,
-
-        COALESCE(SUM(invoice_summary.total_invoice),0)
-        AS invoiced_amount,
-
-        COALESCE(SUM(invoice_summary.settled_invoice),0)
-        AS settled_amount,
-
-        COALESCE(SUM(invoice_summary.unsettled_invoice),0)
-        AS un_settled_amount
-
-        FROM esm_ins_company eic
-
-        LEFT JOIN ins_ply_income ipi
-        ON eic.id = ipi.company_id
-        AND ipi.agreement_type = #{queryVo.agreementType}
-
+            eic.id AS company_id,
+            eic.parent_id AS parent_id,
+            eic.NAME AS company_name,
+            COALESCE ( SUM( ipi.jq_receivable_premium + ipi.sy_receivable_premium + ipi.jy_receivable_premium ), 0 ) AS total_receivable,
+            COALESCE ( SUM( ipi.jq_supervise_costs_premiums + ipi.sy_supervise_costs_premiums + ipi.jy_supervise_costs_premiums ), 0 ) AS supervise_fee,
+            COALESCE ( SUM( ipi.jq_other_costs_premiums + ipi.sy_other_costs_premiums + ipi.jy_other_costs_premiums ), 0 ) AS follow_fee,
+            COALESCE ( SUM( invoice_summary.total_invoice ), 0 ) AS invoiced_amount,
+            COALESCE ( SUM( invoice_summary.settled_invoice ), 0 ) AS settled_amount,
+            COALESCE ( SUM( invoice_summary.unsettled_invoice ), 0 ) AS un_settled_amount
+        FROM
+        esm_ins_company eic
+        LEFT JOIN ins_ply_income ipi ON eic.id = ipi.company_id AND ipi.agreement_type = #{queryVo.agreementType}
         LEFT JOIN (
         LEFT JOIN (
-        SELECT
-        ipiil.income_id,
-
-        SUM(ipii.receivable_supervise_premium)
-        AS total_invoice,
-
-        SUM(
-        CASE WHEN ipii.status = 1
-        THEN ipii.receivable_supervise_premium
-        ELSE 0 END
-        ) AS settled_invoice,
-
-        SUM(
-        CASE WHEN ipii.status = 0
-        THEN ipii.receivable_supervise_premium
-        ELSE 0 END
-        ) AS unsettled_invoice
-
-        FROM ins_ply_income_invoice_link ipiil
-
-        LEFT JOIN ins_ply_income_invoice ipii
-        ON ipii.id = ipiil.invoice_id
-
-        GROUP BY ipiil.income_id
-
-        ) invoice_summary
-        ON invoice_summary.income_id = ipi.id
-
-        WHERE 1=1
+            SELECT
+            ipiil.income_id,
+            SUM( ipii.receivable_supervise_premium ) AS total_invoice,
+            SUM( CASE WHEN ipii.STATUS = 1 THEN ipii.receivable_supervise_premium ELSE 0 END ) AS settled_invoice,
+            SUM( CASE WHEN ipii.STATUS = 0 THEN ipii.receivable_supervise_premium ELSE 0 END ) AS unsettled_invoice
+            FROM
+            ins_ply_income_invoice_link ipiil
+            LEFT JOIN ins_ply_income_invoice ipii ON ipii.id = ipiil.invoice_id
+            <where>
+                <if test="queryVo.invoiceTypes != null and queryVo.invoiceTypes.size() > 0">
+                    AND ipii.invoice_type IN
+                    <foreach item="item" collection="queryVo.invoiceTypes" separator="," open="(" close=")">
+                        #{item}
+                    </foreach>
+                </if>
+            </where>
+            GROUP BY
+            ipiil.income_id
+        ) invoice_summary ON invoice_summary.income_id = ipi.id
+        WHERE
+        1 =1
 
 
         <if test="queryVo.companyId != null and queryVo.companyId != ''">
         <if test="queryVo.companyId != null and queryVo.companyId != ''">
             AND eic.id = #{queryVo.companyId}
             AND eic.id = #{queryVo.companyId}