lipf 3 месяцев назад
Родитель
Сommit
4a3931243a

+ 58 - 22
commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostRatioVo.java

@@ -132,32 +132,68 @@ public class PtlAgreementCostRatioVo {
         this.orderNo = insFeeOrders.getOrderNo();
 
         // 交强险比例
-        this.jqCommissionRatio = insFeeOrders.getJqCommissionRatio() != null ? insFeeOrders.getJqCommissionRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jqInletRatio = insFeeOrders.getJqInletRatio() != null ? insFeeOrders.getJqInletRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jqFollowRatio = insFeeOrders.getJqFollowRatio() != null ? insFeeOrders.getJqFollowRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jqAdditionalRatio = insFeeOrders.getJqAdditionalRatio() != null ? insFeeOrders.getJqAdditionalRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jqKeepPointRatio = insFeeOrders.getJqKeepPointRatio() != null ? insFeeOrders.getJqKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jqExportRatio = insFeeOrders.getJqExportRatio() != null ? insFeeOrders.getJqExportRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jqExportKeepPointRatio = insFeeOrders.getJqExportKeepPointRatio() != null ? insFeeOrders.getJqExportKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+        if(insFeeOrders.getJqPremium().compareTo(BigDecimal.ZERO) == 0){
+            this.jqCommissionRatio = BigDecimal.ZERO;
+            this.jqInletRatio = BigDecimal.ZERO;
+            this.jqFollowRatio =  BigDecimal.ZERO;
+            this.jqAdditionalRatio = BigDecimal.ZERO;
+            this.jqKeepPointRatio = BigDecimal.ZERO;
+            this.jqExportRatio = BigDecimal.ZERO;
+            this.jqExportKeepPointRatio = BigDecimal.ZERO;
+
+        }else{
+            this.jqCommissionRatio = insFeeOrders.getJqCommissionRatio() != null ? insFeeOrders.getJqCommissionRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jqInletRatio = insFeeOrders.getJqInletRatio() != null ? insFeeOrders.getJqInletRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jqFollowRatio = insFeeOrders.getJqFollowRatio() != null ? insFeeOrders.getJqFollowRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jqAdditionalRatio = insFeeOrders.getJqAdditionalRatio() != null ? insFeeOrders.getJqAdditionalRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jqKeepPointRatio = insFeeOrders.getJqKeepPointRatio() != null ? insFeeOrders.getJqKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jqExportRatio = insFeeOrders.getJqExportRatio() != null ? insFeeOrders.getJqExportRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jqExportKeepPointRatio = insFeeOrders.getJqExportKeepPointRatio() != null ? insFeeOrders.getJqExportKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+        }
+
 
         // 商业险比例
-        this.syCommissionRatio = insFeeOrders.getSyCommissionRatio() != null ? insFeeOrders.getSyCommissionRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.syInletRatio = insFeeOrders.getSyInletRatio() != null ? insFeeOrders.getSyInletRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.syFollowRatio = insFeeOrders.getSyFollowRatio() != null ? insFeeOrders.getSyFollowRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.syAdditionalRatio = insFeeOrders.getSyAdditionalRatio() != null ? insFeeOrders.getSyAdditionalRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.syKeepPointRatio = insFeeOrders.getSyKeepPointRatio() != null ? insFeeOrders.getSyKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.syExportRatio = insFeeOrders.getSyExportRatio() != null ? insFeeOrders.getSyExportRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.syExportKeepPointRatio = insFeeOrders.getSyExportKeepPointRatio() != null ? insFeeOrders.getSyExportKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+        if(insFeeOrders.getSyPremium().compareTo(BigDecimal.ZERO) == 0){
+            this.syCommissionRatio = BigDecimal.ZERO;
+            this.syInletRatio = BigDecimal.ZERO;
+            this.syFollowRatio = BigDecimal.ZERO;
+            this.syAdditionalRatio = BigDecimal.ZERO;
+            this.syKeepPointRatio = BigDecimal.ZERO;
+            this.syExportRatio =  BigDecimal.ZERO;
+            this.syExportKeepPointRatio = BigDecimal.ZERO;
+
+        }else{
+            this.syCommissionRatio = insFeeOrders.getSyCommissionRatio() != null ? insFeeOrders.getSyCommissionRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.syInletRatio = insFeeOrders.getSyInletRatio() != null ? insFeeOrders.getSyInletRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.syFollowRatio = insFeeOrders.getSyFollowRatio() != null ? insFeeOrders.getSyFollowRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.syAdditionalRatio = insFeeOrders.getSyAdditionalRatio() != null ? insFeeOrders.getSyAdditionalRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.syKeepPointRatio = insFeeOrders.getSyKeepPointRatio() != null ? insFeeOrders.getSyKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.syExportRatio = insFeeOrders.getSyExportRatio() != null ? insFeeOrders.getSyExportRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.syExportKeepPointRatio = insFeeOrders.getSyExportKeepPointRatio() != null ? insFeeOrders.getSyExportKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+
+        }
 
         // 驾意险比例
-        this.jyCommissionRatio = insFeeOrders.getJyCommissionRatio() != null ? insFeeOrders.getJyCommissionRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jyInletRatio = insFeeOrders.getJyInletRatio() != null ? insFeeOrders.getJyInletRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jyFollowRatio = insFeeOrders.getJyFollowRatio() != null ? insFeeOrders.getJyFollowRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jyAdditionalRatio = insFeeOrders.getJyAdditionalRatio() != null ? insFeeOrders.getJyAdditionalRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jyKeepPointRatio = insFeeOrders.getJyKeepPointRatio() != null ? insFeeOrders.getJyKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jyExportRatio = insFeeOrders.getJyExportRatio() != null ? insFeeOrders.getJyExportRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-        this.jyExportKeepPointRatio = insFeeOrders.getJyExportKeepPointRatio() != null ? insFeeOrders.getJyExportKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
-    }
+        if(insFeeOrders.getJyPremium().compareTo(BigDecimal.ZERO) == 0){
+            this.jyCommissionRatio = BigDecimal.ZERO;
+            this.jyInletRatio =  BigDecimal.ZERO;
+            this.jyFollowRatio = BigDecimal.ZERO;
+            this.jyAdditionalRatio = BigDecimal.ZERO;
+            this.jyKeepPointRatio =BigDecimal.ZERO;
+            this.jyExportRatio = BigDecimal.ZERO;
+            this.jyExportKeepPointRatio = BigDecimal.ZERO;
+
+        }else{
+            this.jyCommissionRatio = insFeeOrders.getJyCommissionRatio() != null ? insFeeOrders.getJyCommissionRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jyInletRatio = insFeeOrders.getJyInletRatio() != null ? insFeeOrders.getJyInletRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jyFollowRatio = insFeeOrders.getJyFollowRatio() != null ? insFeeOrders.getJyFollowRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jyAdditionalRatio = insFeeOrders.getJyAdditionalRatio() != null ? insFeeOrders.getJyAdditionalRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jyKeepPointRatio = insFeeOrders.getJyKeepPointRatio() != null ? insFeeOrders.getJyKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jyExportRatio = insFeeOrders.getJyExportRatio() != null ? insFeeOrders.getJyExportRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+            this.jyExportKeepPointRatio = insFeeOrders.getJyExportKeepPointRatio() != null ? insFeeOrders.getJyExportKeepPointRatio().multiply(new BigDecimal("100")) : BigDecimal.ZERO;
+
+        }
+       }
 
 
 

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

