Quellcode durchsuchen

Merge branch 'refs/heads/master' into dev_jzg_lipf_v20260518

lipf vor 3 Monaten
Ursprung
Commit
63b48f32a2
60 geänderte Dateien mit 1208 neuen und 60 gelöschten Zeilen
  1. 5 0
      commons/src/main/java/com/jzg/commons/entity/account/dto/AccountAddParam.java
  2. 6 0
      commons/src/main/java/com/jzg/commons/entity/account/dto/AccountCardAddParam.java
  3. 6 0
      commons/src/main/java/com/jzg/commons/entity/account/dto/AccountCardEditParam.java
  4. 4 0
      commons/src/main/java/com/jzg/commons/entity/account/dto/AccountCardParam.java
  5. 6 0
      commons/src/main/java/com/jzg/commons/entity/account/dto/AccountEditParam.java
  6. 4 0
      commons/src/main/java/com/jzg/commons/entity/account/dto/AccountParam.java
  7. 4 1
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordQueryVo.java
  8. 2 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java
  9. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementQueryVo.java
  10. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementReportQueryVo.java
  11. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlNewCarJudgeRules.java
  12. 3 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersAdd.java
  13. 2 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersEnd.java
  14. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/InsFeeOrdersVo.java
  15. 2 0
      commons/src/main/java/com/jzg/commons/entity/vo/InsOrdersOtherInfoVo.java
  16. 4 0
      commons/src/main/java/com/jzg/commons/entity/vo/NewCarQuery.java
  17. 191 0
      commons/src/main/java/com/jzg/commons/util/UserContextUtil.java
  18. 149 0
      gateway/src/main/java/com/jzg/filter/AuthGlobalFilter.java
  19. 39 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/component/AnShengCrawlerRequestComponent.java
  20. 11 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/constant/enums/RequestUrl.java
  21. 5 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/po/AnShengCrawlerOrder.java
  22. 1 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java
  23. 19 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/BdTokenResp.java
  24. 27 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/DownloadTokenResult.java
  25. 14 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/DragSliderResp.java
  26. 20 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/LoginResp.java
  27. 24 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/FileDownloadResp.java
  28. 124 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/response/InsuranceResponse.java
  29. 4 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerLoginService.java
  30. 1 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerOrderService.java
  31. 3 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerQuoteProcessService.java
  32. 112 6
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerLoginServiceImpl.java
  33. 2 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerOrderServiceImpl.java
  34. 8 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerQuoteProcessServiceImpl.java
  35. 74 23
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  36. 83 3
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/utils/CustomerNegotiatePriceUtils.java
  37. 14 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  38. 1 1
      tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java
  39. 6 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java
  40. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  41. 2 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java
  42. 5 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  43. 89 0
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  44. 2 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  45. 2 2
      tenant/insurance/quotation-taikang/pom.xml
  46. 1 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java
  47. 6 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/build/ZmCrawlerQuoteResultVoBuild.java
  48. 19 5
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java
  49. 3 0
      tenant/organization/src/main/java/com/jzg/organization/controller/AccountCardController.java
  50. 4 0
      tenant/organization/src/main/java/com/jzg/organization/controller/AccountController.java
  51. 8 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  52. 2 1
      tenant/organization/src/main/java/com/jzg/organization/mapper/NewCarJudgeRulesMapper.java
  53. 17 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/NewCarJudgeRulesServiceImpl.java
  54. 22 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  55. 0 3
      tenant/organization/src/main/resources/application.yml
  56. 1 0
      tenant/organization/src/main/resources/mapper/InvAccountCardMapper.xml
  57. 2 0
      tenant/organization/src/main/resources/mapper/InvAccountMapper.xml
  58. 1 0
      tenant/organization/src/main/resources/mapper/NewCarJudgeRulesMapper.xml
  59. 14 0
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  60. 15 0
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

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

