Ver código fonte

订单详情、费用计算

Qchen 1 ano atrás
pai
commit
8c7d84f178
46 arquivos alterados com 1998 adições e 29 exclusões
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/CostAgreementParam.java
  2. 2 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersAccidentalDriving.java
  3. 15 2
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersOther.java
  4. 2 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersPdfUrl.java
  5. 285 0
      commons/src/main/java/com/jzg/commons/entity/po/InsFeeOrders.java
  6. 0 2
      commons/src/main/java/com/jzg/commons/entity/po/InsTaskImages.java
  7. 2 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementCost.java
  8. 46 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  9. 25 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java
  10. 26 0
      commons/src/main/java/com/jzg/commons/entity/vo/CostsListVo.java
  11. 2 2
      commons/src/main/java/com/jzg/commons/entity/vo/ImagesVo.java
  12. 0 3
      commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostTypeVo.java
  13. 396 0
      commons/src/main/java/com/jzg/commons/entity/vo/RuleAttrMappingVo.java
  14. 17 0
      commons/src/main/java/com/jzg/commons/entity/vo/SalesmanVo.java
  15. 17 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/CostsRuleClient.java
  16. 18 4
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  17. 10 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/QuoteVerification.java
  18. 831 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  19. 8 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsTaskImagesController.java
  20. 3 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  21. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsFeeOrdersMapper.java
  22. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersAccidentalDrivingMapper.java
  23. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java
  24. 7 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersAccidentalDrivingService.java
  25. 1 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java
  26. 4 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsTaskImagesService.java
  27. 16 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java
  28. 16 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersAccidentalDrivingServiceImpl.java
  29. 54 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  30. 12 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsTaskImagesServiceImpl.java
  31. 7 1
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  32. 20 0
      tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementCostController.java
  33. 10 0
      tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java
  34. 3 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/PtlAgreementCostMapper.java
  35. 4 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/PtlAgreementCostTypeMapper.java
  36. 3 1
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java
  37. 3 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java
  38. 4 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java
  39. 6 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java
  40. 8 3
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostTypeServiceImpl.java
  41. 12 3
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java
  42. 2 0
      tenant/organization/src/main/resources/application.yml
  43. 39 2
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  44. 17 0
      tenant/organization/src/main/resources/mapper/PtlAgreementCostTypeMapper.xml
  45. 3 2
      tenant/organization/src/main/resources/mapper/PtlAgreementMapper.xml
  46. 14 0
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

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

@@ -14,5 +14,8 @@ public class CostAgreementParam {
     @Schema(description = "承保规则ID")
     private String coverRuleId;
 
+    @Schema(description = "产品ID")
+    private String productId;
+
 
 }

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersAccidentalDriving.java

@@ -23,4 +23,6 @@ public class InsOrdersAccidentalDriving {
     @Schema(description = "驾意险名称")
     private String riskName;
 
+    @Schema(description = "驾意险份数")
+    private String quantity;
 }

+ 15 - 2
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersOther.java

