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

Merge branch 'master' into wrq_dev

# Conflicts:
#	tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
wangrq 3 месяцев назад
Родитель
Сommit
d2964e85f3
100 измененных файлов с 1589 добавлено и 248 удалено
  1. 4 0
      authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java
  2. 7 0
      commons/src/main/java/com/jzg/commons/config/DataPermissionInterceptor.java
  3. 2 1
      commons/src/main/java/com/jzg/commons/constants/SystemBusPermsConstants.java
  4. 1 0
      commons/src/main/java/com/jzg/commons/core/base/BaseController.java
  5. 40 0
      commons/src/main/java/com/jzg/commons/entity/Constant.java
  6. 3 0
      commons/src/main/java/com/jzg/commons/entity/agreement/po/PtlAgreementAttribution.java
  7. 10 0
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoBankCardDto.java
  8. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/CompanySuperviseSettlementReportDto.java
  9. 14 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/ExportSuperviseSettlementExcelDto.java
  10. 101 5
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java
  11. 18 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java
  12. 73 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/IncomeDataVO.java
  13. 39 3
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java
  14. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java
  15. 24 1
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementQueryVo.java
  16. 3 1
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrders.java
  17. 42 8
      commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java
  18. 4 0
      commons/src/main/java/com/jzg/commons/entity/po/EsmInsCompany.java
  19. 4 1
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreement.java
  20. 4 1
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementCost.java
  21. 7 0
      commons/src/main/java/com/jzg/commons/entity/po/SysAmountAuditing.java
  22. 1 1
      commons/src/main/java/com/jzg/commons/entity/po/SysUserActivityCompleteInRule.java
  23. 24 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoSalesmanBO.java
  24. 1 1
      commons/src/main/java/com/jzg/commons/entity/po/SysUserSignIn.java
  25. 17 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/KindInfoVo.java
  26. 8 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  27. 5 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/base/LoginBase.java
  28. 7 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java
  29. 62 0
      commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsDto.java
  30. 1 0
      commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsInfoDto.java
  31. 3 0
      commons/src/main/java/com/jzg/commons/entity/system/po/SysSystemBusPerms.java
  32. 9 2
      commons/src/main/java/com/jzg/commons/entity/system/vo/SysSystemBusPermsVo.java
  33. 30 2
      commons/src/main/java/com/jzg/commons/entity/vo/AmountAuditVo.java
  34. 9 0
      commons/src/main/java/com/jzg/commons/entity/vo/SalesmanVo.java
  35. 10 2
      commons/src/main/java/com/jzg/commons/entity/vo/SysOrganizationUserLinkVo.java
  36. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/SysUserSelectVo.java
  37. 14 0
      commons/src/main/java/com/jzg/commons/exception/ServiceException.java
  38. 15 0
      commons/src/main/java/com/jzg/commons/util/MinioUtils.java
  39. 19 0
      partner/src/main/java/com/jzg/constants/BigConstants.java
  40. 1 1
      partner/src/main/java/com/jzg/controller/PartnerUserController.java
  41. 2 0
      partner/src/main/java/com/jzg/entity/PartnerUser.java
  42. 5 6
      partner/src/main/java/com/jzg/mapper/PartnerUserMapper.java
  43. 78 26
      partner/src/main/java/com/jzg/service/Impl/PartnerUserServiceImpl.java
  44. 2 2
      partner/src/main/java/com/jzg/utils/ExpiredCommissionUtils.java
  45. 16 0
      partner/src/main/java/com/jzg/utils/TimedTaskUtils.java
  46. 1 1
      partner/src/main/resources/mapper/PartnerUserMapper.xml
  47. 10 0
      platform/src/main/java/com/jzg/controller/EsmInsCompanyController.java
  48. 4 6
      platform/src/main/java/com/jzg/controller/SysMenuController.java
  49. 8 1
      platform/src/main/java/com/jzg/controller/UserRoleController.java
  50. 9 0
      platform/src/main/java/com/jzg/mapper/SysRolePermsMapper.java
  51. 8 0
      platform/src/main/java/com/jzg/service/EsmInsCompanyService.java
  52. 8 0
      platform/src/main/java/com/jzg/service/SysMenuService.java
  53. 71 0
      platform/src/main/java/com/jzg/service/impl/EsmInsCompanyServiceImpl.java
  54. 23 1
      platform/src/main/java/com/jzg/service/impl/SysMenuServiceImpl.java
  55. 6 4
      platform/src/main/java/com/jzg/service/impl/SysSystemServiceImpl.java
  56. 4 2
      platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java
  57. 11 8
      platform/src/main/resources/mapper/PtlAgreementAttributionMapper.xml
  58. 5 0
      platform/src/main/resources/mapper/SysRolePermsMapper.xml
  59. 1 0
      tenant/insurance/pom.xml
  60. 1 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerApplyApplicationRequestBuild.java
  61. 5 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerSearchVehicleByVinResponse.java
  62. 0 2
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerQuoteProcessService.java
  63. 64 67
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  64. 5 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java
  65. 5 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse1.java
  66. 7 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/BoHaiCrawlerQuoteProcessService.java
  67. 23 18
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerQuoteProcessServiceImpl.java
  68. 8 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java
  69. 5 3
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PaymentRequest.java
  70. 5 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/CarModelQueryResponse.java
  71. 2 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/PremiumCalculationResponse.java
  72. 5 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/entity/response/ChengTaiFindCarModelResponse.java
  73. 87 7
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  74. 29 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/DetectLoginRequest.java
  75. 4 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/GetCaptchaRequest.java
  76. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/GetCaptchaResponse.java
  77. 7 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/filter/CarModelsFilter.java
  78. 8 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/filter/CarModelsFilterUtils.java
  79. 1 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/GetCaptchaBaseService.java
  80. 7 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/QuotationBaseService.java
  81. 1 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/QuotationCrawlerBaseService.java
  82. 31 8
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateTimeUtil.java
  83. 8 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiRequestImpl.java
  84. 52 2
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DaJiaCrawlerQuoteResultsVoBuild.java
  85. 1 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DajiaCrawlerAuditResultsVoBuild.java
  86. 13 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/component/DaJiaCrawlerCacheComponent.java
  87. 30 3
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/component/DaJiaCrawlerRequestComponent.java
  88. 2 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/constant/enums/RequestUrl.java
  89. 3 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/po/DaJiaCrawlerOrder.java
  90. 1 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerChannelPackagesRequest.java
  91. 8 4
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerPriceRequest.java
  92. 5 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/response/DaJiaCrawlerCarResponse.java
  93. 9 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/DaJiaCrawlerQuoteProcessService.java
  94. 1 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerOrderServiceImpl.java
  95. 36 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerQuoteProcessServiceImpl.java
  96. 74 30
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java
  97. 31 3
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/build/GuoRenApiQuoteResultsVoBuild.java
  98. 39 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Response/IdentifyCodeDataResponse.java
  99. 9 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java
  100. 39 5
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/build/GuoRenCrawlerQuoteResultsVoBuild.java