@@ -65,4 +65,9 @@ public class AccountAddParam {
     private String invoicingAmount;
 
 
+    /**
+     * 租户代码
+     * */
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/account/dto/AccountCardAddParam.java

@@ -163,4 +163,10 @@ public class AccountCardAddParam {
      */
     @Schema(description = "对公单日限额剩余")
     private String pubDayLinesExcess;
+
+    /**
+     * 租户代码
+     */
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/account/dto/AccountCardEditParam.java

@@ -165,4 +165,10 @@ public class AccountCardEditParam {
      */
     @Schema(description = "对公单日限额剩余")
     private String pubDayLinesExcess;
+
+    /**
+     * 租户代码
+     */
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/account/dto/AccountCardParam.java

@@ -24,4 +24,8 @@ public class AccountCardParam extends PageRequest {
     @Schema(description = "银行卡号")
     private String bankCardNum;
 
+    /** 租户代码 */
+    @Schema(description = "租户代码")
+    private String systemCode;
+
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/account/dto/AccountEditParam.java

@@ -67,4 +67,10 @@ public class AccountEditParam {
      */
     @Schema(description = "开票额度")
     private String invoicingAmount;
+
+    /**
+     * 租户代码
+     * */
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/account/dto/AccountParam.java

@@ -17,4 +17,8 @@ public class AccountParam  extends PageRequest {
      */
     @Schema(description = "企业类型(0内部企业 1外部企业)")
     private Integer outerFlag;
+
+    /** 租户代码 */
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

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

@@ -54,5 +54,8 @@ public class InvoiceRecordQueryVo extends PageRequest {
      */
     private String companyNameSimple;
 
-
+    /**
+     * 租户代码
+     */
+    private String systemCode;
 }

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

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

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

@@ -70,4 +70,7 @@ public class SettlementQueryVo extends PageRequest {
 
     @Schema(description = "协议类型 1-平台协议 2-私有协议")
     private String agreementType;
+
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

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

@@ -51,4 +51,7 @@ public class SettlementReportQueryVo extends PageRequest {
 
     @Schema(description = "开票状态 0-未开票 1-已开票")
     private String invoiceStatus;
+
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

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

@@ -24,6 +24,9 @@ public class PtlNewCarJudgeRules{
 
     private String companyId;
 
+    @Schema(description = "租户代码")
+    private String systemCode;
+
     @TableField(exist = false)
     private String companyName;
 

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersAdd.java

@@ -37,4 +37,7 @@ public class InsOrdersAdd extends QuoteVo {
     @Schema(description = "保单信息")
     private InsOrdersExternalPolicy insOrdersExternalPolicy;
 
+    @Schema(description = "租户代码")
+    private String systemCode;
+
 }

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersEnd.java

@@ -35,4 +35,6 @@ public class InsOrdersEnd extends QuoteVo {
     @Schema(description = "保单信息")
     private InsOrdersExternalPolicy insOrdersExternalPolicy;
 
+    @Schema(description = "租户代码")
+    private String systemCode;
 }

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

@@ -161,6 +161,9 @@ public class InsFeeOrdersVo {
     @Schema(description = "权益相关:剩余金额<可用金额-已使用金额>")
     private BigDecimal remainingAmount;
 
+    @Schema(description = "租户代码")
+    private String systemCode;
+
     public InsFeeOrdersVo(InsFeeOrders insFeeOrders) {
         this.orderNo = insFeeOrders.getOrderNo();
         this.agreementId = insFeeOrders.getAgreementId();

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

@@ -1,6 +1,8 @@
 package com.jzg.commons.entity.vo;
 
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/vo/NewCarQuery.java

@@ -13,4 +13,8 @@ public class NewCarQuery extends PageRequest {
     @Schema
     private String companyId;
 
+    /**
+     * 租户编码
+     */
+    private String systemCode;
 }

+ 191 - 0
commons/src/main/java/com/jzg/commons/util/UserContextUtil.java

@@ -0,0 +1,191 @@
+package com.jzg.commons.util;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用户上下文工具类 —— 从网关透传的请求头中读取用户信息
+ * <p>
+ * 网关层 {@code AuthGlobalFilter} 在 Token 校验通过后,
+ * 会将用户信息注入到以下请求头中,下游微服务可直接读取,无需重复查询 Redis:
+ * <ul>
+ *   <li>{@code X-User-Id} —— 用户ID</li>
+ *   <li>{@code X-Username} —— 用户名/手机号</li>
+ *   <li>{@code X-User-Name} —— 姓名</li>
+ *   <li>{@code X-System-Code} —— 登录系统编码</li>
+ *   <li>{@code X-Dept-Id} —— 部门ID</li>
+ *   <li>{@code X-Work-Number} —— 工号</li>
+ *   <li>{@code X-Province} —— 省份</li>
+ *   <li>{@code X-Auths} —— 权限列表(JSON数组)</li>
+ *   <li>{@code X-Data-Scope} —— 数据权限(JSON对象)</li>
+ *   <li>{@code X-Head-Sculpture} —— 头像URL</li>
+ * </ul>
+ * </p>
+ *
+ * @author lipf
+ * @date 2026/6/16
+ */
+public class UserContextUtil {
+
+    private UserContextUtil() {
+        // 工具类,禁止实例化
+    }
+
+    /**
+     * 获取当前 HTTP 请求(可能为 null,非 Web 上下文时)
+     */
+    private static HttpServletRequest getRequest() {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attributes == null) {
+            return null;
+        }
+        return attributes.getRequest();
+    }
+
+    /**
+     * 从请求头获取用户ID
+     *
+     * @return 用户ID,未获取到时返回空字符串
+     */
+    public static String getUserId() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-User-Id");
+    }
+
+    /**
+     * 从请求头获取用户名
+     *
+     * @return 用户名,未获取到时返回空字符串
+     */
+    public static String getUsername() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-Username");
+    }
+
+    /**
+     * 从请求头获取姓名
+     *
+     * @return 姓名,未获取到时返回空字符串
+     */
+    public static String getUserName() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-User-Name");
+    }
+
+    /**
+     * 从请求头获取系统编码
+     *
+     * @return 系统编码,未获取到时返回空字符串
+     */
+    public static String getSystemCode() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-System-Code");
+    }
+
+    /**
+     * 从请求头获取部门ID
+     *
+     * @return 部门ID,未获取到时返回空字符串
+     */
+    public static String getDeptId() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-Dept-Id");
+    }
+
+    /**
+     * 从请求头获取工号
+     *
+     * @return 工号,未获取到时返回空字符串
+     */
+    public static String getWorkNumber() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-Work-Number");
+    }
+
+    /**
+     * 从请求头获取省份
+     *
+     * @return 省份,未获取到时返回空字符串
+     */
+    public static String getProvince() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-Province");
+    }
+
+    /**
+     * 从请求头获取头像URL
+     *
+     * @return 头像URL,未获取到时返回空字符串
+     */
+    public static String getHeadSculpture() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "";
+        return headerOrEmpty(request, "X-Head-Sculpture");
+    }
+
+    /**
+     * 从请求头获取用户权限列表
+     *
+     * @return 权限标识列表,未获取到时返回空列表
+     */
+    public static List<String> getPerms() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return new ArrayList<>();
+
+        String authsJson = headerOrEmpty(request, "X-Auths");
+        if (authsJson.isEmpty()) return new ArrayList<>();
+
+        List<String> perms = new ArrayList<>();
+        try {
+            JSONArray auths = JSONArray.parseArray(authsJson);
+            for (int i = 0; i < auths.size(); i++) {
+                JSONObject auth = auths.getJSONObject(i);
+                String perm = auth.getString("perms");
+                if (perm != null) {
+                    perms.add(perm);
+                }
+            }
+        } catch (Exception e) {
+            // 解析失败,返回空列表
+        }
+        return perms;
+    }
+
+    /**
+     * 从请求头获取数据权限
+     *
+     * @return 数据权限 JSON 字符串,未获取到时返回 "{}"
+     */
+    public static String getDataScope() {
+        HttpServletRequest request = getRequest();
+        if (request == null) return "{}";
+        return headerOrEmpty(request, "X-Data-Scope");
+    }
+
+    /**
+     * 判断用户信息是否来自网关透传(即请求头中是否存在 X-User-Id)
+     *
+     * @return true 表示本次请求已经过网关鉴权
+     */
+    public static boolean isFromGateway() {
+        return !getUserId().isEmpty();
+    }
+
+    private static String headerOrEmpty(HttpServletRequest request, String name) {
+        String value = request.getHeader(name);
+        return value != null ? value : "";
+    }
+}

+ 149 - 0
gateway/src/main/java/com/jzg/filter/AuthGlobalFilter.java

@@ -0,0 +1,149 @@
+package com.jzg.filter;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 全局鉴权过滤器 —— 网关层统一认证入口
+ * <p>
+ * 所有请求在网关入口处校验 Token 有效性。
+ * 白名单直接放行;其他路径校验 Authorization 头中的 Token 是否在 Redis 中存在。
+ * 校验通过后原样透传请求,不修改任何请求头。
+ * </p>
+ *
+ * @author wh
+ * @date 2026/6/16
+ */
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE + 10)
+@Slf4j
+public class AuthGlobalFilter implements GlobalFilter {
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    /**
+     * 无需鉴权的白名单路径(前缀匹配)
+     */
+    private static final List<String> WHITELIST = new ArrayList<>();
+
+    static {
+        // Swagger / API 文档
+        WHITELIST.add("/swagger-ui/");
+        WHITELIST.add("/v3/api-docs");
+        WHITELIST.add("/swagger-resources/");
+        WHITELIST.add("/webjars/");
+        WHITELIST.add("/favicon.ico");
+
+        // 登录 & 注册(网页端)
+        WHITELIST.add("/auth/login");
+        WHITELIST.add("/auth/captchaById");
+        WHITELIST.add("/auth/register");
+        WHITELIST.add("/auth/sendSmsCode");
+        WHITELIST.add("/auth/forgotPassword");
+        WHITELIST.add("/auth/publicKeyExchange");
+
+        // APP 登录
+        WHITELIST.add("/appAuth/smsCodeLogin");
+        WHITELIST.add("/appAuth/appLogin");
+        WHITELIST.add("/appAuth/partnerAppLogin");
+
+        // 短信
+        WHITELIST.add("/send/sendSmsCode");
+        WHITELIST.add("/sendSmsCode");
+        WHITELIST.add("/appLogin");
+        WHITELIST.add("/smsCodeLogin");
+
+        // 其他公开接口
+        WHITELIST.add("/system/sysListAccountLinking");
+        WHITELIST.add("/supplementOrder/getOrderDetail");
+        WHITELIST.add("/dict/get");
+
+        // 本地生活
+        WHITELIST.add("/signIn/updateSignCompleteRuleIn");
+    }
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        String path = exchange.getRequest().getURI().getPath();
+
+        // 1. 白名单路径直接放行
+        if (isWhitelisted(path)) {
+            return chain.filter(exchange);
+        }
+
+        // 2. 获取 Authorization 头
+        HttpHeaders headers = exchange.getRequest().getHeaders();
+        String authorization = headers.getFirst("Authorization");
+        if (authorization == null || authorization.isEmpty()) {
+            authorization = headers.getFirst("authorization");
+        }
+
+        // 3. Token 不存在 → 401
+        if (authorization == null || authorization.isEmpty()) {
+            log.warn("【网关鉴权】缺少 Authorization 头。path=[{}]", path);
+            return unauthorized(exchange, "未提供认证令牌");
+        }
+
+        // 4. 校验 Token 在 Redis 中是否存在
+        try {
+            Object bucketValue = redissonClient.getBucket(authorization).get();
+            if (bucketValue == null) {
+                log.warn("【网关鉴权】Token 无效或已过期。path=[{}]", path);
+                return unauthorized(exchange, "认证令牌无效或已过期");
+            }
+        } catch (Exception e) {
+            log.error("【网关鉴权】Redis 查询异常。path=[{}]", path, e);
+            return unauthorized(exchange, "认证服务异常");
+        }
+
+        // 5. Token 有效,原样透传请求(不修改任何请求头)
+        log.debug("【网关鉴权】认证通过。path=[{}]", path);
+        return chain.filter(exchange);
+    }
+
+    /**
+     * 判断路径是否在白名单中(前缀匹配)
+     */
+    private boolean isWhitelisted(String path) {
+        for (String pattern : WHITELIST) {
+            if (path.startsWith(pattern)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 返回 401 未授权响应
+     */
+    private Mono<Void> unauthorized(ServerWebExchange exchange, String message) {
+        exchange.getResponse().setStatusCode(HttpStatus.OK);
+        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
+
+        JSONObject body = new JSONObject();
+        body.put("code", 401);
+        body.put("msg", message);
+
+        byte[] bytes = body.toJSONString().getBytes(StandardCharsets.UTF_8);
+        DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
+        return exchange.getResponse().writeWith(Mono.just(buffer));
+    }
+}

+ 39 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/component/AnShengCrawlerRequestComponent.java

@@ -334,6 +334,17 @@ public class AnShengCrawlerRequestComponent {
         return "";
     }
 
+
+    public InsuranceResponse newGsOrder(MultiValueMap<String, String> urlParams,String token) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("loginToken",token);
+        headers.add("User-Agent","Mozilla/5.0 (Linux; Android 5.1.1; VOG-AL00 Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.100 Mobile Safari/537.36");
+
+        ResponseEntity<InsuranceResponse> response = requestComponent.post(requestComponent.buildUrl(RequestUrl.NEW_ORDER.getRequestUrl(anShengCrawlerProperties.getUrl()),urlParams),null, InsuranceResponse.class, headers);
+        return response.getBody();
+    }
+
+
     public PureRiskPremiumQueryResponse pureRiskPremiumQuery(InsuranceContractRequest insuranceContractRequest, HttpHeaders httpHeaders) {
         return post(RequestUrl.PURERISK_PREMIUM_QUERY, insuranceContractRequest, PureRiskPremiumQueryResponse.class, httpHeaders);
 
@@ -343,4 +354,32 @@ public class AnShengCrawlerRequestComponent {
         ResponseEntity<AnShengCrawlerSearchVehicleByVinResponse> responseEntity = requestComponent.formData(RequestUrl.SEARCHVEHICLE_BY_NAME.getRequestUrl(anShengCrawlerProperties.getUrl()), jsonObject, AnShengCrawlerSearchVehicleByVinResponse.class, headers);
         return responseEntity.getBody().getData();
     }
+
+    public String pdfUrl(JSONObject jsonData,String token) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("loginToken",token);
+        headers.add("User-Agent","Mozilla/5.0 (Linux; Android 5.1.1; VOG-AL00 Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.100 Mobile Safari/537.36");
+        MultiValueMap<String, String> urlParams = new LinkedMultiValueMap<>();
+        urlParams.add("method", "query");
+        ResponseEntity<FileDownloadResp> response = requestComponent.post(requestComponent.buildUrl(RequestUrl.PDF_URL.getRequestUrl(anShengCrawlerProperties.getUrl()),urlParams),jsonData, FileDownloadResp.class, headers);
+        return response.getBody().getData();
+    }
+
+
+    public LoginResp downloadToken(MultiValueMap<String, String> formData,MultiValueMap<String, String> urlParams,HttpHeaders headers){
+        ResponseEntity<LoginResp> form = requestComponent.form(requestComponent.buildUrl(RequestUrl.NEW_GS_LOGIN.getRequestUrl(anShengCrawlerProperties.getUrl()), urlParams), formData, LoginResp.class, headers);
+        return form.getBody();
+    }
+
+
+    public BdTokenResp bdResp(MultiValueMap<String, String> formData,MultiValueMap<String, String> urlParams,HttpHeaders headers){
+        ResponseEntity<BdTokenResp> form = requestComponent.form(requestComponent.buildUrl(RequestUrl.NEW_GS_LOGIN.getRequestUrl(anShengCrawlerProperties.getUrl()), urlParams), formData, BdTokenResp.class, headers);
+        return form.getBody();
+    }
+
+    public DragSliderResp huaKuai(MultiValueMap<String, String> formData,HttpHeaders headers) {
+        DragSliderResp dragSliderResp = requestComponent.get(RequestUrl.NEW_GS_LOGIN.getRequestUrl(anShengCrawlerProperties.getUrl()), formData, "获取滑块验证码", DragSliderResp.class, headers);
+        log.info("滑块码:{}",JSONObject.toJSONString(dragSliderResp));
+        return dragSliderResp;
+    }
 }

+ 11 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/constant/enums/RequestUrl.java

@@ -40,7 +40,17 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     QUERY_PRINT_PDF("/printportalapi/printportal/queryPrintpdf.do", "保单下载"),
     DOWNLOAD_PDF("/printportalapi/printportal/downloadPdf.do?policyNo=%s&policyType=6&channel=print&systemName=tpaic-ec&userName=tpaic-ec", "非车保单下载"),
     //   风险与保费查询