@@ -1,191 +0,0 @@
-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 : "";
-    }
-}

+ 8 - 1
platform/src/main/java/com/jzg/service/impl/PtlAgreementAttributionImpl.java

@@ -80,7 +80,14 @@ public class PtlAgreementAttributionImpl extends ServiceImpl<PtlAgreementAttribu
 
     @Override
     public Page<PtlAgreementAttribution> getAgreementAttributionList(Page page, PtlAgreementAttributionQueryVo ptlAgreementAttributionQueryVo) {
-        return baseMapper.getAgreementAttributionList(page,ptlAgreementAttributionQueryVo);
+        Page<PtlAgreementAttribution> agreementAttributionList = baseMapper.getAgreementAttributionList(page, ptlAgreementAttributionQueryVo);
+        agreementAttributionList.getRecords().forEach(item->{
+            // 将用户名密码设置为空
+            if(Objects.isNull(item.getUsername())){
+                item.setUsername("");
+            }
+        });
+        return agreementAttributionList;
     }
 
     @Override

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/build/HuaNongCrawlerQuoteResultsVoBuild.java

@@ -121,7 +121,7 @@ public final class HuaNongCrawlerQuoteResultsVoBuild {
 
         JSONArray scoreJson = new JSONArray();
         scoreJson.add(new JSONObject()
-                .fluentPut("scoreName", "总评分")
+                .fluentPut("scoreName", "交商合计分")
                 .fluentPut("scoreKey", "mark")
                 .fluentPut("score", ultimateScoreBiCi));
         scoreJson.add(new JSONObject()

+ 3 - 3
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java

@@ -470,9 +470,9 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
                     // 累加计数,超过次数则抛出异常
                     if (retryCount.incrementAndGet() >= MAX_RETRY_TIMES) {
                         if(e.getMessage().contains("上传的行业车型编码不在平台车型范围内,请核实。")) {
-                            throw new SystemException("报价重试次数已达上限(" + MAX_RETRY_TIMES + "次),车型匹配失败。上传的行业车型编码不在平台车型范围内,请核实。", e.getMessage());
+                            throw new SystemException("上传的行业车型编码不在平台车型范围内,请核实。");
                         }else {
-                            throw new SystemException("报价重试次数已达上限(" + MAX_RETRY_TIMES + "次),车型匹配失败。" + e.getMessage());
+                            throw new SystemException(e.getMessage());
                         }
                     }
                     // 提取新的modelcodexh并重新执行预处理
@@ -480,7 +480,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
                     continue; // 继续下一次循环
                 }
                 // 非车型匹配异常,直接抛出
-                throw e;
+                throw new SystemException(e.getMessage());
             }
             // 无有效数据且未触发异常时,累加计数
             retryCount.incrementAndGet();

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