+ 4 - 0
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -266,6 +266,10 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
                 sysUserJzgAppMapper.updateById(jzgUserApp);
             }else if(!system.equals(SystemConstants.SYSTEM_PLATFORM.getCode())){
                 SysUserJzgVo jzgUserInfo = sysUserService.getJzgUserInfo(weblogUser.getId(),system);
+                log.info("租户[{}]下用户[{}]不存在",system,weblogUser.getId());
+                if(jzgUserInfo == null){
+                    throw new SystemException("租户下用户不存在");
+                }
                 name = jzgUserInfo.getName();
                 workNumber = jzgUserInfo.getWorkNumber();
                 province = jzgUserInfo.getProvince();

+ 7 - 0
commons/src/main/java/com/jzg/commons/config/DataPermissionInterceptor.java

@@ -1,6 +1,8 @@
 package com.jzg.commons.config;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler;
 import com.jzg.commons.constants.SystemConstants;
 import com.jzg.commons.core.base.BaseController;
@@ -19,6 +21,8 @@ import org.apache.ibatis.session.ResultHandler;
 import org.apache.ibatis.session.RowBounds;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.core.annotation.Order;
 
 import java.io.Serial;
@@ -34,6 +38,8 @@ import java.util.*;
 })
 public class DataPermissionInterceptor implements MultiDataPermissionHandler {
 
+    private static final Logger log = LoggerFactory.getLogger(DataPermissionInterceptor.class);
+
     private List<String> ignoredTables;
 
     private DataScopeProperties dataScopeProperties;
@@ -105,6 +111,7 @@ public class DataPermissionInterceptor implements MultiDataPermissionHandler {
         StringBuilder additionalSql = new StringBuilder();
         String tableName = getTableName(table);
         if(shouldIgnoreTable(table.getName()) && !dataScope.isEmpty()) {
+            log.info("{}函数进入dept过滤",table.getName());
             String fieldName = table.getName().equals("sys_dept") ? "id" : "dept_id";
             tableName = getAliasName(table);
             List<String> deptIds = new ArrayList<>();

+ 2 - 1
commons/src/main/java/com/jzg/commons/constants/SystemBusPermsConstants.java

@@ -14,7 +14,8 @@ public enum SystemBusPermsConstants {
     ORDER_AUDIT_DEPT_BUS(2,"orderAuditDept","订单审核机构"),
     SALESMAN_AUDIT_DEPT(3,"salesmanAuditDept","业务员审核机构"),
     SALESMAN_WITHDRAW_ACCOUNT_AUDIT_DEPT(4,"salesmanWithdrawAccountAuditDept","业务员提现账号审核机构"),
-    SALESMAN_WITHDRAW_PAYMENT_AUDIT_DEPT(5,"salesmanWithdrawPaymentAuditDept","业务员提现申请付款审核机构");
+    SALESMAN_WITHDRAW_PAYMENT_AUDIT_DEPT(5,"salesmanWithdrawPaymentAuditDept","业务员提现申请付款审核机构"),
+    AccountLinking(6,"accountLinking","账号互通");
 
     private Integer id;
     private String code;

+ 1 - 0
commons/src/main/java/com/jzg/commons/core/base/BaseController.java

@@ -115,6 +115,7 @@ public class BaseController {
 
         List<String> userPerms = new ArrayList<>();
         String userJsonStr = redissonClient.getBucket(authorizationHeader).get().toString();
+        log.info("获取平台权限:authorizationHeader=[{}],userJsonStr=[{}]",authorizationHeader, userJsonStr);
         JSONObject userInfo = JSONObject.parseObject(userJsonStr);
         JSONArray auths = userInfo.getJSONArray("auths");
         auths.forEach(auth->{

+ 40 - 0
commons/src/main/java/com/jzg/commons/entity/Constant.java

@@ -0,0 +1,40 @@
+package com.jzg.commons.entity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 常量池
+ * @author lipf
+ * @date 2026/5/13 14:37
+ */
+public class Constant {
+
+    // 业务员类型
+    public static final Map<String, String> ywyAttrTypeMap = new HashMap<>();
+    static {
+        ywyAttrTypeMap.put("5","团队");
+        ywyAttrTypeMap.put("6","个代");
+        ywyAttrTypeMap.put("7","渠道");
+        ywyAttrTypeMap.put("8","电销");
+    }
+
+
+    // 结算状态
+    public static final Map<String, String> settlementStatusMap = new HashMap<>();
+    static {
+        settlementStatusMap.put("0","未结算");
+        settlementStatusMap.put("1","已结算");
+        settlementStatusMap.put("30","全部");
+    }
+
+    // 应收项
+    public static final Map<String, String> invoiceRiskTypeMap = new HashMap<>();
+    static {
+        invoiceRiskTypeMap.put("10","车险");
+        invoiceRiskTypeMap.put("20","非车险");
+        invoiceRiskTypeMap.put("30","全部");
+    }
+
+
+}

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

@@ -91,6 +91,9 @@ public class PtlAgreementAttribution extends BaseModel {
     @TableField(exist = false)
     private String deptName;
 
+    @TableField(exist = false)
+    private String companyCode;
+
     public PtlAgreementAttribution(PtlAgreementAttributionSaveVo ptlAgreementAttributionSaveVo,PtlInsAttributionTemplate ptlInsAttributionTemplate,String esmInsCompanyName) {
         this.id = IdGenerate.nextId();
         this.userDept = ptlAgreementAttributionSaveVo.getUserDept();

+ 10 - 0
commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoBankCardDto.java

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.jzg.commons.entity.po.SysUserJzgInfoBankCardRecord;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -51,6 +52,9 @@ public class SysUserJzgInfoBankCardDto implements Serializable {
     @Schema(description = "业务员类型")
     private String typeAttr;
 
+    @Schema(description = "业务员工号")
+    private String workNumber;
+
     @Schema(description = "银行卡照片文件")
     private String fileId;
 
@@ -72,6 +76,12 @@ public class SysUserJzgInfoBankCardDto implements Serializable {
     @Schema(description = "最新驳回原因")
     private String lastRejectReason;
 
+    @Schema(description = "审核时间")
+    private String auditTime;
+
+    @Schema(description = "审核人")
+    private String auditBy;
+
     @Schema(description = "审核记录列表")
     private List<SysUserJzgInfoBankCardRecord> sysUserJzgInfoBankCardRecordList;
 }

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

@@ -44,4 +44,7 @@ public class CompanySuperviseSettlementReportDto {
 
     @Schema(description = "子保险公司数据")
     private List<CompanySuperviseSettlementReportDto> children;
+
+    @Schema(description = "上级公司ID")
+    private String parentId; // 必须加!构建树形结构需要
 }

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

@@ -18,10 +18,20 @@ public class ExportSuperviseSettlementExcelDto {
     @ExcelProperty(value = "结算记录编号")
     private String settlementId;
 
+    @Schema(description = "结算状态")
+    private String settlementStatus;
+
+    // 结算状态转义
+    @Schema(description = "结算状态")
+    private String settlementStatusName;
+
     @Schema(description = "保险公司")
     @ExcelProperty(value = "保险公司")
     private String companyName;
 
+    @Schema(description = "保险公司序号")
+    private String companyId;
+
     @Schema(description = "开票方")
     @ExcelProperty(value = "开票方")
     private String invoiceParty;
@@ -30,6 +40,10 @@ public class ExportSuperviseSettlementExcelDto {
     @ExcelProperty(value = "应收项")
     private String invoiceType;
 
+    // 应收项转义
+    @Schema(description = "应收项")
+    private String invoiceTypeName;
+
     @Schema(description = "税点")
     @ExcelProperty(value = "税点")
     private String taxPoint;

+ 101 - 5
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java

@@ -1,184 +1,280 @@
 package com.jzg.commons.entity.finance.po;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.jzg.commons.core.base.BaseModel;
+import com.jzg.commons.entity.po.InsFeeOrders;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+import java.io.Serial;
+
+@EqualsAndHashCode(callSuper = true)
 @Data
 @Schema(description = "财务应收表")
-public class InsPlyIncome  extends BaseModel {
+public class InsPlyIncome extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = 6161862008963938376L;
+
+    @ExcelIgnore
     private String id;
 
     @Schema(description = "订单号")
+    @ExcelProperty("订单号")
     private String orderNo;
 
     @Schema(description = "协议类型")
+    @ExcelProperty("协议类型")
     private String agreementType;
 
     @Schema(description = "机构")
+    @ExcelProperty("机构id")
     private String deptId;
 
     @Schema(description = "机构名称")
+    @ExcelProperty("机构名称")
     private String deptName;
 
     @Schema(description = "产品id")
+    @ExcelProperty("产品id")
     private String productId;
 
     @Schema(description = "产品名称")
+    @ExcelProperty("产品名称")
     private String productName;
 
     @Schema(description = "险种")
+    @ExcelProperty("险种")
     private String riskCode;
 
-//    @Schema(description = "出单时间")
-//    private String payTime;
-//
     @Schema(description = "签单时间")
     @TableField(exist = false)
+    @ExcelProperty("签单时间")
     private String signingTime;
 
+    @Schema(description = "签单年份")
+    @TableField(exist = false)
+    private String signYear;
+
+    @Schema(description = "签单日期 yyyy-mm-dd 格式")
+    @TableField(exist = false)
+    private String signDate;
+
     @Schema(description = "保司ID")
+    @ExcelProperty("保司ID")
     private String companyId;
 
     @Schema(description = "保司名称")
     @TableField(exist = false)
+    @ExcelProperty("保司名称")
     private String companyName;
 
     @Schema(description = "协议Id")
+    @ExcelProperty("协议Id")
     private String agreementId;
 
     @Schema(description = "协议名称")
+    @ExcelProperty("协议名称")
     private String agreementName;
 
     @Schema(description = "被保人")
+    @ExcelProperty("被保人")
     private String insuredPerson;
 
     @Schema(description = "车牌号")
+    @ExcelProperty("车牌号")
     private String licenseNo;
 
     @Schema(description = "车船税")
+    @ExcelProperty("车船税")
     private String taxPremium;
 
     @Schema(description = "交强保单号")
+    @ExcelProperty("交强保单号")
     private String jqPolicyNo;
 
     @Schema(description = "商业保单号")
+    @ExcelProperty("商业保单号")
     private String syPolicyNo;
 
     @Schema(description = "驾意保单号")
+    @ExcelProperty("驾意保单号")
     private String jyPolicyNo;
 
     @Schema(description = "交强保费")
+    @ExcelProperty("交强保费")
     private String jqPremium;
 
     @Schema(description = "商业保费")
+    @ExcelProperty("商业保费")
     private String syPremium;
 
     @Schema(description = "驾意保费")
+    @ExcelProperty("驾意保费")
     private String jyPremium;
 
     @Schema(description = "交强手续费")
+    @ExcelProperty("交强手续费")
     private String jqSuperviseCostsPremiums;
 
     @Schema(description = "交强手续费比例")
+    @ExcelProperty("交强手续费比例")
     private String jqSuperviseCostsProportion;
 
     @Schema(description = "商业手续费")
+    @ExcelProperty("商业手续费")
     private String sySuperviseCostsPremiums;
 
     @Schema(description = "商业手续费比例")
+    @ExcelProperty("商业手续费比例")
     private String sySuperviseCostsProportion;
 
     @Schema(description = "驾意手续费")
+    @ExcelProperty("驾意手续费")
     private String jySuperviseCostsPremiums;
 
     @Schema(description = "驾意手续费比例")
+    @ExcelProperty("驾意手续费比例")
     private String jySuperviseCostsProportion;
 
     @TableField(exist = false)
     @Schema(description = "应收手续费")
+    @ExcelProperty("应收手续费")
     private String superviseCostsPremiums;
 
     @TableField(exist = false)
     @Schema(description = "应收跟单费")
+    @ExcelProperty("应收跟单费")
     private String otherCostsPremiums;
 
     @Schema(description = "交强跟单费比例")
+    @ExcelProperty("交强跟单费比例")
     private String jqOtherCostsProportion;
 
     @Schema(description = "交强跟单费")
+    @ExcelProperty("交强跟单费")
     private String jqOtherCostsPremiums;
 
     @Schema(description = "商业跟单费比例")
+    @ExcelProperty("商业跟单费比例")
     private String syOtherCostsProportion;
 
     @Schema(description = "商业跟单费")
+    @ExcelProperty("商业跟单费")
     private String syOtherCostsPremiums;
 
     @Schema(description = "驾意跟单费比例")
+    @ExcelProperty("驾意跟单费比例")
     private String jyOtherCostsProportion;
 
     @Schema(description = "驾意跟单费")
+    @ExcelProperty("驾意跟单费")
     private String jyOtherCostsPremiums;
 
     @Schema(description = "交强应收费用")
+    @ExcelProperty("交强应收费用")
     private String jqReceivablePremium;
 
     @Schema(description = "商业应收费用")
+    @ExcelProperty("商业应收费用")
     private String syReceivablePremium;
 
     @Schema(description = "驾意应收费用")
+    @ExcelProperty("驾意应收费用")
     private String jyReceivablePremium;
 
     @TableField(exist = false)
     @Schema(description = "总应收金额")
+    @ExcelProperty("总应收金额")
     private String receivableAmount;
 
     @Schema(description = "手续费是否已经结算")
+    @ExcelProperty("手续费是否已经结算")
     private String superviseSettlement;
 
     @Schema(description = "跟单费是否已经结算")
+    @ExcelProperty("跟单费是否已经结算")
     private String otherSettlement;
 
     @Schema(description = "驾意险手续费是否已经结算")
+    @ExcelProperty("驾意险手续费是否已经结算")
     private String jySuperviseSettlement;
 
     @Schema(description = "驾意跟单位是否已经结算")
+    @ExcelProperty("驾意跟单位是否已经结算")
     private String jyOtherSettlement;
 
     @Schema(description = "维护人工号")
+    @ExcelProperty("维护人工号")
     private String leaderId;
 
     @Schema(description = "维护人名称")
+    @ExcelProperty("维护人名称")
     private String leaderName;
 
     @Schema(description = "对接人")
+    @ExcelProperty("对接人")
     private String contactPerson;
 
     @Schema(description = "系统code")
+    @ExcelProperty("系统code")
     private String systemCode;
 
     @Schema(description = "业务来源")
+    @ExcelProperty("业务来源")
     private String businessSource;
 
-    @Schema(description = "结算状态")
+    @Schema(description = "结算状态(编码)")
+    @ExcelProperty("结算状态(编码)")
     private String settlementStatus;
 
+    @Schema(description = "结算状态(转义后)")
+    @ExcelProperty("结算状态(转义后)")
+    private String settlementStatusName;
+
     @Schema(description = "增加类型")
+    @ExcelProperty("增加类型")
     private String addType;
 
     @TableField(exist = false)
     @Schema(description = "交强起保日期")
+    @ExcelProperty("交强起保日期")
     private String jqStartDate;
 
     @TableField(exist = false)
     @Schema(description = "商业起保日期")
+    @ExcelProperty("商业起保日期")
     private String syStartDate;
 
     @TableField(exist = false)
     @Schema(description = "订单类型")
+    @ExcelProperty("订单类型")
     private String orderType;
 
+    @TableField(exist = false)
+    @Schema(description = "订单类型(code)")
+    private String entryStatus;
+
+    @TableField(exist = false)
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttr;
+
+    @TableField(exist = false)
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttrName;
+
+    @TableField(exist = false)
+    @Schema(description = "实际签单用户手机号2")
+    private String realQuoteUserId;
+
+    @TableField(exist = false)
+    @Schema(description = "实际签单用户手机号")
+    private String realQuoteUserName;
+
+    @TableField(exist = false)
+    @Schema(description = "订单费用表")
+    private InsFeeOrders insFeeOrders;
 
 }

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

@@ -4,11 +4,15 @@ import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
 import java.math.BigDecimal;
+import java.util.Objects;
 
 @Data
 @Schema(description = "财务应收开票表")
 public class InsPlyIncomeInvoice extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = -3532430480398453542L;
     private String id;
 
     @Schema(description = "保司id")
@@ -23,9 +27,23 @@ public class InsPlyIncomeInvoice extends BaseModel {
     @Schema(description = "虚增金额")
     private BigDecimal overinflatedAmount;
 
+    @Schema(description = "应收项")
+    private String invoickRiskType;
+
+    public BigDecimal getOverinflatedAmount(){
+        return Objects.requireNonNullElse(this.overinflatedAmount, BigDecimal.ZERO);
+    }
+
     @Schema(description = "应收费用")
     private BigDecimal receivableSupervisePremium;
 
+    public BigDecimal getReceivableSupervisePremium(){
+        if(this.receivableSupervisePremium == null){
+            return BigDecimal.ZERO;
+        }
+        return this.receivableSupervisePremium;
+    }
+
     @Schema(description = "税点")
     private String taxPoint;
 

+ 73 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/IncomeDataVO.java

@@ -0,0 +1,73 @@
+package com.jzg.commons.entity.finance.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * @author lipf
+ * @date 2026/5/12 14:16
+ */
+@Data
+public class IncomeDataVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -3396833203930686221L;
+
+    /**
+     * 订单号
+     */
+    private List<String> orderNos;
+
+    /**
+     * 保险公司的id
+     */
+    private String companyId;
+
+    /**
+     * 具体的查询条件
+     */
+    private List<SearchVO> searchList;
+
+    /**
+     * 逻辑判断
+     * and 并且
+     * or 或者
+     */
+    private String logicJudge;
+
+
+    @Data
+    public static class SearchVO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 6474246099964388105L;
+
+        public static final String companyId = "companyId";
+        public static final String signDate = "signDate";
+        public static final String ptlAgreement = "ptlAgreement";
+        public static final String orderType = "orderType";
+        public static final String signYear = "signYear";
+
+        /**
+         * 查询条件
+         * companyId: 表示保险公司(序号)
+         * signDate: 表示签单日期(yyyy-mm-dd)
+         * ptlAgreement: 表示出单协议
+         * orderType: 表示订单类型 (车险订单,补录订单, 代客录单), 传对应的字典码即可
+         * signYear: 表示签单年份
+         */
+        private String name;
+        /**
+         * 查询条件的操作符号
+         */
+        private String type;
+
+        /**
+         * 条件值1
+         */
+        private String search;
+
+    }
+}

+ 39 - 3
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java

@@ -3,6 +3,8 @@ package com.jzg.commons.entity.finance.vo;
 import com.jzg.commons.core.base.PageRequest;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class InvoiceRecordResult extends PageRequest {
 
@@ -21,6 +23,11 @@ public class InvoiceRecordResult extends PageRequest {
      */
     private String companyName;
 
+    /**
+     * 保险公司名称及父级的名称,例如
+     */
+    private String companyALlName;
+
     /**
      * 开票方
      */
@@ -29,17 +36,27 @@ public class InvoiceRecordResult extends PageRequest {
     /**
      * 虚增金额
      */
-    private String overinflatedAmount;
+    private BigDecimal overinflatedAmount;
 
     /**
-     * 应收项
+     * 应收项(转义)
+     * 保留这个是为了兼容之前的功能
      */
     private String accountsReceivable;
 
+    /**
+     * 应收项的编码
+     */
+    private String invoiceRiskType;
+
+    /**
+     * 应收项的转义(新增的,之前用的是accountsReceivable)
+     */
+    private String invoiceRiskTypeName;
     /**
      * 应收费用
      */
-    private String receivableSupervisePremium;
+    private BigDecimal receivableSupervisePremium;
 
     /**
      * 开票金额
@@ -56,6 +73,25 @@ public class InvoiceRecordResult extends PageRequest {
      */
     private String settlementStatus;
 
+    /**
+     * 已结算金额
+     */
+    private BigDecimal settlementAmount;
+    /**
+     * 待结算金额
+     */
+    private BigDecimal remainSettlementAmount;
+
+    /**
+     * 数据库表中的status字段(结算状态)
+     */
+    private String status;
+
+    /**
+     * 结算状态(根据status转移得到的)
+     */
+    private String settlementStatusName;
+
     /**
      * 开票人
      */

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

@@ -107,5 +107,8 @@ public class ReceivableQueryVo extends PageRequest {
     @Schema(description = "增加类型")
     private String addType;
 
+    @Schema(description = "业务员类型 团队/渠道/电销/个代 5:团队 6:个代 7:渠道 8 :电销")
+    private String typeAttr;
+
 
 }

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

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.finance.vo;
 
+import cn.hutool.core.util.StrUtil;
 import com.jzg.commons.core.base.PageRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -24,6 +25,28 @@ public class SettlementQueryVo extends PageRequest {
     @Schema(description = "保险公司Id")
     private String companyId;
 
+    @Schema(description = "应收项")
+    private String invoiceRiskType;
+
+    @Schema(description = "结算状态")
+    private String settlementStatus;
+
+    @Schema(description = "结算用户")
+    private String settlementPerson;
+
+    @Schema(description = "结算日期-开始日期")
+    private String settlementDateStart;
+
+    @Schema(description = "结算日期-结束日期")
+    private String settlementDateEnd;
+
+    private String getSettlementDateEndStr(){
+        if(StrUtil.isEmpty(this.settlementDateEnd)){
+            return null;
+        }
+        return this.settlementDateEnd +" 23:59:59";
+    }
+
     @Schema(description = "开票方")
     private String invoiceParty;
 
@@ -31,7 +54,7 @@ public class SettlementQueryVo extends PageRequest {
     private String status;
 
     @Schema(description = "结算人")
-    private String settlementPerson;
+    private String invoicePerson;
 
     @Schema(description = "结算时间开始")
     private String settlementTimeStart;

+ 3 - 1
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrders.java

@@ -7,13 +7,15 @@ import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import java.time.LocalDate;
+import java.io.Serial;
 import java.time.LocalDateTime;
 
 @Data
 @Schema(description = "保险订单表")
 public class InsOrders extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = -5057873662529403780L;
     @Schema(description = "订单ID")
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private String id;

+ 42 - 8
commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java

@@ -1,98 +1,132 @@
 package com.jzg.commons.entity.orders.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
+import java.io.Serial;
 import java.math.BigDecimal;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 @Schema(description = "订单审核表VO")
 @Data
 public class FeeAuditVo extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = 4631117388822444574L;
+    @ExcelProperty("订单号")
     @Schema(description = "订单号")
     private String orderNo;
 
+    @ExcelProperty("保险公司")
     @Schema(description = "保险公司")
     private String companyName;
 
+    @Schema(description = "保险公司ID")
+    private String companyId;
+    /**
+     * 保险公司名称及父级的名称,例如
+     */
+    @Schema(description = "保险公司名称及父级的名称")
+    private String companyALlName;
+
+    @ExcelProperty("车牌号")
     @Schema(description = "车牌号")
     private String licenseNo;
 
+    @ExcelProperty("被保人姓名")
     @Schema(description = "被保人姓名")
     private String insurName;
 
+    @ExcelProperty("订单类型")
     @Schema(description = "订单类型  1 车险录入 2 待客录单 3 外部订单")
     private String orderType;
 
+    @ExcelProperty("业务员姓名")
     @Schema(description = "业务员姓名")
     private String name;
 
+    @ExcelProperty("业务员手机号")
     @Schema(description = "业务员手机号")
     private String mobile;
 
+    @ExcelProperty("业务员类型")
     @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
     private String attrType;
 
-    @Schema(description = "签单时间")
+    @ExcelProperty("签单时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "签单时间")
     private LocalDateTime signingTime;
 
-    @Schema(description = "报价时间")
+    @ExcelProperty("报价时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "报价时间")
     private LocalDateTime quotationTime;
 
+    @ExcelProperty("对接人")
     @Schema(description = "对接人")
     private String dockingPerson;
 
+    @ExcelProperty("出单协议")
     @Schema(description = "出单协议")
     private String agreementName;
 
+    @ExcelProperty("险种")
     @Schema(description = "险种")
     private String productName;
 
+    @ExcelProperty("出单机构")
     @Schema(description = "出单机构")
     private String deptName;
 
-    @Schema(description = "录单时间")
+    @ExcelProperty("录单时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "录单时间")
     private LocalDateTime createTime;
 
+    @ExcelProperty("录单人")
     @Schema(description = "录单人")
     private String createBy;
 
-    @Schema(description = "支付时间")
+    @ExcelProperty("支付时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "支付时间")
     private LocalDateTime payTime;
 
+    @ExcelProperty("交强险保费")
     @Schema(description = "交强险保费")
     private BigDecimal jqPremium;
 
+    @ExcelProperty("商业险保费")
     @Schema(description = "商业险保费")
     private BigDecimal syPremium;
 
+    @ExcelProperty("驾意险保费")
     @Schema(description = "驾意险保费")
     private BigDecimal jyPremium;
 
+    @ExcelProperty("总保费")
     @Schema(description = "总保费")
     private BigDecimal sumPremium;
 
-    @Schema(description = "审核时间")
+    @ExcelProperty("审核时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "审核时间")
     private LocalDateTime auditTime;
 
+    @ExcelProperty("审核人")
     @Schema(description = "审核人")
     private String auditUser;
 
+    @ExcelProperty("驳回原因")
     @Schema(description = "驳回原因")
     private String refuse;
 
+    @ExcelProperty("权益金额")
     @Schema(description = "权益金额")
     private BigDecimal equityAmount;
 
-
 }

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/po/EsmInsCompany.java

@@ -6,11 +6,15 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.jzg.commons.core.base.BaseModel;
 import lombok.Data;
+
+import java.io.Serial;
 import java.util.List;
 @TableName(value = "esm_ins_company")
 @Data
 public class EsmInsCompany extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = 3082765270221772930L;
     @TableId(type = IdType.ASSIGN_ID)
     private String id;
 

+ 4 - 1
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreement.java

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.po;
 
+import java.io.Serial;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
@@ -10,12 +11,14 @@ import lombok.Data;
 
 /**
  * 协议信息表
- * @TableName ptl_agreement
+ * ptl_agreement
  */
 @Schema(description = "协议管理表")
 @Data
 public class PtlAgreement extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = 8962555764674070017L;
     /** 主键 */
     @Schema(description = "主键")
     private String id;

+ 4 - 1
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementCost.java

@@ -7,18 +7,21 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.jzg.commons.core.base.BaseModel;
 import lombok.Data;
 
+import java.io.Serial;
 import java.time.LocalDateTime;
 import java.util.Date;
 
 
 /**
- * @author: JZG 协议费用管理
+ * @author JZG 协议费用管理
  */
 
 @Data
 @TableName("ptl_agreement_cost")
 public class PtlAgreementCost extends BaseModel {
 
+    @Serial
+    private static final long serialVersionUID = -985496146546865007L;
     @TableId(type = IdType.ASSIGN_ID)
     private String id;
 

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

@@ -65,6 +65,13 @@ public class SysAmountAuditing extends BaseModel {
     @Schema(description = "驳回原因")
     private String rejectReason;
 
+    @Schema(description = "驳回时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime rejectTime;
+
+    @Schema(description = "驳回人")
+    private String rejectPerson;
+
     @Schema(description = "账户名称")
     private String accountName;
 

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/po/SysUserActivityCompleteInRule.java

@@ -24,7 +24,7 @@ public class SysUserActivityCompleteInRule extends BaseModel {
     private String id;
 
     @Schema(description = "租户ID")
-    private String tenantId;
+    private String systemCode;
 
     @Schema(description = "用户ID")
     private String userId;

+ 24 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfoSalesmanBO.java

@@ -0,0 +1,24 @@
+package com.jzg.commons.entity.po;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+@Data
+public class SysUserJzgInfoSalesmanBO extends SysUserJzgInfoSalesman implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 4445597727858843519L;
+
+
+    /**
+     * 租户代码
+     */
+    private String systemCode;
+
+    /**
+     * 用户登录手机号
+     */
+    private String userName;
+}

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/po/SysUserSignIn.java

@@ -25,7 +25,7 @@ public class SysUserSignIn extends BaseModel {
     private String id;
 
     @Schema(description = "租户ID")
-    private String tenantId;
+    private String systemCode;
 
     @Schema(description = "用户ID")
     private String userId;

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

@@ -7,6 +7,7 @@ import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * @description: 商业险 险种信息
@@ -92,9 +93,25 @@ public class KindInfoVo implements Serializable {
     @Schema(description = "服务次数")
     private String serviceTimes;
 
+    private List<OptionsDTO> options;
+
     public KindInfoVo(String number, String number1, String number2, String number3, String number4, String number5, String number6, String number7, String number8, String number9,String number10) {
     }
 
     public KindInfoVo(String number, String number1, String number2, String number3, String number4, String number5, String number6, String number7, String number8, String number9) {
     }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class OptionsDTO{
+
+        private String id;
+
+        private String label;
+
+        private String value;
+
+    }
+
 }

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

@@ -120,6 +120,12 @@ public class QuoteEchoVo extends QuoteVo {
 
         @Schema(description = "业务员租户简称")
         private String systemShortName;
+        // 业务员对应的管理员的id(sys_user表的id)
+        @Schema(description = "业务员对应的管理员的id(sys_user表的id)")
+        private String realQuoteUserManagerId;
+        // 业务员对应的管理员的手机号
+        @Schema(description = "业务员对应的管理员的手机号")
+        private String realQuoteUserManagerUseName;
     }
 
 
@@ -315,6 +321,8 @@ public class QuoteEchoVo extends QuoteVo {
             salesman.setSystemCode(insOrdersVo.getSalesmanInfo().getSystemCode());
             salesman.setSystemName(insOrdersVo.getSalesmanInfo().getSystemName());
             salesman.setSystemShortName(insOrdersVo.getSalesmanInfo().getSystemShortName());
+            salesman.setRealQuoteUserManagerId(insOrdersVo.getSalesmanInfo().getRealQuoteUserManagerId());
+            salesman.setRealQuoteUserManagerUseName(insOrdersVo.getSalesmanInfo().getRealQuoteUserManagerUseName());
         }
         this.setSalesmanInfo(salesman);
         this.setErrorMessage(insOrdersVo.getErrorMessage());

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/base/LoginBase.java

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.quote.vo.base;
 
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -38,4 +39,8 @@ public class LoginBase {
      */
     private int signInMethod;
 
+    /**
+     * 协议id 或 账号id
+     */
+    private String agreementId;
 }

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

@@ -126,6 +126,13 @@ public class InsOrdersVo extends QuoteVo {
 
     @Data
     public static class Salesman{
+
+        // 业务员对应的管理员的id(sys_user表的id)
+        @Schema(description = "业务员对应的管理员的id(sys_user表的id)")
+        private String realQuoteUserManagerId;
+        // 业务员对应的管理员的手机号
+        @Schema(description = "业务员对应的管理员的手机号")
+        private String realQuoteUserManagerUseName;
         @Schema(description = "业务员姓名")
         private String name;
 

+ 62 - 0
commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsDto.java

@@ -1,11 +1,14 @@
 package com.jzg.commons.entity.rights.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 类描述:
@@ -17,6 +20,10 @@ import java.util.Date;
 @Schema(description = "订单选择权益券DTO")
 @Data
 public class InsOrderRightsDto {
+
+    @Schema(description = "权益类型 1 券  2 套餐")
+    private String rightType;
+
     @Schema(description = "权益券id:对应生活服务平台返回的id")
     private String rightsId;
 
@@ -99,4 +106,59 @@ public class InsOrderRightsDto {
 
     @Schema(description = "权益类型:1-权益")
     private Integer rightsType;
+
+    //    @Schema(description = "权益套餐id")
+//    private String rightsPackageId;
+    @Schema(description = "权益套餐名称")
+    private String equityPackageName;
+
+    /**费用最大值*/
+    @Schema(description = "费用最大值")
+    private BigDecimal costPriceMax;
+    /**费用最小值*/
+    @Schema(description = "费用最小值")
+    private BigDecimal costPriceMin;
+
+
+    /**协议价*/
+    @Schema(description= "协议价")
+    private BigDecimal agreementPrice;
+    /**三方结算价*/
+    @Schema(description = "三方结算价")
+    private BigDecimal threeSettlementPrice;
+
+    /**套餐售价*/
+    @Schema(description = "套餐售价")
+    private BigDecimal packagePrice;
+    /**行业id*/
+    @Schema(description = "行业id")
+    private String industryId;
+
+    /**是否上架(0 未上架  1  上架)*/
+    @Schema(description = "是否上架(0 未上架  1  上架)")
+    private String status;
+    @Schema(description = "第三方用户id")
+    private String threeUserId;
+//    /**总数*/
+//    @Schema(description = "权益包总数")
+//    @TableField(exist = false)
+//    private Integer totalNumber;
+
+    /**套餐id套餐名称*/
+    @Schema(description = "套餐id套餐名称")
+    @TableField(exist = false)
+    private String selectNameId;
+
+
+
+    /**第三方用户id*/
+    @Schema(description = "第三方用户id")
+    @TableField(exist = false)
+    private List<String> threeUserIdList;
+
+
+    @Schema(description  = "渠道用户id")
+    @TableField(exist = false)
+    private List<String> channelIds;
+
 }

+ 1 - 0
commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsInfoDto.java

@@ -17,6 +17,7 @@ import java.util.List;
 public class InsOrderRightsInfoDto {
     @Schema(description = "订单关联权益套餐列表")
     private List<InsOrderRightsPackageDto> insOrderRightsPackageList;
+
     @Schema(description = "订单关联权益券列表")
     private List<InsOrderRightsDto> insOrderRightsList;
 

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

@@ -57,6 +57,8 @@ public class SysSystemBusPerms implements Serializable {
     private Integer ownerRights;
     @Schema(description = "车主权益PC端可用还是APP端可用1.PC,2:APP")
     private Integer clientType;
+    @Schema(description = "账号互通")
+    private Integer accountLinking;
 
 
 
@@ -82,5 +84,6 @@ public class SysSystemBusPerms implements Serializable {
             this.ownerRights = sysSystemBusPermsVo.getOwnerRights();
         }
         this.clientType  = sysSystemBusPermsVo.getClientType();
+        this.accountLinking = sysSystemBusPermsVo.getAccountLinking();
     }
 }

+ 9 - 2
commons/src/main/java/com/jzg/commons/entity/system/vo/SysSystemBusPermsVo.java

@@ -83,6 +83,9 @@ public class SysSystemBusPermsVo implements Serializable {
     @Schema(description = "PC端还是APP端可用1:PC,2:APP")
     private Integer clientType;
 
+    @Schema(description = "账号互通")
+    private Integer accountLinking;
+
     public SysSystemBusPermsVo(SysSystemBusPerms sysSystemBusPerms, List<SysSystemBusPermsLink> links) {
         this.id = sysSystemBusPerms.getId();
 //        this.companyId = sysSystemBusPerms.getCompanyId();
@@ -100,6 +103,9 @@ public class SysSystemBusPermsVo implements Serializable {
             this.ownerRights = sysSystemBusPerms.getOwnerRights();
         }
         this.clientType = sysSystemBusPerms.getClientType();
+
+        this.accountLinking = sysSystemBusPerms.getAccountLinking();
+
         //报价的保司
         this.quoteCompanyList.addAll(links.stream()
                 .filter(link -> link.getBusCode().equals(SystemBusPermsConstants.QUOTE_COMPANY_BUS.getCode()))
@@ -122,8 +128,9 @@ public class SysSystemBusPermsVo implements Serializable {
 
         //业务员提现申请付款审核指定机构
         this.salesmanWithdrawPaymentAuditDeptList.addAll(links.stream()
-             .filter(link -> link.getBusCode().equals(SystemBusPermsConstants.SALESMAN_WITHDRAW_PAYMENT_AUDIT_DEPT.getCode()))
-             .map(link->link.getBusId()).collect(Collectors.toList()));
+                .filter(link -> link.getBusCode().equals(SystemBusPermsConstants.SALESMAN_WITHDRAW_PAYMENT_AUDIT_DEPT.getCode()))
+                .map(link->link.getBusId()).collect(Collectors.toList()));
+
     }
 
 }

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

@@ -1,5 +1,7 @@
 package com.jzg.commons.entity.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.BaseModel;
@@ -14,53 +16,79 @@ import java.time.LocalDateTime;
 @Data
 public class AmountAuditVo  extends BaseModel {
 
+    @ExcelProperty("主键")
     @Schema(description = "主键")
     private String id;
 
+    @ExcelProperty("用户信息ID")
     @Schema(description = "sys_user_jzg_info的主键")
     private String userJzgInfoId;
 
+    @ExcelProperty("业务员姓名")
     @Schema(description = "业务员姓名")
     private String name;
 
+    @ExcelProperty("业务员手机号")
     @Schema(description = "业务员手机号")
     private String mobile;
 
+    @ExcelProperty("管理人姓名")
     @Schema(description = "管理人姓名")
     private String managerName;
 
+    @ExcelProperty("管理人手机号")
     @Schema(description = "管理人手机号")
     private String managerMobile;
 
+    @ExcelProperty("业务员类型")
     @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
     private String attrType;
 
-    @Schema(description = "提现时间")
+    @ExcelProperty("提现时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "提现时间")
     private LocalDateTime createTime;
 
-    @Schema(description = "支付时间")
+    @ExcelProperty("支付时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "支付时间")
     private LocalDateTime paymentTime;
 
+    @ExcelProperty("提现金额")
     @Schema(description = "提现金额")
     private BigDecimal amount;
 
+    @ExcelProperty("账户余额")
     @Schema(description = "账户余额")
     private BigDecimal balanceAmount;
 
+    @ExcelProperty("账户名称")
     @Schema(description = "账户名称")
     private String accountName;
 
+    @ExcelProperty("内部银行卡号")
     @Schema(description = "内部银行卡号")
     private String bankCardNum;
 
+    @ExcelProperty("内部银行卡开户行名称")
     @Schema(description = "内部银行卡开户行名称")
     private String bankName;
 
+    @ExcelProperty("内部银行卡开户行号")
     @Schema(description = "内部银行卡开户行号")
     private String bankNum;
 
+    @ExcelProperty("驳回原因")
+    @Schema(description = "驳回原因")
+    private String rejectReason;
+
+    @ExcelProperty("驳回时间")
+    @Schema(description = "驳回时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime rejectTime;
 
+    @ExcelProperty("驳回人")
+    @Schema(description = "驳回人")
+    private String rejectPerson;
 
 }

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

@@ -9,6 +9,15 @@ import lombok.Data;
 
 @Data
 public class SalesmanVo {
+
+    // 业务员的领导id(sys_user_jzg_info表的id)
+    private String leaderId;
+
+    // 业务员对应的管理员的id(sys_user表的id)
+    private String realQuoteUserManagerId;
+    // 业务员对应的管理员的手机号
+    private String realQuoteUserManagerUseName;
+
     private String id;
 
     private String name;

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

@@ -1,10 +1,15 @@
 package com.jzg.commons.entity.vo;
 
-import com.jzg.commons.core.base.PageRequest;
 import lombok.Data;
 
+import java.io.Serial;
+import java.io.Serializable;
+
 @Data
-public class SysOrganizationUserLinkVo{
+public class SysOrganizationUserLinkVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -8437809885332184423L;
+
     private String id;
     private String userId;
     private String name;
@@ -21,4 +26,7 @@ public class SysOrganizationUserLinkVo{
     private String referrerId;
     private String leaderName;
     private String leaderId;
+
+    // 渠道名称
+    private String organizationName;
 }

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

@@ -23,4 +23,7 @@ public class SysUserSelectVo {
 
     @Schema(description = "用户工号")
     private String workNumber;
+
+    @Schema(description = "部门序号")
+    private String deptId;
 }

+ 14 - 0
commons/src/main/java/com/jzg/commons/exception/ServiceException.java

@@ -0,0 +1,14 @@
+package com.jzg.commons.exception;
+
+import java.io.Serial;
+
+
+public class ServiceException extends RuntimeException{
+    @Serial
+    private static final long serialVersionUID = -1477293094627064589L;
+
+
+    public ServiceException(String msg) {
+        super(msg);
+    }
+}

+ 15 - 0
commons/src/main/java/com/jzg/commons/util/MinioUtils.java

@@ -9,6 +9,7 @@ import io.minio.messages.DeleteObject;
 import io.minio.messages.Item;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -195,6 +196,20 @@ public class MinioUtils {
         return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
     }
 
+    /**
+     * 获取base64 文件
+     *
+     * @param bucketName 存储桶
+     * @param objectName 文件名
+     * @return base64字符串
+     */
+    @SneakyThrows(Exception.class)
+    public String getBase64Str(String bucketName, String objectName) {
+        InputStream inputStream = getObject(bucketName, objectName);
+        return Base64Convert.byteToBase64(IOUtils.toByteArray(inputStream));
+    }
+
+
     /**
      * 断点下载
      *

+ 19 - 0
partner/src/main/java/com/jzg/constants/BigConstants.java

@@ -0,0 +1,19 @@
+package com.jzg.constants;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class BigConstants {
+
+    public static final BigDecimal WEIGHT_YQ = new BigDecimal("0.33");
+    public static final BigDecimal WEIGHT_BF = new BigDecimal("0.34");
+    public static final BigDecimal WEIGHT_GR = new BigDecimal("0.33");
+    public static final BigDecimal WEIGHT_TWO_ITEMS = new BigDecimal("0.50");
+    public static final BigDecimal WEIGHT_ONE_ITEM = BigDecimal.ONE;
+    public static final BigDecimal FULL_RATE = BigDecimal.ONE;
+    public static final BigDecimal HUNDRED = new BigDecimal("100");
+    public static final int DIV_SCALE = 10;
+    public static final int RESULT_SCALE = 2;
+    public static final RoundingMode ROUND_MODE = RoundingMode.HALF_UP;
+
+}

+ 1 - 1
partner/src/main/java/com/jzg/controller/PartnerUserController.java

@@ -241,7 +241,7 @@ public class PartnerUserController extends BaseController {
      */
     @GetMapping("checkCommissionExpireTime")
     public void checkCommissionExpireTime() {
-        SpringUtil.getBean(TimedTaskUtils.class).updateOrderDateNoon();
+        SpringUtil.getBean(TimedTaskUtils.class).checkCommissionExpireTime();
     }
 
 

+ 2 - 0
partner/src/main/java/com/jzg/entity/PartnerUser.java

@@ -93,5 +93,7 @@ public class PartnerUser extends PartnerBaseModel {
     @TableField(value = "status")
     private boolean status;
 
+    private boolean first;
+
 
 }

+ 5 - 6
partner/src/main/java/com/jzg/mapper/PartnerUserMapper.java

@@ -118,9 +118,8 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Update("UPDATE partner_user SET upgrade_time = #{date} WHERE  user_id = #{userId} and grade = #{grade}")
     void updateUpgradeTimeByDate(@Param("userId") String userId,@Param("date") Date date,@Param("grade") Integer grade);
 
-    @Update(" UPDATE partner_user pu JOIN( SELECT info.id AS info_id, sa.partner_review_time FROM sys_user_jzg_info info " +
-            " INNER JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = info.id " +
-            " WHERE sa.type_attr = 3 AND sa.partner_status = 3 AND info.user_id = #{userId} LIMIT 1) t ON pu.user_id = t.info_id SET pu.upgrade_time = t.partner_review_time WHERE pu.grade = #{grade} ")
+    @Update(" UPDATE partner_user pu JOIN( SELECT sa.sys_user_jzg_info_id AS info_id,DATE(sa.partner_review_time) as partner_review_time   FROM sys_user_jzg_info_salesman sa " +
+            " WHERE sa.type_attr = 3 AND sa.partner_status = 3 AND sa.sys_user_jzg_info_id = #{userId} ) t ON pu.user_id = t.info_id SET pu.upgrade_time = t.partner_review_time WHERE pu.grade = #{grade} ")
     void updateUpgradeTime(@Param("userId")String userId,@Param("grade") String grade);
 
 
@@ -155,7 +154,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Select("SELECT upgrade_cycle_start_time as startDate FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
     CommissionValidityPeriod selectUpgradeCycleStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
 
-    @Update("UPDATE partner_user SET upgrade_cycle_start_time = #{newDate} WHERE  user_id = #{userId} and grade = #{grade} ")
+    @Update("UPDATE partner_user SET upgrade_cycle_start_time = #{newDate} , first = true WHERE  user_id = #{userId} and grade = #{grade} ")
     void updateUpgradeCycleStartTime(@Param("userId") String userId, @Param("newDate")Date newDate,@Param("grade") Integer grade);
 
 
@@ -164,7 +163,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Select("SELECT upgrade_cycle_start_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
     Date selectUpgradeStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
 
-    @Update(" UPDATE partner_user pu JOIN( SELECT info.id AS user_id, DATE_ADD(DATE(sa.partner_review_time), INTERVAL 1 DAY) AS new_start_time FROM sys_user_jzg_info info " +
+    @Update(" UPDATE partner_user pu JOIN( SELECT info.id AS user_id, DATE_ADD(DATE(sa.partner_review_time), INTERVAL 0 DAY) AS new_start_time FROM sys_user_jzg_info info " +
             " INNER JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = info.id WHERE sa.type_attr = 3 AND sa.partner_status = 3 " +
             " AND info.id = #{userId} AND sa.partner_review_time IS NOT NULL LIMIT 1) t ON pu.user_id = t.user_id SET pu.upgrade_cycle_start_time = t.new_start_time WHERE pu.grade = #{grade} ")
     void updateUpgradeStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
@@ -175,7 +174,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     BigDecimal selectFixedRatio(@Param("userId") String userId, @Param("grade") String  grade);
 
 
-    @Select("SELECT p.* FROM partner_user p LEFT JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = p.user_id  WHERE  sa.type_attr = 3 AND sa.partner_status = 3 " +
+    @Select("SELECT p.* FROM partner_user p LEFT JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = p.user_id  WHERE   sa.type_attr = 3 AND sa.partner_status = 3 " +
             " AND( p.grade, p.user_id) IN ( SELECT MIN( grade ) grade, user_id FROM partner_user WHERE grade IN ( '2', '3', '4' ) AND identity_status = 0 GROUP BY user_id )" +
             " ORDER BY p.create_time DESC")
     List<PartnerUser> queryDowngradedData();

+ 78 - 26
partner/src/main/java/com/jzg/service/Impl/PartnerUserServiceImpl.java

@@ -15,6 +15,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.po.SysUserJzgInfo;
 import com.jzg.commons.entity.vo.SysUserVo;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.constants.BigConstants;
 import com.jzg.constants.TimeConstants;
 import com.jzg.entity.*;
 import com.jzg.entity.param.*;
@@ -466,20 +467,69 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     }
 
     private static BigDecimal getMultiply(List<PartnerAttribute> strategyArray) {
-        PartnerAttribute yq = strategyArray.get(0);
-        BigDecimal min = new BigDecimal(yq.getMin());
-        BigDecimal achieve = new BigDecimal(yq.getAchieve());
-        BigDecimal yqPercent = achieve.divide(min, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("0.33"));
-        PartnerAttribute bf = strategyArray.get(1);
-        BigDecimal bfMin = new BigDecimal(bf.getMin());
-        BigDecimal bfAchieve = new BigDecimal(bf.getAchieve());
-        BigDecimal bfPercent = bfAchieve.divide(bfMin, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("0.34"));
-        PartnerAttribute gr = strategyArray.get(2);
-        BigDecimal grMin = new BigDecimal(gr.getMin());
-        BigDecimal grAchieve = new BigDecimal(gr.getAchieve());
-        BigDecimal grPercent = grAchieve.divide(grMin, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("0.33"));
-        BigDecimal multiply = yqPercent.add(bfPercent).add(grPercent).multiply(new BigDecimal("100"));
-        return multiply;
+        // 1. 健壮性校验:空集合 / 长度不是3 → 直接返回0
+        if (Objects.isNull(strategyArray) || strategyArray.size() != 3) {
+            return BigDecimal.ZERO;
+        }
+
+        PartnerAttribute attr0 = strategyArray.get(0);
+        PartnerAttribute attr1 = strategyArray.get(1);
+        PartnerAttribute attr2 = strategyArray.get(2);
+        // 校验元素非空
+        Objects.requireNonNull(attr0, "第1个指标不能为空");
+        Objects.requireNonNull(attr1, "第2个指标不能为空");
+        Objects.requireNonNull(attr2, "第3个指标不能为空");
+
+        // 2. 获取勾选状态
+        boolean c0 = attr0.isChecked();
+        boolean c1 = attr1.isChecked();
+        boolean c2 = attr2.isChecked();
+        // 统计勾选数量
+        int checkedCount = (c0 ? 1 : 0) + (c1 ? 1 : 0) + (c2 ? 1 : 0);
+
+        // 3. 原始权重数组(与3个指标一一对应)
+        BigDecimal[] baseWeights = {BigConstants.WEIGHT_YQ, BigConstants.WEIGHT_BF, BigConstants.WEIGHT_GR};
+        BigDecimal totalScore = BigDecimal.ZERO;
+
+        // 4. 循环计算(消除所有if-else,复用核心逻辑)
+        for (int i = 0; i < 3; i++) {
+            PartnerAttribute attr = strategyArray.get(i);
+            // 未勾选直接跳过
+            if (!attr.isChecked()) {
+                continue;
+            }
+
+            // 5. 动态获取当前指标权重(核心逻辑)
+            BigDecimal currentWeight;
+            if (checkedCount == 3) {
+                currentWeight = baseWeights[i];  // 3个全选:用原始权重
+            } else if (checkedCount == 2) {
+                currentWeight = BigConstants.WEIGHT_TWO_ITEMS; // 选2个:统一0.5
+            } else if (checkedCount == 1) {
+                currentWeight = BigConstants.WEIGHT_ONE_ITEM;  // 选1个:统一1
+            } else {
+                continue; // 都不选
+            }
+
+            // 6. 统一计算完成率(防止除零异常)
+            BigDecimal achieve = new BigDecimal(attr.getAchieve());
+            BigDecimal min = new BigDecimal(attr.getMin());
+            if (min.compareTo(BigDecimal.ZERO) == 0) {
+                throw new ArithmeticException("指标最小值不能为0,索引:" + i);
+            }
+            BigDecimal percent = achieve.divide(min, BigConstants.DIV_SCALE, BigConstants.ROUND_MODE);
+
+            // 7. 计算单项得分(和原逻辑完全一致)
+            BigDecimal itemScore = percent.compareTo(BigConstants.FULL_RATE) > 0
+                    ? currentWeight
+                    : percent.multiply(currentWeight);
+
+            // 累加总分
+            totalScore = totalScore.add(itemScore);
+        }
+
+        // 8. 统一输出结果(所有分支逻辑相同)
+        return totalScore.multiply(BigConstants.HUNDRED).setScale(BigConstants.RESULT_SCALE, BigConstants.ROUND_MODE);
     }
 
 
@@ -512,13 +562,17 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     }
 
     @Override
-    public HttpResult degradedTask(String grade, String sysUserId) {
+    public HttpResult<PartnerRuleEntity> degradedTask(String grade, String userId) {
+        SysUserJzgInfo sysUserJzgInfo = getSysUserJzgInfo(userId);
+        return degradedTaskVo(grade,sysUserJzgInfo.getId());
+    }
+
+
+    public HttpResult<PartnerRuleEntity> degradedTaskVo(String grade, String userId) {
         PartnerRuleEntity partnerRuleEntity = ruleService.selectByGrade(grade);
         if (partnerRuleEntity == null) {
             return HttpResult.error("等级不存在");
         }
-        SysUserJzgInfo sysUserJzgInfo = getSysUserJzgInfo(sysUserId);
-        String userId = sysUserJzgInfo.getId();
         partnerRuleEntity.setRequirement(null);
         CommissionValidityPeriod period = baseMapper.selectUpgradeCycleStartTime(userId, Integer.valueOf(grade));
         period.setEndDate(SpringUtil.getBean(ExpiredCommissionUtils.class).generateDowngradeTime(grade, period.getStartDate()));
@@ -700,11 +754,13 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
             handleActiveUser(partnerUser, level);
         } else {
             level.setLockingState("1");
-            if (null != partnerUser.getUpgradeTime()) {
-                PartnerRuleEntity ruleEntity = ruleService.selectByGrade(String.valueOf(partnerUser.getGrade()));
-                if (Objects.nonNull(partnerUser.getUpgradeTime())){
-                    level.setExpiryDate(new SimpleDateFormat("yyyy-MM-dd").format(PartnerDateUtils.addDays(partnerUser.getUpgradeTime(), Integer.valueOf(ruleEntity.getKhDays()))));
+            PartnerRuleEntity ruleEntity = ruleService.selectByGrade(String.valueOf(partnerUser.getGrade()));
+            if (Objects.nonNull(partnerUser.getUpgradeCycleStartTime()) && Objects.nonNull(ruleEntity.getKhDays())){
+                Integer value = Integer.valueOf(ruleEntity.getKhDays());
+                if (!partnerUser.isFirst()){
+                    value = value + 1;
                 }
+                level.setExpiryDate(new SimpleDateFormat("yyyy-MM-dd").format(PartnerDateUtils.addDays(partnerUser.getUpgradeCycleStartTime(),value )));
             }
             level.setProportional(proportional(String.valueOf(partnerUser.getGrade()), partnerUser.getUserId()));
         }
@@ -1299,11 +1355,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
 //            appUserInfoVo.setInsUploadFiles(new InsUploadFiles());
         }
         appUserInfoVo.setGrade(null == min ? 4 : min);
-        SpringUtil.getBean(ExpiredCommissionUtils.class).initializeExpirationTime(userId);
-        SysUserJzgInfo sysUserJzgInfo = getSysUserJzgInfo(userId);
-        if (!Objects.isNull(sysUserJzgInfo)) {
-            appUserInfoVo.setUserInfoId(sysUserJzgInfo.getId());
-        }
+        SpringUtil.getBean(ExpiredCommissionUtils.class).initializeExpirationTime(userId,appUserInfoVo.getUserInfoId());
         return appUserInfoVo;
     }
 

+ 2 - 2
partner/src/main/java/com/jzg/utils/ExpiredCommissionUtils.java

@@ -93,11 +93,11 @@ public class ExpiredCommissionUtils {
      * 登录初始化过期时间
      */
     @Transactional(rollbackFor = Exception.class)
-    public void initializeExpirationTime(String userId) {
+    public void initializeExpirationTime(String userId,String infoId) {
         List<PartnerUser> partnerUsers = partnerUserMapper.selectListByUserId(userId);
         for (PartnerUser partnerUser : partnerUsers) {
             if (null == partnerUser.getUpgradeCycleStartTime()){
-                partnerUserMapper.updateUpgradeStartTime(userId, partnerUser.getGrade());
+                partnerUserMapper.updateUpgradeStartTime(infoId, partnerUser.getGrade());
             }
         }
     }

+ 16 - 0
partner/src/main/java/com/jzg/utils/TimedTaskUtils.java

@@ -22,6 +22,8 @@ import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -150,6 +152,8 @@ public class TimedTaskUtils {
 
         // 查询所有用户的租户code
         List<String> systemCodeList = partnerUserMapper.distinctSystemCode();
+//        ArrayList<String> systemCodeList = new ArrayList<>();
+//        systemCodeList.add("QQ000");
         for (String systemCode : systemCodeList) {
             try {
                 TenantContextUtils.setCustomTenantId(systemCode);
@@ -165,6 +169,9 @@ public class TimedTaskUtils {
                     if (null == upgradeStartTime){
                         continue;
                     }
+                    if (!partnerUser.isFirst()){
+                        khDays = khDays + 1;
+                    }
                     log.info("开始时间:{}", formatter.format(upgradeStartTime));
                     //  生成结束时间
                     Date upgradeEndTime = PartnerDateUtils.generateEndTime(upgradeStartTime, khDays);
@@ -198,6 +205,15 @@ public class TimedTaskUtils {
     }
 
 
+    public static boolean isSameDay(Date date1, Date date2) {
+        if (date1 == null || date2 == null) {
+            return false;
+        }
+        LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate localDate2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        return localDate1.equals(localDate2);
+    }
+
     public void update(List<PartnerRuleEntity> partnerRuleEntities,List<String> idList){
         QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("identity_status", 0);

+ 1 - 1
partner/src/main/resources/mapper/PartnerUserMapper.xml

@@ -1164,7 +1164,7 @@ SELECT
 
     <select id="queryAppUserInfoVoByUserId" resultType="com.jzg.entity.vo.AppUserInfoVo">
         SELECT
-            u.id user_id,u.mobile
+            u.id user_id,u.mobile,info.id as userInfoId
         FROM
             sys_user u
                 LEFT JOIN sys_user_jzg_info info ON info.user_id = u.id

+ 10 - 0
platform/src/main/java/com/jzg/controller/EsmInsCompanyController.java

@@ -455,4 +455,14 @@ public class EsmInsCompanyController extends BaseController {
         return HttpResult.ok(esmInsCompanyService.getTopCompanyId(companyId));
     }
 
+    /**
+     * 获取所有保险公司的全路径名称
+     * Key: 公司ID
+     * Value: 总公司/分公司/支公司
+     */
+    @Operation(summary = "获取所有保险公司的全路径名称")
+    @GetMapping("getAllCompanyHierarchyPaths")
+    public Map<String, String> getAllCompanyHierarchyPaths(){
+        return esmInsCompanyService.getAllCompanyHierarchyPaths();
+    }
 }

+ 4 - 6
platform/src/main/java/com/jzg/controller/SysMenuController.java

@@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * 菜单控制器
@@ -47,11 +46,10 @@ public class SysMenuController extends BaseController {
         }
     }
 
-
-    @PostMapping(value = "/delete")
-    public HttpResult delete(@RequestBody List<SysMenu> records) {
-        List<String> ids = records.stream().map(SysMenu::getId).collect(Collectors.toList());
-        return HttpResult.ok(sysMenuService.removeBatchByIds(ids));
+    @DeleteMapping(value = "/delete/{id}")
+    public HttpResult<Boolean> delete(@PathVariable("id") String id) {
+        log.info("菜单删除:id=[{}]",id);
+        return HttpResult.ok(sysMenuService.deleteMenuById(id));
     }
 
 

+ 8 - 1
platform/src/main/java/com/jzg/controller/UserRoleController.java

@@ -1,5 +1,6 @@
 package com.jzg.controller;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.jzg.commons.aop.OperatorTrajectory;
 import com.jzg.commons.constants.OperationTypeEnum;
@@ -14,6 +15,8 @@ import com.jzg.mapper.SysRoleMapper;
 import com.jzg.service.UserRoleService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -28,6 +31,8 @@ import java.util.Objects;
 @RequestMapping("/userRole")
 public class UserRoleController extends BaseController {
 
+    private static final Logger log = LoggerFactory.getLogger(UserRoleController.class);
+
     @Autowired
     UserRoleService userRoleService;
 
@@ -67,7 +72,8 @@ public class UserRoleController extends BaseController {
     @OperatorTrajectory(moduleName = "组织架构/角色管理/修改角色",OperationDict = OperationTypeEnum.UPDATE, mapperClass = SysRoleMapper.class,type = "U",entityClass = SysRoleVo.class )
     @Operation(summary = "角色修改")
     @PostMapping("/roleUpdate")
-    public HttpResult roleUpdate(@Validated @RequestBody SysRoleVo sysRoleVo){
+    public HttpResult<String> roleUpdate(@Validated @RequestBody SysRoleVo sysRoleVo){
+        log.info("修改角色信息:sysRoleVo=[{}]", JSONUtil.toJsonStr(sysRoleVo));
         //如果不是平台则校验数据权限
         if(!getUserSystemCode().equals(SystemConstants.SYSTEM_PLATFORM.getCode())){
             //从用户信息中获取租户code
@@ -78,6 +84,7 @@ public class UserRoleController extends BaseController {
             }
         }
         if(userRoleService.isExist(sysRoleVo.getName(),sysRoleVo.getId())){
+            log.info("角色名称已存在,请修改后重新提交。sysRoleVo.getName()=[{}],sysRoleVo.getId()=[{}]",sysRoleVo.getName(),sysRoleVo.getId());
             throw new ValidateException("角色名称已存在,请修改后重新提交");
         }
         return userRoleService.roleUpdate(sysRoleVo)? HttpResult.ok("修改角色成功") : HttpResult.error("修改角色失败");

+ 9 - 0
platform/src/main/java/com/jzg/mapper/SysRolePermsMapper.java

@@ -18,4 +18,13 @@ public interface SysRolePermsMapper extends BaseMapper<SysRolePerms> {
     List<SysRolePerms> getByRoleId(@Param("id") String id);
 
     List<SysRolePerms> getByRoleIdNew(@Param("roleId") String roleId);
+
+    /**
+     * 根据菜单序号删除菜单和角色的对应关系
+     *
+     * @param menuId 菜单序号
+     * @author lipf
+     * @date 2026/5/11 16:39
+     */
+    void deleteByMenuId(String menuId);
 }

+ 8 - 0
platform/src/main/java/com/jzg/service/EsmInsCompanyService.java

@@ -9,6 +9,7 @@ import com.jzg.commons.entity.vo.EsmInsCompanyVo;
 
 
 import java.util.List;
+import java.util.Map;
 
 public interface EsmInsCompanyService extends IService<EsmInsCompany> {
 
@@ -144,6 +145,13 @@ public interface EsmInsCompanyService extends IService<EsmInsCompany> {
      * @return
      */
     String getTopCompanyId(String companyId);
+
+    /**
+     * 获取所有保险公司的全路径名称
+     * Key: 公司ID
+     * Value: 总公司/分公司/支公司
+     */
+    public Map<String, String> getAllCompanyHierarchyPaths();
 }
 
 

+ 8 - 0
platform/src/main/java/com/jzg/service/SysMenuService.java

@@ -49,6 +49,14 @@ public interface SysMenuService extends IService<SysMenu> {
      * @return
      */
     List<SysCommonFunctionDto> getCommonFunction(String systemCode, String userId);
+
+    /**
+     * 删除菜单
+     *
+     * @author lipf
+     * @date 2026/5/11 16:34
+     */
+    boolean deleteMenuById(String menuId);
 }
 
 

+ 71 - 0
platform/src/main/java/com/jzg/service/impl/EsmInsCompanyServiceImpl.java

@@ -359,6 +359,77 @@ public class EsmInsCompanyServiceImpl extends ServiceImpl<EsmInsCompanyMapper, E
     public String getTopCompanyId(String companyId) {
         return baseMapper.getTopCompanyId(companyId);
     }
+
+    /**
+     * 获取所有保险公司的全路径名称
+     * Key: 公司ID
+     * Value: 总公司/分公司/支公司
+     */
+    public Map<String, String> getAllCompanyHierarchyPaths() {
+        log.info("获取所有保险公司的全路径名称");
+        // 1. 查询所有未删除的保险公司(一次性加载,避免循环查库)
+        List<EsmInsCompany> allCompanies = baseMapper.selectList(null);
+        allCompanies = allCompanies.stream().filter(action->action.getIsDelete()==0).toList();
+
+        // 2. 将列表转换为 Map,以便通过 ID 快速查找对象 (ID -> Company Object)
+        Map<String, EsmInsCompany> companyMap = allCompanies.stream()
+                .collect(Collectors.toMap(EsmInsCompany::getId, c -> c));
+
+        // 3. 结果缓存 Map (ID -> "A/B/C" Path)
+        // 使用 ConcurrentHashMap 或者普通 HashMap 均可,视并发需求而定
+        Map<String, String> pathCache = new HashMap<>();
+
+        // 4. 遍历所有公司,构建路径
+        for (EsmInsCompany company : allCompanies) {
+            buildPath(company.getId(), companyMap, pathCache);
+        }
+        log.info("构建得到的公司的层级结构如下: [{}]", JSONUtil.toJsonStr(pathCache));
+        return pathCache;
+    }
+
+    /**
+     * 递归构建单个公司的路径(带缓存优化,防止重复计算)
+     */
+    private String buildPath(String currentId, Map<String, EsmInsCompany> companyMap, Map<String, String> pathCache) {
+        // 如果已经计算过,直接返回(记忆化搜索,防止重复递归)
+        if (pathCache.containsKey(currentId)) {
+            return pathCache.get(currentId);
+        }
+
+        EsmInsCompany currentCompany = companyMap.get(currentId);
+        if (currentCompany == null) {
+            return "";
+        }
+
+        // 获取父级 ID
+        String parentId = currentCompany.getParentId();
+
+        String fullPath;
+
+        // 判断是否有父级 (根据数据库设计,根节点的 parent_id 通常为 0 或 null)
+        if (parentId == null || parentId.equals("0")) {
+            // 如果是根节点,路径就是它自己的名字
+            //fullPath = currentCompany.getName();
+            fullPath = currentCompany.getNameSimple();
+        } else {
+            // 如果有父级,递归获取父级的路径,然后拼接当前名字
+            // 注意:这里递归调用 buildPath,利用缓存避免死循环和重复计算
+            String parentPath = buildPath(parentId, companyMap, pathCache);
+
+            if (parentPath.isEmpty()) {
+                //fullPath = currentCompany.getName();
+                fullPath = currentCompany.getNameSimple();
+            } else {
+                //fullPath = parentPath + "/" + currentCompany.getName();
+                fullPath = parentPath + "/" + currentCompany.getNameSimple();
+            }
+        }
+
+        // 存入缓存
+        pathCache.put(currentId, fullPath);
+        return fullPath;
+    }
+
 }
 
 

+ 23 - 1
platform/src/main/java/com/jzg/service/impl/SysMenuServiceImpl.java

@@ -12,6 +12,7 @@ import com.jzg.commons.entity.po.SysUserRole;
 import com.jzg.commons.entity.vo.SystemMenuVo;
 import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.mapper.SysMenuMapper;
+import com.jzg.mapper.SysRolePermsMapper;
 import com.jzg.mapper.SysSystemMenuMapper;
 import com.jzg.mapper.SysUserRoleMapper;
 import com.jzg.service.SysMenuService;
@@ -44,6 +45,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
 
     private final BaseController baseController;
 
+    private final SysRolePermsMapper sysRolePermsMapper;
+
 
     /**
      * 查询菜单的树形结构(基于租户的)
@@ -76,13 +79,14 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
 
     @Override
     public List<SysMenu> getRoleMenuTree(String systemCode, String userId) {
+        log.info("查询租户下的用户拥有的菜单权限。systemCode=[{}], userId=[{}] ", systemCode, userId);
         List<SysUserRole> sysUserRole = sysUserRoleMapper.selectByUserIdAndSysCodeOne(userId,systemCode);
         // modify by lipf ,2026年4月3日08:52:05, 解决NPE 异常
         if(sysUserRole == null || sysUserRole.isEmpty()){
             log.info("租户[{}]下的用户[{}]角色为空",systemCode, userId);
             return Collections.emptyList();
         }
-        List<SysMenu> menus = this.getMenuByRoleId(sysUserRole.stream().map(x->x.getRoleId()).toList());
+        List<SysMenu> menus = this.getMenuByRoleId(sysUserRole.stream().map(SysUserRole::getRoleId).toList());
         List<SysMenu> sysMenus = new ArrayList<>();
         for (SysMenu menu : menus) {
             if (menu.getParentId() == null || menu.getParentId().equalsIgnoreCase("0")) {
@@ -187,6 +191,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
         }
         List<SysMenu> menuByRoleId = sysMenuMapper.getMenuByRoleId(roleIds);
         List<SysMenu> distinctMenuList = menuByRoleId.stream()
+                // modify by lipf, 2026年5月11日16:32:31 提高代码健壮性
+                .filter(action-> action.getId() != null)
                 .collect(Collectors.toMap(
                         SysMenu::getId,
                         Function.identity(),
@@ -195,6 +201,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
                 .values()
                 .stream()
                 .toList();
+        log.info("根据角色序号查询有权限的菜单: roleIds=[{}]distinctMenuList=[{}]", JSONUtil.toJsonStr(roleIds), JSONUtil.toJsonStr(distinctMenuList));
         return distinctMenuList;
     }
 
@@ -252,6 +259,21 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
     public List<SysCommonFunctionDto> getCommonFunction(String systemCode, String userId) {
         return this.baseMapper.getCommonFunction(systemCode, userId);
     }
+
+    /**
+     * 删除菜单
+     *  删除菜单的时候,将菜单和角色的对应关系也删除
+     *
+     * @param menuId 菜单序号
+     * @author lipf
+     * @date 2026/5/11 16:34
+     */
+    @Override
+    public boolean deleteMenuById(String menuId) {
+        log.info("根据序号删除对应的菜单信息:menuId=[{}]", menuId);
+        sysRolePermsMapper.deleteByMenuId(menuId);
+        return this.removeById(menuId);
+    }
 }
 
 

+ 6 - 4
platform/src/main/java/com/jzg/service/impl/SysSystemServiceImpl.java

@@ -536,18 +536,20 @@ public class SysSystemServiceImpl extends ServiceImpl<SysSystemMapper, SysSystem
                         .select(SysDept::getId)
                         .eq(SysDept::getSystemCode, sysSystem.getSysCode())).stream()
                         .map(SysDept::getId).collect(Collectors.toList());
-                if (CollUtil.isNotEmpty(deptIdList)) {
+                // 需要排除当前租户自己
+                if (CollUtil.isNotEmpty(deptIdList) && CollUtil.size(deptIdList) > 1) {
                     errorStr = "租户["+sysSystem.getSysName()+"]还有部分子机构,请将这些子机构删除后,再进行删除!";
                     return errorStr;
                 }
 
-                Long count = sysUserJzgInfoMapper.selectCount(new LambdaQueryWrapper<SysUserJzgInfo>()
+                List<SysUserJzgInfo> sysUserJzgInfos = sysUserJzgInfoMapper.selectList(new LambdaQueryWrapper<SysUserJzgInfo>()
                         .eq(SysUserJzgInfo::getSystemCode, sysSystem.getSysCode())
                         .eq(SysUserJzgInfo::getIsEnable, 0)
                         .eq(SysUserJzgInfo::getIsDelete, 0));
 
-                if(count > 0){
-                    errorStr = "租户["+sysSystem.getSysName()+"]还有部分员工,请将这些员工变更机构或者删除后,再进行删除!";
+                if(CollUtil.size(sysUserJzgInfos) > 0){
+                    String names = sysUserJzgInfos.stream().map(SysUserJzgInfo::getName).collect(Collectors.joining("、"));
+                    errorStr = "租户["+sysSystem.getSysName()+"]还有[" + names + "]等员工,请将这些员工变更机构或者删除后,再进行删除!";
                     return errorStr;
                 }
             }

+ 4 - 2
platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jzg.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.annotation.IgnoreTenant;
@@ -54,8 +55,8 @@ public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> imp
 
     @Override
     public SysRoleVo roleGet(String roleId) {
-        log.info("查询角色的权限: roleId=[{}]",roleId);
         String userSystemCode = baseController.getUserSystemCode();
+        log.info("查询角色的权限: roleId=[{}],userSystemCode=[{}]",roleId, userSystemCode);
         SysRole sysRole = baseMapper.selectOne(new LambdaQueryWrapper<SysRole>()
                 .eq(SysRole::getId,roleId)
                 .eq(SysRole::getSystemCode,userSystemCode));
@@ -142,6 +143,8 @@ public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> imp
     @Transactional
     @Override
     public boolean roleUpdate(SysRoleVo sysRoleVo) {
+        String systemCOde = baseController.getUserSystemCode();
+        log.info("修改角色信息:sysRoleVo=[{}],systemCode=[{}]", JSONUtil.toJsonStr(sysRoleVo),systemCOde);
         SysRole sysRole = sysRoleVo.getSysRole();
         List<SysRolePerms> sysRolePermsList = new ArrayList<>();
         sysRoleVo.getPerms().forEach(item->{
@@ -161,7 +164,6 @@ public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> imp
                .eq(SysRoleDataScope::getRoleId,sysRole.getId()));
         sysRoleDataScopeLinkMapper.delete(new LambdaQueryWrapper<SysRoleDataScopeLink>()
               .eq(SysRoleDataScopeLink::getRoleId,sysRole.getId()));
-
         //保存角色数据权限  如果是平台则直接跳过
         if(!baseController.getUserSystemCode().equals(SystemConstants.SYSTEM_PLATFORM.getCode())) {
             SysRoleDataScope sysRoleDataScope = new SysRoleDataScope();

+ 11 - 8
platform/src/main/resources/mapper/PtlAgreementAttributionMapper.xml

@@ -23,6 +23,7 @@
         paa.create_time,
         paa.update_time,
         eic.name_simple as insCompanyName,
+        eic.company_code as companyCode,
         pau.url as url,
         sd.name as deptName
         from
@@ -55,16 +56,18 @@
 
     <select id="getAgreementAttribution" resultMap="BaseResultMap">
         select
-            *,
-            pau.url as url,
-            sd.name as deptName
+        *,
+        pau.url as url,
+        sd.name as deptName,
+        eic.company_code as companyCode
         from
-            ptl_agreement_attribution paa
-                left join ptl_agreement_url pau on paa.login_url = pau.id
-                left join sys_dept sd on paa.user_dept = sd.id
+        ptl_agreement_attribution paa
+        left join ptl_agreement_url pau on paa.login_url = pau.id
+        left join sys_dept sd on paa.user_dept = sd.id
+        left join esm_ins_company eic on paa.ins_company_id = eic.id
         where
-            1=1
-          and paa.is_delete = '0'
+        1=1
+        and paa.is_delete = '0'
         <if test="id != null and id != ''">
             and paa.id = #{id}
         </if>

+ 5 - 0
platform/src/main/resources/mapper/SysRolePermsMapper.xml

@@ -2,6 +2,11 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.jzg.mapper.SysRolePermsMapper">
 
+    <!--根据菜单序号删除菜单和角色的对应关系 2026年5月11日16:41:08 lipf -->
+    <delete id="deleteByMenuId">
+        delete  from sys_role_perms srp where srp.perms_id = #{menuId}
+    </delete>
+
     <select id="getByRoleId" resultType="com.jzg.commons.entity.po.SysRolePerms">
         select id, role_id as roleId, perms_id as permsId, perms
         from sys_role_perms

+ 1 - 0
tenant/insurance/pom.xml

@@ -34,6 +34,7 @@
         <module>quotation-zhongan</module>
         <module>quotation-taishan</module>
         <module>quotation-renbao</module>
+        <module>quotation-renbaonew</module>
         <module>quotation-guoshou</module>
     </modules>
 

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

@@ -56,7 +56,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
             AnShengCrawlerApplyApplicationRequest.ContractsDTO.BillInfoDetailDTO billInfoDetailDTO = buildBillInfoDetailDTO(insuranerName, personDTO.getMobileTelephone());
             contractsDTO.setBillInfoDetail(billInfoDetailDTO);
             AnShengCrawlerApplyApplicationRequest.ContractsDTO.BrandAutoModelDTO brandAutoModelDTO = buildBrandAutoModelDTO(responseContracts.getVehicle());
-            contractsDTO.setBrandAutoModel(brandAutoModelDTO);
+            //contractsDTO.setBrandAutoModel(brandAutoModelDTO);
             contractsDTO.setSaleChannelSource(new AnShengCrawlerApplyApplicationRequest.ContractsDTO.SaleChannelSourceDTO(""));
             contractsDTO.setUnderwriteInfos(List.of(new AnShengCrawlerApplyApplicationRequest.ContractsDTO.UnderwriteInfosDTO("1", "")));
             AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO policyExtendDTO = buildPolicyExtend(insuranerName, personDTO.getMobileTelephone());

+ 5 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/AnShengCrawlerSearchVehicleByVinResponse.java

@@ -60,6 +60,11 @@ public class AnShengCrawlerSearchVehicleByVinResponse  implements Serializable,
             return this.brandAutoModel.purchasePrice;
         }
 
+        @Override
+        public String getSeatCount() {
+            return this.brandAutoModel.seatCom;
+        }
+
         @NoArgsConstructor
         @Data
         public static class BrandAutoModelDTO {

+ 0 - 2
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerQuoteProcessService.java

@@ -9,8 +9,6 @@ public interface AnShengCrawlerQuoteProcessService {
     /**
      * 获取请求头信息
      *
-     * @param username 用户名
-     * @param password 密码
      * @return 请求头
      */
     HttpHeaders getHttpHeaders(AttributionInformationVo attributionInformationVo);

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

@@ -5,6 +5,7 @@ import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
+import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.ansheng.crawler.build.AnShengCrawlerApplyApplicationRequestBuild;
 import com.jzg.quotation.ansheng.crawler.build.AnShengCrawlerQuoteResultsVoBuild;
@@ -20,7 +21,9 @@ import com.jzg.quotation.ansheng.crawler.service.AnShengCrawlerQuoteProcessServi
 import com.jzg.quotation.ansheng.crawler.service.AnShengCrawlerRequest;
 import com.jzg.quotation.ansheng.crawler.utils.CheckVehicleCodeSecretGenerateUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
+import com.jzg.quotation.commons.component.DistributedLockComponent;
 import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import lombok.RequiredArgsConstructor;
@@ -49,6 +52,8 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     private final AnShengCrawlerCacheComponent anShengCrawlerCacheComponent;
 
+    private final DistributedLockComponent distributedLockComponent;
+
     private final AnShengCrawlerQuoteProcessService anShengCrawlerQuoteProcessService;
 
     @Override
@@ -56,16 +61,29 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         anShengCrawlerLoginService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        String username = detectLoginRequest.getUsername();
+        String password = detectLoginRequest.getPassword();
+        String authorization = anShengCrawlerCacheComponent.getAuthorization(detectLoginRequest.getUsername());
+        if (!StringUtils.hasText(authorization)) {
+            try {
+                authorization = distributedLockComponent.blockingExecute(AnShengCrawlerCacheComponent.ACCOUNT_LOCKOUT + detectLoginRequest.getUsername(), () -> anShengCrawlerLoginService.login(username, password));
+            } catch (Exception e) {
+                throw new SystemException("登录失败");
+            }
+        }
+        return StringUtils.hasText(authorization);
+    }
+
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
         // 订单号
         final String ordersNo = quoteVo.getOrder().getOrdersNo();
         // 请求头信息
-        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(quoteVo.getOrder()
-                .getAttributionInformationVo());
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(quoteVo.getOrder().getAttributionInformationVo());
         // 归属信息
-        AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(quoteVo.getOrder()
-                .getAgreementId(), httpHeaders);
+        AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(quoteVo.getOrder().getAgreementId(), httpHeaders);
 
         DepartmentPlanCode departmentPlanCode = DepartmentPlanCode.PLAN_109;
         // 新能源
@@ -85,7 +103,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         AnShengCrawlerSearchVehicleByVinResponse.DataDTO dataDTO = CarModelsFilterUtils.to(dataDTOS, quoteVo.getCarInfoVo());
         // 报价
         AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply = new AnShengCrawlerCalculatePremiumApplyMessage(quoteVo, dataDTO, userDetailResponse, departmentPlanCode, checkVehicleCodeSecretGenerate);
-        log.info("安盛报价参数:{}",JSONObject.toJSONString(crawlerCalculatePremiumApply));
+        log.info("安盛报价参数:{}", JSONObject.toJSONString(crawlerCalculatePremiumApply));
         AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply = anShengCrawlerRequestComponent.calculatePremiumApply(crawlerCalculatePremiumApply, httpHeaders);
         // 处理重复投保
         if (calculatePremiumApply.getMessage().contains("重复投保")) {
@@ -93,22 +111,22 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
             String endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
             crawlerCalculatePremiumApply.getContracts().get(0).getPolicyBase().setInsuranceBeginTime(startTime);
             crawlerCalculatePremiumApply.getContracts().get(0).getPolicyBase().setInsuranceEndTime(endTime);
-            log.info("安盛报价重复投保参数:{}",JSONObject.toJSONString(crawlerCalculatePremiumApply));
+            log.info("安盛报价重复投保参数:{}", JSONObject.toJSONString(crawlerCalculatePremiumApply));
             calculatePremiumApply = anShengCrawlerRequestComponent.calculatePremiumApply(crawlerCalculatePremiumApply, httpHeaders);
         }
         if (calculatePremiumApply.getCode() == 200) {
             // 缓存报价信息
             //  处理报价返回起止时间
-            calculatePremiumApply.getData().getContracts().forEach(v ->{
-                crawlerCalculatePremiumApply.getContracts().forEach(va ->{
+            calculatePremiumApply.getData().getContracts().forEach(v -> {
+                crawlerCalculatePremiumApply.getContracts().forEach(va -> {
                     AnShengCrawlerCalculatePremiumApplyMessage.ContractsDTO.PolicyBaseDTO policyBase = va.getPolicyBase();
-                    if (StringUtils.equals(v.getPlanCode(),policyBase.getPlanCode())){
+                    if (StringUtils.equals(v.getPlanCode(), policyBase.getPlanCode())) {
                         policyBase.setInsuranceBeginTime(v.getInsuranceBeginTime());
                         policyBase.setInsuranceEndTime(v.getInsuranceEndTime());
                     }
                 });
             });
-            log.info("安盛报价返回数据:{}",JSONObject.toJSONString(calculatePremiumApply));
+            log.info("安盛报价返回数据:{}", JSONObject.toJSONString(calculatePremiumApply));
             AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = AnShengCrawlerApplyApplicationRequestBuild.build(crawlerCalculatePremiumApply, calculatePremiumApply, userDetailResponse, compulsoryVersionNo);
             // 缓存数据
             anShengCrawlerCacheComponent.cacheQuoteRequest(ordersNo, autoSpecialPromiseRequest);
@@ -123,6 +141,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     /**
      * 提取系统自动分配的起保时间
+     *
      * @param returnMessage 核心提示
      * @return 提取到的时间字符串,未提取到返回 null
      */
@@ -142,35 +161,27 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         // 获取报价信息
         AnShengCrawlerApplyApplicationRequest applicationRequest = anShengCrawlerCacheComponent.getQuoteResponse(ordersNo);
         // 获取图片上传信息
-        List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> imagesInfo = anShengCrawlerCacheComponent.getImagesInfo(underwritingVo.getOrder()
-                .getOrdersNo());
+        List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> imagesInfo = anShengCrawlerCacheComponent.getImagesInfo(underwritingVo.getOrder().getOrdersNo());
         // 请求头
-        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(underwritingVo.getOrder()
-                .getAttributionInformationVo());
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(underwritingVo.getOrder().getAttributionInformationVo());
         // 获取特别约定
         AnShengCrawlerAutoSpecialPromiseResponse autoSpecialPromiseResponse = anShengCrawlerRequestComponent.autoSpecialPromise(applicationRequest, httpHeaders);
         // 核保规则
         AnShengCrawlerRuleCheckForSimpleResponse anShengCrawlerApplyApplicationResponse = anShengCrawlerRequestComponent.principiumRuleCheckForSimple(applicationRequest, httpHeaders);
-        Map<String, AnShengCrawlerAutoSpecialPromiseResponse.DataDTO> stringDataDTOMap = autoSpecialPromiseResponse.getData()
-                .stream()
-                .collect(Collectors.toMap(AnShengCrawlerAutoSpecialPromiseResponse.DataDTO::getPlanCode, x -> x));
-        Map<String, AnShengCrawlerRuleCheckForSimpleResponse.DataDTO> ruleCheckForSimpleData = anShengCrawlerApplyApplicationResponse.getData()
-                .stream()
-                .collect(Collectors.toMap(AnShengCrawlerRuleCheckForSimpleResponse.DataDTO::getPlanCode, x -> x));
+        Map<String, AnShengCrawlerAutoSpecialPromiseResponse.DataDTO> stringDataDTOMap = autoSpecialPromiseResponse.getData().stream().collect(Collectors.toMap(AnShengCrawlerAutoSpecialPromiseResponse.DataDTO::getPlanCode, x -> x));
+        Map<String, AnShengCrawlerRuleCheckForSimpleResponse.DataDTO> ruleCheckForSimpleData = anShengCrawlerApplyApplicationResponse.getData().stream().collect(Collectors.toMap(AnShengCrawlerRuleCheckForSimpleResponse.DataDTO::getPlanCode, x -> x));
         // 核保加入上传的影像、特别约定信息
         applicationRequest.getContracts().forEach(contract -> {
             // 特别约定
-            AnShengCrawlerAutoSpecialPromiseResponse.DataDTO promiseData = stringDataDTOMap.get(contract.getPolicyBase()
-                    .getPlanCode());
+            AnShengCrawlerAutoSpecialPromiseResponse.DataDTO promiseData = stringDataDTOMap.get(contract.getPolicyBase().getPlanCode());
             // 核保规则
-            AnShengCrawlerRuleCheckForSimpleResponse.DataDTO simpleData = ruleCheckForSimpleData.get(contract.getPolicyBase()
-                    .getPlanCode());
+            AnShengCrawlerRuleCheckForSimpleResponse.DataDTO simpleData = ruleCheckForSimpleData.get(contract.getPolicyBase().getPlanCode());
             contract.getPolicyBase().setAlterableSpecialPromise(promiseData.getAlterableSpecialPromise());
             contract.setPolicyAttachments(new ArrayList<>());
             contract.getPolicyBase().setFirstTrialTaskNo(simpleData.getFirstTrialTaskNo());
             contract.getTargetList().get(0).setVehicleTax(applicationRequest.getContracts().get(0).getTargetList().get(0).getVehicleTax());
         });
-        log.info("安盛核保参数:{}",JSONObject.toJSONString(applicationRequest));
+        log.info("安盛核保参数:{}", JSONObject.toJSONString(applicationRequest));
         // 核保
         AnShengCrawlerApplyApplicationResponse applyApplicationResponse = anShengCrawlerRequestComponent.applyApplication(applicationRequest, httpHeaders);
         // 投保订单号保存
@@ -194,31 +205,28 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     /**
      * 保存投保单号
-     * @param ordersNo 订单号
+     *
+     * @param ordersNo                 订单号
      * @param applyApplicationResponse 核保信息
      */
     private void saveThePolicyNumber(String ordersNo, AnShengCrawlerApplyApplicationResponse applyApplicationResponse) {
         log.info("安盛核保返回参数:{}", JSONObject.toJSONString(applyApplicationResponse));
         AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(ordersNo);
         List<AnShengCrawlerOrder.NiInfo> niInfoList = new ArrayList<>();
-        Optional.ofNullable(applyApplicationResponse.getData())
-                .orElse(new ArrayList<>())
-                .forEach(dataDTO -> {
-                    // 交强险
-                    if (DepartmentPlanCode.PLAN_105.getCode().equals(dataDTO.getPlanCode())) {
-                        anShengCrawlerOrder.setCiPolicyNo(dataDTO.getApplyPolicyNo());
-                        // 商业险
-                    } else if (DepartmentPlanCode.PLAN_109.getCode()
-                            .equals(dataDTO.getPlanCode()) || DepartmentPlanCode.PLAN_113.getCode()
-                            .equals(dataDTO.getPlanCode())) {
-                        anShengCrawlerOrder.setBiPolicyNo(dataDTO.getApplyPolicyNo());
-                    }else {
-                        String jy = com.jzg.commons.util.StringUtils.isEmpty(dataDTO.getProductCode()) ? "" : dataDTO.getProductCode();
-                        AnShengCrawlerOrder.NiInfo niInfo = new AnShengCrawlerOrder.NiInfo();
-                        niInfo.setNiPolicyNo(jy);
-                        niInfoList.add(niInfo);
-                    }
-                });
+        Optional.ofNullable(applyApplicationResponse.getData()).orElse(new ArrayList<>()).forEach(dataDTO -> {
+            // 交强险
+            if (DepartmentPlanCode.PLAN_105.getCode().equals(dataDTO.getPlanCode())) {
+                anShengCrawlerOrder.setCiPolicyNo(dataDTO.getApplyPolicyNo());
+                // 商业险
+            } else if (DepartmentPlanCode.PLAN_109.getCode().equals(dataDTO.getPlanCode()) || DepartmentPlanCode.PLAN_113.getCode().equals(dataDTO.getPlanCode())) {
+                anShengCrawlerOrder.setBiPolicyNo(dataDTO.getApplyPolicyNo());
+            } else {
+                String jy = com.jzg.commons.util.StringUtils.isEmpty(dataDTO.getProductCode()) ? "" : dataDTO.getProductCode();
+                AnShengCrawlerOrder.NiInfo niInfo = new AnShengCrawlerOrder.NiInfo();
+                niInfo.setNiPolicyNo(jy);
+                niInfoList.add(niInfo);
+            }
+        });
         anShengCrawlerOrder.setNiInfos(niInfoList);
         anShengCrawlerOrderService.saveAnShengCrawlerOrder(anShengCrawlerOrder);
     }
@@ -227,25 +235,21 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         // 请求头
-        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(paymentLinkVo.getOrder()
-                .getAttributionInformationVo());
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(paymentLinkVo.getOrder().getAttributionInformationVo());
         // 归属信息
-        AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(paymentLinkVo.getOrder()
-                .getAgreementId(), httpHeaders);
-        AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(paymentLinkVo.getOrder()
-                .getOrdersNo());
+        AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(paymentLinkVo.getOrder().getAgreementId(), httpHeaders);
+        AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
         // 获取支付链接
         AnShengCrawlerPaymentRequest anShengCrawlerPaymentRequest = new AnShengCrawlerPaymentRequest(anShengCrawlerOrder, userDetailResponse.getDepartmentCode(), anShengCrawlerOrder.getTotalPremium());
         String paymentUrl = anShengCrawlerRequestComponent.payment(anShengCrawlerPaymentRequest, httpHeaders);
-        log.info("获取安盛支付二维码地址长度:{}",StringUtils.isNotEmpty(paymentUrl) ? paymentUrl.length() : "无法获取支付链接");
+        log.info("获取安盛支付二维码地址长度:{}", StringUtils.isNotEmpty(paymentUrl) ? paymentUrl.length() : "无法获取支付链接");
         return new PaymentLinkResultsVo(true, paymentUrl, "");
     }
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         // 请求头信息
-        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(insuranceUploadImageVo.getOrder()
-                .getAttributionInformationVo());
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(insuranceUploadImageVo.getOrder().getAttributionInformationVo());
 
         // 单个上传影像
         List<AnShengCrawlerFileUploadResponse.DataDTO> dataDTOS = new ArrayList<>();
@@ -263,8 +267,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
         // 缓存影像信息
         List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyAttachmentsDTO> policyAttachmentsDTOList = AnShengCrawlerFileUploadResponse.toPolicyAttachmentsDTOList(dataDTOS);
-        anShengCrawlerCacheComponent.cacheImagesInfo(insuranceUploadImageVo.getOrder()
-                .getOrdersNo(), policyAttachmentsDTOList);
+        anShengCrawlerCacheComponent.cacheImagesInfo(insuranceUploadImageVo.getOrder().getOrdersNo(), policyAttachmentsDTOList);
     }
 
     @Override
@@ -276,10 +279,8 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
 
-        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(downloadPolicyVo.getOrder()
-                .getAttributionInformationVo());
-        AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(downloadPolicyVo.getOrder()
-                .getOrdersNo());
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(downloadPolicyVo.getOrder().getAttributionInformationVo());
+        AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(downloadPolicyVo.getOrder().getOrdersNo());
 
         // 交强保单和标志
         Optional.ofNullable(anShengCrawlerOrder.getCiPolicyNo()).ifPresent(policyNo -> {
@@ -307,19 +308,15 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         // 获取订单信息
-        AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(orderStatusVo.getOrder()
-                .getOrdersNo());
+        AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(orderStatusVo.getOrder().getOrdersNo());
         // 获取请求头
-        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(orderStatusVo.getOrder()
-                .getAttributionInformationVo());
+        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(orderStatusVo.getOrder().getAttributionInformationVo());
         // 归属信息
-        AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(orderStatusVo.getOrder()
-                .getAgreementId(), httpHeaders);
+        AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse = anShengCrawlerQuoteProcessService.getUserDetailResponse(orderStatusVo.getOrder().getAgreementId(), httpHeaders);
         // 查询订单状态
         AnShengCrawlerComprehensiveQueryInsurenetRequest crawlerComprehensiveQueryInsurenet = new AnShengCrawlerComprehensiveQueryInsurenetRequest(userDetailResponse.getAgentCode(), userDetailResponse.getDepartmentCode(), anShengCrawlerOrder.getOrderNo(), anShengCrawlerOrder.getRecordingTime());
         AnShengCrawlerComprehensiveQueryInsurenetResponse queryDocumentsInformationResponse = anShengCrawlerRequestComponent.comprehensiveQueryInsurenet(crawlerComprehensiveQueryInsurenet, httpHeaders);
-        List<AnShengCrawlerComprehensiveQueryInsurenetResponse.DataDTO.ListDTO> list = queryDocumentsInformationResponse.getData()
-                .getList();
+        List<AnShengCrawlerComprehensiveQueryInsurenetResponse.DataDTO.ListDTO> list = queryDocumentsInformationResponse.getData().getList();
 
         return null;
     }

+ 5 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java

@@ -25,6 +25,7 @@ import com.jzg.quotation.commons.annotation.QuoteApiService;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateUtil;
 import lombok.RequiredArgsConstructor;
@@ -56,6 +57,10 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         return ptlAgreementUrl.getData().getUrl();
     }
 
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        return true;
+    }
 
     /**
      * 重复报价

+ 5 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse1.java

@@ -398,5 +398,10 @@ public class BoHaiCrawlerCarResponse1 implements Serializable {
         public String getPurchasePrice() {
             return vehiclePrice;
         }
+
+        @Override
+        public String getSeatCount() {
+            return String.valueOf(vehicleSeat);
+        }
     }
 }

+ 7 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/BoHaiCrawlerQuoteProcessService.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.bohai.crawler.service;
 
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import org.springframework.http.HttpHeaders;
 
 /**
@@ -25,4 +26,10 @@ public interface BoHaiCrawlerQuoteProcessService {
      */
     HttpHeaders getHeaders(String username, String password);
 
+    /**
+     * 检测登录
+     * @param detectLoginRequest
+     * @return
+     */
+    boolean detectLogin(DetectLoginRequest detectLoginRequest);
 }

+ 23 - 18
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerQuoteProcessServiceImpl.java

@@ -10,6 +10,7 @@ import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerCheckTokenRes
 import com.jzg.quotation.bohai.crawler.service.BoHaiCrawlerQuoteProcessService;
 import com.jzg.quotation.bohai.crawler.util.DESEncryption;
 import com.jzg.quotation.bohai.crawler.util.PythonExecutor;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RBucket;
@@ -65,6 +66,16 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
     // 登陆次数
     public static final int LOGINS_NUMBER = 3;
 
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        // 从Redis获取sessionId
+        String sessionId = getOrRefreshSessionId();
+        if (!StringUtils.hasLength(sessionId)) {
+            sessionId = getSessionId();
+        }
+        return StringUtils.hasLength(sessionId);
+    }
+
     /**
      * 登录
      * @param username 用户名
@@ -126,6 +137,10 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
 
         // 从Redis获取sessionId
         String sessionId = getOrRefreshSessionId();
+
+        if (StringUtils.hasLength(sessionId)) {
+            sessionId = getSessionId();
+        }
         httpHeaders.set("sessionId", sessionId);
         return httpHeaders;
     }
@@ -153,7 +168,7 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
      *
      * @return sessionId字符串
      */
-    private String getOrRefreshSessionId() {
+    public String getOrRefreshSessionId() {
         // 从Redis获取sessionId
         RBucket<String> bucket = redissonClient.getBucket(BOHAI_SESSION_ID_KEY);
         String sessionId = bucket.get();
@@ -164,23 +179,6 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
             return sessionId;
         }
 
-        // Redis中不存在,调用Python脚本获取sessionId
-        log.info("Redis缓存中sessionId不存在,开始调用Python脚本获取");
-        sessionId = PythonExecutor.executeAndGetSessionId(
-                PYTHON_SCRIPT_PATH,
-                PYTHON_EXECUTABLE_PATH,
-                PYTHON_EXECUTION_TIMEOUT
-        );
-
-        // 校验获取结果
-        if (!StringUtils.hasLength(sessionId)) {
-            log.error("调用Python脚本获取sessionId失败");
-            throw new SystemException("获取sessionId失败");
-        }
-
-        // 将sessionId存入Redis并设置过期时间
-        bucket.set(sessionId, Duration.ofSeconds(SESSION_ID_EXPIRE_SECONDS));
-        log.info("sessionId已存入Redis缓存,过期时间: {}秒", SESSION_ID_EXPIRE_SECONDS);
         return sessionId;
     }
 
@@ -192,16 +190,23 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
      * @return sessionId字符串
      */
     private String getSessionId() {
+        RBucket<String> bucket = redissonClient.getBucket(BOHAI_SESSION_ID_KEY);
+
         String sessionId = PythonExecutor.executeAndGetSessionId(
                 PYTHON_SCRIPT_PATH,
                 PYTHON_EXECUTABLE_PATH,
                 PYTHON_EXECUTION_TIMEOUT
         );
+
         // 校验获取结果
         if (!StringUtils.hasLength(sessionId)) {
             log.error("调用Python脚本获取sessionId失败");
             throw new SystemException("获取sessionId失败");
         }
+
+        // 将sessionId存入Redis并设置过期时间
+        bucket.set(sessionId, Duration.ofSeconds(SESSION_ID_EXPIRE_SECONDS));
+        log.info("sessionId已存入Redis缓存,过期时间: {}秒", SESSION_ID_EXPIRE_SECONDS);
         return sessionId;
     }
 }

+ 8 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java

@@ -29,6 +29,7 @@ import com.jzg.quotation.bohai.crawler.util.OrderNoGenerator;
 import com.jzg.quotation.bohai.crawler.util.PythonExecutor;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.bohai.crawler.build.BoHaiCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.bohai.crawler.component.BoHaiCrawlerRequestComponent;
@@ -76,6 +77,8 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
 
     private final BoHaiCrawlerQuoteProcessService boHaiCrawlerQuoteProcessService;
 
+    private final BoHaiCrawlerQuoteProcessServiceImpl oHaiCrawlerQuoteProcessServiceImpl;
+
     /**
      * 说明:E:\project\memorize_backend\venv\Scripts\python.exe   这是我本地的python解释器路径,这个需要修改为你本地的路径
      */
@@ -93,6 +96,11 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         boHaiCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+  public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        return boHaiCrawlerQuoteProcessService.detectLogin(detectLoginRequest);
+    }
+    
     /**
      * 报价
      *

+ 5 - 3
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PaymentRequest.java

@@ -85,13 +85,15 @@ public class PaymentRequest {
     private String type;
 
     public PaymentRequest(PaymentLinkVo paymentLinkVo) {
-        this.orderCoder = paymentLinkVo.getInsOrders().getInsOrderNo();
+        this.orderCoder = paymentLinkVo.getInsOrders().getCompanyOrderNo();
         this.payAmt = String.valueOf(paymentLinkVo.getInsOrdersCosts().getSumPremium());
         this.businessType = "1";
         this.foreEndURL = "";
 
         this.acciAppPolicyNo = paymentLinkVo.getInsOrdersPolicy().getJyApplyNo();
-        this.nvhlSuitCode = paymentLinkVo.getInsOrdersAccidentalDriving().getRiskCode();
-        this.payAmtnvhl = paymentLinkVo.getInsOrdersAccidentalDriving().getAmount();
+        if (paymentLinkVo.getInsOrdersAccidentalDriving() != null) {
+            this.nvhlSuitCode = paymentLinkVo.getInsOrdersAccidentalDriving().getRiskCode();
+            this.payAmtnvhl = paymentLinkVo.getInsOrdersAccidentalDriving().getAmount();
+        }
     }
 }

+ 5 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/CarModelQueryResponse.java

@@ -165,5 +165,10 @@ public class CarModelQueryResponse {
         public String getPurchasePrice() {
             return null;
         }
+
+        @Override
+        public String getSeatCount() {
+            return null;
+        }
     }
 }

+ 2 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/PremiumCalculationResponse.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.chengtai.api.entity.response;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@@ -17,6 +18,7 @@ import java.util.List;
 @NoArgsConstructor
 @Data
 @JacksonXmlRootElement(localName = "policyFeeCountResponseBody")
+@JsonIgnoreProperties(ignoreUnknown = true)
 public class PremiumCalculationResponse {
     /**
      * 报文头信息(Head)

+ 5 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/entity/response/ChengTaiFindCarModelResponse.java

@@ -150,5 +150,10 @@ public class ChengTaiFindCarModelResponse implements Serializable {
         public String getPurchasePrice() {
             return purchaseprice;
         }
+
+        @Override
+        public String getSeatCount() {
+            return seatcount;
+        }
     }
 }

+ 87 - 7
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.commons.component;
 
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
 import com.jzg.commons.constants.quote.enums.base.InsuranceEnum;
 import com.jzg.commons.exception.SystemException;
@@ -402,6 +403,7 @@ public class RequestComponent {
             try {
                 // 使用FastJSON手动解析JSON
                 result = JSON.parseObject(filteredResponse, responseClass);
+                log.info("JSON解析成功,解析后的响应内容: {}", result);
             } catch (Exception e) {
                 log.error("JSON解析失败,过滤后的响应内容: {}", filteredResponse, e);
                 throw new WebClientResponseException(
@@ -460,6 +462,79 @@ public class RequestComponent {
     }
 
 
+    /**
+     * 构造post请求
+     *
+     * @param url
+     * @param body
+     * @param responseClass
+     * @param headers
+     * @param <Response>    响应实体
+     * @return <Response> ResponseEntity<Response>
+     */
+    public <Response> ResponseEntity<Response> daJiaImgPost(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
+        log.info("URL的值:{},body的值:{}", url, body);
+        WebClient webClient = selectNoSSLWebClient2();
+        try {
+            // 创建一个不带Accept-Encoding的请求头,避免服务器返回压缩数据
+            HttpHeaders requestHeaders = new HttpHeaders();
+            if (headers != null) {
+                requestHeaders.addAll(headers);
+            }
+            // 移除Accept-Encoding头,让服务器返回未压缩的数据
+            requestHeaders.remove("Accept-Encoding");
+
+            // 获取响应实体
+            ResponseEntity<String> rawResponse = webClient.post()
+                    .uri(url)
+                    .headers(setHeaders(requestHeaders))
+                    .body(BodyInserters.fromValue(body))
+                    .retrieve()
+                    .toEntity(String.class)
+                    .block();
+            if (rawResponse == null) {
+                throw new WebClientResponseException(500, "No response received", HttpHeaders.EMPTY, "No response received".getBytes(StandardCharsets.UTF_8), null);
+            }
+
+            String responseBody = rawResponse.getBody();
+            if (responseBody == null) {
+                responseBody = "";
+            }
+
+            Response result;
+            // 判断返回的字符串是否为有效的JSON格式
+            if (isValidJson(responseBody)) {
+                result = JSON.parseObject(responseBody, responseClass);
+            }else{
+                result = (Response)responseBody;
+            }
+            // 构建返回的ResponseEntity
+            return ResponseEntity.status(rawResponse.getStatusCode()).headers(rawResponse.getHeaders()).body(result);
+        } catch (WebClientResponseException e) {
+            // 如果是WebClientResponseException,记录详细信息
+            log.error("WebClient请求失败,状态码: {}, 响应头: {}", e.getStatusCode(), e.getHeaders(), e);
+            throw e;
+        } catch (Exception e) {
+            // 处理其他异常(修复NPE)
+            log.error("请求失败", e);
+
+            // 核心修复:e.getMessage() 可能为 null,必须判空
+            String errorMsg = e.getMessage();
+            if (errorMsg == null) {
+                errorMsg = "网络请求超时或服务端无响应";
+            }
+
+            throw new WebClientResponseException(
+                    500,
+                    "Request failed: " + errorMsg,
+                    HttpHeaders.EMPTY,
+                    errorMsg.getBytes(StandardCharsets.UTF_8),
+                    null
+            );
+        }
+    }
+
+
     /**
      * 构造post请求
      *
@@ -471,7 +546,6 @@ public class RequestComponent {
      * @return <Response> ResponseEntity<Response>
      */
     public <Response> ResponseEntity<Response> post(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
-        log.info("URL的值:{},body的值1:{}", url, body);
         WebClient webClient = selectNoSSLWebClient2();
         try {
             // 创建一个不带Accept-Encoding的请求头,避免服务器返回压缩数据
@@ -503,6 +577,8 @@ public class RequestComponent {
             // 判断返回的字符串是否为有效的JSON格式
             if (isValidJson(responseBody)) {
                 result = JSON.parseObject(responseBody, responseClass);
+                InsuranceLog.infoLog(InsuranceEnum.XDCX.getPinyin(), "\t---------> URl: {} \t---------> 请求参数:{}", url, BodyInserters.fromValue(body));
+                InsuranceLog.infoLog(InsuranceEnum.XDCX.getPinyin(), "\t---------> 响应参数:{}", result);
             }else{
                 result = (Response)responseBody;
             }
@@ -649,6 +725,7 @@ public class RequestComponent {
      */
     public <Response> ResponseEntity<Response> basePost(String url, Object body, ParameterizedTypeReference<Response> bodyTypeReference, HttpHeaders headers) {
         String requestBody = JSON.toJSONString(body);
+        log.info("URL的值:{},body的值:{}", url, requestBody);
         return webClient.post()
                 .uri(url)
                 .body(BodyInserters.fromValue(requestBody))
@@ -716,6 +793,7 @@ public class RequestComponent {
      */
     public <Response> ResponseEntity<Response> formData(String url, MultiValueMap<String, Object> parts, Class<Response> responseClass, HttpHeaders headers) {
         WebClient webClient = selectWebClientAs(url);
+        log.info("URL的值:{},body的值:{}", url, BodyInserters.fromMultipartData(parts));
         return webClient.post()
                 .uri(url)
                 .headers(RequestComponent.setHeaders(headers))
@@ -727,12 +805,12 @@ public class RequestComponent {
                 .block();
     }
 
-    public <Response> ResponseEntity<Response> formDataZhongAn(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
+    public <Response> ResponseEntity<Response> formDataZhongAn(String url, Object body, Class<Response> responseClass, HttpHeaders headers,String type) {
         MultiValueMap<String, Object> multiValueMap = RequestObjectConversion.convertMultiValueMap(body);
-        return formDatazhongan1(url, multiValueMap, responseClass, headers);
+        return formDatazhongan1(url, multiValueMap, responseClass, headers,type);
     }
 
-    public <Response> ResponseEntity<Response> formDatazhongan1(String url, MultiValueMap<String, Object> parts, Class<Response> responseClass, HttpHeaders headers) {
+    public <Response> ResponseEntity<Response> formDatazhongan1(String url, MultiValueMap<String, Object> parts, Class<Response> responseClass, HttpHeaders headers,String type) {
 
         return webClient.post()
                 .uri(url)
@@ -740,11 +818,12 @@ public class RequestComponent {
                 .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(BodyInserters.fromMultipartData(parts))
                 .retrieve()
-                .toEntity(responseClass).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody.getBody()))
+                .toEntity(responseClass).doOnNext(responseBody -> InsuranceLog.infoLog(InsuranceEnum.ZAPA.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 响应参数:{}",
+                        "爬虫" + type,url,JSONObject.toJSONString(responseBody)))
                 .block();
     }
 
-    public String formDataString(String url, Object body, HttpHeaders headers) {
+    public String formDataString(String url, Object body, HttpHeaders headers,String type) {
         MultiValueMap<String, Object> multiValueMap = RequestObjectConversion.convertMultiValueMap(body);
         BodyInserters.MultipartInserter multipartInserter = BodyInserters.fromMultipartData(multiValueMap);
         String block = webClient.post()
@@ -752,7 +831,8 @@ public class RequestComponent {
                 .headers(RequestComponent.setHeaders(headers))
                 .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(BodyInserters.fromMultipartData(multiValueMap))
-                .retrieve().bodyToMono(String.class).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody)) // 打印响应
+                .retrieve().bodyToMono(String.class).doOnNext(responseBody -> InsuranceLog.infoLog(InsuranceEnum.ZAPA.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 响应参数:{}",
+                        "爬虫" + type,url, JSONObject.parseObject(responseBody)))
                 .block();
 
 

+ 29 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/DetectLoginRequest.java

@@ -0,0 +1,29 @@
+package com.jzg.quotation.commons.entity;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class DetectLoginRequest {
+
+    /**
+     * 请求类型  1 api 2 python
+     */
+    private  String apiType;
+
+    /**
+     * 承保机构编码
+     */
+    private String companyCode;
+
+    /**
+     * 账号
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+}

+ 4 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/GetCaptchaRequest.java

@@ -34,4 +34,8 @@ public class GetCaptchaRequest implements Serializable {
      */
     private String phone;
 
+    /**
+     * 协议id 或 账号id
+     */
+    private String agreementId;
 }

+ 1 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/GetCaptchaResponse.java

@@ -22,7 +22,7 @@ public class GetCaptchaResponse  implements Serializable {
     /**
      * 验证码编号
      */
-    private String captchaId;
+    private String identifyId;
 
     /**
      * 验证码图片

+ 7 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/filter/CarModelsFilter.java

@@ -21,4 +21,11 @@ public interface CarModelsFilter {
      */
     String getPurchasePrice();
 
+    /**
+     * 获取车辆座位数
+     *
+     * @return 车辆类型
+     */
+    String getSeatCount();
+
 }

+ 8 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/filter/CarModelsFilterUtils.java

@@ -19,7 +19,6 @@ public final class CarModelsFilterUtils {
         if (carModelsFilterList.isEmpty()) {
             throw new SystemException("核心查询车型失败 请联系业务人员处理");
         }
-
         List<T> stadarCarDTOS = new ArrayList<>();
         if (!StringUtils.isEmpty(carInfo.getCarYear())) {
             stadarCarDTOS = carModelsFilterList
@@ -29,6 +28,14 @@ public final class CarModelsFilterUtils {
                             .equals(car.getCarYear()))
                     .collect(Collectors.toList());
         }
+        if (!StringUtils.isEmpty(carInfo.getSeatCount())) {
+            stadarCarDTOS = stadarCarDTOS
+                    .stream()
+                    .filter(car -> carInfo
+                            .getSeatCount()
+                            .equals(car.getSeatCount()))
+                    .collect(Collectors.toList());
+        }
 
         if (!stadarCarDTOS.isEmpty()) {
             carModelsFilterList = stadarCarDTOS;

+ 1 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/GetCaptchaBaseService.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.commons.service;
 
 
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 

+ 7 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/QuotationBaseService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.commons.service;
 
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 
 /**
  * 报价基类
@@ -50,5 +51,10 @@ public interface QuotationBaseService {
      */
     OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws Exception;
 
-
+    /**
+     * 检测登录
+     *
+     * @param detectLoginRequest 检测登录信息
+     */
+    boolean detectLogin(DetectLoginRequest detectLoginRequest);
 }

+ 1 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/QuotationCrawlerBaseService.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.commons.service;
 
 
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 
 
 /**

+ 31 - 8
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateTimeUtil.java

@@ -1,13 +1,11 @@
 package com.jzg.quotation.commons.utils;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import org.apache.commons.lang3.StringUtils;
 
 import java.text.ParseException;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAccessor;
@@ -470,10 +468,6 @@ public class DateTimeUtil {
 //        System.err.println("注册日期:"+lRegisterDate);
 //        System.err.println("上市日期:"+lVehicleYearDate);
         return lVehicleYearDate.isBefore(lRegisterDate);
-
-
-
-
     }
 
     /**
@@ -494,6 +488,35 @@ public class DateTimeUtil {
         return false;
     }
 
+    /**
+     * 将日期字符串解析为LocalDateTime对象
+     * 支持多种日期格式:
+     * - ISO格式:yyyy-MM-ddTHH:mm:ss+08:00(含时区)
+     * - 完整格式:yyyy-MM-dd HH:mm:ss
+     * - 简短格式:yyyy-MM-dd(自动补充时间为00:00:00)
+     *
+     * @param dateStr 日期字符串,可以为null或空字符串
+     * @return 解析后的LocalDateTime对象,如果输入为空则返回null
+     */
+    public static LocalDateTime parseDate(String dateStr) {
+        if (StrUtil.isEmpty(dateStr)) {
+            return null;
+        }
+
+        // 如果包含T或时区信息,使用ISO格式解析
+        if (dateStr.contains("T") || dateStr.contains("+") || dateStr.contains("Z")) {
+            return ZonedDateTime.parse(dateStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME).toLocalDateTime();
+        }
+
+        // 处理仅包含日期的字符串(长度为10),补充默认时间
+        if (dateStr.length() == 10) {
+            return LocalDateTime.parse(dateStr + " 00:00:00", DateTimeFormatter.ofPattern(DATETIME_PATTERN));
+        }
+
+        // 使用标准格式解析
+        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(DATETIME_PATTERN));
+    }
+
 
 
     public static void main(String[] args) throws ParseException {

+ 8 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiRequestImpl.java

@@ -19,6 +19,7 @@ import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.annotation.QuoteApiService;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.dajia.api.build.DaJiaAPIQuoteResultsVoBuild;
@@ -68,6 +69,13 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
         return ptlAgreementUrl.getData().getUrl();
     }
 
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        String username = detectLoginRequest.getUsername();
+        String password = detectLoginRequest.getPassword();
+        return true;
+    }
+
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
         log.info("大家保险车险API报价:quoteVo=[{}]", JSONUtil.toJsonStr(quoteVo));

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

@@ -9,6 +9,7 @@ import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.OrderStatusResultVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.dajia.crawler.constant.enums.DaJiaCrawlerOrderState;
 import com.jzg.quotation.dajia.crawler.entity.request.quote.BusinessInsuranceDTO;
@@ -148,10 +149,10 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         CompulsoryInsuranceDTO compulsoryInsurance = daJiaCrawlerSaveResponse.getCompulsoryInsurance(); // 交强险
         BusinessInsuranceDTO businessInsurance = daJiaCrawlerSaveResponse.getBusinessInsurance(); // 商业险
         if (!ObjectUtils.isEmpty(compulsoryInsurance)) {
-            scoreVo.setJqLossRation(compulsoryInsurance.getCoefficientInfo().getLossRatioCi());
+            scoreVo.setJqLossRation(StringUtils.isNotEmpty(compulsoryInsurance.getCoefficientInfo().getLossRatioCi()) ? compulsoryInsurance.getCoefficientInfo().getLossRatioCi() : null);
         }
         if (!ObjectUtils.isEmpty(businessInsurance)) {
-            scoreVo.setSyLossRation(businessInsurance.getCoefficientInfo().getLossRatioBi());
+            scoreVo.setSyLossRation(StringUtils.isNotEmpty(businessInsurance.getCoefficientInfo().getLossRatioBi()) ? businessInsurance.getCoefficientInfo().getLossRatioBi() : null);
         }
         // 总赔付率 违章评分 高速风险分
         String carIllegalScore;
@@ -165,6 +166,7 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
             carIllegalScore = daJiaCrawlerSaveResponse.getBusinessInsurance().getCoefficientInfo().getCarIllegalScore();
             highwayScore = daJiaCrawlerSaveResponse.getBusinessInsurance().getCoefficientInfo().getHighwayScore();
         }
+        CompulsoryInsuranceDTO.CoefficientInfoDTO coefficientInfo = daJiaCrawlerSaveResponse.getCompulsoryInsurance().getCoefficientInfo();
         JSONArray scoreArray = new JSONArray();
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","交强定价评分")
@@ -182,6 +184,54 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
                 .fluentPut("scoreName","高速风险分")
                 .fluentPut("scoreKey","highwayScore")
                 .fluentPut("score",highwayScore));
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","醉酒驾驶行为违法次数")
+                .fluentPut("scoreKey","drunkTotalCoef")
+                .fluentPut("score",coefficientInfo.getDrunkTotalCoef()));
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","理赔调整系数")
+                .fluentPut("scoreKey","claimAdjustValue")
+                .fluentPut("score",coefficientInfo.getClaimAdjustValue()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","交强险手续费")
+                .fluentPut("scoreKey","handFeeCi")
+                .fluentPut("score",coefficientInfo.getHandFeeCi()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","商业险手续费")
+                .fluentPut("scoreKey","handFeeBi")
+                .fluentPut("score",coefficientInfo.getHandFeeBi()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","续保次数")
+                .fluentPut("scoreKey","renewalFrequency")
+                .fluentPut("score",coefficientInfo.getRenewalFrequency()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","违法调整系数")
+                .fluentPut("scoreKey","carIllegalScore")
+                .fluentPut("score",coefficientInfo.getCarIllegalScore()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","商业险连续承保年数")
+                .fluentPut("scoreKey","insureYears")
+                .fluentPut("score",coefficientInfo.getInsureYears()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","商业险建议折扣")
+                .fluentPut("scoreKey","suggestedDiscount")
+                .fluentPut("score",coefficientInfo.getSuggestedDiscount()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","无赔款优待系数")
+                .fluentPut("scoreKey","totalCoefNum")
+                .fluentPut("score",coefficientInfo.getTotalCoefNum()));
+        scoreVo.setScoreJson(scoreArray);
+        scoreArray.add(new JSONObject()
+                .fluentPut("scoreName","无赔优系数级别")
+                .fluentPut("scoreKey","claimAdjustLvl")
+                .fluentPut("score",coefficientInfo.getClaimAdjustLvl()));
         scoreVo.setScoreJson(scoreArray);
         return scoreVo;
     }

+ 1 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DajiaCrawlerAuditResultsVoBuild.java

@@ -42,7 +42,7 @@ public final class DajiaCrawlerAuditResultsVoBuild {
             if (null != daJiaCrawlerGenerateResponse.getJqGenerate().getErrorMessage()) {
                 sb.append(String.format("交强险提示信息:%s", daJiaCrawlerGenerateResponse.getJqGenerate().getErrorMessage()));
             }
-            if (null != daJiaCrawlerGenerateResponse.getSyGenerate().getErrorMessage()) {
+            if (!Objects.isNull(daJiaCrawlerGenerateResponse.getSyGenerate()) && null != daJiaCrawlerGenerateResponse.getSyGenerate().getErrorMessage()) {
                 sb.append(String.format("商业险提示信息:%s", daJiaCrawlerGenerateResponse.getSyGenerate().getErrorMessage()));
             }
             underwritingResultsVo.setUnderwritingResult(sb.toString());

+ 13 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/component/DaJiaCrawlerCacheComponent.java

@@ -43,6 +43,8 @@ public class DaJiaCrawlerCacheComponent {
 
     public static final String USER_CODE = "USER_CODE";
 
+    public static final String TOKEN_ID = "TOKEN_ID";
+
     /**
      * 缓存授权信息
      *
@@ -56,6 +58,7 @@ public class DaJiaCrawlerCacheComponent {
         String authorization = BEARER + token;
         authorizationMap.put(AUTHORIZATION, authorization);
         authorizationMap.put(USER_CODE, userCode);
+        authorizationMap.put(TOKEN_ID, token);
         RMap<Object, Object> map = redissonClient.getMap(DAJIA_AUTHORIZATION + userName);
         map.putAll(authorizationMap);
         map.expire(Duration.ofHours(DAJIA_AUTHORIZATION_TIME));
@@ -104,4 +107,14 @@ public class DaJiaCrawlerCacheComponent {
         return (String) redissonClient.getMap(DAJIA_AUTHORIZATION + username).get(AUTHORIZATION);
     }
 
+    /**
+     * 获取授权信息
+     *
+     * @param username 用户名
+     * @return 授权token
+     */
+    public String getTokenId(String username) {
+        return (String) redissonClient.getMap(DAJIA_AUTHORIZATION + username).get(TOKEN_ID);
+    }
+
 }

+ 30 - 3
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/component/DaJiaCrawlerRequestComponent.java

@@ -4,6 +4,7 @@ package com.jzg.quotation.dajia.crawler.component;
 import com.alibaba.fastjson2.JSON;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
@@ -24,9 +25,7 @@ import org.springframework.util.MultiValueMap;
 import org.springframework.web.reactive.function.BodyInserters;
 import org.springframework.web.reactive.function.client.WebClient;
 
-import java.nio.charset.StandardCharsets;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
 
 @Slf4j
@@ -279,7 +278,20 @@ public class DaJiaCrawlerRequestComponent {
      */
     public void initData(DaJiaCrawlerInitDataRequest request, HttpHeaders headers) {
         String url = daJiaCrawlerProperties.getBaseUrl() + RequestUrl.INIT_DATA.uri();
-        requestComponent.objectPost(url, request, String.class, headers);
+        requestComponent.post(url, request, String.class, headers);
+    }
+
+    /**
+     * 初始化数据
+     *
+     * @param request 初始化数据
+     * @param headers 请求头
+     * @return 初始化数据响应
+     */
+    public String  initImgData(DaJiaCrawlerInitDataRequest request, HttpHeaders headers) {
+        String url = daJiaCrawlerProperties.getBaseUrl() + RequestUrl.INIT_DATA.uri();
+        ResponseEntity<String> stringResponseEntity = requestComponent.daJiaImgPost(url, request, String.class, headers);
+        return stringResponseEntity.getHeaders().getFirst("X-Imp-Token");
     }
 
     /**
@@ -356,6 +368,11 @@ public class DaJiaCrawlerRequestComponent {
         String url = RequestUrl.QRCODE.getRequestUrl(daJiaCrawlerProperties.getBaseUrl()) + "/" + orderNo + "/1";
         MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
         map.add("operatorCode", operatorCode);
+        try {
+            Thread.sleep(5000);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
         DaJiaCrawlerBaseResponse daJiaCrawlerBaseResponse = requestComponent.get(url, map, "", DaJiaCrawlerBaseResponse.class, headers);
         return DESEncryption.decryptStrToObject(daJiaCrawlerBaseResponse.getResult(), DaJiaCrawlerQrcodeResponse.class);
     }
@@ -388,4 +405,14 @@ public class DaJiaCrawlerRequestComponent {
         return  DESEncryption.decryptStrToObject(response.getResult(), DaJiaCrawlerDownloadResponse.class);
     }
 
+    public void policyQuery(String lastPolicyNo, HttpHeaders headers,String userCode) {
+        if (StringUtils.isEmpty(lastPolicyNo)){
+            return;
+        }
+        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
+        map.add("operatorCode",userCode);
+        String body = requestComponent.get(RequestUrl.POLICY_QUERY.getRequestUrl(daJiaCrawlerProperties.getBaseUrl()) + lastPolicyNo, map, "", String.class, headers);
+        String string1 = DESEncryption.decryptStrToObject(body, String.class);
+        log.info("返回数据:{}",string1);
+    }
 }

+ 2 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/constant/enums/RequestUrl.java

@@ -38,6 +38,8 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     ELECTRON_POLICY_IO_DOWNLOAD("/api_vhl_prod/api/electronPolicyIODownload", "下载保单"),
     // 状态查询
     ORDER_LIST_REVISED("/api_vhl_prod/api/orderListRevised", "订单状态查询"),
+    // 政策查询
+    POLICY_QUERY("/api_vhl_prod/api/policyquery/","政策查询"),
     ;
 
     private final String uri;

+ 3 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/po/DaJiaCrawlerOrder.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.dajia.crawler.entity.po;
 
+import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerSaveResponse;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -64,4 +65,6 @@ public class DaJiaCrawlerOrder {
      */
     private String createTime;
 
+    private DaJiaCrawlerSaveResponse saveResponse;
+
 }

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

@@ -43,7 +43,7 @@ public class DaJiaCrawlerChannelPackagesRequest {
     public DaJiaCrawlerChannelPackagesRequest(DaJiaCrawlerConfigureParameters parameters, String operatorCode) {
         this.loginCompany = parameters.getLoginCompany();
         this.companyCode = parameters.getCDptCde();
-        this.combineProductCode = parameters.getCombineProductCode();
+        this.combineProductCode = "1469";
         this.operatorCode = operatorCode;
     }
 }

+ 8 - 4
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerPriceRequest.java

@@ -137,13 +137,17 @@ public class DaJiaCrawlerPriceRequest implements Serializable {
         // 商业险
         if (!ObjectUtils.isEmpty(quoteVo.getBiRiskInfoVo())) {
             this.businessInsurance = new BusinessInsuranceDTO(quoteVo.getBiRiskInfoVo(), quoteVo.getKindInfoVo());
-            proposalInfo.setMark("3");
         }else {
             this.businessInsurance = new BusinessInsuranceDTO();
         }
-
-        if (!ObjectUtils.isEmpty(quoteVo.getBiRiskInfoVo()) && !ObjectUtils.isEmpty(quoteVo.getCiRiskInfoVo())) {
+        boolean hasBiRisk = !ObjectUtils.isEmpty(quoteVo.getBiRiskInfoVo());
+        boolean hasCiRisk = !ObjectUtils.isEmpty(quoteVo.getCiRiskInfoVo());
+        if (hasBiRisk && hasCiRisk) {
             proposalInfo.setMark("1");
+        } else if (hasCiRisk) {
+            proposalInfo.setMark("2");
+        } else if (hasBiRisk) {
+            proposalInfo.setMark("3");
         }
         this.checkCarInformationDTO = new CheckCarInfomationDTO();
         String vehicleExhaust = car.getVehicleExhaust();
@@ -157,7 +161,7 @@ public class DaJiaCrawlerPriceRequest implements Serializable {
         }
         String startTime;
         String endTime;
-        if (!compulsoryInsurance.getProductInfo().getStartDate().equals("")) {
+        if (!ObjectUtils.isEmpty(quoteVo.getCiRiskInfoVo())) {
             startTime = compulsoryInsurance.getProductInfo().getStartDate();
             endTime = compulsoryInsurance.getProductInfo().getEndDate();
         } else {

+ 5 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/response/DaJiaCrawlerCarResponse.java

@@ -280,5 +280,10 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         public String getPurchasePrice() {
             return vehiclePrice;
         }
+
+        @Override
+        public String getSeatCount() {
+            return String.valueOf(vehicleSeat);
+        }
     }
 }

+ 9 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/DaJiaCrawlerQuoteProcessService.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.dajia.crawler.service;
 
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import org.springframework.http.HttpHeaders;
 
 /**
@@ -18,6 +19,14 @@ public interface DaJiaCrawlerQuoteProcessService {
      */
     String login(String username, String password);
 
+    /**
+     * 检测登录
+     *
+     * @param detectLoginRequest 检测登录请求
+     * @return 检测结果
+     */
+    boolean detectLogin(DetectLoginRequest detectLoginRequest);
+
     /**
      * 获取请求头信息
      *

+ 1 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerOrderServiceImpl.java

@@ -22,6 +22,7 @@ public class DaJiaCrawlerOrderServiceImpl implements DaJiaCrawlerOrderService {
     @Override
     public void saveOrderInfo(QuoteVo quoteVo, DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse,  String businessNo) {
         DaJiaCrawlerOrder daJiaCrawlerOrder = new DaJiaCrawlerOrder();
+        daJiaCrawlerOrder.setSaveResponse(daJiaCrawlerSaveResponse);
         daJiaCrawlerOrder.setId(quoteVo.getOrder().getOrdersNo());
         daJiaCrawlerOrder.setOrdersNo(daJiaCrawlerSaveResponse.getProposalInfo().getOrderNo());
         // 交强投保单号

+ 36 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerQuoteProcessServiceImpl.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.dajia.crawler.service.impl;
 
 import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.dajia.crawler.component.DaJiaCrawlerCacheComponent;
 import com.jzg.quotation.dajia.crawler.component.DaJiaCrawlerRequestComponent;
 import com.jzg.quotation.dajia.crawler.entity.request.DaJiaCrawlerCheckTokenRequest;
@@ -10,6 +11,7 @@ import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerCheckTokenRes
 import com.jzg.quotation.dajia.crawler.service.DaJiaCrawlerQuoteProcessService;
 import com.jzg.quotation.dajia.crawler.utils.DESEncryption;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
@@ -17,6 +19,8 @@ import org.springframework.util.StringUtils;
 
 import java.util.Optional;
 
+
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class DaJiaCrawlerQuoteProcessServiceImpl implements DaJiaCrawlerQuoteProcessService {
@@ -28,6 +32,17 @@ public class DaJiaCrawlerQuoteProcessServiceImpl implements DaJiaCrawlerQuotePro
     // 登陆次数
     public static final int LOGINS_NUMBER = 3;
 
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        String username = detectLoginRequest.getUsername();
+        String password = detectLoginRequest.getPassword();
+        String authorization = daJiaCrawlerCacheComponent.getAuthorization(username);
+        if (!StringUtils.hasText(authorization) || isTokenInvalid(username)) {
+            authorization = login(username, password);
+        }
+        return StringUtils.hasText(authorization);
+    }
+
     /**
      * 登录
      * @param username 用户名
@@ -62,7 +77,7 @@ public class DaJiaCrawlerQuoteProcessServiceImpl implements DaJiaCrawlerQuotePro
     @Override
     public HttpHeaders getHeaders(String username, String password) {
         String authorization = daJiaCrawlerCacheComponent.getAuthorization(username);
-        if (!StringUtils.hasLength(authorization)) {
+        if (!StringUtils.hasText(authorization) || isTokenInvalid(username)) {
             authorization = login(username, password);
         }
         HttpHeaders headers = new HttpHeaders();
@@ -74,6 +89,26 @@ public class DaJiaCrawlerQuoteProcessServiceImpl implements DaJiaCrawlerQuotePro
         return headers;
     }
 
+    private boolean isTokenInvalid(String username) {
+        String userCode = daJiaCrawlerCacheComponent.getUserCode(username);
+        String tokenId = daJiaCrawlerCacheComponent.getTokenId(username);
+
+        try {
+            checkToken(userCode, tokenId);
+            return false;
+        } catch (Exception e) {
+            String errorMsg = e.getMessage();
+            // 401 代表 token 过期/未授权 → 标记为无效
+            if (errorMsg != null && errorMsg.contains("401 Unauthorized from")) {
+                log.warn("token 过期,自动重新登录: {}", errorMsg);
+                return true;
+            }
+            // 其他异常直接抛出
+            log.error("登录校验异常: {}", e.getMessage(), e);
+            throw new SystemException("登录异常");
+        }
+    }
+
     /**
      * 校验token
      * @param userCode

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

@@ -1,15 +1,16 @@
 package com.jzg.quotation.dajia.crawler.service.impl;
 
 
-import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.alibaba.fastjson2.JSONObject;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
-import com.jzg.commons.util.MinioUtils;
+import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.TimeProcessing;
@@ -18,7 +19,6 @@ import com.jzg.quotation.dajia.crawler.build.DajiaCrawlerAuditResultsVoBuild;
 import com.jzg.quotation.dajia.crawler.component.BuildingAttributionInformation;
 import com.jzg.quotation.dajia.crawler.component.DaJiaCrawlerCacheComponent;
 import com.jzg.quotation.dajia.crawler.component.DaJiaCrawlerRequestComponent;
-import com.jzg.quotation.dajia.crawler.constant.enums.DaJiaCrawlerOrderState;
 import com.jzg.quotation.dajia.crawler.entity.DaJiaCrawlerConfigureParameters;
 import com.jzg.quotation.dajia.crawler.entity.po.DaJiaCrawlerOrder;
 import com.jzg.quotation.dajia.crawler.entity.request.*;
@@ -31,6 +31,8 @@ import com.jzg.quotation.dajia.crawler.service.DaJiaCrawlerQuoteProcessService;
 import com.jzg.quotation.dajia.crawler.service.DaJiaCrawlerRequest;
 import com.jzg.quotation.dajia.crawler.utils.ImagesEncrypt;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+import org.redisson.api.RedissonClient;
 import org.springframework.http.HttpHeaders;
 import org.springframework.util.StringUtils;
 
@@ -42,7 +44,7 @@ import java.util.stream.Collectors;
 
 /**
  * 大家财险爬虫报价服务实现类
- * 
+ *
  * <p>通过模拟浏览器操作的方式实现大家财险的完整报价流程,包括:</p>
  * <ul>
  *   <li>用户登录认证</li>
@@ -53,32 +55,45 @@ import java.util.stream.Collectors;
  *   <li>保单下载</li>
  *   <li>订单状态查询</li>
  * </ul>
- * 
+ *
  * @author wenks
  * @since 2025/2/12
  */
+@Log4j2
 @QuoteCrawlerService(value = InsuranceCode.INSURANCE_DJPC)
 @RequiredArgsConstructor
 public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
 
-    /** 大家财险爬虫请求组件,负责与保险公司API的交互 */
+    /**
+     * 大家财险爬虫请求组件,负责与保险公司API的交互
+     */
     private final DaJiaCrawlerRequestComponent daJiaCrawlerRequestComponent;
 
-    /** 归属信息构建组件,用于构建机构、套餐、渠道等归属信息 */
+    /**
+     * 归属信息构建组件,用于构建机构、套餐、渠道等归属信息
+     */
     private final BuildingAttributionInformation buildingAttributionInformation;
 
-    /** 大家财险缓存组件,负责认证信息和订单数据的缓存管理 */
+    /**
+     * 大家财险缓存组件,负责认证信息和订单数据的缓存管理
+     */
     private final DaJiaCrawlerCacheComponent daJiaCrawlerCacheComponent;
 
-    /** 大家财险订单服务,负责订单数据的持久化操作 */
+    /**
+     * 大家财险订单服务,负责订单数据的持久化操作
+     */
     private final DaJiaCrawlerOrderService daJiaCrawlerOrderService;
 
-    /** 大家财险爬虫报价流程服务,负责登录认证和请求头管理 */
+    /**
+     * 大家财险爬虫报价流程服务,负责登录认证和请求头管理
+     */
     private final DaJiaCrawlerQuoteProcessService daJiaCrawlerQuoteProcessService;
 
+    private final RedissonClient redissonClient;
+
     /**
      * 用户登录认证
-     * 
+     *
      * @param loginBase 登录基础信息,包含用户名和密码
      */
     @Override
@@ -86,9 +101,16 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         daJiaCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        return daJiaCrawlerQuoteProcessService.detectLogin(detectLoginRequest);
+
+    }
+
+
     /**
      * 车险报价核心流程
-     * 
+     *
      * <p>完整的报价流程包括以下步骤:</p>
      * <ol>
      *   <li>获取认证信息和配置参数</li>
@@ -100,7 +122,7 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
      *   <li>缓存订单数据</li>
      *   <li>持久化订单信息</li>
      * </ol>
-     * 
+     *
      * @param quoteVo 报价请求参数,包含车辆信息、投保人信息等
      * @return QuoteResultsVo 报价结果,包含保费明细、订单号等信息
      */
@@ -110,12 +132,10 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
         HttpHeaders headers = daJiaCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         String userCode = daJiaCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
-
         // 1.1 解析配置参数
         DaJiaCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
         // 1.2 构建归属信息(机构、套餐、渠道信息)
         ProposalInfoDTO proposalInfoDTO = buildingAttributionInformation.build(parameters, userCode, headers);
-
         // 2.0 车型查询
         DaJiaCrawlerCarRequest daJiaCrawlerCarRequest = new DaJiaCrawlerCarRequest(quoteVo.getCarInfoVo(), parameters.getLoginCompany(), parameters.getCDptCde(), userCode);
         DaJiaCrawlerCarResponse daJiaCrawlerCarResponse = daJiaCrawlerRequestComponent.car(daJiaCrawlerCarRequest, headers);
@@ -133,7 +153,8 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         String message = crawlerPriceResponse.getIncreasedValueMsg();
         if (message.contains("重复投保")) {
             String startTime = extractDuplicateEndTime(message);
-            String endTime = TimeProcessing.minusOneSecondAfterYear(startTime);;
+            String endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
+            ;
             CompulsoryInsuranceDTO compulsoryInsuranceDTO = daJiaCrawlerPriceRequest.getCompulsoryInsurance();
             BusinessInsuranceDTO businessInsuranceDTO = daJiaCrawlerPriceRequest.getBusinessInsurance();
             compulsoryInsuranceDTO.getProductInfo().setStartDate(startTime);
@@ -142,9 +163,15 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
             businessInsuranceDTO.getProductInfo().setEndDate(endTime);
             crawlerPriceResponse = daJiaCrawlerRequestComponent.price(daJiaCrawlerPriceRequest, headers);
         }
+        String lastPolicyNo = crawlerPriceResponse.getCompulsoryInsurance().getProductInfo().getLastPolicyNo();
+
+        daJiaCrawlerRequestComponent.policyQuery(lastPolicyNo, headers, userCode);
+
+        log.info("报价返回参数:{}", JSONObject.toJSONString(crawlerPriceResponse));
         // 3.1 保存订单到保险公司系统
         DaJiaCrawlerSaveRequest daJiaCrawlerSaveRequest = new DaJiaCrawlerSaveRequest(crawlerPriceResponse, userCode, quoteVo);
         DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse = daJiaCrawlerRequestComponent.save(daJiaCrawlerSaveRequest, headers);
+        log.info("daJiaCrawlerSaveResponse:{}", JSONObject.toJSONString(daJiaCrawlerSaveResponse));
         // 3.2 初始化订单数据
         DaJiaCrawlerInitDataRequest daJiaCrawlerInitDataRequest = new DaJiaCrawlerInitDataRequest(daJiaCrawlerSaveResponse.getCompulsoryInsurance(), daJiaCrawlerSaveResponse.getBusinessInsurance());
         daJiaCrawlerRequestComponent.initData(daJiaCrawlerInitDataRequest, headers);
@@ -158,11 +185,13 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         return DaJiaCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), quoteVo, daJiaCrawlerSaveResponse);
     }
 
+
     // 截取重复投保终保日期
     private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
 
     /**
      * 提取系统自动分配的起保时间
+     *
      * @param returnMessage 核心提示
      * @return 提取到的时间字符串,未提取到返回 null
      */
@@ -178,9 +207,9 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
 
     /**
      * 订单核保处理
-     * 
+     *
      * <p>将已报价的订单提交给保险公司进行核保审核</p>
-     * 
+     *
      * @param underwritingVo 核保请求参数,包含订单号等信息
      * @return UnderwritingResultsVo 核保结果
      */
@@ -194,31 +223,41 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse = daJiaCrawlerCacheComponent.getDaJiaCrawlerSaveResponse(daJiaCrawlerOrder.getOrdersNo());
         // 提交核保申请
         DaJiaCrawlerGenerateResponse response = daJiaCrawlerRequestComponent.generate(daJiaCrawlerSaveResponse, headers);
-        return DajiaCrawlerAuditResultsVoBuild.buildUnderwritingResultsVo(daJiaCrawlerOrder.getOrdersNo(), response);
+        log.info("大家核保数据返回:{}", JSONObject.toJSONString(response));
+        UnderwritingResultsVo underwritingResultsVo = DajiaCrawlerAuditResultsVoBuild.buildUnderwritingResultsVo(daJiaCrawlerOrder.getOrdersNo(), response);
+        if (response.getStatus().equals("4")) {
+            PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+            paymentLinkVo.setOrder(underwritingVo.getOrder());
+            PaymentLinkResultsVo paymentLink = getPaymentLink(paymentLinkVo);
+            underwritingResultsVo.setPaymentLink(paymentLink.getPaymentLink());
+        }
+        return underwritingResultsVo;
     }
 
     /**
      * 获取支付链接
-     * 
+     *
      * <p>为已核保通过的订单生成支付二维码链接</p>
-     * 
+     *
      * @param paymentLinkVo 支付链接请求参数
      * @return PaymentLinkResultsVo 支付链接结果,包含二维码URL
      */
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
+
         AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
         DaJiaCrawlerOrder daJiaCrawlerOrder = daJiaCrawlerOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
         HttpHeaders headers = daJiaCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         String userCode = daJiaCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
         // 生成支付二维码
         DaJiaCrawlerQrcodeResponse daJiaCrawlerQrcodeResponse = daJiaCrawlerRequestComponent.qrcode(daJiaCrawlerOrder.getOrdersNo(), userCode, headers);
-        return new PaymentLinkResultsVo(true, daJiaCrawlerQrcodeResponse.getUrl(), "");
+        log.info("获取支付链接返回数据:{}", JSONObject.toJSONString(daJiaCrawlerQrcodeResponse));
+        return new PaymentLinkResultsVo(true, daJiaCrawlerQrcodeResponse.getImageContent(), "");
     }
 
     /**
      * 上传保险影像资料
-     * 
+     *
      * <p>上传车险相关的影像资料,如行驶证、驾驶证等。流程包括:</p>
      * <ol>
      *   <li>获取上传文件标志和URL</li>
@@ -226,7 +265,7 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
      *   <li>批量上传文件到对象存储</li>
      *   <li>统一提交文件信息到保险系统</li>
      * </ol>
-     * 
+     *
      * @param insuranceUploadImageVo 影像上传请求参数,包含图片列表和分类信息
      */
     @Override
@@ -238,12 +277,17 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         DaJiaCrawlerOrder daJiaCrawlerOrder = daJiaCrawlerOrderService.getById(insuranceUploadImageVo.getOrder()
                 .getOrdersNo());
         List<InsuranceImageVo> imageVoList = insuranceUploadImageVo.getImageVoList();
-        
+        DaJiaCrawlerInitDataRequest daJiaCrawlerInitDataRequest = new DaJiaCrawlerInitDataRequest(daJiaCrawlerOrder.getSaveResponse().getCompulsoryInsurance(), daJiaCrawlerOrder.getSaveResponse().getBusinessInsurance());
+        headers.set("X-Imp-Token", daJiaCrawlerRequestComponent.initImgData(daJiaCrawlerInitDataRequest, headers));
+
         // 按影像类型分组处理
         imageVoList.forEach(imageVo -> {
             // 1. 获取上传文件标志和预签名URL
             DaJiaCrawlerUploadSignsRequest daJiaCrawlerUploadSignsRequest = new DaJiaCrawlerUploadSignsRequest(daJiaCrawlerOrder.getBusinessNo(), imageVo.getInsuranceImageCode(), imageVo.getImageBase64List());
             DaJiaCrawlerUploadSignsResponse daJiaCrawlerUploadSignsResponse = daJiaCrawlerRequestComponent.uploadSigns(daJiaCrawlerUploadSignsRequest, headers);
+            if (com.jzg.commons.util.StringUtils.equals("FAIL", daJiaCrawlerUploadSignsResponse.getCode())) {
+                throw new SystemException("获取上传影像异常:" + daJiaCrawlerUploadSignsResponse.getMessage());
+            }
             // 2. 构建文件名到上传信息的映射
             Map<String, DaJiaCrawlerUploadSignsResponse.DataDTO> dataDTOMap = daJiaCrawlerUploadSignsResponse.getData()
                     .stream()
@@ -276,14 +320,14 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
 
     /**
      * 下载电子保单
-     * 
+     *
      * <p>根据订单信息下载对应的电子保单文件,支持:</p>
      * <ul>
      *   <li>交强险保单</li>
      *   <li>商业险保单</li>
      *   <li>非车险保单</li>
      * </ul>
-     * 
+     *
      * @param downloadPolicyVo 保单下载请求参数
      * @return DownloadPolicyResultVo 保单下载结果,包含各类保单的下载链接
      */
@@ -299,7 +343,7 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         DaJiaCrawlerDownloadRequest daJiaCrawlerDownloadRequest = new DaJiaCrawlerDownloadRequest(daJiaCrawlerOrder, userCode);
         DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
         DaJiaCrawlerDownloadResponse response;
-        
+
         // 下载交强险保单
         if (StringUtils.hasLength(daJiaCrawlerOrder.getCiPolicyNo())) {
             daJiaCrawlerDownloadRequest.setPlyNo(daJiaCrawlerOrder.getCiPolicyNo());
@@ -325,9 +369,9 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
 
     /**
      * 查询订单状态
-     * 
+     *
      * <p>查询订单在保险公司系统中的最新状态,包括核保状态、支付状态等</p>
-     * 
+     *
      * @param orderStatusVo 订单状态查询请求参数
      * @return OrderStatusResultVo 订单状态结果,包含订单当前状态信息
      */

+ 31 - 3
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/build/GuoRenApiQuoteResultsVoBuild.java

@@ -1,5 +1,7 @@
 package com.jzg.quotation.guoren.api.build;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
@@ -32,12 +34,36 @@ public class GuoRenApiQuoteResultsVoBuild {
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
 
         // 交强保费 车船税 商业保费
-        buildPremium(quoteResultsVo, premiumResponse,nonAutoInsOrderResponse);
+        buildPremium(quoteResultsVo, premiumResponse, nonAutoInsOrderResponse);
+
+        QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
+        scoreVo.setLossRation(premiumResponse.getData().getAutoPriceOutputXOMRespVo().getBillELR());
+        scoreVo.setJqLossRation(premiumResponse.getData().getAutoPriceOutputXOMRespVo().getBillCTPELR());
+        scoreVo.setSyLossRation(premiumResponse.getData().getAutoPriceOutputXOMRespVo().getBillCOMELR());
+        if (premiumResponse.getData().getCiInsureDemandDTOS() != null && premiumResponse.getData().getCiInsureDemandDTOS().size() > 0) {
+            scoreVo.setCiClaims(premiumResponse.getData().getCiInsureDemandDTOS().get(0).getClaimTimes());
+            scoreVo.setBiClaims(premiumResponse.getData().getCiInsureDemandDTOS().get(0).getClaimTimes());
+        }
+        scoreVo.setTotalAdjustRate(premiumResponse.getData().getSignDiscount());
+
+        // 保司评分
+        JSONArray scoreJson = new JSONArray();
+        //光博评分
+        scoreJson.add(new JSONObject().fluentPut("scoreName", "交强光博分").fluentPut("scoreKey", "score").fluentPut("score", premiumResponse.getData().getCirate().getBillcomeGroup()));
+
+        if (premiumResponse.getData().getBirate() != null) {
+            scoreJson.add(new JSONObject().fluentPut("scoreName", "商业光博分").fluentPut("scoreKey", "score").fluentPut("score", premiumResponse.getData().getBirate().getBillcomeGroup()));
+        }
+
+        scoreVo.setScoreJson(scoreJson);
+        quoteResultsVo.setScoreVo(scoreVo);
+
         return quoteResultsVo;
     }
 
     /**
      * 处理商业险数据
+     *
      * @param premiumResponse
      * @return
      */
@@ -52,6 +78,7 @@ public class GuoRenApiQuoteResultsVoBuild {
 
     /**
      * 处理交强险数据
+     *
      * @param premiumResponse
      * @return riskInfoVo
      */
@@ -66,13 +93,13 @@ public class GuoRenApiQuoteResultsVoBuild {
 
     /**
      * 处理商业险信息
+     *
      * @param kindInfoVo
      * @param itemVOListDTOS
      * @return
      */
     private static List<KindInfoVo> buildKindInfoVo(List<KindInfoVo> kindInfoVo, List<PremiumResponse.DataDTO.ItemVOListDTO> itemVOListDTOS) {
-        Map<String, PremiumResponse.DataDTO.ItemVOListDTO> collect = itemVOListDTOS.stream()
-                .collect(Collectors.toMap(PremiumResponse.DataDTO.ItemVOListDTO::getKindCode, x -> x));
+        Map<String, PremiumResponse.DataDTO.ItemVOListDTO> collect = itemVOListDTOS.stream().collect(Collectors.toMap(PremiumResponse.DataDTO.ItemVOListDTO::getKindCode, x -> x));
         kindInfoVo.forEach(kind -> {
             PremiumResponse.DataDTO.ItemVOListDTO itemVOListDTO = collect.get(kind.getKindCode());
             if (itemVOListDTO.getKindCode().equals(kind.getKindCode())) {
@@ -87,6 +114,7 @@ public class GuoRenApiQuoteResultsVoBuild {
 
     /**
      * 设置商业险,交强险保费
+     *
      * @param quoteResultsVo
      * @param premiumResponse
      */

+ 39 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Response/IdentifyCodeDataResponse.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.guoren.api.entity.Response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @author wks
+ * @version 1.0
+ * @description: 【国任财险】 直连 发送验证码响应
+ * @date 2025/11/11 15:12
+ */
+@NoArgsConstructor
+@Data
+public class IdentifyCodeDataResponse {
+
+    @JsonProperty(value = "resultCode")
+    @JSONField(name = "resultCode")
+    private Integer resultCode;
+    @JsonProperty(value = "resultMsg")
+    @JSONField(name = "resultMsg")
+    private String resultMsg;
+    @JsonProperty(value = "data")
+    @JSONField(name = "data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+    /**
+     * 验证码编号
+     */
+    @JsonProperty("identifyId")
+    private String identifyId;
+
+    }
+}

+ 9 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java

@@ -26,6 +26,7 @@ import com.jzg.quotation.commons.component.InsImagesUploadCacheComponent;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.commons.utils.HttpUtil;
@@ -79,8 +80,6 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
 
     private final GuoRenApiConfigurationProperties properties;
 
-    private final StringRedisTemplate redisTemplate;
-
     private final InsImagesUploadCacheComponent insImagesUploadCacheComponent;
 
     private final PlatformClient platformClient;
@@ -93,6 +92,13 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
         return ptlAgreementUrl.getData().getUrl();
     }
 
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        String username = detectLoginRequest.getUsername();
+        String password = detectLoginRequest.getPassword();
+        return true;
+    }
+
     /**
      * 报价
      *
@@ -728,6 +734,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
                     FilePart filePart = new FilePart("file", tempFile);
                     Part[] parts = {
                             filePart,
+                            new StringPart("businessType", "T"),
                             new StringPart("businessNo", businessNo),
                             new StringPart("operatorCode", operatorCode),
                             new StringPart("comCode", comCode),

+ 39 - 5
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/build/GuoRenCrawlerQuoteResultsVoBuild.java

@@ -1,13 +1,20 @@
 package com.jzg.quotation.guoren.crawler.build;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.quote.enums.quote.KindCode;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.guoren.api.constant.enums.GuoRenRiskCode;
+import com.jzg.quotation.guoren.api.entity.Response.PremiumResponse;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerBaseResponse;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerCalculationPremiumData;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerProposalNoSaveData;
+import me.chanjar.weixin.mp.bean.card.BaseInfo;
 
 import java.util.List;
 import java.util.Map;
@@ -44,8 +51,38 @@ public final class GuoRenCrawlerQuoteResultsVoBuild {
         quoteResultsVo.getCosts().setCiPremium(ciPremium);
         quoteResultsVo.getCosts().setBiPremium(biPremium); // 注意这里CI和BI保费相同
         quoteResultsVo.getCosts().setVvTax(vvTax);
-        List<KindInfoVo> kindInfoVo = buildKindInfoVo(quoteVo.getKindInfoVo(), calculationPremium.getBi().getPrptitemkindList());
-        quoteResultsVo.setKindInfoVo(kindInfoVo);
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
+
+        quoteResultsVo.setCiRiskInfoVo(quoteVo.getCiRiskInfoVo());
+        quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
+
+        if (calculationPremium.getBi().getPrptitemkindList() != null) {
+            List<KindInfoVo> kindInfoVo = buildKindInfoVo(quoteVo.getKindInfoVo(), calculationPremium.getBi().getPrptitemkindList());
+            quoteResultsVo.setKindInfoVo(kindInfoVo);
+        }
+
+        QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
+        scoreVo.setLossRation(calculationPremium.getBc().getAutoPriceOutputXOMRespVo().getStrBillELR2());
+        scoreVo.setJqLossRation(calculationPremium.getBc().getAutoPriceOutputXOMRespVo().getStrBillCTPELR2());
+        scoreVo.setSyLossRation(calculationPremium.getBc().getAutoPriceOutputXOMRespVo().getStrBillCOMELR2());
+
+        // 保司评分
+        JSONArray scoreJson = new JSONArray();
+        //光博评分
+        scoreJson.add(new JSONObject()
+                .fluentPut("scoreName", "交强光博分")
+                .fluentPut("scoreKey", "score")
+                .fluentPut("score", calculationPremium.getCi().getPrpTmainRate().getBillcomeGroup()));
+
+        if (calculationPremium.getBi().getPrpTmainRate() != null) {
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "商业光博分")
+                    .fluentPut("scoreKey", "score")
+                    .fluentPut("score", calculationPremium.getBi().getPrpTmainRate().getBillcomeGroup()));
+        }
+
+        scoreVo.setScoreJson(scoreJson);
+        quoteResultsVo.setScoreVo(scoreVo);
 
         return quoteResultsVo;
     }
@@ -78,7 +115,4 @@ public final class GuoRenCrawlerQuoteResultsVoBuild {
     }
 
 
-
-
-
 }

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