-    PURERISK_PREMIUM_QUERY("/portalapi/pureRiskPremiumQuery", "风险与保费查询")
+    PURERISK_PREMIUM_QUERY("/portalapi/pureRiskPremiumQuery", "风险与保费查询"),
+
+
+    //   获取PDF地址
+    PDF_URL("/astmobile/pdf.do", "获取PDF地址"),
+
+    //   获取订单
+    NEW_ORDER("/astmobile/newgsOrder.do", "获取订单"),
+
+    //   新归属登录
+    NEW_GS_LOGIN("/astmobile/newgsLogin.do", "归属登录")
 
 
     ;

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

@@ -23,6 +23,11 @@ public class AnShengCrawlerOrder {
     @Id
     private String id;
 
+    /**
+     * 车牌号
+     */
+    private String licenseNo;
+
     /**
      * 保险公司订单号
      */

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

@@ -40,7 +40,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
         String customerNegotiatePrice = CustomerNegotiatePriceUtils.calculateTheDepreciationValue(departmentPlanCode.getCode(), quoteVo.getCarInfoVo()
                         .getEnergyTypeCode(),
                 dataDTO.getCustomerNegotiatePrice(), riskInfoVo.getStartDate(), quoteVo.getCarInfoVo()
-                        .getRegisterDate());
+                        .getRegisterDate(),quoteVo.getCarInfoVo());
         String energyTypeCode = quoteVo.getCarInfoVo().getEnergyTypeCode();
         this.isTryCal = false;
         this.contracts = new ArrayList<>();

+ 19 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/BdTokenResp.java

@@ -0,0 +1,19 @@
+package com.jzg.quotation.ansheng.crawler.entity.request;
+
+
+import lombok.Data;
+
+/**
+ * 根据agentCode获取bdToken响应
+ */
+@Data
+public class BdTokenResp {
+    private String msg;
+    private Integer code;
+    private BdTokenData data;
+
+    @Data
+    public static class BdTokenData {
+        private String token;
+    }
+}

+ 27 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/DownloadTokenResult.java

@@ -0,0 +1,27 @@
+package com.jzg.quotation.ansheng.crawler.entity.request;
+
+
+import lombok.Data;
+
+/**
+ * 登录最终返回结果
+ */
+@Data
+public class DownloadTokenResult {
+    /**
+     * 状态码 200成功 400失败
+     */
+    private Integer code;
+    /**
+     * 提示信息
+     */
+    private String message;
+    /**
+     * 登录token
+     */
+    private String token;
+    /**
+     * 业务bdToken
+     */
+    private String bdToken;
+}

+ 14 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/DragSliderResp.java

@@ -0,0 +1,14 @@
+package com.jzg.quotation.ansheng.crawler.entity.request;
+
+
+import lombok.Data;
+
+/**
+ * 获取滑块验证码响应
+ */
+@Data
+public class DragSliderResp {
+    private String data;
+    private String msg;
+    private Integer code;
+}

+ 20 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/LoginResp.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.ansheng.crawler.entity.request;
+
+
+import lombok.Data;
+
+/**
+ * 账号密码登录响应
+ */
+@Data
+public class LoginResp {
+    private String token;
+    private String msg;
+    private Integer code;
+    private LoginData data;
+
+    @Data
+    public static class LoginData {
+        private String agentCode;
+    }
+}

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

@@ -0,0 +1,24 @@
+package com.jzg.quotation.ansheng.crawler.entity.response;
+
+
+import lombok.Data;
+
+@Data
+public class FileDownloadResp {
+
+    /**
+     * 响应码
+     */
+    private String code;
+
+    /**
+     * 响应信息
+     */
+    private String msg;
+
+    /**
+     * 文件下载地址
+     */
+    private String data;
+
+}

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

@@ -0,0 +1,124 @@
+package com.jzg.quotation.ansheng.crawler.entity.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InsuranceResponse {
+
+    /** 响应码 0000=成功 */
+    private String code;
+    /** 响应信息 */
+    private String msg;
+    /** 保单数据列表 */
+    private List<InsurancePolicy> data;
+
+
+    /**
+     * 车辆保险保单明细
+     */
+    @Data
+    public static class InsurancePolicy {
+
+        /** 被保险人姓名 */
+        @JsonProperty("insuredName")
+        private String insuredName;
+
+        /** 申请时间 */
+        @JsonProperty("applyDate")
+        private String applyDate;
+
+        /** 车牌号码 */
+        @JsonProperty("vehicleLicenceCode")
+        private String vehicleLicenceCode;
+
+        /** 证件号码 */
+        @JsonProperty("certiCode")
+        private String certiCode;
+
+        /** 产品名称 */
+        @JsonProperty("productName")
+        private String productName;
+
+        /** 订单状态 */
+        @JsonProperty("orderStatus")
+        private String orderStatus;
+
+        /** 投保单号 */
+        @JsonProperty("applyPolicyNo")
+        private String applyPolicyNo;
+
+        /** 保单号 */
+        @JsonProperty("policyNo")
+        private String policyNo;
+
+        /** 实际总保费 */
+        @JsonProperty("totalActualPremium")
+        private String totalActualPremium;
+
+        /** 关联保单号 */
+        @JsonProperty("policyWithNo")
+        private String policyWithNo;
+
+        /** 保单类型 */
+        @JsonProperty("policyTpe")
+        private String policyTpe;
+
+        /** 临时号牌类型 */
+        @JsonProperty("temporaryType")
+        private String temporaryType;
+
+        /** 临时号牌 */
+        @JsonProperty("temporaryNo")
+        private String temporaryNo;
+
+        /** 临时标识ID */
+        @JsonProperty("temporaryId")
+        private String temporaryId;
+
+        /** 整数部分 */
+        @JsonProperty("integralPortion")
+        private String integralPortion;
+
+        /** 是否生效 */
+        @JsonProperty("isEffective")
+        private String isEffective;
+
+        /** 代理人编码 */
+        @JsonProperty("agentCode")
+        private String agentCode;
+
+        /** 关联ID */
+        @JsonProperty("relationId")
+        private String relationId;
+
+        /** 代理人名称 */
+        @JsonProperty("agentName")
+        private String agentName;
+
+        /** 保单状态 */
+        @JsonProperty("policyStates")
+        private String policyStates;
+
+        /** 使用属性编码 */
+        @JsonProperty("usageAttributeCode")
+        private String usageAttributeCode;
+
+        /** 所有权属性编码 */
+        @JsonProperty("ownershipAttributeCode")
+        private String ownershipAttributeCode;
+
+        /** 签名串 */
+        @JsonProperty("sign")
+        private String sign;
+
+        /** 扩展签名串 */
+        @JsonProperty("signExt")
+        private String signExt;
+    }
+
+
+}

+ 4 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerLoginService.java

@@ -1,6 +1,6 @@
 package com.jzg.quotation.ansheng.crawler.service;
 
-import org.springframework.http.HttpHeaders;
+import com.jzg.quotation.ansheng.crawler.entity.request.DownloadTokenResult;
 
 public interface AnShengCrawlerLoginService {
 
@@ -12,4 +12,7 @@ public interface AnShengCrawlerLoginService {
      */
     String login(String userName, String password);
 
+
+    DownloadTokenResult getObtainDownloadToken(String username, String password);
+
 }

+ 1 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/AnShengCrawlerOrderService.java

@@ -16,7 +16,7 @@ public interface AnShengCrawlerOrderService {
      * 保存订单号
      * @param id 订单号
      */
-    void saveRecordingTime(String id);
+    void saveRecordingTime(String id,String licenseNo);
 
     /**
      * 保存订单

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

@@ -1,6 +1,7 @@
 package com.jzg.quotation.ansheng.crawler.service;
 
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.quotation.ansheng.crawler.entity.request.DownloadTokenResult;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerGetUserDetailResponse;
 import org.springframework.http.HttpHeaders;
 
@@ -24,4 +25,6 @@ public interface AnShengCrawlerQuoteProcessService {
     AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO getUserDetailResponse(String agreementId, HttpHeaders headers);
 
 
+    DownloadTokenResult obtainDownloadToken(AttributionInformationVo attributionInformationVo);
+
 }

+ 112 - 6
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerLoginServiceImpl.java

@@ -5,20 +5,18 @@ import com.jzg.commons.entity.quote.vo.identify.SliderCaptchaVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerCacheComponent;
 import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerRequestComponent;
-import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerCheckLoginRequest;
-import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerCheckVerificationRequest;
-import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerVerifyRequest;
+import com.jzg.quotation.ansheng.crawler.entity.request.*;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerVerifyResponse;
 import com.jzg.quotation.ansheng.crawler.service.AnShengCrawlerLoginService;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
-import com.jzg.quotation.commons.utils.CookieParseUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 
 import java.util.List;
-import java.util.Map;
 
 @Service
 @RequiredArgsConstructor
@@ -67,4 +65,112 @@ public class AnShengCrawlerLoginServiceImpl implements AnShengCrawlerLoginServic
         throw new SystemException("登录失败,请重新登录");
     }
 
+    @Override
+    public DownloadTokenResult getObtainDownloadToken(String username, String password) {
+        // 构建请求头
+        HttpHeaders headers = buildCommonHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+        // URL参数
+        MultiValueMap<String, String> urlParams = new LinkedMultiValueMap<>();
+        urlParams.add("method", "login");
+
+        // 表单参数
+        MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
+        formData.add("account", username);
+        formData.add("password", password);
+        formData.add("phone", "");
+        formData.add("agentCode", "");
+        formData.add("verificationCode", "");
+        formData.add("authenticationType", "1");
+        // 拼接滑块码
+        String dragCode = getHuaKuai();
+        formData.add("dragSliderCode", dragCode != null ? dragCode : "");
+        // 发起POST表单请求,使用项目已有的form请求方法
+        LoginResp loginResp = anShengCrawlerRequestComponent.downloadToken( formData, urlParams,headers);
+        if (loginResp == null) {
+            DownloadTokenResult result = new DownloadTokenResult();
+            result.setCode(400);
+            result.setMessage("登录响应为空");
+            return result;
+        }
+
+        // 判断登录是否成功
+        if ("成功".equals(loginResp.getMsg())) {
+            String token = loginResp.getToken();
+            String agentCode = loginResp.getData() != null ? loginResp.getData().getAgentCode() : "";
+
+            // 3. 二次请求:根据agentCode获取bdToken
+            HttpHeaders secondHeaders = new HttpHeaders();
+            secondHeaders.add("loginToken", token);
+            secondHeaders.add("User-Agent", buildUserAgent());
+
+            MultiValueMap<String, String> secondUrlParams = new LinkedMultiValueMap<>();
+            secondUrlParams.add("method", "getUserByAgentCode");
+
+            MultiValueMap<String, String> secondForm = new LinkedMultiValueMap<>();
+            secondForm.add("agentCode", agentCode);
+            secondForm.add("agentPersonCode", "");
+            String bdToken = "";
+            BdTokenResp bdResp = anShengCrawlerRequestComponent.bdResp(secondForm, secondUrlParams, headers);
+            if (bdResp != null && bdResp.getData() != null) {
+                bdToken = bdResp.getData().getToken();
+            }
+
+            // 组装成功返回
+            DownloadTokenResult success = new DownloadTokenResult();
+            success.setCode(200);
+            success.setMessage(loginResp.getMsg());
+            success.setToken(token);
+            success.setBdToken(bdToken);
+            return success;
+        } else {
+            // 登录失败
+            DownloadTokenResult fail = new DownloadTokenResult();
+            fail.setCode(400);
+            fail.setMessage(loginResp.getMsg());
+            return fail;
+        }
+    }
+
+
+
+    /**
+     * 1. GET 请求 获取滑块验证码 dragSliderCode
+     */
+    public String getHuaKuai() {
+        HttpHeaders headers = buildCommonHeaders();
+        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+        params.add("method", "getDragSliderCode");
+        DragSliderResp dragSliderResp = anShengCrawlerRequestComponent.huaKuai(params, headers);
+        return dragSliderResp.getData();
+    }
+
+
+    /**
+     * 构建公共请求头(复刻Python headers)
+     */
+    private HttpHeaders buildCommonHeaders() {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Host", "apps.axa.cn");
+        headers.add("Pragma", "no-cache");
+        headers.add("Cache-Control", "no-cache");
+        headers.add("Accept", "application/json, text/plain, */*");
+        headers.add("Origin", "https://apps.axa.cn");
+        headers.add("loginToken", "");
+        headers.add("User-Agent", buildUserAgent());
+        headers.add("Referer", "https://apps.axa.cn/astmobilefront/index.html");
+        headers.add("Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
+        headers.add("X-Requested-With", "com.axa.ast");
+        return headers;
+    }
+
+    private String buildUserAgent() {
+        return "Mozilla/5.0 (Linux; Android 9; MI 8 Build/PKQ1.180729.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/72.0.3626.121 Mobile Safari/537.36";
+    }
+
+
+
+
+
 }

+ 2 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerOrderServiceImpl.java

@@ -20,9 +20,10 @@ public class  AnShengCrawlerOrderServiceImpl implements AnShengCrawlerOrderServi
     }
 
     @Override
-    public void saveRecordingTime(String id){
+    public void saveRecordingTime(String id,String licenseNo){
         AnShengCrawlerOrder anShengCrawlerOrder = new AnShengCrawlerOrder();
         anShengCrawlerOrder.setId(id);
+        anShengCrawlerOrder.setLicenseNo(licenseNo);
         anShengCrawlerOrder.setRecordingTime(TimeProcessing.nowDateTime());
         anShengCrawlerOrderRepository.save(anShengCrawlerOrder);
     }

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

@@ -5,6 +5,7 @@ import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerCacheComponent;
 import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerRequestComponent;
+import com.jzg.quotation.ansheng.crawler.entity.request.DownloadTokenResult;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerGetUserDetailResponse;
 import com.jzg.quotation.ansheng.crawler.service.AnShengCrawlerLoginService;
 import com.jzg.quotation.ansheng.crawler.service.AnShengCrawlerQuoteProcessService;
@@ -55,4 +56,11 @@ public class AnShengCrawlerQuoteProcessServiceImpl implements AnShengCrawlerQuot
         }, AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO.class, Duration.ofHours(AnShengCrawlerCacheComponent.AGENT_DEFINE_TIME));
     }
 