@@ -2568,19 +2568,19 @@ public class RenBaoNewCrawlerRequestBuilder {
                 }
             } else if ("TY1".equals(zgKindCode)) {
                 // 附加增值服务特约条款(道路救援服务)
-                if (serviceTimes != null) {
-                    kind.put("quantity", serviceTimes);
+                if (!amountStr.isEmpty()) {
+                    kind.put("quantity", amountStr);
                 }
             } else if ("TY2".equals(zgKindCode)) {
                 // 附加增值服务特约条款(车辆安全检测)
-                if (serviceTimes != null) {
-                    List<Map<String, Object>> safeCheckItemList = buildSafeCheckItemList(serviceTimes);
+                if (!amountStr.isEmpty()) {
+                    List<Map<String, Object>> safeCheckItemList = buildSafeCheckItemList(amountStr);
                     kind.put("safeCheckItemList", safeCheckItemList);
                 }
             } else if ("TY3".equals(zgKindCode) || "TY4".equals(zgKindCode)) {
                 // 附加增值服务特约条款(代为驾驶服务)
-                if (serviceTimes != null) {
-                    kind.put("quantity", serviceTimes);
+                if (!amountStr.isEmpty()) {
+                    kind.put("quantity", amountStr);
                 }
             }  else if ("MJ1".equals(zgKindCode) || "MJ2".equals(zgKindCode) ||
                     "MJ3".equals(zgKindCode) || "MJ4".equals(zgKindCode)){

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

@@ -224,8 +224,8 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         // 加投直接乘
         BigDecimal addThrow = premium.multiply(addThrowRatio).setScale(scale, RoundingMode.HALF_EVEN);
         // 出口直接乘
-        BigDecimal export = premium.multiply(exportRatio).setScale(scale, RoundingMode.HALF_DOWN);
-        BigDecimal exportKeepPoint = premium.multiply(exportKeepPointRatio).setScale(scale, RoundingMode.HALF_EVEN);
+        BigDecimal export = premium.multiply(exportRatio).setScale(scale, RoundingMode.DOWN);
+        BigDecimal exportKeepPoint = premium.multiply(exportKeepPointRatio).setScale(scale, RoundingMode.DOWN);
         // 留点比例直接乘, modify by lipf ,留点比例在infFeeOrder中计算得到。这里直接使用 2026年6月16日17:32:09, 为了保持金额一致,留点比例不适用百分比乘积,而是使用金额相减
         // BigDecimal keepPoint = premium.multiply(keepPointRatio).setScale(scale, RoundingMode.HALF_EVEN);
         //BigDecimal keepPoint = BigDecimalUtil.subtract(BigDecimalUtil.add(inlet,addThrow),export);

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

@@ -1713,6 +1713,11 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
      */
     @Override
     public HttpResult<InsFeeCalculateResponse> cvalculateFees(InsFeeCalculateRequest request) {
+
+        if(request.getMobile().isEmpty()){
+            return HttpResult.error("请选择业务员!");
+        }
+
         String agreementId = request.getAgreementId();
         // 保费 & 所有比例字段 null → 0
         BigDecimal jqPremium  = nvl(request.getJqPremium());
@@ -1754,6 +1759,23 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         syRatio = capRatio(syRatio, syCostType);
         jyRatio = capRatio(jyRatio, jyCostType);
 
+        // 3.1 保费为0 → 入口手续费比例和入口比例归零
+        if (jqPremium.compareTo(BigDecimal.ZERO) == 0) {
+            jqRatio = BigDecimal.ZERO;
+            jqInlet = BigDecimal.ZERO;
+            jqCostType.setInlet(BigDecimal.ZERO);
+        }
+        if (syPremium.compareTo(BigDecimal.ZERO) == 0) {
+            syRatio = BigDecimal.ZERO;
+            syInlet = BigDecimal.ZERO;
+            syCostType.setInlet(BigDecimal.ZERO);
+        }
+        if (jyPremium.compareTo(BigDecimal.ZERO) == 0) {
+            jyRatio = BigDecimal.ZERO;
+            jyInlet = BigDecimal.ZERO;
+            jyCostType.setInlet(BigDecimal.ZERO);
+        }
+
         // 4. 跟单费比例 = 入口比例 - 手续费比例
         BigDecimal jqFollow = calcFollowRatio(jqCostType, jqRatio);
         BigDecimal syFollow = calcFollowRatio(syCostType, syRatio);
@@ -1775,11 +1797,14 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         calcInsuranceType(feeOrders, syPremium, syCostType, syRatio, syFollow, taxFactor, "sy");
         calcInsuranceType(feeOrders, jyPremium, jyCostType, jyRatio, jyFollow, taxFactor, "jy");
 
-        // 7. 保存各比例(小数)到 feeOrders
-        // 保存各比例到 feeOrders
-        feeOrders.setJqCommissionRatio(div100(ptlAgreement.getJqEntranceFeeRatio()));
-        feeOrders.setSyCommissionRatio(div100(ptlAgreement.getSyEntranceFeeRatio()));
-        feeOrders.setJyCommissionRatio(div100(ptlAgreement.getJyEntranceFeeRatio()));
+        // 7. 计算分销费用(返回分销精度差值)—— 须在 saveRatio 之前,因为 export 需要减分销比例
+        BigDecimal distributionDiff = calcDistributionFee(sumPremium, feeOrders, request.getMobile());
+
+        // 7.1 保存各比例到 feeOrders
+
+        feeOrders.setJqCommissionRatio(div100(jqRatio));
+        feeOrders.setSyCommissionRatio(div100(syRatio));
+        feeOrders.setJyCommissionRatio(div100(jyRatio));
         feeOrders.setJqInletRatio(div100(jqInlet));
         feeOrders.setSyInletRatio(div100(syInlet));
         feeOrders.setJyInletRatio(div100(jyInlet));
@@ -1792,15 +1817,41 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         feeOrders.setJqKeepPointRatio(nvl(feeOrders.getJqKeepPointRatio()));
         feeOrders.setSyKeepPointRatio(nvl(feeOrders.getSyKeepPointRatio()));
         feeOrders.setJyKeepPointRatio(nvl(feeOrders.getJyKeepPointRatio()));
-        feeOrders.setJqExportRatio(div100(jqExport));
-        feeOrders.setSyExportRatio(div100(syExport));
-        feeOrders.setJyExportRatio(div100(jyExport));
+
+        // —— 出口比例 = 出口比例 - 分销比例(对齐旧 saveRatio)
+        BigDecimal firstDist  = nvl(feeOrders.getFirstDistributionRatio());
+        BigDecimal secondDist = nvl(feeOrders.getSecondDistributionRatio());
+        BigDecimal thirdDist  = nvl(feeOrders.getThirdDistributionRatio());
+        feeOrders.setJqExportRatio(jqExport.compareTo(BigDecimal.ZERO) > 0
+                ? div100(jqExport).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist))
+                : BigDecimal.ZERO);
+        feeOrders.setSyExportRatio(syExport.compareTo(BigDecimal.ZERO) > 0
+                ? div100(syExport).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist))
+                : BigDecimal.ZERO);
+        feeOrders.setJyExportRatio(jyExport.compareTo(BigDecimal.ZERO) > 0
+                ? div100(jyExport).subtract(div100(firstDist)).subtract(div100(secondDist)).subtract(div100(thirdDist))
+                : BigDecimal.ZERO);
+
         feeOrders.setJqExportKeepPointRatio(div100(jqEKP));
         feeOrders.setSyExportKeepPointRatio(div100(syEKP));
         feeOrders.setJyExportKeepPointRatio(div100(jyEKP));
 
-        // 计算分销费用(返回分销精度差值)
-        BigDecimal distributionDiff = calcDistributionFee(sumPremium, feeOrders,request.getMobile());
+        // 7.2 保费为0 → 出口相关字段归零(对齐旧 saveRatio)
+        if (jqPremium.compareTo(BigDecimal.ZERO) == 0) {
+            feeOrders.setJqExportRatio(BigDecimal.ZERO); feeOrders.setJqExportPremium(BigDecimal.ZERO);
+            feeOrders.setJqExportKeepPointRatio(BigDecimal.ZERO); feeOrders.setJqExportKeepPointPremium(BigDecimal.ZERO);
+            feeOrders.setJqKeepPointRatio(BigDecimal.ZERO);
+        }
+        if (syPremium.compareTo(BigDecimal.ZERO) == 0) {
+            feeOrders.setSyExportRatio(BigDecimal.ZERO); feeOrders.setSyExportPremium(BigDecimal.ZERO);
+            feeOrders.setSyExportKeepPointRatio(BigDecimal.ZERO); feeOrders.setSyExportKeepPointPremium(BigDecimal.ZERO);
+            feeOrders.setSyKeepPointRatio(BigDecimal.ZERO);
+        }
+        if (jyPremium.compareTo(BigDecimal.ZERO) == 0) {
+            feeOrders.setJyExportRatio(BigDecimal.ZERO); feeOrders.setJyExportPremium(BigDecimal.ZERO);
+            feeOrders.setJyExportKeepPointRatio(BigDecimal.ZERO); feeOrders.setJyExportKeepPointPremium(BigDecimal.ZERO);
+            feeOrders.setJyKeepPointRatio(BigDecimal.ZERO);
+        }
 
         // 8. 总应收/总应付
         feeOrders.setTotalReceivablePremium(feeOrders.getJqReceivablePremium()

+ 4 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java

@@ -173,6 +173,9 @@ public class PtlAgreementServiceImpl extends ServiceImpl<PtlAgreementMapper, Ptl
             log.info("协议id不存在:id=[{}]",id);
             throw new SystemException("协议id不存在!id=" + id);
         }
+        if (Objects.isNull(agreementVo.getUsername())){
+            agreementVo.setUsername("");
+        }
         return agreementVo;
     }
 