@@ -40,14 +40,17 @@ public class InsOrdersOther {
     private byte syRenewal;
 
     @Schema(description = "交强出险次数")
-    private byte jqClaims;
+    private Integer jqClaims;
 
     @Schema(description = "商业出险次数")
-    private byte syClaims;
+    private Integer syClaims;
 
     @Schema(description = "是否是真假单交")
     private byte isDjq;
 
+    @Schema(description = "总折扣率")
+    private BigDecimal totalAdjustRate;
+
     @Schema(description = "交强折扣")
     private BigDecimal jqAdjustRate;
 
@@ -57,4 +60,14 @@ public class InsOrdersOther {
     @Schema(description = "太平绿黄红区间评分")
     private String tpColorScore;
 
+    @Schema(description = "紫金鼎然分")
+    private String ubiPredictedInfoScore;
+
+    @Schema(description = "阳光交商合并经营成本率")
+    private String mergeCostRate;
+
+    @Schema(description = "商业险是否有费用")
+    private String ciMessage;
+
+
 }

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersPdfUrl.java

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.orders.po;
 
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -12,6 +13,7 @@ import java.time.LocalDateTime;
 public class InsOrdersPdfUrl {
 
     @Schema(description = "订单号")
+    @TableId
     private String orderNo;
 
     @Schema(description = "险种信息")

+ 285 - 0
commons/src/main/java/com/jzg/commons/entity/po/InsFeeOrders.java

@@ -0,0 +1,285 @@
+package com.jzg.commons.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jzg.commons.entity.vo.PtlAgreementCostTypeVo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/7/2 16:59
+ */
+
+@Data
+@Schema(description = "订单费用表")
+@TableName("ins_fee_orders")
+public class InsFeeOrders {
+    @Schema(description = "订单号")
+    @TableId
+    private String orderNo;
+
+    @Schema(description = "协议id")
+    private String agreementId;
+
+    @Schema(description = "费用id")
+    private String costId;
+
+    @Schema(description = "交强险保费")
+    private BigDecimal jqPremium;
+
+    @Schema(description = "商业险保费")
+    private BigDecimal syPremium;
+
+    @Schema(description = "驾意险保费")
+    private BigDecimal jyPremium;
+
+    @Schema(description = "总保费")
+    private BigDecimal totalPremium;
+
+    @Schema(description = "交强险应收保费")
+    private BigDecimal jqReceivablePremium;
+
+    @Schema(description = "商业险应收保费")
+    private BigDecimal syReceivablePremium;
+
+    @Schema(description = "驾意险应收保费")
+    private BigDecimal jyReceivablePremium;
+
+    @Schema(description = "总应收保费")
+    private BigDecimal totalReceivablePremium;
+
+    @Schema(description = "交强险应付保费")
+    private BigDecimal jqPayablePremium;
+
+    @Schema(description = "商业险应付保费")
+    private BigDecimal syPayablePremium;
+
+    @Schema(description = "驾意险应付保费")
+    private BigDecimal jyPayablePremium;
+
+    @Schema(description = "总应付保费")
+    private BigDecimal totalPayablePremium;
+
+    @Schema(description = "交强险手续费费用")
+    private BigDecimal jqCommissionPremium;
+
+    @Schema(description = "商业险手续费费用")
+    private BigDecimal syCommissionPremium;
+
+    @Schema(description = "驾意险手续费费用")
+    private BigDecimal jyCommissionPremium;
+
+    @Schema(description = "交强险跟单费费用")
+    private BigDecimal jqFollowPremium;
+
+    @Schema(description = "商业险跟单费费用")
+    private BigDecimal syFollowPremium;
+
+    @Schema(description = "驾意险跟单费费用")
+    private BigDecimal jyFollowPremium;
+
+    @Schema(description = "交强险加投费费费用")
+    private BigDecimal jqAdditionalPremium;
+
+    @Schema(description = "商业险加投费费费用")
+    private BigDecimal syAdditionalPremium;
+
+    @Schema(description = "驾意险加投费费费用")
+    private BigDecimal jyAdditionalPremium;
+//    // 获取协议录入的 手续费比例 保留百分比
+//    BigDecimal jqEntranceFeeRatio = agreementInfoVo.getAgreement().getJqEntranceFeeRatio().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//    BigDecimal syEntranceFeeRatio = agreementInfoVo.getAgreement().getSyEntranceFeeRatio().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//    BigDecimal jyEntranceFeeRatio = agreementInfoVo.getAgreement().getJyEntranceFeeRatio().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//    // 开始计算费用
+//    // 通过费用id查询入口出口比例
+//    List<PtlAgreementCostTypeVo> costTypeList = orgClient.queryByCostId(costId);
+//    PtlAgreementCostTypeVo jqCostType = costTypeList.stream().filter(c -> "交强险".equals(c.getCostType())).findFirst().orElse(null);
+//    PtlAgreementCostTypeVo syCostType = costTypeList.stream().filter(c -> "商业险".equals(c.getCostType())).findFirst().orElse(null);
+//    PtlAgreementCostTypeVo jyCostType = costTypeList.stream().filter(c -> "驾意险".equals(c.getCostType())).findFirst().orElse(null);
+//    // 计算跟单费比例 入口比例 - 手续费比例 = 跟单比例 (保留百分比)
+//    BigDecimal jqFollowRatio = (jqCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN).subtract(jqEntranceFeeRatio));
+//    BigDecimal syFollowRatio = (syCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN).subtract(syEntranceFeeRatio));
+//    BigDecimal jyFollowRatio = (jyCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN).subtract(jyEntranceFeeRatio));
+//    // 当协议是平台协议时
+//        if (agreementType.equals("1")) {
+//        // 初始化交强应收 应付金额
+//        BigDecimal jqReceivablePremium = BigDecimal.ZERO;
+//        BigDecimal jqPayablePremium = BigDecimal.ZERO;
+//        // 交强险保费 * 入口手续费比例 + 交强险保费 * 跟单费比例 + 交强险保费 * 加投比例 = 交强应收(不含车船税);
+//        // 交强险保费 * 出口比例 = 交强应付;
+//        if (jqCostType != null) {
+//            // 转换百分比
+//            BigDecimal inletPercent = jqCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal addThrowPercent = jqCostType.getAddThrow().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal exportPercent = jqCostType.getExport().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            // 交强应收
+//            jqReceivablePremium = insOrdersCosts.getJqPremium().multiply(inletPercent)
+//                    .add(insOrdersCosts.getJqPremium().multiply(addThrowPercent))
+//                    .add(insOrdersCosts.getJqPremium().multiply(jqFollowRatio)).setScale(5, RoundingMode.HALF_EVEN);
+//            // 交强应付
+//            jqPayablePremium = insOrdersCosts.getJqPremium().multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+//            // 交强手续费费用
+//            insFeeOrders.setJqCommissionPremium(insOrdersCosts.getJqPremium().multiply(jqEntranceFeeRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 交强跟单费费用
+//            insFeeOrders.setJqFollowPremium(insOrdersCosts.getJqPremium().multiply(jqFollowRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 交强加投费费用
+//            insFeeOrders.setJqAdditionalPremium(insOrdersCosts.getJqPremium().multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN));
+//        }
+//        insFeeOrders.setJqReceivablePremium(jqReceivablePremium);
+//        insFeeOrders.setJqPayablePremium(jqPayablePremium);
+//
+//        // 初始化商业应收 应付金额
+//        BigDecimal syReceivablePremium = BigDecimal.ZERO;
+//        BigDecimal syPayablePremium = BigDecimal.ZERO;
+//        // 商业险保费 * 入口手续费比例 + 商业险保费 * 跟单费比例 + 商业险保费 * 加投比例 = 商业应收
+//        // 商业险保费 * 出口比例 = 商业应付;
+//        if (syCostType != null) {
+//            // 转换百分比
+//            BigDecimal inletPercent = syCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal addThrowPercent = syCostType.getAddThrow().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal exportPercent = syCostType.getExport().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            // 商业应收
+//            syReceivablePremium = insOrdersCosts.getSyPremium().multiply(inletPercent)
+//                    .add(insOrdersCosts.getSyPremium().multiply(addThrowPercent))
+//                    .add(insOrdersCosts.getSyPremium().multiply(syFollowRatio)).setScale(5, RoundingMode.HALF_EVEN);
+//            // 商业应付
+//            syPayablePremium = insOrdersCosts.getSyPremium().multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+//            // 商业手续费费用
+//            insFeeOrders.setSyCommissionPremium(insOrdersCosts.getSyPremium().multiply(syEntranceFeeRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 商业跟单费费用
+//            insFeeOrders.setSyFollowPremium(insOrdersCosts.getSyPremium().multiply(syFollowRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 商业加投费费用
+//            insFeeOrders.setSyAdditionalPremium(insOrdersCosts.getSyPremium().multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN));
+//        }
+//        insFeeOrders.setSyReceivablePremium(syReceivablePremium);
+//        insFeeOrders.setSyPayablePremium(syPayablePremium);
+//
+//        // 初始化驾意应收 应付金额
+//        BigDecimal jyReceivablePremium = BigDecimal.ZERO;
+//        BigDecimal jyPayablePremium = BigDecimal.ZERO;
+//        // 驾意险保费 * 入口手续费比例 + 驾意险保费 * 跟单费比例 + 驾意险保费 * 加投比例 = 商业应收
+//        // 驾意险保费 * 出口比例 = 驾意险应付;
+//        if (jyCostType != null) {
+//            // 转换百分比
+//            BigDecimal inletPercent = jyCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal addThrowPercent = jyCostType.getAddThrow().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal exportPercent = jyCostType.getExport().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            // 驾意应收
+//            jyReceivablePremium = insOrdersCosts.getJyPremium().multiply(inletPercent)
+//                    .add(insOrdersCosts.getJyPremium().multiply(addThrowPercent))
+//                    .add(insOrdersCosts.getJyPremium().multiply(jyFollowRatio)).setScale(5, RoundingMode.HALF_EVEN);
+//            // 驾意应付
+//            jyPayablePremium = insOrdersCosts.getJyPremium().multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+//            // 驾意手续费费用
+//            insFeeOrders.setJyCommissionPremium(insOrdersCosts.getJyPremium().multiply(jyEntranceFeeRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 驾意跟单费费用
+//            insFeeOrders.setJyFollowPremium(insOrdersCosts.getJyPremium().multiply(jyFollowRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 驾意加投费费用
+//            insFeeOrders.setJyAdditionalPremium(insOrdersCosts.getJyPremium().multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN));
+//        }
+//        insFeeOrders.setJyReceivablePremium(jyReceivablePremium);
+//        insFeeOrders.setJyPayablePremium(jyPayablePremium);
+//        // 应收总金额
+//        BigDecimal totalReceivablePremium = jqReceivablePremium.add(syReceivablePremium).add(jyReceivablePremium).setScale(5, RoundingMode.HALF_EVEN);
+//        insFeeOrders.setTotalReceivablePremium(totalReceivablePremium);
+//        // 应付总金额
+//        BigDecimal totalPayablePremium = jqPayablePremium.add(syPayablePremium).add(jyPayablePremium).setScale(2, RoundingMode.DOWN);
+//        insFeeOrders.setTotalPayablePremium(totalPayablePremium);
+//        insFeeOrdersService.save(insFeeOrders);
+//    }
+//    // 当协议类型是私有协议时
+//        if (!agreementType.equals("1")) {
+//        // 固定税收 1.06
+//        BigDecimal fixedTax = new BigDecimal("1.06");
+//        // 初始化交强应收 应付金额
+//        BigDecimal jqReceivablePremium = BigDecimal.ZERO;
+//        BigDecimal jqPayablePremium = BigDecimal.ZERO;
+//        // 交强险保费 * 入口手续费比例 + 交强险保费 * 跟单费比例 + 交强险保费 * 加投比例 = 交强应收(不含车船税);
+//        // 交强险保费 * 出口比例 = 交强应付;
+//        if (jqCostType != null) {
+//            // 转换百分比
+//            BigDecimal inletPercent = jqCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal addThrowPercent = jqCostType.getAddThrow().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal exportPercent = jqCostType.getExport().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            // 交强应收
+//            jqReceivablePremium = (insOrdersCosts.getJqPremium().divide(fixedTax)).multiply(inletPercent)
+//                    .add((insOrdersCosts.getJqPremium().divide(fixedTax)).multiply(addThrowPercent))
+//                    .add((insOrdersCosts.getJqPremium().divide(fixedTax)).multiply(jqFollowRatio)).setScale(5, RoundingMode.HALF_EVEN);
+//            // 交强应付
+//            jqPayablePremium = insOrdersCosts.getJqPremium().multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+//            // 交强手续费费用
+//            insFeeOrders.setJqCommissionPremium(insOrdersCosts.getJqPremium().multiply(jqEntranceFeeRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 交强跟单费费用
+//            insFeeOrders.setJqFollowPremium(insOrdersCosts.getJqPremium().multiply(jqFollowRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 交强加投费费用
+//            insFeeOrders.setJqAdditionalPremium(insOrdersCosts.getJqPremium().multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN));
+//        }
+//        insFeeOrders.setJqReceivablePremium(jqReceivablePremium);
+//        insFeeOrders.setJqPayablePremium(jqPayablePremium);
+//
+//        // 初始化商业应收 应付金额
+//        BigDecimal syReceivablePremium = BigDecimal.ZERO;
+//        BigDecimal syPayablePremium = BigDecimal.ZERO;
+//        // 商业险保费 * 入口手续费比例 + 商业险保费 * 跟单费比例 + 商业险保费 * 加投比例 = 商业应收
+//        // 商业险保费 * 出口比例 = 商业应付;
+//        if (syCostType != null) {
+//            // 转换百分比
+//            BigDecimal inletPercent = syCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal addThrowPercent = syCostType.getAddThrow().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal exportPercent = syCostType.getExport().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            // 商业应收
+//            syReceivablePremium = (insOrdersCosts.getSyPremium().divide(fixedTax)).multiply(inletPercent)
+//                    .add((insOrdersCosts.getSyPremium().divide(fixedTax)).multiply(addThrowPercent))
+//                    .add((insOrdersCosts.getSyPremium().divide(fixedTax)).multiply(syFollowRatio)).setScale(5, RoundingMode.HALF_EVEN);
+//            // 商业应付
+//            syPayablePremium = insOrdersCosts.getSyPremium().multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+//            // 商业手续费费用
+//            insFeeOrders.setSyCommissionPremium(insOrdersCosts.getSyPremium().multiply(syEntranceFeeRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 商业跟单费费用
+//            insFeeOrders.setSyFollowPremium(insOrdersCosts.getSyPremium().multiply(syFollowRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 商业加投费费用
+//            insFeeOrders.setSyAdditionalPremium(insOrdersCosts.getSyPremium().multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN));
+//        }
+//        insFeeOrders.setSyReceivablePremium(syReceivablePremium);
+//        insFeeOrders.setSyPayablePremium(syPayablePremium);
+//
+//        // 初始化驾意应收 应付金额
+//        BigDecimal jyReceivablePremium = BigDecimal.ZERO;
+//        BigDecimal jyPayablePremium = BigDecimal.ZERO;
+//        // 驾意险保费 * 入口手续费比例 + 驾意险保费 * 跟单费比例 + 驾意险保费 * 加投比例 = 商业应收
+//        // 驾意险保费 * 出口比例 = 驾意险应付;
+//        if (jyCostType != null) {
+//            // 转换百分比
+//            BigDecimal inletPercent = jyCostType.getInlet().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal addThrowPercent = jyCostType.getAddThrow().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            BigDecimal exportPercent = jyCostType.getExport().divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+//            // 驾意应收
+//            jyReceivablePremium = (insOrdersCosts.getJyPremium().divide(fixedTax)).multiply(inletPercent)
+//                    .add((insOrdersCosts.getJyPremium().divide(fixedTax)).multiply(addThrowPercent))
+//                    .add((insOrdersCosts.getJyPremium().divide(fixedTax)).multiply(jyFollowRatio)).setScale(5, RoundingMode.HALF_EVEN);
+//            // 驾意应付
+//            jyPayablePremium = insOrdersCosts.getJyPremium().multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+//            // 驾意手续费费用
+//            insFeeOrders.setJyCommissionPremium(insOrdersCosts.getJyPremium().multiply(jyEntranceFeeRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 驾意跟单费费用
+//            insFeeOrders.setJyFollowPremium(insOrdersCosts.getJyPremium().multiply(jyFollowRatio).setScale(5, RoundingMode.HALF_EVEN));
+//            // 驾意加投费费用
+//            insFeeOrders.setJyAdditionalPremium(insOrdersCosts.getJyPremium().multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN));
+//        }
+//        insFeeOrders.setJyReceivablePremium(jyReceivablePremium);
+//        insFeeOrders.setJyPayablePremium(jyPayablePremium);
+//        // 应收总金额
+//        BigDecimal totalReceivablePremium = jqReceivablePremium.add(syReceivablePremium).add(jyReceivablePremium).setScale(5, RoundingMode.HALF_EVEN);
+//        insFeeOrders.setTotalReceivablePremium(totalReceivablePremium);
+//        // 应付总金额
+//        BigDecimal totalPayablePremium = jqPayablePremium.add(syPayablePremium).add(jyPayablePremium).setScale(2, RoundingMode.DOWN);
+//        insFeeOrders.setTotalPayablePremium(totalPayablePremium);
+//        insFeeOrdersService.save(insFeeOrders);
+//
+//    }
+}

+ 0 - 2
commons/src/main/java/com/jzg/commons/entity/po/InsTaskImages.java

@@ -23,7 +23,5 @@ public class InsTaskImages extends BaseModel {
 
     private String imageId;
 
-    private String sort;
-
 
 }

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementCost.java

@@ -34,6 +34,8 @@ public class PtlAgreementCost extends BaseModel {
 
     private Date failureTime;
 
+    private Integer priorityLevel;
+
     private int auditMethod;
 
     private String costDescribe;

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

@@ -1,14 +1,18 @@
 package com.jzg.commons.entity.quote.vo.aggregated;
 
 
+import com.jzg.commons.entity.orders.po.InsOrdersQrcode;
 import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.entity.scheme.vo.PtlAgreementInsCompanyVo;
 import com.jzg.commons.constants.quote.enums.quote.RiskCode;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
+import com.jzg.commons.entity.vo.ImagesVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -42,6 +46,7 @@ public class QuoteEchoVo extends QuoteVo {
         private String companyName;
         private String productsName;
         private String agreementName;
+        private String agreementType;
         private String createBy;
         private String createTime;
         private String quoteTime;
@@ -79,6 +84,8 @@ public class QuoteEchoVo extends QuoteVo {
         private String deptName;
     }
 
+
+
     /**
      * 费用信息
      */
@@ -127,7 +134,20 @@ public class QuoteEchoVo extends QuoteVo {
 
         @Schema(description = "驾意险保单号")
         private String niPolicyNumber;
+
+        @Schema(description = "交强险标志地址")
+        private String ciPolicySignUrl;
+
+        @Schema(description = "交强险保单地址")
+        private String ciPolicyUrl;
+
+        @Schema(description = "商业险保单地址")
+        private String biPolicyUrl;
+
+        @Schema(description = "驾意险保单地址")
+        private String niPolicyUrl;
     }
+
     //保单号信息
     private OrdersPolicyVo policy;
 
@@ -145,6 +165,21 @@ public class QuoteEchoVo extends QuoteVo {
      */
     private String errorMessage;
 
+    /**
+     * 影像资料
+     */
+    private List<ImagesVo> imageVoList;
+
+    /**
+     * 费用信息
+     */
+    private InsFeeOrders insFeeOrders;
+
+    /**
+     * 支付码
+     */
+    private InsOrdersQrcode qrcode;
+
 
     /**
      * 订单数据库查询数据转 QuoteVo对象
@@ -157,6 +192,7 @@ public class QuoteEchoVo extends QuoteVo {
         this.setOrdersNo(insOrdersVo.getId());
         this.getOrder().setAgreementId(insOrdersVo.getInsOrders().getAgreementId());
         this.getOrder().setAgreementName(insOrdersVo.getAgreementName());
+        this.getOrder().setAgreementType(insOrdersVo.getAgreementType());
         this.getOrder().setOrdersNo(insOrdersVo.getId());
         this.getOrder().setQuoteNo(insOrdersVo.getQuoteNo());
         this.getOrder().setInsuranceCompanyCode(insOrdersVo.getCompanyId());
@@ -168,6 +204,11 @@ public class QuoteEchoVo extends QuoteVo {
         this.getOrder().setCreateTime(insOrdersVo.getCreateTime().toString());
         this.getOrder().setQuoteTime(insOrdersVo.getCreateTime().toString());
         this.getOrder().setSigningTime(insOrdersVo.getPayTime());
+        Salesman salesman = new Salesman();
+        salesman.setName(insOrdersVo.getSalesmanInfo().getName());
+        salesman.setDeptName(insOrdersVo.getSalesmanInfo().getDeptName());
+        salesman.setTypeAttr(insOrdersVo.getSalesmanInfo().getTypeAttr());
+        this.setSalesmanInfo(salesman);
         this.setErrorMessage(insOrdersVo.getErrorMessage());
 
         //车辆信息处理
@@ -226,6 +267,11 @@ public class QuoteEchoVo extends QuoteVo {
         this.policy.setBiPolicyNumber(insOrdersVo.getInsOrdersPolicy().getSyPolicyNo());
         this.policy.setNiApplyNumber(insOrdersVo.getInsOrdersPolicy().getJyApplyNo());
         this.policy.setNiPolicyNumber(insOrdersVo.getInsOrdersPolicy().getJyPolicyNo());
+        this.policy.setCiPolicyUrl(insOrdersVo.getInsOrdersPdfUrl().getJqUrl());
+        this.policy.setBiPolicyUrl(insOrdersVo.getInsOrdersPdfUrl().getSyUrl());
+        this.policy.setNiPolicyUrl(insOrdersVo.getInsOrdersPdfUrl().getJyUrl());
+        this.policy.setCiPolicySignUrl(insOrdersVo.getInsOrdersPdfUrl().getJqSignUrl());
+
 
         //评分信息
         this.scoreVo = new QuoteResultsVo.ScoreVo();

+ 25 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java

@@ -3,6 +3,7 @@ package com.jzg.commons.entity.quote.vo.orders;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.entity.orders.po.*;
+import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
 import com.jzg.commons.entity.vo.InsTaskImagesVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -92,6 +93,9 @@ public class InsOrdersVo extends QuoteVo {
     @Schema(description = "保单号信息")
     private InsOrdersPolicy insOrdersPolicy;
 
+    @Schema(description = "电子保单信息")
+    private InsOrdersPdfUrl insOrdersPdfUrl;
+
     @Schema(description = "订单其他信息")
     private InsOrdersOther insOrdersOther;
 
@@ -101,4 +105,25 @@ public class InsOrdersVo extends QuoteVo {
     @Schema(description = "险种信息")
     private List<InsOrdersKind> insOrdersKindList;
 
+    @Schema(description = "业务员信息")
+    private Salesman salesmanInfo;
+
+    @Data
+    public static class Salesman{
+        @Schema(description = "业务员姓名")
+        private String name;
+
+        @Schema(description = "业务员手机号")
+        private String mobile;
+
+        @Schema(description = "业务员类型")
+        private String typeAttr;
+
+        @Schema(description = "业务员归属ID")
+        private String deptId;
+
+        @Schema(description = "业务员归属")
+        private String deptName;
+    }
+
 }

+ 26 - 0
commons/src/main/java/com/jzg/commons/entity/vo/CostsListVo.java

@@ -0,0 +1,26 @@
+package com.jzg.commons.entity.vo;
+
+import com.jzg.commons.entity.po.PtlAgreementCostRule;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/7/1 11:58
+ */
+
+@Data
+@Schema(description = "匹配费用列表VO")
+public class CostsListVo {
+    private String id;
+
+    private String productName;
+
+    private String productId;
+
+    private Integer priorityLevel;
+
+    private List<PtlAgreementCostRule> ptlAgreementCostRuleList;
+}

+ 2 - 2
commons/src/main/java/com/jzg/commons/entity/vo/ImagesVo.java

@@ -17,10 +17,10 @@ public class ImagesVo {
     @Schema(description = "文件存储ID")
     private String imageId;
 
-    @Schema(description = "图片地址")
+    @Schema(description = "图片名称")
     private String fileName;
 
-    @Schema(description = "图片地址")
+    @Schema(description = "图片类型")
     private String fileType;
 
     @Schema(description = "图片地址")

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

@@ -23,9 +23,6 @@ public class PtlAgreementCostTypeVo{
     @Schema(description = "出口比例")
     private BigDecimal export;
 
-    @Schema(description = "手续费")
-    private BigDecimal commission;
-
     @Schema(description = "加投比例")
     private BigDecimal addThrow;
 

+ 396 - 0
commons/src/main/java/com/jzg/commons/entity/vo/RuleAttrMappingVo.java

@@ -0,0 +1,396 @@
+package com.jzg.commons.entity.vo;
+
+import com.jzg.commons.constants.quote.enums.quote.CarKindCode;
+import com.jzg.commons.constants.quote.enums.quote.KindCode;
+import com.jzg.commons.constants.quote.enums.quote.VehicleUseCode;
+import com.jzg.commons.entity.orders.po.*;
+import com.jzg.commons.util.StringUtils;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+/**
+ * @author quchen
+ * @date 2025/7/1 17:10
+ */
+
+@Data
+public class RuleAttrMappingVo {
+    private String attrCode;
+
+    private String value;
+
+    public RuleAttrMappingVo(String attrCode, String value) {
+        this.attrCode = attrCode;
+        this.value = value;
+    }
+
+    public static List<RuleAttrMappingVo> getRuleAttrMappingVoList(InsOrdersOther insOrdersOther,
+                                                                   InsOrdersCarInfo insOrdersCarInfo, List<InsOrdersRisk> riskList,
+                                                                   List<InsOrdersCarUserInfo> insOrdersCarUserInfos, List<InsOrdersKind> kindList,
+                                                                   InsOrdersCosts insOrdersCosts, InsOrdersAccidentalDriving insOrdersAccidentalDriving) {
+        List<RuleAttrMappingVo> ruleAttrMappingVoList = new ArrayList<>();
+        //车牌号
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("LicenseNo", insOrdersCarInfo.getLicenseNo()));
+        //品牌型号
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("BrandandModel", insOrdersCarInfo.getBrandName()));
+        //座位数
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("PassengerCarSeatingCapacity", insOrdersCarInfo.getSeatCount().toString()));
+        //新车购置价
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("PurchasePriceofNewVehicle", insOrdersCarInfo.getPurchasePrice().toString()));
+        //车辆用途
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleUseCode", VehicleUseCode.getByCode(insOrdersCarInfo.getVehicleUseCode())));
+        //车辆种类
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarType", CarKindCode.getByCode(insOrdersCarInfo.getCarKindCode())));
+        //车辆类型
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarTypeCode", insOrdersCarInfo.getCarTypeCode()));
+        //核定载质量
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("AuthorizedLoadWeight", insOrdersCarInfo.getLimitLoad().toString()));
+//        //汽车排量
+//        ruleAttrMappingVoList.add(new RuleAttrMappingVo("EngineCapacity", insOrdersCarInfo.getDisplacement()));
+        //整备质量
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CurbWeight", insOrdersCarInfo.getCompleteKerbMass().toString()));
+        //能源类型
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("NewEnergyMark", insOrdersCarInfo.getEnergyTypeCode()));
+//        //注册日期
+//        ruleAttrMappingVoList.add(new RuleAttrMappingVo("RegistrationDate", insOrdersCarInfo.getRegisterDate()));
+        //是否过户
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("Transfer", String.valueOf(insOrdersCarInfo.getTransfer())));
+        //交强起保日期
+        riskList.stream().filter(risk -> risk.getRiskCode().equals("0507"))
+                .findFirst().ifPresent(risk -> ruleAttrMappingVoList.add(new RuleAttrMappingVo("JqStartTime", risk.getStartDate().toString())));
+        //商业起保日期
+        riskList.stream().filter(risk -> risk.getRiskCode().equals("0510"))
+                .findFirst().ifPresent(risk -> ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyStartTime", risk.getStartDate().toString())));
+
+        LocalDate registrationDate = LocalDateTime.parse(insOrdersCarInfo.getRegisterDate().toString()).toLocalDate();
+        LocalDate currentDate = LocalDate.now();
+        //车龄
+        long between = ChronoUnit.YEARS.between(registrationDate, currentDate) + 1;
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleAge", String.valueOf(between)));
+        //转续保 交强
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("JqRenewalOfInsurance", String.valueOf(insOrdersOther.getJqRenewal())));
+        //转续保 商业
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyRenewalOfInsurance", String.valueOf(insOrdersOther.getSyRenewal())));
+        // 车主
+        InsOrdersCarUserInfo ownerInfo = insOrdersCarUserInfos.stream()
+                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(1)).findFirst().orElse(null);
+        if(StringUtils.isBlank(ownerInfo.getCerType().toString()) || "1".equals(ownerInfo.getCerType().toString())) {
+            //车主 证件号码(前6位)
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("OwnersInfoIdentifyNumber", ownerInfo.getIdentifyNumber()));
+            //车主 年龄
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("OwnersInfoAge", ownerInfo.getAge().toString()));
+            //车主 性别
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("OwnersInfoSex", ownerInfo.getGender().equals("男") ? "1" : "2"));
+        }
+        // 投保人
+        InsOrdersCarUserInfo policyHolderInfo = insOrdersCarUserInfos.stream()
+                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(2)).findFirst().orElse(null);
+        if (StringUtils.isBlank(policyHolderInfo.getCerType().toString()) || "1".equals(policyHolderInfo.getCerType().toString())) {
+            //投保人 证件号码(前6位)
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoIDNumber", policyHolderInfo.getIdentifyNumber()));
+            //投保人 年龄
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoAge", policyHolderInfo.getAge().toString()));
+            //投保人 性别
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoSex", policyHolderInfo.getGender().equals("男") ? "1" : "2"));
+        }
+        //被保人
+        InsOrdersCarUserInfo insuredPersonInfo = insOrdersCarUserInfos.stream()
+                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(3)).findFirst().orElse(null);
+        if (StringUtils.isBlank(insuredPersonInfo.getCerType().toString()) || "1".equals(insuredPersonInfo.getCerType().toString())) {
+            //被保人 证件号码(前6位)
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoIDNumber", insuredPersonInfo.getIdentifyNumber()));
+            //被保人 年龄
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoAge", insuredPersonInfo.getAge().toString()));
+            //被保人 性别
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoSex", insuredPersonInfo.getGender().equals("男") ? "1" : "2"));
+        }
+        String OPIConsistent = "0";
+        if(StringUtils.isNotBlank(ownerInfo.getCerType().toString())){
+            boolean boo = ownerInfo.getCerType().equals(insuredPersonInfo.getCerType()) && insuredPersonInfo.getCerType().equals(policyHolderInfo.getCerType());
+            if(boo){
+                if("1".equals(ownerInfo.getCerType().toString())){
+                    if((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
+                            (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))){
+                        OPIConsistent = "1";
+                    }
+                }else{
+                    if((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
+                            (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))){
+                        OPIConsistent = "1";
+                    }
+                }
+            }
+        }else {
+            if ((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
+                    (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))) {
+                OPIConsistent = "1";
+            }
+        }
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("OPIConsistent",OPIConsistent));
+
+        String PIConsistent = "0";
+        if(StringUtils.isNotBlank(insuredPersonInfo.getCerType().toString())){
+            boolean boo = insuredPersonInfo.getCerType().equals(policyHolderInfo.getCerType());
+            if(boo){
+                if("1".equals(insuredPersonInfo.getCerType().toString())){
+                    //投被保人是否一致
+                    if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())){
+                        PIConsistent = "1";
+                    }
+                }else{
+                    //投被保人是否一致
+                    if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())){
+                        PIConsistent = "1";
+                    }
+                }
+            }
+        }else{
+            //投被保人是否一致
+            if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())){
+                PIConsistent = "1";
+            }
+        }
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("PIConsistent",PIConsistent));
+        // 起保日期 月份判断
+        InsOrdersRisk jqRisk = riskList.stream().filter(risk -> risk.getRiskCode().equals("0507")).findFirst().orElse(null);
+        if (jqRisk != null) {
+            LocalDateTime jqStartDate = LocalDateTime.parse(jqRisk.getStartDate().toString(),DateTimeFormatter.ISO_LOCAL_DATE_TIME);
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("JqStartMonth", String.valueOf(jqStartDate.getMonthValue())));
+        }
+        InsOrdersRisk syRisk = riskList.stream().filter(risk -> risk.getRiskCode().equals("0510")).findFirst().orElse(null);
+        if (syRisk != null) {
+            LocalDateTime syStartDate = LocalDateTime.parse(syRisk.getStartDate().toString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME);
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyStartMonth", String.valueOf(syStartDate.getMonthValue())));
+        }
+
+        kindList.forEach(kind -> {
+            //机动车损失险
+            if (KindCode.A.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("MotorVehicleDamageInsurance", String.valueOf(kind.getAmount())));
+            //第三者责任险
+            if (KindCode.B.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("ThirdPartyLiabilityInsurance",
+                        String.valueOf(kind.getAmount().intValue())));
+            //司机责任险
+            if (KindCode.D3.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("DriverLiabilityInsurance", String.valueOf(kind.getAmount())));
+            //乘客责任险
+            if (KindCode.D4.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("PassengerLiabilityInsurance", String.valueOf(kind.getUnitAmount())));
+            //车身划痕险
+            if (KindCode.L.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarScratchInsurance", String.valueOf(kind.getAmount())));
+            //绝对免赔率特约险(车损)
+            if (KindCode.MJ1.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleDamageAbsoluteDeductibleSpecialInsurance",
+                        String.valueOf(kind.getAmount())));
+            //绝对免赔率特约险(三者)
+            if (KindCode.MJ2.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("ThirdAbsoluteDeductibleSpecialInsurance",
+                        String.valueOf(kind.getAmount())));
+            //绝对免赔率特约险(司机)
+            if (KindCode.MJ3.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("DriverAbsoluteDeductibleSpecialInsurance",
+                        String.valueOf(kind.getAmount())));
+            //绝对免赔率特约险(乘客)
+            if (KindCode.MJ4.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("PassengerAbsoluteDeductibleSpecialInsurance",
+                        String.valueOf(kind.getAmount())));
+            //附加医保-三者
+            if (KindCode.SY_FJ_YBW1.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("ThirdPartyAdditionalMedicalInsurance",
+                        String.valueOf(kind.getAmount())));
+            //附加医保-座位险(乘客)
+            if (KindCode.SY_FJ_YBW2.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("PassengerAdditionalMedicalInsurance",
+                        String.valueOf(kind.getAmount())));
+            //附加医保-座位险(司机)
+            if (KindCode.SY_FJ_YBW3.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("DriverAdditionalMedicalInsurance",
+                        String.valueOf(kind.getAmount())));
+            //法定节假日限额翻倍险
+            if (KindCode.BD.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("LegalHolidayLimitDoublingInsurance",
+                        String.valueOf(kind.getAmount())));
+            //道路救援服务特约条款
+            if (KindCode.TY1.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("RoadsideAssistanceServiceSpecialClause",
+                        String.valueOf(kind.getServiceTimes())));
+            //车辆安全检测特约条款
+            if (KindCode.TY2.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleSafetyInspectionSpecialClause",
+                        String.valueOf(kind.getServiceTimes())));
+            //代为驾驶服务特约条款
+            if (KindCode.TY3.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("SubstituteDrivingServiceSpecialClause",
+                        String.valueOf(kind.getServiceTimes())));
+            //代为送检服务特约条款
+            if (KindCode.TY4.getCode().equals(kind.getKindCode()))
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("SubstituteInspectionServiceSpecialClause",
+                        String.valueOf(kind.getServiceTimes())));
+        });
+        //交强保费
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CompulsoryTrafficAccidentLiabilityInsurancePremium",
+                String.valueOf(insOrdersCosts.getJqPremium())));
+        //车船税
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleandVesselTax", String.valueOf(insOrdersCosts.getTaxPremium())));
+        //非车险
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("NonMotorInsurance", String.valueOf(insOrdersCosts.getJyPremium())));
+        //总折扣率
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("TotalDiscountRate", String.valueOf(insOrdersOther.getTotalAdjustRate())));
+        //交强折扣
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CompulsoryInsuranceDiscount", String.valueOf(insOrdersOther.getJqAdjustRate())));
+        //商业折扣
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CommercialDiscount", String.valueOf(insOrdersOther.getSyAdjustRate())));
+        //数值型总评分
+        Pattern pattern = Pattern.compile("[0-9]*");
+        if (insOrdersOther.getScore() != null) {
+            if (pattern.matcher(insOrdersOther.getScore()).matches()) {
+                //数值型评分
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("NumericalOverallRating", String.valueOf(insOrdersOther.getScore())));
+            } else {
+                //字母型评分
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("CharacterBasedRating", String.valueOf(insOrdersOther.getScore())));
+            }
+        }
+        //交强评分
+        if (insOrdersOther.getJqScore() != null) {
+            if (pattern.matcher(insOrdersOther.getJqScore()).matches()) {
+                //数值型评分
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("CompulsoryInsuranceRating", String.valueOf(insOrdersOther.getJqScore())));
+            } else {
+                //字母型评分
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("JqCharacterBasedRating",
+                        String.valueOf(insOrdersOther.getJqScore())));
+            }
+        }
+        //商业评分
+        if (insOrdersOther.getSyScore() != null) {
+            if (pattern.matcher(insOrdersOther.getSyScore()).matches()) {
+                //数值型评分
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("CommercialRating", String.valueOf(insOrdersOther.getSyScore())));
+            } else {
+                //字母型评分
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyCharacterBasedRating",
+                        String.valueOf(insOrdersOther.getSyScore())));
+            }
+        }
+        //交强赔付率
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CompulsoryInsurancePayoutRate", String.valueOf(insOrdersOther.getJqLossRation())));
+        //商业赔付率
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CommercialPayoutRate", String.valueOf(insOrdersOther.getSyLossRation())));
+        //总赔付率
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("TotalPayoutRate", String.valueOf(insOrdersOther.getLossRation())));
+        //真假单交
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("IsDJQ", String.valueOf(insOrdersOther.getIsDjq())));
+        //紫金鼎然评分
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("UbiPredictedInfoScore", insOrdersOther.getUbiPredictedInfoScore()));
+        // 交强出险次数
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("JqNumberOfClaims", insOrdersOther.getJqClaims() == null ? "0" : insOrdersOther.getJqClaims().toString()));
+        // 商业出险次数
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyNumberOfClaims", insOrdersOther.getSyClaims() == null ? "0" : insOrdersOther.getSyClaims().toString()));
+        // 车牌地区
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("LicenseArea", insOrdersCarInfo.getLicenseNo().substring(0, 1)));
+        // 系数
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("Coefficient", getCoefficient(insOrdersCarInfo, insOrdersCosts).toString()));
+        // 商业是否有费用
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CiMessage", (insOrdersOther.getCiMessage() == null || "".equals(insOrdersOther.getCiMessage())) ? "0" : "1"));
+        //太平绿黄红区
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("GreenYellowAndRedAreas", insOrdersOther.getTpColorScore()));
+        if (insOrdersAccidentalDriving != null) {
+            //非车名称
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("NonCarName", insOrdersAccidentalDriving.getRiskName()));
+            //非车份数
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("NonCarQuantity",
+                    String.valueOf(insOrdersAccidentalDriving.getQuantity())));
+        }
+        //发证日期
+//        ruleAttrMappingVoList.add(new RuleAttrMappingVo("DateofIssuance", carInfo.getIssueDate()));
+        //车长
+//        ruleAttrMappingVoList.add(new RuleAttrMappingVo("VehicleLength", carInfo.getCarLength()));
+        //特种车判断
+        // ruleAttrMappingVoList.add(new RuleAttrMappingVo("SpecialVehicle", Objects.nonNull(carInfo.getImportFlag()) && carInfo.getImportFlag().equals("特种车类") ? "1" : "0"));
+        //是否新车
+        //使用注册日期算出自然月 然后判断是否是新旧车
+//        boolean isNoLicenseFlag = false;
+//        if (carJudgeRule != null) {
+//            if (carJudgeRule.getUnitTypeCode().equals("天")) {
+//                long days = ChronoUnit.DAYS.between(registrationDate, currentDate);
+//                if (days < Integer.parseInt(carJudgeRule.getUnitTypeValue())) {
+//                    isNoLicenseFlag = true;
+//                }
+//            }
+//            if (carJudgeRule.getUnitTypeCode().equals("月")) {
+//                long months = ChronoUnit.MONTHS.between(registrationDate, currentDate);
+//                if (months < Integer.parseInt(carJudgeRule.getUnitTypeValue())) {
+//                    isNoLicenseFlag = true;
+//                }
+//            }
+//        }
+//        ruleAttrMappingVoList.add(new RuleAttrMappingVo("NewAndOldCars", isNoLicenseFlag ? "1" : "0"));
+        return ruleAttrMappingVoList;
+    }
+
+    private static Float getCoefficient(InsOrdersCarInfo carInfo,InsOrdersCosts insOrdersCosts) {
+        Integer seatCount = carInfo.getSeatCount();
+        Float coefficient = 1.00f;
+        //家庭自用车
+        if (carInfo.getCarKindCode().equals(CarKindCode.CAR_KIND_CODE_A0.getCode()) &&
+                carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_05.getCode())) {
+            //2-5座
+            if (seatCount >= 2 && seatCount <= 5) {
+                coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 950;
+            }
+            //6-9座
+            if (seatCount >= 6 && seatCount <= 9) {
+                coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 1100;
+            }
+        } else
+            //非营业机关、企业
+            if (carInfo.getCarKindCode().equals(CarKindCode.CAR_KIND_CODE_A0.getCode()) &&
+                    (carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_06.getCode()) ||
+                            carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_07.getCode()))) {
+                //2-5座
+                if (seatCount >= 2 && seatCount <= 5) {
+                    coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 1000;
+                }
+                //6-9座
+                if (seatCount >= 6 && seatCount <= 9) {
+                    coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 1130;
+                }
+            } else
+                //出租车 网约车
+                if (carInfo.getCarKindCode().equals(CarKindCode.CAR_KIND_CODE_A0.getCode()) &&
+                        carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_01.getCode())) {
+                    coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 1800;
+                }else
+                //货车
+                if (carInfo.getCarKindCode().equals(CarKindCode.CAR_KIND_CODE_A0.getCode())) {
+                    //营业货运 2吨
+                    if (carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_04.getCode()) &&
+                            Integer.parseInt(carInfo.getLimitLoad().toString()) < 2000) {
+                        coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 1850;
+                    }
+
+                    //非营业货运 2吨
+                    if (carInfo.getVehicleUseCode().equals(VehicleUseCode.VEHICLE_USE_CODE_08.getCode()) &&
+                            Integer.parseInt(carInfo.getLimitLoad().toString()) < 2000) {
+                        coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 1200;
+                    }
+
+                    //大吨位
+                    if (Integer.parseInt(carInfo.getLimitLoad().toString()) > 2000) {
+                        coefficient = Float.parseFloat(insOrdersCosts.getJqPremium().toString()) / 4480;
+                    }
+                }
+        return coefficient;
+    }
+}