+    @Override
+    public DownloadTokenResult obtainDownloadToken(AttributionInformationVo attributionInformationVo) {
+        String username = attributionInformationVo.getUsername();
+        String password = attributionInformationVo.getPassword();
+        return anShengCrawlerLoginService.getObtainDownloadToken(username, password);
+    }
+
 }

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

@@ -33,7 +33,12 @@ import com.jzg.quotation.commons.utils.TimeProcessing;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.time.Year;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -136,7 +141,6 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         // 报价
         AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply = new AnShengCrawlerCalculatePremiumApplyMessage(quoteVo, dataDTO, userDetailResponse, departmentPlanCode, checkVehicleCodeSecretGenerate);
         log.info("安盛报价参数:{}", JSONObject.toJSONString(crawlerCalculatePremiumApply));
-
         InsuranceContractRequest insuranceContractRequest = new  InsuranceContractRequest(crawlerCalculatePremiumApply);
         PureRiskPremiumQueryResponse premiumQueryResponse = anShengCrawlerRequestComponent.pureRiskPremiumQuery(insuranceContractRequest, httpHeaders);
         PureRiskPremiumQueryResponse.TargetsBean targetsBean = premiumQueryResponse.getData().getContracts().get(0).getTargets().get(0);
@@ -176,7 +180,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
             // 缓存数据
             anShengCrawlerCacheComponent.cacheQuoteRequest(ordersNo, autoSpecialPromiseRequest);
         }
-        anShengCrawlerOrderService.saveRecordingTime(ordersNo);
+        anShengCrawlerOrderService.saveRecordingTime(ordersNo,quoteVo.getCarInfoVo().getLicenseNo());
         // 构造返回参数
         return AnShengCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(ordersNo, quoteVo, calculatePremiumApply);
     }
@@ -382,33 +386,80 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
-
-        HttpHeaders httpHeaders = anShengCrawlerQuoteProcessService.getHttpHeaders(downloadPolicyVo.getOrder().getAttributionInformationVo());
         AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(downloadPolicyVo.getOrder().getOrdersNo());
+        DownloadTokenResult obtainDownloadToken = anShengCrawlerQuoteProcessService.obtainDownloadToken(downloadPolicyVo.getOrder().getAttributionInformationVo());
+        // 缓存token,避免重复调用
+        String loginToken = obtainDownloadToken.getToken();
+        String bdToken = obtainDownloadToken.getBdToken();
+
+        MultiValueMap<String, String> urlParams = new LinkedMultiValueMap<>();
+        urlParams.add("method", "queryAll");
+        urlParams.add("loginToken", loginToken);
+        urlParams.add("orderStatus", "2");
+        //车牌
+        urlParams.add("searchValue", URLEncoder.encode(anShengCrawlerOrder.getLicenseNo(), StandardCharsets.UTF_8));
+        InsuranceResponse insuranceResponse = anShengCrawlerRequestComponent.newGsOrder(urlParams, loginToken);
+        if (!StringUtils.equals("成功", insuranceResponse.getMsg()) || CollectionUtil.isEmpty(insuranceResponse.getData())) {
+            throw new SystemException("暂无找到该车保单信息");
+        }
+        String currentYear = String.valueOf(Year.now().getValue());
+        for (InsuranceResponse.InsurancePolicy policy : insuranceResponse.getData()) {
+            if (policy == null) {
+                continue;
+            }
+            String applyDate = policy.getApplyDate();
 
-        // 交强保单和标志
-        Optional.ofNullable(anShengCrawlerOrder.getCiPolicyNo()).ifPresent(policyNo -> {
-            AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCi = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "6");
-            downloadPolicyResultVo.setJqUrl(anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCi, httpHeaders));
-
-            AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCiBz = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "2");
-            downloadPolicyResultVo.setJqFlagUrl(anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCiBz, httpHeaders));
-        });
-        // 商业保单和标志
-        Optional.ofNullable(anShengCrawlerOrder.getBiPolicyNo()).ifPresent(policyNo -> {
-            AnShengCrawlerQueryPrintPdfRequest queryPrintPdfCi = new AnShengCrawlerQueryPrintPdfRequest(policyNo, "6");
-            downloadPolicyResultVo.setSyUrl(anShengCrawlerRequestComponent.queryPrintPdf(queryPrintPdfCi, httpHeaders));
-        });
+            String productName = policy.getProductName();
+            String policyNo = policy.getPolicyNo();
+            String signExt = policy.getSignExt();
 
-        // 非车保单和标志
-        anShengCrawlerOrder.getNiInfos().forEach(niInfo -> {
-            Optional.ofNullable(niInfo.getNiPolicyNumber()).ifPresent(policyNo -> {
-                anShengCrawlerRequestComponent.downloadPdf(policyNo, httpHeaders);
-            });
-        });
+            String applyYear = "";
+            if (applyDate != null && applyDate.length() >= 4) {
+                applyYear = applyDate.substring(0, 4);
+            }
+            // 机动车辆交强险
+            if ("机动车辆交强险".equals(productName)) {
+                JSONObject mainJson = buildPdfJson(policyNo, "2", signExt, bdToken);
+                downloadPolicyResultVo.setJqUrl(anShengCrawlerRequestComponent.pdfUrl(mainJson, loginToken));
+                JSONObject flagJson = buildPdfJson(policyNo, "4", signExt, bdToken);
+                downloadPolicyResultVo.setJqFlagUrl(anShengCrawlerRequestComponent.pdfUrl(flagJson, loginToken));
+            }
+            // 机动车辆综合险保险
+            if ("机动车辆综合险保险".equals(productName)) {
+                JSONObject syJson = buildPdfJson(policyNo, "2", signExt, bdToken);
+                downloadPolicyResultVo.setSyUrl(anShengCrawlerRequestComponent.pdfUrl(syJson, loginToken));
+            }
+            // 其他险种且为当年投保
+            if (!"机动车辆综合险保险".equals(productName) && !"机动车辆交强险".equals(productName) && currentYear.equals(applyYear)) {
+                JSONObject otherJson = buildPdfJson(policyNo, "5", signExt, bdToken);
+                downloadPolicyResultVo.setJyUrl(anShengCrawlerRequestComponent.pdfUrl(otherJson, loginToken));
+            }
+        }
         return downloadPolicyResultVo;
     }
 
+
+    /**
+     * 通用构建PDF请求JSON
+     */
+    private JSONObject buildPdfJson(String policyNo, String printType, String signExt, String bdToken) {
+        return JSONObject.of(
+                "head", JSONObject.of(
+                        "requestType", "V113",
+                        "account", "",
+                        "password", "",
+                        "token", bdToken
+                ),
+                "requestInfo", JSONObject.of(
+                        "basePart", JSONObject.of(
+                                "policyNo", policyNo,
+                                "printType", printType,
+                                "sign", signExt
+                        )
+                )
+        );
+    }
+
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         // 获取订单信息

+ 83 - 3
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/utils/CustomerNegotiatePriceUtils.java