@@ -228,7 +231,7 @@ public class PtlAgreementServiceImpl extends ServiceImpl<PtlAgreementMapper, Ptl
 
 
     @Override
-    @GlobalTransactional(rollbackFor = Exception.class)
+//    @GlobalTransactional(rollbackFor = Exception.class)
     public void agreementAdd(AgreementAddParam param) {
         PtlAgreement ptlAgreement = new PtlAgreement();
         BeanUtils.copyProperties(param,ptlAgreement);

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

@@ -588,7 +588,7 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
         //过滤 能源类型 使用性质 车辆种类
         List<PtlScheme> ptlSchemes = ptlSchemeMapper.selectList(new LambdaQueryWrapper<PtlScheme>().
                 eq(PtlScheme::getCompanyId, companyId).eq(PtlScheme::getEnergyType, energyType).
-                like(PtlScheme::getCarnature, carnature).like(PtlScheme::getVehicleType, vehicleType).
+                eq(PtlScheme::getCarnature, carnature).eq(PtlScheme::getVehicleType, vehicleType).
                 eq(PtlScheme::getProductId, productId).eq(PtlScheme::getIsDelete, 0));
         Map<String, PtlScheme> collectPtlSchemes = ptlSchemes.stream().collect(Collectors.toMap(PtlScheme::getId, Function.identity()));
         AssertionUtils.isFail(collectPtlSchemes.isEmpty(), "没有可报价的方案配置信息");

+ 20 - 14
tenant/organization/src/main/resources/mapper/PtlAgreementMapper.xml

@@ -62,6 +62,25 @@
         pa.api_type,pa.jq_entrance_fee_ratio,pa.sy_entrance_fee_ratio,pa.jy_entrance_fee_ratio
     </sql>
     <select id="queryPage" resultType="com.jzg.commons.entity.vo.AgreementVo">
+        WITH RECURSIVE t AS (
+        SELECT
+        id,
+        CAST(id AS CHAR) COLLATE utf8mb4_general_ci AS str_id
+        FROM
+        esm_ins_company
+        WHERE
+        id = #{param.companyId}
+        AND is_delete = 0
+        AND parent_id = 0 UNION ALL
+        SELECT
+        c.id,
+        CAST(c.id AS CHAR) COLLATE utf8mb4_general_ci AS str_id
+        FROM
+        esm_ins_company c
+        JOIN t ON c.parent_id = t.id
+        WHERE
+        c.is_delete = 0
+        )
         select <include refid="Base_Column_List"/>
         FROM ptl_agreement pa
         LEFT JOIN ptl_agreement_attribution paa on pa.attribution_id = paa.id AND paa.is_delete = 0
@@ -80,20 +99,7 @@
                 and pa.system_code = #{param.systemCode}
             </if>
             <if test="param.companyId != null and param.companyId != ''">
-                and pa.company_id in (
-                WITH RECURSIVE t AS (
-                SELECT id
-                FROM esm_ins_company
-                WHERE id = #{param.companyId}
-                AND parent_id = 0
-                AND is_delete = 0
-                UNION ALL
-                SELECT c.id
-                FROM esm_ins_company c
-                JOIN t ON c.parent_id = t.id
-                WHERE c.is_delete = 0
-                )
-                SELECT id FROM t)
+                AND pa.company_id IN (SELECT str_id FROM t)
             </if>
             <if test="param.companyIds != null and param.companyIds != ''">
                 and pa.company_id in