+ 17 - 0
commons/src/main/java/com/jzg/commons/entity/vo/SalesmanVo.java

@@ -0,0 +1,17 @@
+package com.jzg.commons.entity.vo;
+
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/7/4 10:23
+ */
+
+@Data
+public class SalesmanVo {
+    private String name;
+
+    private String deptName;
+
+    private String typeAttr;
+}

+ 17 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/CostsRuleClient.java

@@ -0,0 +1,17 @@
+package com.jzg.quotation.commons.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.costs.vo.ValidateSchemeRuleVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name="jzg-costsorrule",url = "http://localhost:8001/")
+public interface CostsRuleClient {
+
+
+
+    @PostMapping("/validate/rule/validateSchemeRule")
+    public HttpResult validateSchemeRule(@RequestBody ValidateSchemeRuleVo validateSchemeRuleVo);
+
+}

+ 18 - 4
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -1,19 +1,20 @@
 package com.jzg.quotation.commons.client;
 
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostAgreementParam;
 import com.jzg.commons.entity.dto.MessageAddParam;
 import com.jzg.commons.entity.enums.MessageCodeEnum;
 import com.jzg.commons.entity.po.PtlAgreement;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
 import com.jzg.commons.entity.po.SysMessageTemplate;
-import com.jzg.commons.entity.vo.AgreementInfoVo;
-import com.jzg.commons.entity.vo.PersonAreaVo;
-import com.jzg.commons.entity.vo.PtlAgreementCostVo;
+import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
+import com.jzg.commons.entity.vo.*;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
-@FeignClient(name="jzg-organization",url = "http://192.168.0.250:8084/")
+@FeignClient(name="jzg-organization",url = "http://localhost:8084/")
 public interface OrgClient {
 
     /**
@@ -53,4 +54,17 @@ public interface OrgClient {
     public HttpResult<AgreementInfoVo> queryAgreementById(@RequestParam String id,
                                                           @RequestHeader("Authorization") String authToken,
                                                           @RequestHeader("system_code") String systemCode);
+
+    @PostMapping(value = "/ptlAgreementCost/queryByAgreementIdAndProductId")
+    public List<CostsListVo> queryByAgreementIdAndProductId(@RequestBody CostAgreementParam costAgreementParam,
+                                                            @RequestHeader("Authorization") String authToken);
+
+    @GetMapping(value = "/pltAgreement/attr/list")
+    public HttpResult<List<PtlAgreementUndwrtRulesAttr>> list();
+
+    @GetMapping(value = "/ptlAgreementCost/queryByCostId")
+    public List<PtlAgreementCostTypeVo> queryByCostId(@RequestParam String costId);
+
+    @GetMapping(value = "/userInfo/getUserByMobile")
+    public SalesmanVo getUserByMobile(@RequestParam String mobile, @RequestHeader("Authorization") String authToken);
 }

+ 10 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/QuoteVerification.java

@@ -0,0 +1,10 @@
+package com.jzg.quotation.summary.aop;
+
+public @interface QuoteVerification {
+
+    String value() default "报价注解拦截";
+
+}
+
+
+

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

@@ -0,0 +1,831 @@
+package com.jzg.quotation.summary.aop.aspect;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.commons.constants.ProductsType;
+import com.jzg.commons.constants.quote.enums.quote.CarKindCode;
+import com.jzg.commons.constants.quote.enums.quote.CarNatureCode;
+import com.jzg.commons.constants.quote.enums.quote.EnergyTypeCode;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.CostAgreementParam;
+import com.jzg.commons.entity.orders.po.*;
+import com.jzg.commons.entity.po.*;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.entity.vo.AgreementInfoVo;
+import com.jzg.commons.entity.vo.CostsListVo;
+import com.jzg.commons.entity.vo.PtlAgreementCostTypeVo;
+import com.jzg.commons.entity.vo.RuleAttrMappingVo;
+import com.jzg.quotation.commons.client.OrgClient;
+import com.jzg.quotation.summary.service.*;
+import lombok.RequiredArgsConstructor;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.BiConsumer;
+
+/**
+ * @author quchen
+ * @date 2025/6/30 17:50
+ */
+
+@Aspect
+@Component
+@RequiredArgsConstructor
+public class QuoteVerificationAspect {
+    private final InsOrdersService insOrdersService;
+
+    private final InsOrdersRiskService insOrdersRiskService;
+
+    private final InsOrdersCostsService insOrdersCostsService;
+
+    private final InsOrdersCarInfoService insOrdersCarInfoService;
+
+    private final InsOrdersCarUserInfoService insOrdersCarUserInfoService;
+
+    private final InsOrdersKindService insOrdersKindService;
+
+    private final InsOrdersAccidentalDrivingService insOrdersAccidentalDrivingService;
+
+    private final OrgClient orgClient;
+
+    private final InsOrdersOtherService insOrdersOtherService;
+
+    private final InsFeeOrdersService insFeeOrdersService;
+    private static final Logger log = LoggerFactory.getLogger("fee");
+
+    private final BaseController baseController;
+
+    @AfterReturning(pointcut = "@annotation(com.jzg.quotation.summary.aop.QuoteVerification)", returning = "result")
+    public void doAfter(HttpResult<QuoteResultsVo> result) {
+        if (result.getCode() == 200) {
+            StringBuilder logs = new StringBuilder();
+            InsOrders insOrders = insOrdersService.getById(result.getData().getOrdersNo());
+            // 获取订单车辆信息
+            InsOrdersCarInfo insOrdersCarInfo = insOrdersCarInfoService.getById(insOrders.getId());
+            // 获取订单险种信息
+            List<InsOrdersRisk> insOrdersRisks = insOrdersRiskService.list(new LambdaQueryWrapper<InsOrdersRisk>().eq(InsOrdersRisk::getOrderNo, insOrders.getId()));
+            // 获取订单车主、投被保人信息
+            List<InsOrdersCarUserInfo> insOrdersCarUserInfos = insOrdersCarUserInfoService.list(new LambdaQueryWrapper<InsOrdersCarUserInfo>().eq(InsOrdersCarUserInfo::getOrderNo, insOrders.getId()));
+            // 获取订单费用信息
+            InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
+            // 获取订单险种信息
+            List<InsOrdersKind> kindList = insOrdersKindService.list(new LambdaQueryWrapper<InsOrdersKind>().eq(InsOrdersKind::getOrderNo, insOrders.getId()));
+            // 获取订单驾意险信息
+            InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getById(insOrders.getId());
+            // 获取订单其他信息
+            InsOrdersOther insOrdersOther = insOrdersOtherService.getById(insOrders.getId());
+            // 获取协议信息
+            HttpResult<AgreementInfoVo> ptlAgreement = orgClient.queryAgreementById(insOrders.getAgreementId(), baseController.getToken(),baseController.getAppSystemCode());
+            AgreementInfoVo agreementInfoVo = ptlAgreement.getData();
+            // 通过协议id和产品id查询费用列表
+            CostAgreementParam costAgreementParam = new CostAgreementParam();
+            costAgreementParam.setPtlAgreementId(insOrders.getAgreementId());
+            costAgreementParam.setProductId(insOrders.getProductId());
+            List<CostsListVo> costsList = orgClient.queryByAgreementIdAndProductId(costAgreementParam, baseController.getToken());
+            List<CostsListVo> agreementProductCosts = new ArrayList<>();
+            // 通过费用规则遍历 按优先级匹配 校验通过的费用
+            costsList.forEach(costsListVo -> {
+                AtomicBoolean matching = new AtomicBoolean(true);
+                costsListVo.getPtlAgreementCostRuleList().forEach(ptlAgreementCostRule -> {
+                    //判断能源类型是 燃油/新能源
+                    if (ptlAgreementCostRule.getAttrCode().equals("NewEnergyMark")) {
+                        String energyType =  EnergyTypeCode.isNewEnergy(insOrdersCarInfo.getEnergyTypeCode()) ? "1" : "0";
+                        if(!ptlAgreementCostRule.getMin().equals(energyType)) {
+                            matching.set(false);
+                        }
+                    }
+                    //判断使用性质是 营业/非营业
+                    if (ptlAgreementCostRule.getAttrCode().equals("CarNatureCode")) {
+                        String[] split = ptlAgreementCostRule.getMin().split(",");
+                        boolean isPipei = false;
+                        for(int i = 0;i < split.length; i++){
+                            if(split[i].equals(CarNatureCode.getByCode(insOrdersCarInfo.getCarNatureCode()))) {
+                                isPipei = true;
+                            }
+                        }
+                        if(!isPipei){
+                            matching.set(false);
+                        }
+                    }
+                    //车辆种类是  客车/货车
+                    if(ptlAgreementCostRule.getAttrCode().equals("CarKindCode")) {
+                        String[] split = ptlAgreementCostRule.getMin().split(",");
+                        boolean isPipei = false;
+                        for(int i = 0;i < split.length; i++){
+                            if(split[i].equals(CarKindCode.getByCode(insOrdersCarInfo.getCarKindCode()))) {
+                                isPipei = true;
+                            }
+                        }
+                        if(!isPipei){
+                            matching.set(false);
+                        }
+                    }
+                });
+                if(matching.get()){
+                    agreementProductCosts.add(costsListVo);
+                }
+            });
+            // 若优先级为空 添加优先级
+            for (int i = 0; i < agreementProductCosts.size(); i++) {
+                if (agreementProductCosts.get(i).getPriorityLevel() == null) {
+                    agreementProductCosts.get(i).setPriorityLevel(10);
+                }
+            }
+            if (!agreementProductCosts.isEmpty()) {
+                //按优先级进行排序
+                agreementProductCosts.sort(Comparator.comparingInt(CostsListVo::getPriorityLevel));
+                //遍历费用因子
+                String costId = verificationCosts(agreementProductCosts, logs, insOrdersOther, insOrdersCarInfo, insOrdersRisks, insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving);
+                if (costId != null) {
+                    // 根据匹配到的协议、费用 开始计算入口费用
+                    calcCosts(agreementInfoVo,costId, insOrders,insOrdersCosts);
+                    log.debug("费用因子校验通过,子订单id:" + insOrders.getId() + ",费用id:" + costId);
+                }
+            } else {
+                logs.append("没有找到该协议的费用信息" + "\n");
+            }
+        }
+    }
+
+    private String verificationCosts(List<CostsListVo> agreementProductCosts,StringBuilder logs,
+                                     InsOrdersOther insOrdersOther, InsOrdersCarInfo insOrdersCarInfo,
+                                     List<InsOrdersRisk> riskList, List<InsOrdersCarUserInfo> insOrdersCarUserInfos,
+                                     List<InsOrdersKind> kindList, InsOrdersCosts insOrdersCosts,
+                                     InsOrdersAccidentalDriving insOrdersAccidentalDriving) {
+        //获取所有费用属性
+        List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = orgClient.list().getData();
+        //获取所有费用属性关联
+        List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(insOrdersOther,insOrdersCarInfo,
+                riskList, insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving);
+
+        for (int i = 0; i < agreementProductCosts.size(); i++) {
+            //判断是否匹配
+//            log.debug("费用因子匹配开始:" + agreementProductCosts.get(i).getId());
+//
+//            log.debug("车牌号:" + insOrdersCarInfo.getLicenseNo());
+//            log.debug("费用因子备注:" + agreementProductCosts.get(i).getCostsDescription());
+//            logs.append("费用id:" + agreementProductCosts.get(i).getId() + "\n");
+//            logs.append("费用因子描述:" + agreementProductCosts.get(i).getCostsDescription() + "\n");
+            if (judgements(agreementProductCosts.get(i).getPtlAgreementCostRuleList(),ruleAttrMappingVoList,undwrtRulesAttrList,logs)) {
+                return agreementProductCosts.get(i).getId();
+            }
+            log.debug("当前费用因子匹配结束\n");
+        }
+        return null;
+    }
+
+    /**
+     * 费用因子的对比
+     */
+    private boolean judgements(List<PtlAgreementCostRule> ptlAgreementCostRuleList,List<RuleAttrMappingVo> ruleAttrMappingVoList, List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList,StringBuilder logs) {
+        boolean useFlag = true;
+        for (PtlAgreementCostRule ptlAgreementProductCostsAttrLink : ptlAgreementCostRuleList) {
+            //查找规则中的 传值属性
+            RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream()
+                    .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
+                    .findFirst()
+                    .orElse(null);
+            //如果查找不到 传值属性 直接费用对比失败
+            if (ruleAttrMappingVo == null) {
+                log.debug("传入的值找不到该属性:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+                log.debug("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+
+
+                List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
+                        .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
+                        .toList();
+                if (!collect.isEmpty()) {
+                    logs.append("规则匹配失败:" + collect.get(0).getAttrName() + "\n");
+                }
+                return false;
+            }
+
+            //查找 费用因子规则
+            PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = undwrtRulesAttrList.stream()
+                    .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
+                    .findFirst()
+                    .get();
+
+            if(!Objects.isNull(ruleAttrMappingVo.getValue())) {
+                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
+            }else{
+                useFlag = false;
+            }
+
+            if (!useFlag) {
+                log.debug("检验的值:" + ptlAgreementProductCostsAttrLink.getMin());
+                log.debug("传入的值:" + ruleAttrMappingVo.getValue());
+                log.debug("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+
+
+                List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
+                        .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
+                        .toList();
+
+                if (ptlAgreementProductCostsAttrLink.getMin() != null) {
+                    logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMin() + "\n");
+                } else {
+                    logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMax() + "\n");
+                }
+
+                logs.append("传入的值:" + ruleAttrMappingVo.getValue() + "\n");
+
+                if (!collect.isEmpty()) {
+                    logs.append("<span style=\"color:red;\">规则匹配失败:" + collect.get(0).getAttrName() + "</span>\n");
+                }
+
+                return false;
+            }
+        }
+        return useFlag;
+    }
+    private boolean attrEqual(PtlAgreementCostRule ptlAgreementCostRule,
+                              PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value) {
+        if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")) {
+            return checkBoxEqual(ptlAgreementCostRule, value);
+        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputNumber")) {
+            return inputNumberEqual(ptlAgreementCostRule, value);
+        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("input")) {
+            //截取身份证号码
+            if (ptlAgreementCostRule.getAttrCode().equals("CarOwnersIDNumber") || ptlAgreementCostRule.getAttrCode().equals("ApplicantIDNumber") ||
+                    ptlAgreementCostRule.getAttrCode().equals("InsuredIDNumber")) {
+                value = value.substring(0, ptlAgreementCostRule.getMin().length());
+            }
+            return inputTextEqual(ptlAgreementCostRule, value);
+        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("select")) {
+            //截取车牌
+            if (ptlAgreementUndwrtRulesAttr.getAttrCode().equals("LicenseNo")) {
+                value = value.substring(0, 2);
+            }
+            return selectEqual(ptlAgreementCostRule, value);
+        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
+            return radioEqual(ptlAgreementCostRule, value);
+        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("datetime")){ // 时间
+            return dateTimeEqual(ptlAgreementCostRule, value);
+        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("date")){
+            return dateEqual(ptlAgreementCostRule, value);
+        }
+
+        return false;
+    }
+
+    /**
+     * 属性为多选判断
+     */
+    private boolean checkBoxEqual(PtlAgreementCostRule ptlAgreementCostRule, String value) {
+        String[] split = ptlAgreementCostRule.getMin().split(",");
+        for (String sp : split) {
+            if (sp.equals(value)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean checkBoxEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
+        if (!ptlAgreementUndwrtRulesAttrLink.getMin().equals(value)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 属性为数值型判断
+     */
+    private boolean inputNumberEqual(PtlAgreementCostRule ptlAgreementCostRule, String value) {
+        double v = Double.parseDouble(value);
+        //统一处理数值
+        if ("1".equals(ptlAgreementCostRule.getOperator())) {
+            if (Double.parseDouble(ptlAgreementCostRule.getMin()) <= v &&
+                    Double.parseDouble(ptlAgreementCostRule.getMax()) >= v) {
+                return true;
+            }
+        } else if ("2".equals(ptlAgreementCostRule.getOperator())) {
+            if (Double.parseDouble(ptlAgreementCostRule.getMin()) > v) {
+                return true;
+            }
+        } else if ("3".equals(ptlAgreementCostRule.getOperator())) {
+            if (Double.parseDouble(ptlAgreementCostRule.getMin()) >= v) {
+                return true;
+            }
+        } else if ("4".equals(ptlAgreementCostRule.getOperator())) {
+            if (Double.parseDouble(ptlAgreementCostRule.getMax()) < v) {
+                return true;
+            }
+        } else if ("5".equals(ptlAgreementCostRule.getOperator())) {
+            if (Double.parseDouble(ptlAgreementCostRule.getMax()) <= v) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean inputNumberEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
+        double v = Double.parseDouble(value);
+        //统一处理数值
+        if ("1".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+            if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) <= v &&
+                    Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) >= v) {
+                return false;
+            }
+        } else if ("2".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+            if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) > v) {
+                return false;
+            }
+        } else if ("3".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+            if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) >= v) {
+                return false;
+            }
+        } else if ("4".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+            if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) < v) {
+                return false;
+            }
+        } else if ("5".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+            if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) <= v) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 属性为输入框判断
+     */
+    private boolean inputTextEqual(PtlAgreementCostRule ptlAgreementCostRule, String value) {
+        //将值进行分割
+        String[] split = ptlAgreementCostRule.getMin().split(",");
+        AtomicBoolean returnBool = new AtomicBoolean(false);
+
+        List<String> equalsMap = new ArrayList<>();
+        //字符型评分
+        equalsMap.add("CharacterBasedRating");
+        //交强字符型评分
+        equalsMap.add("JqCharacterBasedRating");
+        //商业字符型评分
+        equalsMap.add("SyCharacterBasedRating");
+
+
+
+        //equest 等于判断
+        if(equalsMap.contains(ptlAgreementCostRule.getAttrCode())){
+            boolean b = Arrays.stream(split).anyMatch(value::equals);
+            returnBool.set(b);
+        }else if((ptlAgreementCostRule.getAttrCode().equals("BrandandModel") || ptlAgreementCostRule.getAttrCode().equals("CarOwnerName")
+                || ptlAgreementCostRule.getAttrCode().equals("CarOwnersAddress") || ptlAgreementCostRule.getAttrCode().equals("ApplicantAddress")
+                || ptlAgreementCostRule.getAttrCode().equals("InsuredAddress"))
+                && ptlAgreementCostRule.getOperator().equals("2")){
+            //处理品牌型号  不包含的情况
+            boolean anyMatch = Arrays.stream(split)
+                    .anyMatch(value::contains);
+            returnBool.set(!anyMatch);
+        }else {
+            boolean anyMatch = Arrays.stream(split)
+                    .anyMatch(value::contains);
+            returnBool.set(anyMatch);
+        }
+        return returnBool.get();
+    }
+
+    private boolean inputTextEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
+        //将值进行分割
+        String[] split = ptlAgreementUndwrtRulesAttrLink.getMin().split(",");
+        AtomicBoolean returnBool = new AtomicBoolean(false);
+
+        List<String> equalsMap = new ArrayList<>();
+        //字符型评分
+        equalsMap.add("CharacterBasedRating");
+        //交强字符型评分
+        equalsMap.add("JqCharacterBasedRating");
+        //商业字符型评分
+        equalsMap.add("SyCharacterBasedRating");
+
+
+
+        //equest 等于判断
+        if(equalsMap.contains(ptlAgreementUndwrtRulesAttrLink.getAttrCode())){
+            boolean b = Arrays.stream(split).anyMatch(value::equals);
+            returnBool.set(b);
+        }else if((ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("BrandandModel") || ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("CarOwnerName")
+                || ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("CarOwnersAddress") || ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("ApplicantAddress")
+                || ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("InsuredAddress"))
+                && ptlAgreementUndwrtRulesAttrLink.getOperator().equals("2")){
+            //处理品牌型号  不包含的情况
+            boolean anyMatch = Arrays.stream(split)
+                    .anyMatch(value::contains);
+            returnBool.set(!anyMatch);
+        }else {
+            boolean anyMatch = Arrays.stream(split)
+                    .anyMatch(value::contains);
+            returnBool.set(anyMatch);
+        }
+        return !returnBool.get();
+    }
+
+    /**
+     * 属性为下拉框判断
+     */
+    private boolean selectEqual(PtlAgreementCostRule ptlAgreementCostRule, String value) {
+        if (ptlAgreementCostRule.getMin() != null && ptlAgreementCostRule.getMin().contains(value)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 属性为选择框判断
+     *
+     * @param ptlAgreementUndwrtRulesAttrLink
+     * @param value
+     * @return
+     */
+    private boolean selectEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
+        if (ptlAgreementUndwrtRulesAttrLink.getMin() == null) {
+            return false;
+        }
+        if (!ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 属性为单选框判断
+     */
+    private boolean radioEqual(PtlAgreementCostRule ptlAgreementCostRule, String value) {
+        //新能源判断
+        if ("NewEnergy".equals(ptlAgreementCostRule.getAttrCode())) {
+            // 是否是新能源车
+            boolean newEnergy = EnergyTypeCode.isNewEnergy(value);
+            if (newEnergy && ptlAgreementCostRule.getMin().equals("1")) {
+                return true;
+            } else if (!newEnergy && ptlAgreementCostRule.getMin().equals("0")) {
+                return true;
+            }
+        } else if (ptlAgreementCostRule.getMin().contains(value)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean radioEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
+        //新能源判断
+        if ("NewEnergy".equals(ptlAgreementUndwrtRulesAttrLink.getAttrCode())) {
+            // 是否是新能源车
+            boolean newEnergy = EnergyTypeCode.isNewEnergy(value);
+            if (newEnergy && ptlAgreementUndwrtRulesAttrLink.getMin().equals("1")) {
+                return false;
+            } else if (!newEnergy && ptlAgreementUndwrtRulesAttrLink.getMin().equals("0")) {
+                return false;
+            }
+        } else if (ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)) {
+            return false;
+        }
+        return true;
+    }
+
+    public boolean dateTimeEqual(PtlAgreementCostRule ptlAgreementCostRule, String value){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        if(Objects.isNull(value) || value.equals("")){
+            return false;
+        }
+        LocalDateTime v = LocalDateTime.parse(value,formatter);
+        LocalDateTime min = null,max = null;
+        if(!Objects.isNull(ptlAgreementCostRule.getMin())){
+            min = LocalDateTime.parse(ptlAgreementCostRule.getMin(),formatter);
+        }
+        if(!Objects.isNull(ptlAgreementCostRule.getMax())){
+            max = LocalDateTime.parse(ptlAgreementCostRule.getMax(),formatter);
+        }
+
+        //统一处理数值
+        if ("1".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isAfter(min) && v.isBefore(max)) {
+                return true;
+            }
+        } else if ("2".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isBefore(min)) {
+                return true;
+            }
+        } else if ("3".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isBefore(min) || v.isEqual(min)) {
+                return true;
+            }
+        } else if ("4".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isAfter(max)) {
+                return true;
+            }
+        } else if ("5".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isAfter(max) || v.isEqual(max)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    public boolean dateEqual(PtlAgreementCostRule ptlAgreementCostRule, String value){
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        if(Objects.isNull(value) || value.equals("")){
+            return false;
+        }
+        LocalDateTime v = LocalDate.parse(value).atStartOfDay();
+        LocalDateTime min = null,max = null;
+        if(!Objects.isNull(ptlAgreementCostRule.getMin())){
+            min = LocalDate.parse(ptlAgreementCostRule.getMin()).atStartOfDay();
+        }
+        if(!Objects.isNull(ptlAgreementCostRule.getMax())){
+            max = LocalDate.parse(ptlAgreementCostRule.getMax()).atStartOfDay();
+        }
+
+        //统一处理数值
+        if ("1".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isAfter(min) && v.isBefore(max)) {
+                return true;
+            }
+        } else if ("2".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isBefore(min)) {
+                return true;
+            }
+        } else if ("3".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isBefore(min) || v.isEqual(min)) {
+                return true;
+            }
+        } else if ("4".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isAfter(max)) {
+                return true;
+            }
+        } else if ("5".equals(ptlAgreementCostRule.getOperator())) {
+            if (v.isAfter(max) || v.isEqual(max)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    public boolean dateTimeEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value, InsOrders insOrders){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        //判断险种 的起保时间
+        if(ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("SyStartTime") || ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("JqStartTime"))
+        {
+            if(insOrders.getProductId().equals(ProductsType.PT_0330.getCode()) && ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("SyStartTime")){
+                return true;
+            }
+            if(insOrders.getProductId().equals(ProductsType.PT_034001.getCode()) && ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("JqStartTime")){
+                return true;
+            }
+        }
+        if(!Objects.isNull(value) && !value.isEmpty()) {
+            LocalDateTime v = LocalDateTime.parse(value, formatter);
+            LocalDateTime min = null, max = null;
+            if (!Objects.isNull(ptlAgreementUndwrtRulesAttrLink.getMin())) {
+                min = LocalDateTime.parse(ptlAgreementUndwrtRulesAttrLink.getMin(), formatter);
+            }
+            if (!Objects.isNull(ptlAgreementUndwrtRulesAttrLink.getMax())) {
+                max = LocalDateTime.parse(ptlAgreementUndwrtRulesAttrLink.getMax(), formatter);
+            }
+
+            //统一处理数值
+            if ("1".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isAfter(min) && v.isBefore(max)) {
+                    return true;
+                }
+            } else if ("2".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isBefore(min)) {
+                    return true;
+                }
+            } else if ("3".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isBefore(min)) {
+                    return true;
+                }
+            } else if ("4".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isAfter(max)) {
+                    return true;
+                }
+            } else if ("5".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isAfter(max)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+    public boolean dateEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        if(!Objects.isNull(value) && !value.isEmpty()) {
+            LocalDateTime v = LocalDate.parse(value).atStartOfDay();
+            LocalDateTime min = null, max = null;
+            if (!Objects.isNull(ptlAgreementUndwrtRulesAttrLink.getMin())) {
+                min = LocalDate.parse(ptlAgreementUndwrtRulesAttrLink.getMin()).atStartOfDay();
+            }
+            if (!Objects.isNull(ptlAgreementUndwrtRulesAttrLink.getMax())) {
+                max = LocalDate.parse(ptlAgreementUndwrtRulesAttrLink.getMax()).atStartOfDay();
+            }
+
+            //统一处理数值
+            if ("1".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isAfter(min) && v.isBefore(max)) {
+                    return true;
+                }
+            } else if ("2".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isBefore(min)) {
+                    return true;
+                }
+            } else if ("3".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isBefore(min)) {
+                    return true;
+                }
+            } else if ("4".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isAfter(max)) {
+                    return true;
+                }
+            } else if ("5".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
+                if (!v.isAfter(max)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+    public void calcCosts(AgreementInfoVo agreementInfoVo, String costId, InsOrders insOrders, InsOrdersCosts insOrdersCosts) {
+        InsFeeOrders insFeeOrders = new InsFeeOrders();
+        insFeeOrders.setOrderNo(insOrders.getId());
+        insFeeOrders.setAgreementId(insOrders.getAgreementId());
+        insFeeOrders.setCostId(costId);
+        insFeeOrders.setJqPremium(insOrdersCosts.getJqPremium());
+        insFeeOrders.setSyPremium(insOrdersCosts.getSyPremium());
+        insFeeOrders.setJyPremium(insOrdersCosts.getJyPremium());
+        insFeeOrders.setTotalPremium(insOrdersCosts.getSumPremium());
+        // 获取协议是平台协议还是私有协议 1 平台协议 2 私有协议
+        String agreementType = agreementInfoVo.getAgreement().getAgreementType();
+        BigDecimal jqEntranceFeeRatio = convertPercent(agreementInfoVo.getAgreement().getJqEntranceFeeRatio());
+        BigDecimal syEntranceFeeRatio = convertPercent(agreementInfoVo.getAgreement().getSyEntranceFeeRatio());
+        BigDecimal jyEntranceFeeRatio = convertPercent(agreementInfoVo.getAgreement().getJyEntranceFeeRatio());
+
+        // 2. 获取费用类型列表(处理空集合,避免NPE)
+        List<PtlAgreementCostTypeVo> costTypeList = orgClient.queryByCostId(costId);
+        costTypeList = costTypeList == null ? Collections.emptyList() : costTypeList;
+
+        // 3. 获取各险种对应的费用类型配置
+        PtlAgreementCostTypeVo jqCostType = getCostTypeByTypeName(costTypeList, "交强险");
+        PtlAgreementCostTypeVo syCostType = getCostTypeByTypeName(costTypeList, "商业险");
+        PtlAgreementCostTypeVo jyCostType = getCostTypeByTypeName(costTypeList, "驾意险");
+
+        // 4. 计算跟单费比例(入口比例 - 手续费比例)
+        BigDecimal jqFollowRatio = calculateFollowRatio(jqCostType, jqEntranceFeeRatio);
+        BigDecimal syFollowRatio = calculateFollowRatio(syCostType, syEntranceFeeRatio);
+        BigDecimal jyFollowRatio = calculateFollowRatio(jyCostType, jyEntranceFeeRatio);
+
+        // 5. 根据协议类型确定税率因子(平台协议为1,私有协议为1/1.06)
+        BigDecimal taxFactor = "1".equals(agreementType)
+                ? BigDecimal.ONE
+                : new BigDecimal("1").divide(new BigDecimal("1.06"), 10, RoundingMode.HALF_EVEN);
+
+        // 6. 统一处理各险种的费用计算(应收、应付、各类费用)
+        processInsuranceType(
+                insOrdersCosts.getJqPremium(), jqCostType, jqEntranceFeeRatio, jqFollowRatio, taxFactor,
+                insFeeOrders,
+                InsFeeOrders::setJqReceivablePremium, InsFeeOrders::setJqPayablePremium,
+                InsFeeOrders::setJqCommissionPremium, InsFeeOrders::setJqFollowPremium, InsFeeOrders::setJqAdditionalPremium
+        );
+
+        processInsuranceType(
+                insOrdersCosts.getSyPremium(), syCostType, syEntranceFeeRatio, syFollowRatio, taxFactor,
+                insFeeOrders,
+                InsFeeOrders::setSyReceivablePremium, InsFeeOrders::setSyPayablePremium,
+                InsFeeOrders::setSyCommissionPremium, InsFeeOrders::setSyFollowPremium, InsFeeOrders::setSyAdditionalPremium
+        );
+
+        processInsuranceType(
+                insOrdersCosts.getJyPremium(), jyCostType, jyEntranceFeeRatio, jyFollowRatio, taxFactor,
+                insFeeOrders,
+                InsFeeOrders::setJyReceivablePremium, InsFeeOrders::setJyPayablePremium,
+                InsFeeOrders::setJyCommissionPremium, InsFeeOrders::setJyFollowPremium, InsFeeOrders::setJyAdditionalPremium
+        );
+
+        // 7. 计算总应收、总应付并保存
+        calculateTotalPremium(insFeeOrders);
+        insFeeOrdersService.save(insFeeOrders);
+    }
+
+    /**
+     * 转换百分比为小数(如:50 -> 0.5)
+     */
+    private BigDecimal convertPercent(BigDecimal percent) {
+        return percent.divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_EVEN);
+    }
+
+    /**
+     * 根据险种名称从列表中获取对应的费用类型配置
+     */
+    private PtlAgreementCostTypeVo getCostTypeByTypeName(List<PtlAgreementCostTypeVo> costTypeList, String typeName) {
+        return costTypeList.stream()
+                .filter(costType -> typeName.equals(costType.getCostType()))
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * 计算跟单费比例(入口比例 - 手续费比例)
+     */
+    private BigDecimal calculateFollowRatio(PtlAgreementCostTypeVo costType, BigDecimal entranceFeeRatio) {
+        if (costType == null) {
+            return BigDecimal.ZERO;
+        }
+        BigDecimal inletPercent = convertPercent(costType.getInlet());
+        return inletPercent.subtract(entranceFeeRatio);
+    }
+
+    /**
+     * 处理单个险种的费用计算(核心复用方法)
+     *
+     * @param premium         险种保费
+     * @param costType        险种费用类型配置
+     * @param commissionRatio 手续费比例
+     * @param followRatio     跟单费比例
+     * @param taxFactor       税率因子(平台协议为1,私有协议为1/1.06)
+     * @param insFeeOrders    费用订单对象
+     * @param setReceivable   应收金额setter
+     * @param setPayable      应付金额setter
+     * @param setCommission   手续费setter
+     * @param setFollow       跟单费setter
+     * @param setAdditional   加投费setter
+     */
+    private void processInsuranceType(
+            BigDecimal premium,
+            PtlAgreementCostTypeVo costType,
+            BigDecimal commissionRatio,
+            BigDecimal followRatio,
+            BigDecimal taxFactor,
+            InsFeeOrders insFeeOrders,
+            BiConsumer<InsFeeOrders, BigDecimal> setReceivable,
+            BiConsumer<InsFeeOrders, BigDecimal> setPayable,
+            BiConsumer<InsFeeOrders, BigDecimal> setCommission,
+            BiConsumer<InsFeeOrders, BigDecimal> setFollow,
+            BiConsumer<InsFeeOrders, BigDecimal> setAdditional
+    ) {
+        // 若险种配置为空,默认应收应付为0
+        if (costType == null || premium == null) {
+            setReceivable.accept(insFeeOrders, BigDecimal.ZERO);
+            setPayable.accept(insFeeOrders, BigDecimal.ZERO);
+            return;
+        }
+
+        // 转换百分比(入口比例、加投比例、出口比例)
+        BigDecimal inletPercent = convertPercent(costType.getInlet());
+        BigDecimal addThrowPercent = convertPercent(costType.getAddThrow());
+        BigDecimal exportPercent = convertPercent(costType.getExport());
+
+        // 计算应收金额(保费 * 税率因子 * (入口比例 + 加投比例 + 跟单比例))
+        BigDecimal taxablePremium = premium.multiply(taxFactor);
+        BigDecimal receivable = taxablePremium.multiply(inletPercent)
+                .add(taxablePremium.multiply(addThrowPercent))
+                .add(taxablePremium.multiply(followRatio))
+                .setScale(5, RoundingMode.HALF_EVEN);
+
+        // 计算应付金额(保费 * 出口比例,保留2位小数)
+        BigDecimal payable = premium.multiply(exportPercent.setScale(2, RoundingMode.DOWN));
+
+        // 计算各类费用并设置到订单对象
+        setReceivable.accept(insFeeOrders, receivable);
+        setPayable.accept(insFeeOrders, payable);
+        setCommission.accept(insFeeOrders, premium.multiply(commissionRatio).setScale(5, RoundingMode.HALF_EVEN));
+        setFollow.accept(insFeeOrders, premium.multiply(followRatio).setScale(5, RoundingMode.HALF_EVEN));
+        setAdditional.accept(insFeeOrders, premium.multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN));
+    }
+
+    /**
+     * 计算总应收和总应付金额
+     */
+    private void calculateTotalPremium(InsFeeOrders insFeeOrders) {
+        // 总应收 = 交强险应收 + 商业险应收 + 驾意险应收
+        BigDecimal totalReceivable = insFeeOrders.getJqReceivablePremium()
+                .add(insFeeOrders.getSyReceivablePremium())
+                .add(insFeeOrders.getJyReceivablePremium())
+                .setScale(5, RoundingMode.HALF_EVEN);
+
+        // 总应付 = 交强险应付 + 商业险应付 + 驾意险应付
+        BigDecimal totalPayable = insFeeOrders.getJqPayablePremium()
+                .add(insFeeOrders.getSyPayablePremium())
+                .add(insFeeOrders.getJyPayablePremium())
+                .setScale(2, RoundingMode.DOWN);
+
+        insFeeOrders.setTotalReceivablePremium(totalReceivable);
+        insFeeOrders.setTotalPayablePremium(totalPayable);
+    }
+}