@@ -1,6 +1,8 @@
 package com.jzg.quotation.ansheng.crawler.utils;
 
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.ansheng.crawler.constant.enums.DepartmentPlanCode;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 
@@ -20,11 +22,89 @@ public final class CustomerNegotiatePriceUtils {
                                                        String energyType,
                                                        String carPrice,
                                                        String warrantyTime,
-                                                       String registerDateTime) {
-        BigDecimal bigDecimal = calculateType(planCode, energyType, carPrice);
-        return calculateTheDepreciationValue(new BigDecimal(carPrice), TimeProcessing.dateTimeToDate(warrantyTime), registerDateTime, bigDecimal);
+                                                       String registerDateTime,
+                                                       CarInfoVo carInfoVo) {
+        BigDecimal bigDeqcimal = calculateType(planCode, energyType, carPrice);
+        BigDecimal v = calcMonthDepreciationNew(carInfoVo, Double.valueOf(carPrice), planCode);
+
+        return calculateTheDepreciationValue(new BigDecimal(carPrice), TimeProcessing.dateTimeToDate(warrantyTime), registerDateTime,v);
+    }
+
+    public static BigDecimal calcMonthDepreciationNew(CarInfoVo carInfoVo,Double newCarPrice,String planCode) {
+        String completeKerbMass = carInfoVo.getCompleteKerbMass();
+        String curbWeightStr  = String.valueOf((completeKerbMass == null || completeKerbMass.isEmpty()) ?  BigDecimal.ZERO : new BigDecimal(completeKerbMass).divide(new BigDecimal("1000")));
+        double t = 0.0;
+        String codeItemsName = carInfoVo.getCarKindCode();
+        String nature = carInfoVo.getCarNatureCode();
+        String seatStr = carInfoVo.getSeatCount();
+        if ("1".equals(nature)) {
+            // 非营业车辆
+            if ("1".equals(codeItemsName)) {
+                // 客车
+                double seatComs = 0;
+                if (seatStr != null && !seatStr.isEmpty()) {
+                    seatComs = Double.parseDouble(seatStr);
+                }
+                if (seatComs <= 9) {
+                    if ("113".equals(planCode)) {
+                        if ("0".equals(StringUtils.equals("109",planCode))) {
+                            // 新能源
+                            if (newCarPrice <= 100000) {
+                                t = 0.82;
+                            } else if (newCarPrice <= 200000) {
+                                t = 0.77;
+                            } else if (newCarPrice <= 300000) {
+                                t = 0.72;
+                            } else {
+                                t = 0.68;
+                            }
+                        } else {
+                            // 非新能源
+                            t = 0.63;
+                        }
+                    } else {
+                        t = 0.6;
+                    }
+                } else {
+                    // 座位>9
+                    t = 0.9;
+                }
+            } else if ("2".equals(codeItemsName)) {
+                t = 0.9;
+            } else if ("54".equals(codeItemsName)) {
+                t = 0.9;
+            } else if ("21".equals(codeItemsName)) {
+                t = 1.1;
+            }
+
+            // t为0默认0.9
+            if (t == 0) {
+                t = 0.9;
+            }
+        } else {
+            // 营业车辆 nature=2
+            if ("21".equals(codeItemsName)) {
+                t = 1.4;
+            } else if ("10".equals(codeItemsName)) {
+                t = 1.1;
+            } else if ("54".equals(codeItemsName)) {
+                t = 1.1;
+            } else if ("2".equals(codeItemsName)) {
+                if (curbWeightStr != null && !curbWeightStr.isEmpty()) {
+                    double curbWeight = Double.parseDouble(curbWeightStr);
+                    if (curbWeight <= 1.8) {
+                        t = 1.1;
+                    }
+                }
+            }
+            if (t == 0) {
+                t = 0.9;
+            }
+        }
+        return new BigDecimal(t).divide(new BigDecimal("100"));
     }
 
+
     private static BigDecimal calculateType(String planCode, String energyType, String carPrice) {
         BigDecimal type = BigDecimal.ZERO;
 

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

@@ -8,6 +8,7 @@ import com.jzg.quotation.commons.config.WebClientConfig;
 import com.jzg.quotation.commons.entity.CookiesRequest;
 import com.jzg.quotation.commons.utils.InsuranceLog;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
+import io.netty.handler.timeout.ReadTimeoutException;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.ParameterizedTypeReference;
@@ -33,6 +34,9 @@ import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.util.Map;
 import java.util.Optional;
+import java.time.Duration;
+import java.util.Map;
+import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.regex.Pattern;
 
@@ -396,6 +400,16 @@ public class RequestComponent {
                     .body(BodyInserters.fromValue(body))
                     .retrieve()
                     .toEntity(String.class)
+                    .timeout(Duration.ofSeconds(60))
+                    .onErrorMap(ReadTimeoutException.class, ex ->
+                            new WebClientResponseException(
+                                    504,
+                                    "第三方接口读取超时:" + url,
+                                    HttpHeaders.EMPTY,
+                                    null,
+                                    null
+                            )
+                    )
                     .block();
             if (rawResponse == null) {
                 throw new WebClientResponseException(

+ 1 - 1
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java

@@ -1755,7 +1755,7 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
         RenBaoNewCrawlerConfigureParameters parameters = ConfigureParametersConversion
                 .conversionEntity(RenBaoNewCrawlerConfigureParameters.class, attributionInfo.getConfigInfo());
 
-        String jwt = requestComponent.getJwtToken(parameters.getCarChecker());
+        String jwt = attributionInfo.getPassword();
         RMap<String, Object> authorization = getTokenService.getAuthorization(
                 attributionInfo.getUsername(),
                 jwt,

+ 6 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java

@@ -141,6 +141,7 @@ public class FactorMatch {
     public static boolean judgementsUnderwrite(List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementCostRuleList, List<RuleAttrMappingVo> ruleAttrMappingVoList,
                                      List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList, StringBuilder logs, List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList) {
         boolean useFlag = true;
+        boolean groupUseFlag = false;
         for (PtlAgreementUndwrtRulesAttrLink ptlAgreementProductCostsAttrLink : ptlAgreementCostRuleList) {
             //查找规则中的 传值属性
             RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream()
@@ -183,6 +184,10 @@ public class FactorMatch {
                 log.info("承保规则校验-传入值为null: attrCode={}, useFlag=false", ptlAgreementProductCostsAttrLink.getAttrCode());
             }
 
+            if(useFlag){
+                groupUseFlag = useFlag;
+            }
+
             if (!useFlag) {
                 log.info("承保规则校验-条件命中! attrCode={}, 传入值={}, 规则min={}, max={}, operator={}",
                         ptlAgreementProductCostsAttrLink.getAttrCode(), ruleAttrMappingVo.getValue(),
@@ -221,12 +226,10 @@ public class FactorMatch {
                 if (CollUtil.isNotEmpty(collect)) {
                     logs.append("<span style=\"color:red;\">规则匹配失败:" + collect.get(0).getAttrName() + "</span>\n");
                 }
-
-                return false;
             }
         }
         log.info("承保规则校验-所有条件均未命中, 规则组通过, useFlag={}", useFlag);
-        return useFlag;
+        return groupUseFlag;
     }
 
 

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

@@ -85,7 +85,7 @@ public class QuoteVerificationAspect {
             // 获取订单险种信息
             List<InsOrdersKind> kindList = insOrdersKindService.list(new LambdaQueryWrapper<InsOrdersKind>().eq(InsOrdersKind::getOrderNo, insOrders.getId()));
             // 获取订单驾意险信息
-            InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getById(insOrders.getId());
+            InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getByOrderId(insOrders.getId());
             // 获取订单其他信息
             InsOrdersOther insOrdersOther = insOrdersOtherService.getById(insOrders.getId());
             // 获取协议信息

+ 2 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java

@@ -69,6 +69,7 @@ public class InsOrdersController extends BaseController {
     @Operation(summary = "录入订单新增")
     @PostMapping("saveOrders")
     public HttpResult saveOrUpdate(@RequestBody InsOrdersAdd ordersAdd) {
+        ordersAdd.setSystemCode(getSystemCode());
         return insOrdersService.saveOrders(ordersAdd);
     }
 
@@ -76,6 +77,7 @@ public class InsOrdersController extends BaseController {
     @Operation(summary = "录入订单修改")
     @PostMapping("updateOrders")
     public HttpResult updateOrders(@RequestBody InsOrdersEnd ordersEnd) {
+        ordersEnd.setSystemCode(getSystemCode());
         return insOrdersService.updateOrders(ordersEnd);
     }
 

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

@@ -183,7 +183,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrders.setProductName(ProductsType.getProductNameByCode(ordersAdd.getProductId()));
             insOrders.setOrderStatus(InsOrderStatusEnum.QUOTE_ING.getCode());
             insOrders.setEntryStatus(3);
-
+            insOrders.setSystemCode(ordersAdd.getSystemCode());
             // 插入订单信息,如果插入失败,则返回错误信息
             int insertResult = insOrdersMapper.insert(insOrders);
             if (insertResult <= 0) {
@@ -231,7 +231,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrdersPolicyService.save(policy);
 
             //  保存订单费用
-            updateOrSaveFeeOrder(ordersAdd.getFeeOrdersVo(), quoteNo);
+            updateOrSaveFeeOrder(ordersAdd.getFeeOrdersVo(), quoteNo, ordersAdd.getSystemCode());
 
             // 保险种类信息
             List<KindInfoVo> kindInfoVo = ordersAdd.getKindInfoVo();
@@ -294,12 +294,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
 
     //  更新订单费用信息
-    public void updateOrSaveFeeOrder(InsFeeOrdersVo feeOrdersVo, String quoteNo) {
+    public void updateOrSaveFeeOrder(InsFeeOrdersVo feeOrdersVo, String quoteNo, String systemCode) {
         if (StringUtils.isEmpty(feeOrdersVo.getAgreementId())) {
             feeOrdersVo.setAgreementId(null);
         }
         InsFeeOrders feeOrders = BeanUtil.copyProperties(feeOrdersVo, InsFeeOrders.class);
         feeOrders.setOrderNo(quoteNo);
+        feeOrders.setSystemCode(systemCode);
         insFeeOrdersMapper.insertOrUpdate(feeOrders);
     }
 
@@ -349,7 +350,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
 
             //更新订单费用
-            updateOrSaveFeeOrder(ordersEnd.getFeeOrdersVo(), quoteNo);
+            updateOrSaveFeeOrder(ordersEnd.getFeeOrdersVo(), quoteNo, ordersEnd.getSystemCode());
 
             // 税费信息
             VehicleAndVesselTaxVo vehicleAndVesselTax = ordersEnd.getVehicleAndVesselTaxVo();

+ 89 - 0
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -27,6 +27,95 @@ spring:
       password: 123456  # 如果没有密码,可删除此行
       database: 0
 
+#多租户配置
+tenant:
+  enable: true
+  column: system_code
+  filterTables:
+  ignoreTables:
+    - sys_system
+    - sys_role_perms
+    - sys_area
+    - sys_dict
+    - sys_dict_type
+    - sys_user
+    - sys_user_jzg_info
+    - sys_user_jzg_info_bank_card
+    - sys_user_role
+    - sys_user_jzg_info_file
+    - sys_organization_user_link
+    - sys_upload_files
+    - sys_config
+    - sys_activity
+    - sys_activity_award
+    - sys_activity_dept
+    - sys_activity_record
+    - sys_poster_org
+    - sys_message_template
+    - sys_message_user
+    - sys_notice_user
+    - ptl_scheme_info
+    - ptl_scheme_insurance
+    - ptl_scheme_insurance_driving_intention
+    - ins_business_insurance_option
+    - ins_business_insurance
+    - ptl_agreement_attribution
+    - ptl_agreement_dept
+    - ptl_agreement_undwrt_rules_attr
+    - ptl_agreement_undwrt_rules_dict_labal
+    - ptl_area_license
+    - ptl_agreement_undwrt_rules
+    - ptl_agreement_undwrt_rules_attr_link
+    - ptl_scheme_rules_attr_link
+    - esm_ins_company
+    - qr_barcode_config
+    - jyx_config
+    - jyx_setting
+    - sys_user_jzg_app
+    - sys_dept
+    - sys_user_jzg_info_salesman
+    - dept_tree
+    - dept_path
+    - ptl_agreement_cost_type
+    #- ins_orders
+    - ins_fee_orders
+    - ins_orders_costs
+    - ins_orders_car_info
+    - ins_orders_policy
+    - ins_orders_pdf_url
+    - ins_orders_accidental_driving
+    - ins_orders_clause
+    - ins_orders_tax
+    - ins_task_images
+    - ins_orders_qrcode
+    - ins_order_rights
+    - ins_order_rights_package
+    - ins_orders_kind
+    - sys_relation_person
+    - ins_ply_income_invoice_link
+    - ins_orders_risk
+    - ins_orders_car_user_info
+    - ins_order_adjust
+    - ins_ply_income_invoice
+    - ins_ply_income_invoice_settlement
+    - esm_user_referrer
+    - ins_ply_income_invoice_settlement_file
+    - wechat_customer_service
+    - wechat_customer_service_duty
+    - wechat_customer_service_recording
+    - ins_fee_audit
+    - sys_user_jzg_info_bank_card_record
+    - ptl_agreement_dispatch_rules_attr_link
+    - ptl_agreement_dispatch_action
+    - sys_app_manage
+    - sys_version
+    - ptl_agreement_dispatch_rules_attr_link
+    - ptl_agreement_dispatch_action
+    - ptl_new_car_judge_rules
+    - ptl_new_car_judge_rules
+    - ins_orders_external_policy
+    - t
+
 
 #百度图片识别API
 baidu:

+ 2 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml

@@ -120,6 +120,7 @@
         <id property="orderNo" column="order_no" jdbcType="VARCHAR"/>
         <result property="jqScore" column="jq_score" jdbcType="VARCHAR"/>
         <result property="score" column="score" jdbcType="VARCHAR"/>
+        <result property="scoreJson" column="score_json" jdbcType="VARCHAR"     typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
         <result property="syScore" column="sy_score" jdbcType="VARCHAR"/>
         <result property="lossRation" column="loss_ration" jdbcType="VARCHAR"/>
         <result property="jqLossRation" column="jq_loss_ration" jdbcType="VARCHAR"/>
@@ -723,6 +724,7 @@
     <select id="selectOrdersOtherByOrderNo" resultMap="InsOrdersOtherMap">
         SELECT ot.order_no,
         ot.score,
+        ot.score_json,
         ot.jq_score,
         ot.sy_score,
         ot.loss_ration,

+ 2 - 2
tenant/insurance/quotation-taikang/pom.xml

@@ -50,8 +50,8 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
-                    <source>14</source>
-                    <target>14</target>
+                    <source>15</source>
+                    <target>15</target>
                 </configuration>
             </plugin>
         </plugins>

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

@@ -256,7 +256,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
 
             // 跳过保额为空的险种,避免数值解析时空指针异常
             if (infoVo.getAmount() == null) {
-                log.warn("泰山报价-跳过保额为空的险种: platformKindCode={}, kindCode={}", kindCode, infoVo.getKindCode());
+                log.info("泰山报价-跳过保额为空的险种: platformKindCode={}, kindCode={}", kindCode, infoVo.getKindCode());
                 continue;
             }
 

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

@@ -10,6 +10,7 @@ import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.quotation.zhongmei.crawler.entity.Response.ZmCrawlerQuotedPriceResponse;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -121,6 +122,11 @@ public final class ZmCrawlerQuoteResultVoBuild {
             });
             quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
         }
+        BigDecimal jqPremium = quoteResultsVo.getCosts().getCiPremium() == null || quoteResultsVo.getCosts().getCiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResultsVo.getCosts().getCiPremium());
+        BigDecimal syPremium = quoteResultsVo.getCosts().getBiPremium() == null || quoteResultsVo.getCosts().getBiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResultsVo.getCosts().getBiPremium());
+        BigDecimal niPremium = quoteResultsVo.getCosts().getNiPremium() == null || quoteResultsVo.getCosts().getNiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResultsVo.getCosts().getNiPremium());
+        BigDecimal vVTax = quoteResultsVo.getCosts().getVvTax() == null || quoteResultsVo.getCosts().getVvTax().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResultsVo.getCosts().getVvTax());
+        quoteResultsVo.getCosts().setSumPremium(String.valueOf(jqPremium.add(syPremium).add(niPremium).add(vVTax)));
     }
 
     public static QuoteResultsVo.ScoreVo buildScore(ZmCrawlerQuotedPriceResponse quotedPriceResponse) {

+ 19 - 5
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

@@ -300,17 +300,31 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
     }
 
     private static final Pattern DUPLICATE_START_TIME_PATTERN = Pattern.compile("起保日期:(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})");
+    private static final Pattern DUPLICATE_END_TIME_PATTERN_SY = Pattern.compile("终保日期:(\\d{4}-\\d{2}-\\d{2})");
     private String extractDuplicateStartTime(String answer) {
-        Matcher matcher = DUPLICATE_START_TIME_PATTERN.matcher(answer);
-        if (matcher.find()) {
+        // 优先匹配终保日期
+        Matcher matcherEndTime = DUPLICATE_END_TIME_PATTERN_SY.matcher(answer);
+        if (matcherEndTime.find()) {
             // 取出匹配到的时间
-            String timeStr = matcher.group(1);
+            String timeStr = matcherEndTime.group(1) + " 00:00:00";
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
             LocalDateTime dateTime;
             LocalDateTime localDateTime = LocalDateTime.parse(timeStr, formatter);
-            LocalDateTime afterAdd = localDateTime.plusYears(1);
-            return afterAdd.format(formatter);
+            return localDateTime.format(formatter);
+        } else {
+            // 匹配不到终保日期去匹配起保日期
+            Matcher matcher = DUPLICATE_START_TIME_PATTERN.matcher(answer);
+            if (matcher.find()) {
+                // 取出匹配到的时间
+                String timeStr = matcher.group(1);
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+                LocalDateTime dateTime;
+                LocalDateTime localDateTime = LocalDateTime.parse(timeStr, formatter);
+                LocalDateTime afterAdd = localDateTime.plusYears(1);
+                return afterAdd.format(formatter);
+            }
         }
         return null;
     }

+ 3 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/AccountCardController.java

@@ -38,6 +38,7 @@ public class AccountCardController extends BaseController {
     @PostMapping("/cardList")
     @Operation(summary = "账户列表分页")
     public HttpResult<Page<AccountCardVo>> cardList(@RequestBody AccountCardParam param){
+        param.setSystemCode(getSystemCode());
         Page<AccountCardVo> result = accountCardService.queryPage(param);
         return HttpResult.ok(result);
     }
@@ -69,6 +70,7 @@ public class AccountCardController extends BaseController {
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
             AssertionUtils.isFail(false,"生效时间不能大于失效时间!");
         }
+        param.setSystemCode(getSystemCode());
         accountCardService.cardAdd(param);
         return HttpResult.ok("新增成功");
     }
@@ -89,6 +91,7 @@ public class AccountCardController extends BaseController {
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
             AssertionUtils.isFail(false,"生效时间不能大于失效时间!");
         }
+        param.setSystemCode(getSystemCode());
         accountCardService.cardEdit(param);
         return HttpResult.ok("修改成功");
     }

+ 4 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/AccountController.java

@@ -29,6 +29,7 @@ public class AccountController extends BaseController {
     @PostMapping("/accountPage")
     @Operation(summary = "企业管理列表分页")
     public HttpResult<Page<AccountVo>> accountPage(@RequestBody AccountParam param){
+        param.setSystemCode(getSystemCode());
         Page<AccountVo> result = accountService.queryPage(param);
         return HttpResult.ok(result);
     }
@@ -40,6 +41,7 @@ public class AccountController extends BaseController {
     @PostMapping("/accountList")
     @Operation(summary = "企业管理列表")
     public HttpResult accountList(@RequestBody AccountParam param){
+        param.setSystemCode(getSystemCode());
         List<AccountVo> result = accountService.queryList(param);
         return HttpResult.ok(result);
     }
@@ -65,6 +67,7 @@ public class AccountController extends BaseController {
     @Operation(summary = "来往企业添加")
     @PostMapping("/accountAdd")
     public HttpResult<String> accountAdd(@Validated @RequestBody AccountAddParam param) {
+        param.setSystemCode(getSystemCode());
         accountService.cardAdd(param);
         return HttpResult.ok("新增成功");
     }
@@ -77,6 +80,7 @@ public class AccountController extends BaseController {
     @Operation(summary = "来往企业修改")
     @PostMapping("/accountEdit")
     public HttpResult accountEdit(@Validated @RequestBody AccountEditParam param) {
+        param.setSystemCode(getSystemCode());
         accountService.accountEdit(param);
         return HttpResult.ok("修改成功");
     }

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

@@ -91,6 +91,7 @@ public class ReceivableController {
         if (StrUtil.isBlank(receivableQueryVo.getAgreementType())){
             receivableQueryVo.setAgreementType("2");
         }
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         HttpResult<Page<InsPlyIncome>> ok = HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
         Page<InsPlyIncome> data = ok.getData();
         List<InsPlyIncomeOrder> receivablePageIds = receivableService.getReceivablePageIds(receivableQueryVo);
@@ -107,6 +108,7 @@ public class ReceivableController {
         if (StrUtil.isBlank(receivableQueryVo.getAgreementType())){
             receivableQueryVo.setAgreementType("2");
         }
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         HttpResult<Page<InsPlyIncome>> ok = HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
         Page<InsPlyIncome> data = ok.getData();
         if (null == data || CollUtil.isEmpty(data.getRecords())){
@@ -167,6 +169,7 @@ public class ReceivableController {
             receivableQueryVo.setAgreementType("2");
         }
         //return HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         HttpResult<Page<InsPlyIncome>> ok = HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
         Page<InsPlyIncome> data = ok.getData();
         List<InsPlyIncomeOrder> receivablePageIds = receivableService.getReceivablePageIds(receivableQueryVo);
@@ -182,6 +185,7 @@ public class ReceivableController {
         if (StrUtil.isBlank(receivableQueryVo.getAgreementType())) {
             receivableQueryVo.setAgreementType("2");
         }
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         HttpResult<Page<InsPlyIncome>> ok = HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
         Page<InsPlyIncome> data = ok.getData();
         if (null == data || CollUtil.isEmpty(data.getRecords())){
@@ -197,6 +201,7 @@ public class ReceivableController {
     public HttpResult<InsPlyIncomeVO> getJyCommissionReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
         receivableQueryVo.setQueryType("3");
         receivableQueryVo.setAgreementType("2");
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         HttpResult<Page<InsPlyIncome>> ok = HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
         Page<InsPlyIncome> data = ok.getData();
         List<InsPlyIncomeOrder> receivablePageIds = receivableService.getReceivablePageIds(receivableQueryVo);
@@ -208,6 +213,7 @@ public class ReceivableController {
     public HttpResult<InsPlyIncomeVO> getJyOtherReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
         receivableQueryVo.setQueryType("2");
         receivableQueryVo.setAgreementType("2");
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         HttpResult<Page<InsPlyIncome>> ok = HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
         Page<InsPlyIncome> data = ok.getData();
         List<InsPlyIncomeOrder> receivablePageIds = receivableService.getReceivablePageIds(receivableQueryVo);
@@ -432,6 +438,7 @@ public class ReceivableController {
         if (StrUtil.isBlank(receivableQueryVo.getAgreementType())){
             receivableQueryVo.setAgreementType("1");
         }
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         Page<InsPlyIncome> data = receivableService.getPlatFormReceivableList(receivableQueryVo);
         List<InsPlyIncomeOrder> receivablePageIds = receivableService.getReceivablePageIds(receivableQueryVo);
         //满足条件的的总的应收
@@ -458,6 +465,7 @@ public class ReceivableController {
         if (StrUtil.isBlank(receivableQueryVo.getAgreementType())){
             receivableQueryVo.setAgreementType("1");
         }
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         Page<InsPlyIncome> data = receivableService.getPlatFormReceivableList(receivableQueryVo);
         if (null == data || CollUtil.isEmpty(data.getRecords())){
             return HttpResult.ok(BigDecimal.ZERO);

+ 2 - 1
tenant/organization/src/main/java/com/jzg/organization/mapper/NewCarJudgeRulesMapper.java

@@ -6,8 +6,9 @@ import com.jzg.commons.entity.po.PtlAgreementCostRule;
 import com.jzg.commons.entity.po.PtlNewCarJudgeRules;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 @Mapper
 public interface NewCarJudgeRulesMapper extends BaseMapper<PtlNewCarJudgeRules> {
-    public Page<PtlNewCarJudgeRules> getNewCarList(Page page);
+    public Page<PtlNewCarJudgeRules> getNewCarList(Page page,  @Param("systemCode") String systemCode);
 }

+ 17 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/NewCarJudgeRulesServiceImpl.java

@@ -23,12 +23,16 @@ import com.jzg.organization.mapper.SysUploadFilesMapper;
 import com.jzg.organization.mapper.SysUserMapper;
 import com.jzg.organization.service.*;
 import com.thoughtworks.xstream.mapper.LambdaMapper;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -40,8 +44,12 @@ import static java.util.Objects.nonNull;
 
 
 @Service
+@RequiredArgsConstructor
 public class NewCarJudgeRulesServiceImpl extends ServiceImpl<NewCarJudgeRulesMapper, PtlNewCarJudgeRules>
     implements NewCarJudgeRulesService {
+
+    private final BaseController baseController;
+
     /**
      * 根据保险公司查询新旧车规则
      * @param companyId
@@ -107,7 +115,15 @@ public class NewCarJudgeRulesServiceImpl extends ServiceImpl<NewCarJudgeRulesMap
 //                        .eq(nonNull(newCarQuery.getCompanyId()),
 //                                PtlNewCarJudgeRules::getCompanyId,
 //                                newCarQuery.getCompanyId()));
-        Page<PtlNewCarJudgeRules> newCarList = baseMapper.getNewCarList(newCarQuery.getPage());
+        String systemCode = "";
+        //如果是APP登录的话 则传递SystemCode的头部字段
+        if (baseController.getUserSystemCode().equals("APP")) {
+            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+            systemCode = request.getHeader("system_code");
+        } else {
+            systemCode = baseController.getUserSystemCode();
+        }
+        Page<PtlNewCarJudgeRules> newCarList = baseMapper.getNewCarList(newCarQuery.getPage(), systemCode);
         return newCarList;
     }
 

+ 22 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -591,6 +591,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public List<InsPlyIncome> getReceivableList(ReceivableQueryVo receivableQueryVo) {
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         // modify by lipf, 和查询调用同一个查询mapper,并且将分页参数进行调整 2026年6月9日10:03:13
         receivableQueryVo.setPages(1);
         receivableQueryVo.setSize(Integer.MAX_VALUE);
@@ -2605,6 +2606,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if("30".equals(invoiceRecordQueryVo.getSettlementStatus())){
             invoiceRecordQueryVo.setSettlementStatus(null);
         }
+        invoiceRecordQueryVo.setSystemCode(baseController.getSystemCode());
         Page<InvoiceRecordResult> invoiceRecordList = baseMapper.getInvoiceRecordList(invoiceRecordQueryVo.getPage(), invoiceRecordQueryVo);
         List<InvoiceRecordResult> records = invoiceRecordList.getRecords();
         if(CollUtil.isNotEmpty(records)){
@@ -2698,6 +2700,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportSuperviseJyExcel(ReceivableQueryVo receivableQueryVo) throws IOException {
         verifyUploadPath();
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         List<ExportSuperviseJyExcelDto> exportSuperviseJyExcelDtos = baseMapper.getSuperviseJyExcelDtos(receivableQueryVo);
         exportSuperviseJyExcelDtos.forEach(dto -> {
             switch (dto.getEntryStatus()) {
@@ -2720,6 +2723,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         log.info("查询结算手续费结算记录:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
         // 设置空条件
         setNoneCondition(settlementQueryVo);
+        // 设置租户
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.superviseSettlementExcelDtos(page, settlementQueryVo);
         // 补充、转换列表的数据
         supplementaryListData(exportSuperviseSettlementExcelDtos);
@@ -2737,6 +2742,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         log.info("查询平台结算记录:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
         // 设置空条件
         setNoneCondition(settlementQueryVo);
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.platformSettlementExcelDtos(page, settlementQueryVo);
         // 补充、转换列表的数据
         supplementaryListData(exportSuperviseSettlementExcelDtos);
@@ -2754,6 +2760,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         log.info("查询平台结算记录:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
         // 设置空条件
         setNoneCondition(settlementQueryVo);
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.followSettlementExcelDtos(page, settlementQueryVo);
         // 补充、转换列表的数据
         supplementaryListData(exportSuperviseSettlementExcelDtos);
@@ -2825,6 +2832,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportSuperviseSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
         verifyUploadPath();
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.superviseSettlementExcelDtos(page, settlementQueryVo);
         // 补充、转换列表的数据
         supplementaryListData(exportSuperviseSettlementExcelDtos);
@@ -2841,6 +2849,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportPlatformSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
         verifyUploadPath();
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.platformSettlementExcelDtos(page, settlementQueryVo);
         // 补充、转换列表的数据
         supplementaryListData(exportSuperviseSettlementExcelDtos);
@@ -2872,6 +2881,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      */
     @Override
     public String exportPlatFormReceivable(ReceivableQueryVo receivableQueryVo) {
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         List<InsPlyIncome> receivableList = baseMapper.getReceivableList(receivableQueryVo);
 
         // 调用动态导出
@@ -2885,6 +2895,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public Page<ExportSuperviseSettlementDetailExcelDto> superviseSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo) {
         log.info("superviseSettlementDetailExcel:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementDetailExcelDto> exportSuperviseSettlementDetailExcelDtos = baseMapper.getSuperviseSettlementDetailExcelDtos(page, settlementQueryVo);
         exportSuperviseSettlementDetailExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -2910,6 +2921,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportSuperviseSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
         verifyUploadPath();
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementDetailExcelDto> exportSuperviseSettlementDetailExcelDtos = baseMapper.getSuperviseSettlementDetailExcelDtos(page, settlementQueryVo);
         exportSuperviseSettlementDetailExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -2936,6 +2948,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportSuperviseSettlementDetailJyExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
         verifyUploadPath();
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportSuperviseSettlementDetailJyExcelDto> exportSuperviseSettlementDetailJyExcelDtos = baseMapper.getSuperviseSettlementDetailJyExcelDtos(page, settlementQueryVo);
         exportSuperviseSettlementDetailJyExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -2959,6 +2972,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportOtherExcel(ReceivableQueryVo receivableQueryVo) throws IOException {
         verifyUploadPath();
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         // modify by lipf, 2026年6月9日11:57:39 调用和查询相同的接口,保证数据一致性
         //List<ExportOtherExcelDto> exportOtherExcelDtos = baseMapper.getOtherExcelDtos(receivableQueryVo);
         receivableQueryVo.setSize(Integer.MAX_VALUE);
@@ -2989,6 +3003,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportOtherJyExcel(ReceivableQueryVo receivableQueryVo) throws IOException {
         verifyUploadPath();
+        receivableQueryVo.setSystemCode(baseController.getSystemCode());
         List<ExportOtherJyExcelDto> exportOtherJyExcelDtos = baseMapper.getOtherJyExcelDtos(receivableQueryVo);
         exportOtherJyExcelDtos.forEach(dto -> {
             switch (dto.getEntryStatus()) {
@@ -3002,6 +3017,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public Page<ExportOtherSettlementExcelDto> exportOtherSettlement(Page page, SettlementQueryVo settlementQueryVo) {
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportOtherSettlementExcelDto> exportOtherSettlementExcelDtos = baseMapper.getOtherSettlementExcelDtos(page, settlementQueryVo);
         exportOtherSettlementExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -3029,6 +3045,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportOtherSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
         verifyUploadPath();
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportOtherSettlementExcelDto> exportOtherSettlementExcelDtos = baseMapper.getOtherSettlementExcelDtos(page, settlementQueryVo);
         exportOtherSettlementExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -3049,6 +3066,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public Page<ExportOtherSettlementDetailExcelDto> otherSettlementDetail(Page page, SettlementQueryVo settlementQueryVo) {
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportOtherSettlementDetailExcelDto> otherSettlementDetail = baseMapper.getOtherSettlementDetailExcelDtos(page, settlementQueryVo);
         otherSettlementDetail.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -3071,6 +3089,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportOtherSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
         verifyUploadPath();
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportOtherSettlementDetailExcelDto> exportOtherSettlementDetailExcelDtos = baseMapper.getOtherSettlementDetailExcelDtos(page, settlementQueryVo);
         exportOtherSettlementDetailExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -3098,6 +3117,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public void exportOtherSettlementDetailJyExcel(Page page, SettlementQueryVo settlementQueryVo) throws IOException {
         verifyUploadPath();
+        settlementQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ExportOtherSettlementDetailJyExcelDto> exportOtherSettlementDetailJyExcelDtos = baseMapper.getOtherSettlementDetailJyExcelDtos(page, settlementQueryVo);
         exportOtherSettlementDetailJyExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -3429,6 +3449,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public Page<ReceiverSettlementReportDto> receiverSettlementReport(Page page, SettlementReportQueryVo settlementReportQueryVo) {
         log.info("平台协议应收-结算报表-对接人结算报表查询。 settlementReportQueryVo=[{}]", JSONUtil.toJsonStr(settlementReportQueryVo));
+        settlementReportQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ReceiverSettlementReportDto> receiverSettlementReport = baseMapper.getReceiverSettlementReport(page, settlementReportQueryVo);
         List<ReceiverSettlementReportDto> records = receiverSettlementReport.getRecords();
         if(CollUtil.isNotEmpty(records)) {
@@ -3454,6 +3475,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public void exportReceiverSettlementReportExcel(Page page, SettlementReportQueryVo settlementReportQueryVo) {
+        settlementReportQueryVo.setSystemCode(baseController.getSystemCode());
         Page<ReceiverSettlementReportDto> receiverSettlementReport = baseMapper.getReceiverSettlementReport(page, settlementReportQueryVo);
         List<ReceiverSettlementReportDto> receiverSettlementReportDtos = receiverSettlementReport.getRecords();
         EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), ReceiverSettlementReportDto.class, receiverSettlementReportDtos, "对接人结算报表");

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

@@ -84,9 +84,6 @@ tenant:
     - ins_ply_income_invoice_link
     - ins_orders_risk
     - ins_orders_car_user_info
-    - ins_ply_income
-    - ins_ply_income_invoice
-    - ins_ply_income_invoice_settlement
     - esm_user_referrer
     - ins_ply_income_invoice_settlement_file
     - wechat_customer_service

+ 1 - 0
tenant/organization/src/main/resources/mapper/InvAccountCardMapper.xml

@@ -54,6 +54,7 @@
         LEFT JOIN inv_account ia on ia.id = iac.account_id AND ia.is_delete = 0
         <where>
             iac.is_delete = 0
+            and iac.system_code = #{param.systemCode}
             <if test="param.accountName != null and param.accountName != ''">
                 and ia.account_name like CONCAT('%',#{param.accountName}, '%')
             </if>

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

@@ -38,6 +38,7 @@
         FROM inv_account ia
         <where>
             ia.is_delete = 0
+            and ia.system_code = #{param.systemCode}
             <if test="param.outerFlag != null ">
                 and ia.outer_flag = #{param.outerFlag}
             </if>
@@ -53,6 +54,7 @@
         FROM inv_account ia
         <where>
             ia.is_delete = 0
+            and ia.system_code = #{param.systemCode}
             <if test="param.outerFlag != null ">
                 and ia.outer_flag = #{param.outerFlag}
             </if>

+ 1 - 0
tenant/organization/src/main/resources/mapper/NewCarJudgeRulesMapper.xml

@@ -12,6 +12,7 @@
         <where>
             pncjr.is_delete = 0
         </where>
+        and pncjr.system_code = #{systemCode}
     </select>
 
 </mapper>

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

@@ -297,6 +297,20 @@
             tr.is_delete = 0
             AND tr.ptl_agreement_cost_id = #{costId}
         </where>
+
+        GROUP BY tr.id,
+        tr.ptl_agreement_cost_id,
+        tr.rules_id,
+        tr.attr_id,
+        tr.attr_code,
+        tr.min,
+        tr.max,
+        tr.operator,
+        tr.batch,
+        a.attr_name,
+        a.attr_type,
+        a.attr_group,
+        a.dict_id
     </select>
 
     <select id="selectCostType" resultMap="costType">

+ 15 - 0
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -290,6 +290,7 @@
     </select>
     <select id="getReceivablePage" resultType="com.jzg.commons.entity.finance.po.InsPlyIncome">
         <include refid="query"/>
+        and ipi.system_code = #{receivableQueryVo.systemCode}
         <if test="receivableQueryVo.invoiceId != null and receivableQueryVo.invoiceId != ''" >
             AND ipi.id  in (
             select ipiil.income_id  from ins_ply_income_invoice_link ipiil where ipiil.invoice_id  = #{receivableQueryVo.invoiceId} and ipiil.is_delete = 0
@@ -404,6 +405,7 @@
         <where>
             ipi.is_delete  = 0
             AND ipi.settlement_status = '0'
+            AND ipi.system_code = #{receivableQueryVo.systemCode}
             <if test="receivableQueryVo.queryType != null and receivableQueryVo.queryType == 1">
                 AND ipi.supervise_settlement = 0
             </if>
@@ -480,6 +482,7 @@
         LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510' AND ior2.is_delete = 0
         <where>
             ipi.is_delete = 0
+            AND ipi.system_code = #{receivableQueryVo.systemCode}
             AND NOT EXISTS ( SELECT 1 FROM ins_ply_income_invoice_link ipil WHERE ipil.income_id = ipi.id AND ipil.is_delete = 0 )
             <if test="receivableQueryVo.queryType != null and receivableQueryVo.queryType == 1">
                 AND ipi.supervise_settlement = 0
@@ -547,6 +550,7 @@
         left join ptl_agreement agree on io.agreement_id = agree.id AND agree.is_delete = 0
         <where>
             ipiis.is_delete = 0
+            AND ipiis.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
                 AND ipiis.id IN
                 <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -628,6 +632,7 @@
         LEFT JOIN ptl_agreement agree ON io.agreement_id = agree.id AND agree.is_delete = 0
         <where>
             ipiis.is_delete = 0
+            AND ipiis.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
                 AND ipiis.id IN
                 <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -695,6 +700,7 @@
         LEFT JOIN esm_ins_company eic ON ipii.company_id = eic.id  AND eic.is_delete = 0
         <where>
             ipiis.is_delete = 0
+            AND ipiis.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
                 AND ipiis.id IN
                 <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -774,6 +780,7 @@
         LEFT JOIN ins_orders io ON ipi.order_no = io.id AND io.is_delete = 0
         <where>
             ipii.is_delete = 0
+            AND ipii.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementId != null and settlementQueryVo.settlementId != ''">
                 AND ipiis.id = #{settlementQueryVo.settlementId}
             </if>
@@ -839,6 +846,7 @@
         LEFT JOIN ins_orders io ON ipi.order_no = io.id AND io.is_delete = 0
         <where>
             ipii.is_delete = 0
+            AND ipii.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
                 AND ipiis.id IN
                 <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -903,6 +911,7 @@
         LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510' AND ior2.is_delete = 0
         <where>
             ipi.is_delete = 0
+            AND ipi.system_code = #{receivableQueryVo.systemCode}
             <if test="receivableQueryVo.queryType != null and receivableQueryVo.queryType == 1">
                 AND ipi.supervise_settlement = 0
             </if>
@@ -959,6 +968,7 @@
         LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510' AND ior2.is_delete = 0
         <where>
             ipi.is_delete = 0
+            AND ipi.system_code = #{receivableQueryVo.systemCode}
             <if test="receivableQueryVo.queryType != null and receivableQueryVo.queryType == 1">
                 AND ipi.supervise_settlement = 0
             </if>
@@ -1009,6 +1019,7 @@
         LEFT JOIN ins_ply_income ipi ON ipi.id = ipil.income_id AND ipi.is_delete = 0
         <where>
             ipiis.is_delete = 0
+            AND ipiis.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
                 AND ipiis.id IN
                 <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -1059,6 +1070,7 @@
         LEFT JOIN ins_orders io ON ipi.order_no = io.id AND io.is_delete = 0
         <where>
             ipii.is_delete = 0
+            AND ipii.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
                 AND ipiis.id IN
                 <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -1121,6 +1133,7 @@
         LEFT JOIN ins_orders io ON ipi.order_no = io.id AND io.is_delete = 0
         <where>
             ipii.is_delete = 0
+            AND ipii.system_code = #{settlementQueryVo.systemCode}
             <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
                 AND ipiis.id IN
                 <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -1266,6 +1279,7 @@
         LEFT JOIN esm_ins_company eic on eic.id = ipii.company_id AND eic.is_delete = 0
         <where>
             ipii.is_delete = 0
+            AND ipii.system_code = #{invoiceRecordQueryVo.systemCode}
             <if test="invoiceRecordQueryVo.invoiceType != null and invoiceRecordQueryVo.invoiceType != ''">
                 AND ipii.invoice_type = #{invoiceRecordQueryVo.invoiceType}
             </if>
@@ -1583,6 +1597,7 @@
         <where>
             ipi.is_delete = 0
             AND ipi.agreement_type = '1'
+            AND ipi.system_code = #{settlementReportQueryVo.systemCode}
             <if test="settlementReportQueryVo.companyId != null and settlementReportQueryVo.companyId != ''">
                 AND ipi.company_id = #{settlementReportQueryVo.companyId}
             </if>