+ 8 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsTaskImagesController.java

@@ -9,6 +9,8 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.constraints.NotBlank;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @Tag(name = "订单影像资料上传")
 @RestController
 @RequestMapping("/order/taskImages")
@@ -35,5 +37,11 @@ public class InsTaskImagesController {
         return HttpResult.ok(insTaskImagesService.selectByQuoteNo(quoteNo));
     }
 
+    @Operation(summary = "删除影像资料")
+    @GetMapping("/delete")
+    public HttpResult delete(@RequestParam("id") String id) {
+        return insTaskImagesService.deleteById(id);
+    }
+
 
 }

+ 3 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -26,6 +26,7 @@ import com.jzg.commons.constants.quote.enums.base.QuoteRuleCategory;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.quotation.commons.service.QuotationBaseService;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
+import com.jzg.quotation.summary.aop.QuoteVerification;
 import com.jzg.quotation.summary.aop.OrderOperationLog;
 import com.jzg.quotation.summary.constants.QuoteNumberConstant;
 import com.jzg.quotation.summary.classifier.QuoteInfoParameterFilling;
@@ -194,7 +195,8 @@ public class UnifyOrderManager {
     )
     @Operation(summary = "统一报价")
     @PostMapping("/quote")
-    public HttpResult quote(@RequestBody QuoteVo quoteVo) throws Exception {
+    @QuoteVerification
+    public HttpResult<QuoteResultsVo> quote(@RequestBody QuoteVo quoteVo) throws Exception {
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(quoteVo.getOrder()
                 .getInsuranceCompanyCode(), baseController.getToken());
         AssertionUtils.isFail(esmInsCompanyHttpResult.getCode() != 200, esmInsCompanyHttpResult.getMsg());

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsFeeOrdersMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.po.InsFeeOrders;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsFeeOrdersMapper extends BaseMapper<InsFeeOrders> {
+}

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersAccidentalDrivingMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.orders.po.InsOrdersAccidentalDriving;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsOrdersAccidentalDrivingMapper extends BaseMapper<InsOrdersAccidentalDriving> {
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsFeeOrdersService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.po.InsFeeOrders;
+
+public interface InsFeeOrdersService extends IService<InsFeeOrders> {
+}

+ 7 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersAccidentalDrivingService.java

@@ -0,0 +1,7 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.orders.po.InsOrdersAccidentalDriving;
+
+public interface InsOrdersAccidentalDrivingService extends IService<InsOrdersAccidentalDriving> {
+}

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

@@ -3,6 +3,7 @@ package com.jzg.quotation.summary.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.InsOrdersParam;
 import com.jzg.commons.entity.enums.MessageCodeEnum;

+ 4 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsTaskImagesService.java

@@ -7,6 +7,8 @@ import com.jzg.commons.entity.po.InsTaskImages;
 import com.jzg.commons.entity.vo.InsTaskImagesVo;
 import com.jzg.commons.entity.quote.vo.aggregated.InsuranceUploadImageVo;
 
+import java.util.List;
+
 public interface InsTaskImagesService extends IService<InsTaskImages> {
 
 
@@ -14,6 +16,8 @@ public interface InsTaskImagesService extends IService<InsTaskImages> {
 
     InsTaskImagesVo selectByQuoteNo(String quoteNo);
 
+    HttpResult deleteById(String id);
+
     void removeByQuoteNo(String quoteNo);
     boolean imageSave(InsuranceUploadImageVo insuranceUploadImageVo);
 

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

@@ -0,0 +1,16 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.quotation.summary.mapper.InsFeeOrdersMapper;
+import com.jzg.quotation.summary.service.InsFeeOrdersService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author quchen
+ * @date 2025/7/3 8:48
+ */
+
+@Service
+public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, InsFeeOrders> implements InsFeeOrdersService {
+}

+ 16 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersAccidentalDrivingServiceImpl.java

@@ -0,0 +1,16 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.orders.po.InsOrdersAccidentalDriving;
+import com.jzg.quotation.summary.mapper.InsOrdersAccidentalDrivingMapper;
+import com.jzg.quotation.summary.service.InsOrdersAccidentalDrivingService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author quchen
+ * @date 2025/7/3 8:46
+ */
+
+@Service
+public class InsOrdersAccidentalDrivingServiceImpl extends ServiceImpl<InsOrdersAccidentalDrivingMapper, InsOrdersAccidentalDriving> implements InsOrdersAccidentalDrivingService {
+}

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

@@ -5,11 +5,14 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jzg.commons.constants.CompanyConstants;
 import com.jzg.commons.constants.InsuranceRisk;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
@@ -22,14 +25,13 @@ import com.jzg.commons.entity.enums.MessageCodeEnum;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteResultVo;
 import com.jzg.commons.entity.orders.vo.OrderListVo;
-import com.jzg.commons.entity.po.EsmInsCompany;
-import com.jzg.commons.entity.po.InsTaskImages;
-import com.jzg.commons.entity.po.SysMessageTemplate;
+import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.entity.quote.vo.aggregated.OrderStatusResultVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.aggregated.UnderwritingResultsVo;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.MinioUtils;
@@ -47,12 +49,14 @@ import com.jzg.quotation.summary.consumer.template.OrderMessageTemplate;
 import com.jzg.quotation.summary.mapper.InsOrdersCarInfoMapper;
 import com.jzg.quotation.summary.mapper.InsOrdersMapper;
 import com.jzg.quotation.summary.mapper.InsOrdersQrcodeMapper;
+import com.jzg.quotation.summary.mapper.SysUploadFilesMapper;
 import com.jzg.quotation.summary.service.*;
 import com.jzg.quotation.summary.state.listener.OrderStateListener;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.commons.beanutils.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -116,6 +120,17 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     @Autowired
     private InsOrdersTrackService trackService;
 
+    @Autowired
+    private SysUploadFilesMapper sysUploadFilesMapper;
+
+    @Autowired
+    private InsOrdersPdfUrlService insOrdersPdfUrlService;
+
+    @Autowired
+    private InsFeeOrdersService insFeeOrdersService;
+
+    @Value("${minio.bucket-name}")
+    private String bucketName;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -340,6 +355,14 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         HttpResult<AgreementInfoVo> ptlAgreement =orgClient.queryAgreementById(insOrdersVo.getInsOrders().getAgreementId(),baseController.getToken(),baseController.getAppSystemCode());
         insOrdersVo.setAgreementType(ptlAgreement.getData().getAgreement().getAgreementType());
         insOrdersVo.setAgreementName(ptlAgreement.getData().getAgreement().getAgreementName());
+
+        // 业务员信息
+        SalesmanVo salesmanInfo = orgClient.getUserByMobile(insOrdersVo.getCreateBy(),baseController.getToken());
+        InsOrdersVo.Salesman salesman = new InsOrdersVo.Salesman();
+        salesman.setName(salesmanInfo.getName());
+        salesman.setDeptName(salesmanInfo.getDeptName());
+        salesman.setTypeAttr(salesmanInfo.getTypeAttr());
+        insOrdersVo.setSalesmanInfo(salesman);
         // 2. 处理车辆用户信息列表
         if (CollectionUtil.isNotEmpty(insOrdersVo.getCarUserInfoList())) {
             for (InsOrdersCarUserInfo carUserInfo : insOrdersVo.getCarUserInfoList()) {
@@ -366,6 +389,12 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                 }
             });
         }
+        // 订单电子保单信息
+        insOrdersVo.setInsOrdersPdfUrl(insOrdersPdfUrlService.getById(id));
+        if (insOrdersVo.getInsOrdersPdfUrl() ==  null) {
+            insOrdersVo.setInsOrdersPdfUrl(new InsOrdersPdfUrl());
+        }
+
         insOrdersVo.setInsOrdersTax(insOrdersTaxService.getById(id));
         setInsOrdersExternalPolicy(insOrdersVo.getInsOrdersExternalPolicy());
         return insOrdersVo;
@@ -900,6 +929,28 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         if(esmInsCompanyHttpResult.getCode()==200){
             resultVo.setInsCompanyVo(esmInsCompanyHttpResult.getData());
         }
+        // 影像资料
+        List<InsTaskImages> imagesList = insTaskImagesService.list(new LambdaQueryWrapper<InsTaskImages>()
+                .eq(InsTaskImages::getQuoteNo, insOrdersVo.getQuoteNo())
+                .eq(InsTaskImages::getIsDelete, 0));
+        List<ImagesVo> imageVoList = new ArrayList<>();
+        for (InsTaskImages images : imagesList) {
+            ImagesVo imagesVo = new ImagesVo();
+            SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectById(images.getImageId());
+            imagesVo.setId(images.getId());
+            imagesVo.setImageId(sysUploadFiles.getId());
+            imagesVo.setFileName(sysUploadFiles.getFileName());
+            imagesVo.setImageType(images.getImageType());
+            imagesVo.setFileType(sysUploadFiles.getFileType());
+            imagesVo.setBucketName(sysUploadFiles.getBucketName());
+            imagesVo.setDownloadUrl(MinioUtils.getPresignedObjectUrl(bucketName,sysUploadFiles.getFileName()));
+            imageVoList.add(imagesVo);
+        }
+        resultVo.setImageVoList(imageVoList);
+        // 支付码
+        InsOrdersQrcode qrcode = insOrdersQrcodeMapper.selectOne(new LambdaQueryWrapper<InsOrdersQrcode>()
+                .eq(InsOrdersQrcode::getOrderno, ordersNo));
+        resultVo.setQrcode(qrcode);
         return resultVo;
     }
 

+ 12 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsTaskImagesServiceImpl.java

@@ -79,5 +79,17 @@ public class  InsTaskImagesServiceImpl extends ServiceImpl<InsTaskImagesMapper,
         baseMapper.removeByQuoteNo(quoteNo);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult deleteById(String id) {
+        try {
+            InsTaskImages taskImages = baseMapper.selectById(id);
+            baseMapper.deleteById(taskImages);
+            return HttpResult.ok("删除成功");
+        } catch (Exception e){
+            return HttpResult.error("删除失败");
+        }
+    }
+
 
 }

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

@@ -438,7 +438,13 @@
     </select>
     
     <select id="getById" resultMap="InsOrdersVoMap">
-        select id, quote_no,company_name,product_id,product_name,audit_status,audit_comments,create_by,audit_id,audit_name,error_message,create_time,create_by,update_time,update_by from ins_orders where id = #{id}
+        select id,
+               quote_no,
+               company_name,
+               product_id,
+               product_name,
+               audit_status,
+               audit_comments,create_by,audit_id,audit_name,error_message,create_time,create_by,update_time,update_by from ins_orders where id = #{id}
     </select>
 
     <select id="queryList" resultMap="InsOrdersVoMap">

+ 20 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementCostController.java

@@ -5,9 +5,14 @@ import com.jzg.commons.aop.OperatorTrajectory;
 import com.jzg.commons.constants.OperationTypeEnum;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.*;
+import com.jzg.commons.entity.po.PtlAgreementCostType;
+import com.jzg.commons.entity.vo.CostListVo;
+import com.jzg.commons.entity.vo.CostsListVo;
+import com.jzg.commons.entity.vo.PtlAgreementCostTypeVo;
 import com.jzg.commons.entity.vo.PtlAgreementCostVo;
 import com.jzg.organization.mapper.PtlAgreementCostMapper;
 import com.jzg.organization.service.PtlAgreementCostService;
+import com.jzg.organization.service.PtlAgreementCostTypeService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.Valid;
@@ -28,6 +33,9 @@ public class PtlAgreementCostController {
     @Autowired
     private PtlAgreementCostService ptlAgreementCostService;
 
+    @Autowired
+    private PtlAgreementCostTypeService ptlAgreementCostTypeService;
+
     @OperatorTrajectory(moduleName = "报价配置/费用管理/新增费用",OperationDict = OperationTypeEnum.IN_AGREEMENT,mapperClass = PtlAgreementCostMapper.class,entityClass = PtlAgreemenCostAdd.class)
     @Operation(summary = "协议费用管理新增")
     @PostMapping("save")
@@ -68,6 +76,18 @@ public class PtlAgreementCostController {
         return HttpResult.ok(ptlAgreementCostService.queryByAgreementIdAndCoverRuleId(costAgreementParam));
     }
 
+    @Operation(summary = "通过协议ID与规则ID查询")
+    @PostMapping("queryByAgreementIdAndProductId")
+    public List<CostsListVo> queryByAgreementIdAndProductId(@RequestBody CostAgreementParam costAgreementParam){
+        return ptlAgreementCostService.queryByAgreementIdAndProductId(costAgreementParam);
+    }
+
+    @Operation(summary = "通过费用ID查询费用类型集合")
+    @GetMapping("queryByCostId")
+    public List<PtlAgreementCostTypeVo> queryByCostId(@NotEmpty(message = "id不能为空") String costId){
+        return ptlAgreementCostTypeService.queryByCostId(costId);
+    }
+
     @Operation(summary = "协议费用管理审核成功")
     @PostMapping("auditSuccess")
     public HttpResult auditSuccess(@Valid @RequestBody CostReviewParam costReviewParam){

+ 10 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java

@@ -8,6 +8,7 @@ import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.SysUserInfoParam;
 import com.jzg.commons.entity.dto.SysUserJzgInfoDto;
+import com.jzg.commons.entity.po.SysUser;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.request.RequestSingleParam;
 import com.jzg.organization.mapper.SysUserJzgInfoMapper;
@@ -31,6 +32,8 @@ public class UserController extends BaseController {
 
     @Autowired
     private SysDeptService sysDeptService;
+    @Autowired
+    private BaseController baseController;
 
     @Operation(summary = "分页获取业务员列表接口", description = "分页获取业务员列表接口")
     @PostMapping(value = "/getUserInfoList")
@@ -162,4 +165,11 @@ public class UserController extends BaseController {
         return HttpResult.ok(sysUserService.getTenantList(getUserName()));
     }
 
+    @Operation(summary = "通过电话获取业务员",description = "通过电话获取用户")
+    @GetMapping(value = "/getUserByMobile")
+    public SalesmanVo getUserByMobile(@RequestParam String mobile){
+        SysUser sysUser = sysUserService.getUserByMobile(mobile);
+        return sysUserService.getUserInfoBySystemCodeAndUserId(sysUser.getId());
+    }
+
 }

+ 3 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/PtlAgreementCostMapper.java

@@ -7,6 +7,7 @@ import com.jzg.commons.entity.dto.CostManagementVo;
 import com.jzg.commons.entity.dto.PtlAgreementCostParam;
 import com.jzg.commons.entity.po.PtlAgreementCost;
 import com.jzg.commons.entity.vo.CostListVo;
+import com.jzg.commons.entity.vo.CostsListVo;
 import com.jzg.commons.entity.vo.PtlAgreementCostVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -22,6 +23,8 @@ public interface PtlAgreementCostMapper extends BaseMapper<PtlAgreementCost> {
 
     List<CostListVo> queryByAgreementIdAndCoverRuleId(CostAgreementParam costAgreementParam);
 
+    List<CostsListVo> queryByAgreementIdAndProductId(CostAgreementParam costAgreementParam);
+
     Page<CostManagementVo> pageList(Page page,@Param("costParam") PtlAgreementCostParam costParam);
 
 

+ 4 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/PtlAgreementCostTypeMapper.java

@@ -3,9 +3,11 @@ package com.jzg.organization.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jzg.commons.entity.po.PtlAgreementCostType;
+import com.jzg.commons.entity.vo.PtlAgreementCostTypeVo;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
 
 
 @Mapper
@@ -13,4 +15,6 @@ public interface PtlAgreementCostTypeMapper extends BaseMapper<PtlAgreementCostT
 
     @Delete("DELETE FROM ptl_agreement_cost_type WHERE ptl_agreement_cost_id = #{id}")
     void deleteByPtlAgreementCostId(String id);
+
+    List<PtlAgreementCostTypeVo> queryByCostId(String costId);
 }

+ 3 - 1
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java

@@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.dto.SysUserJzgInfoDto;
-import com.jzg.commons.entity.po.SysSystem;
 import com.jzg.commons.entity.po.SysUserJzgInfo;
 import com.jzg.commons.entity.user.vo.SysTennatVo;
+import com.jzg.commons.entity.vo.SalesmanVo;
 import com.jzg.commons.entity.vo.SysUserInfoListVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -25,4 +25,6 @@ public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
 
     SysUserJzgInfo getUserJzgInfoByUserId(String userId);
 
+    SalesmanVo getUserInfoBySystemCodeAndUserId(@Param("userId")String userId);
+
 }

+ 3 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java

@@ -5,6 +5,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.*;
 import com.jzg.commons.entity.po.PtlAgreementCost;
 import com.jzg.commons.entity.vo.CostListVo;
+import com.jzg.commons.entity.vo.CostsListVo;
 import jakarta.validation.constraints.NotNull;
 import java.util.List;
 
@@ -20,6 +21,8 @@ public interface PtlAgreementCostService extends IService<PtlAgreementCost> {
 
     List<CostListVo> queryByAgreementIdAndCoverRuleId(CostAgreementParam costAgreementParam);
 
+    List<CostsListVo> queryByAgreementIdAndProductId(CostAgreementParam costAgreementParam);
+
     HttpResult enableDisableByIds(List<String> ids,Boolean isEnabled);
 
     void updateAuditMethod(List<Long> ids);

+ 4 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java

@@ -135,4 +135,8 @@ public interface SysUserService extends IService<SysUser> {
      */
     boolean validatePassword(String mobile, String password);
 
+    SysUser getUserByMobile(String mobile);
+
+    SalesmanVo getUserInfoBySystemCodeAndUserId(String userId);
+
 }

+ 6 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

@@ -13,6 +13,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.*;
 import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.vo.CostListVo;
+import com.jzg.commons.entity.vo.CostsListVo;
 import com.jzg.commons.entity.vo.PtlAgreementCostRuleVo;
 import com.jzg.commons.entity.vo.PtlAgreementCostVo;
 import com.jzg.commons.exception.SystemException;
@@ -190,6 +191,11 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
         return ptlAgreementCostMapper.queryByAgreementIdAndCoverRuleId(costAgreementParam);
     }
 
+    @Override
+    public List<CostsListVo> queryByAgreementIdAndProductId(CostAgreementParam costAgreementParam) {
+        return ptlAgreementCostMapper.queryByAgreementIdAndProductId(costAgreementParam);
+    }
+
 
     private List<PtlAgreementCostVo> queryByAgreementId(CostAgreementParam costAgreementParam){
         return ptlAgreementCostMapper.queryByAgreementId(costAgreementParam);

+ 8 - 3
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostTypeServiceImpl.java

@@ -17,11 +17,16 @@ import java.util.List;
 public class PtlAgreementCostTypeServiceImpl extends ServiceImpl<PtlAgreementCostTypeMapper, PtlAgreementCostType> implements PtlAgreementCostTypeService {
 
 
+//    @Override
+//    public List<PtlAgreementCostTypeVo> queryByCostId(String costId) {
+//        return BeanUtil.copyToList(baseMapper.selectList(new LambdaQueryChainWrapper<>(PtlAgreementCostType.class)
+//                .eq(PtlAgreementCostType::getPtlAgreementCostId, costId)
+//                .eq(PtlAgreementCostType::getIsDelete, Constants.NOT_DELETED)), PtlAgreementCostTypeVo.class);
+//    }
+
     @Override
     public List<PtlAgreementCostTypeVo> queryByCostId(String costId) {
-        return BeanUtil.copyToList(baseMapper.selectList(new LambdaQueryChainWrapper<>(PtlAgreementCostType.class)
-                .eq(PtlAgreementCostType::getPtlAgreementCostId, costId)
-                .eq(PtlAgreementCostType::getIsDelete, Constants.NOT_DELETED)), PtlAgreementCostTypeVo.class);
+        return baseMapper.queryByCostId(costId);
     }
 
     @Override

+ 12 - 3
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java

@@ -35,7 +35,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.statemachine.StateMachine;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -69,10 +68,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     private SysAreaService sysAreaService;
 
     @Autowired
-    private SysUserService sysUserService;
+    private SysUserMapper sysUserMapper;
 
     @Autowired
-    private StateMachine<UserState.UserStateEnum, UserState.UserStateEvent> stateMachine;
+    private SysUserService sysUserService;
 
     @Resource
     private SysOrganizationUserLinkService sysOrganizationUserLinkService;
@@ -804,6 +803,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     public Object getHistoryData(String id) {
         return  sysUserJzgInfoService.getById(id);
     }
+
+    @Override
+    public SysUser getUserByMobile(String mobile) {
+        return sysUserMapper.getUserByMobile(mobile);
+    }
+
+    @Override
+    public SalesmanVo getUserInfoBySystemCodeAndUserId(String userId) {
+        return sysUserJzgInfoMapper.getUserInfoBySystemCodeAndUserId(userId);
+    }
 }
 
 

+ 2 - 0
tenant/organization/src/main/resources/application.yml

@@ -60,9 +60,11 @@ tenant:
     - qr_barcode_config
     - jyx_config
     - sys_user_jzg_app
+    - sys_dept
     - sys_user_jzg_info_salesman
     - dept_tree
     - dept_path
+    - ptl_agreement_cost_type
 
   ignoreLoginNames:
 

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

@@ -56,7 +56,6 @@
         <result column="cost_type" property="costType" jdbcType="VARCHAR"/>
         <result column="inlet" property="inlet" jdbcType="DECIMAL"/>
         <result column="export" property="export" jdbcType="DECIMAL"/>
-        <result column="commission" property="commission" jdbcType="DECIMAL"/>
         <result column="add_throw" property="addThrow" jdbcType="DECIMAL"/>
     </resultMap>
 
@@ -87,6 +86,20 @@
         <collection property="ptlAgreementCostVoList" column="{costId = ids}" ofType="com.jzg.commons.entity.vo.PtlAgreementCostVo" select="selectCostById" />
     </resultMap>
 
+    <resultMap id="CostsList" type="com.jzg.commons.entity.vo.CostsListVo">
+        <result column="id" property="id" jdbcType="VARCHAR"/>
+        <result column="product_name" property="productName" jdbcType="VARCHAR"/>
+        <result column="product_id" property="productId" jdbcType="VARCHAR"/>
+        <result column="priority_level" property="priorityLevel" jdbcType="VARCHAR"/>
+        <collection property="ptlAgreementCostRuleList" ofType="com.jzg.commons.entity.po.PtlAgreementCostRule">
+            <result column="rule_id" property="id" jdbcType="VARCHAR"/>
+            <result column="ptl_agreement_cost_id" property="ptlAgreementCostId" jdbcType="VARCHAR"/>
+            <result column="attr_code" property="attrCode" jdbcType="VARCHAR"/>
+            <result column="min" property="min" jdbcType="VARCHAR"/>
+            <result column="max" property="max" jdbcType="VARCHAR"/>
+        </collection>
+    </resultMap>
+
 
     <resultMap id="CostManagementVoMap" type="com.jzg.commons.entity.dto.CostManagementVo">
         <result column="ptlAgreementId" property="ptlAgreementId" jdbcType="VARCHAR"/>
@@ -128,6 +141,31 @@
         GROUP BY c.product_id, c.product_name
     </select>
 
+    <select id="queryByAgreementIdAndProductId" resultMap="CostsList">
+        SELECT
+        c.id,
+        c.product_name,
+        c.product_id,
+        c.priority_level,
+        r.id as rule_id,
+        r.ptl_agreement_cost_id as ptl_agreement_cost_id,
+        r.attr_code as attr_code,
+        r.min as min,
+        r.max as max
+        FROM
+        ptl_agreement_cost c
+        left join ptl_agreement_cost_rule r on c.id = r.ptl_agreement_cost_id
+        <where>
+            c.is_delete = 0
+            <if test="ptlAgreementId != null">
+                AND c.ptl_agreement_id = #{ptlAgreementId}
+            </if>
+            <if test="productId != null">
+                AND c.product_id = #{productId}
+            </if>
+        </where>
+    </select>
+
     <select id="selectCostById"  resultMap="CostResultMap">
         SELECT
             t.id,
@@ -242,7 +280,6 @@
             tt.cost_type,
             tt.inlet,
             tt.export,
-            tt.commission,
             tt.add_throw
         FROM
             ptl_agreement_cost_type tt

+ 17 - 0
tenant/organization/src/main/resources/mapper/PtlAgreementCostTypeMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.organization.mapper.PtlAgreementCostTypeMapper">
+    <resultMap id="ResultMap"
+               type="com.jzg.commons.entity.vo.PtlAgreementCostTypeVo">
+    </resultMap>
+    <select id="queryByCostId" resultMap="ResultMap">
+        select *
+            from
+        ptl_agreement_cost_type
+        where 1=1
+            and ptl_agreement_cost_type.is_delete = 0
+            and ptl_agreement_cost_id = #{costId}
+    </select>
+</mapper>

+ 3 - 2
tenant/organization/src/main/resources/mapper/PtlAgreementMapper.xml

@@ -55,7 +55,8 @@
         pa.create_by,pa.create_time,pa.update_by,
         pa.create_by,pa.create_time,pa.update_by,
         pa.update_time,pa.is_delete,paa.username,paa.user_abbr as userAbbr,
-        suji.name as managerName,sd.name as managerDeptName,suf.file_name as fileName,suf.file_size as fileSize,
+        suji.name as managerName,sd.name as managerDeptName,
+--         suf.file_name as fileName,suf.file_size as fileSize,
         eic.name_simple as company,sdd.name as deptName,
         pa.api_type,pa.jq_entrance_fee_ratio,pa.sy_entrance_fee_ratio,pa.jy_entrance_fee_ratio
     </sql>
@@ -174,7 +175,7 @@
         LEFT JOIN sys_dept sdd on pa.dept_id = sdd.id
         LEFT JOIN sys_user_jzg_info suji on pa.custodian_id = suji.user_id
         LEFT JOIN sys_dept sd on suji.dept_id = sd.id
-        LEFT JOIN sys_upload_files suf on suf.id = pa.file_id
+--         LEFT JOIN sys_upload_files suf on suf.id = pa.file_id
         LEFT JOIN esm_ins_company eic on pa.company_id = eic.id
         <where>
             <if test="id != null and id != ''">

+ 14 - 0
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -157,4 +157,18 @@
             user_id = #{userId}
     </select>
 
+    <select id="getUserInfoBySystemCodeAndUserId" resultType="com.jzg.commons.entity.vo.SalesmanVo">
+        SELECT
+            suji.name,
+            suji.dept_Id as deptId,
+            sd.name as deptName,
+            suji.type_attr as typeAttr
+        FROM
+            sys_user_jzg_info suji
+                LEFT JOIN sys_user su ON suji.user_id = su.id
+                left join sys_dept sd on sd.id = suji.dept_id
+        WHERE
+            suji.user_id = #{userId}
+    </select>
+
 </mapper>