Преглед изворни кода

Merge remote-tracking branch 'origin/master'

liub пре 1 недеља
родитељ
комит
fd5ecc809a
22 измењених фајлова са 234 додато и 82 уклоњено
  1. 1 1
      authentication/src/main/java/com/jzg/config/SecurityConfig.java
  2. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/CostExternalPageParam.java
  3. 3 3
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateFollow.java
  4. 2 2
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseCar.java
  5. 1 1
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseNoCar.java
  6. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/RuleAttrMappingVo.java
  7. 6 0
      gateway/src/main/java/com/jzg/filter/AuthGlobalFilter.java
  8. 11 0
      gateway/src/main/java/com/jzg/filter/DecryptFilter.java
  9. 1 8
      partner/src/main/java/com/jzg/service/Impl/PartnerUserServiceImpl.java
  10. 2 2
      partner/src/main/java/com/jzg/utils/DistributionUtils.java
  11. 33 20
      partner/src/main/resources/mapper/PartnerUserMapper.xml
  12. 4 1
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/constants/OperatorConstant.java
  13. 32 24
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/impl/RuleServiceImpl.java
  14. 7 5
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java
  15. 8 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  16. 63 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java
  17. 0 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesAttrServiceImpl.java
  18. 6 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  19. 3 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgAppServiceImpl.java
  20. 9 1
      tenant/organization/src/main/resources/mapper/PtlAgreementCostExternalMapper.xml
  21. 10 0
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml
  22. 23 12
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

+ 1 - 1
authentication/src/main/java/com/jzg/config/SecurityConfig.java

@@ -95,7 +95,7 @@ public class SecurityConfig {
                                 "/auth/login","/auth/captchaById","/auth/register","/sendSmsCode","/appLogin","/smsCodeLogin","/auth/publicKeyExchange","/appAuth/smsCodeLogin","/send/sendSmsCode",
                                 "/auth/login","/auth/captchaById","/auth/register","/sendSmsCode","/appLogin","/smsCodeLogin","/auth/publicKeyExchange","/appAuth/smsCodeLogin","/send/sendSmsCode",
                                 "/appAuth/appLogin","/auth/sendSmsCode","/auth/forgotPassword","/appAuth/partnerAppLogin",
                                 "/appAuth/appLogin","/auth/sendSmsCode","/auth/forgotPassword","/appAuth/partnerAppLogin",
                                 "/supplementOrder/getOrderDetail","/dict/get", "/getAllButtons","/order/qrCode/**","/appUser/userInfoGet",
                                 "/supplementOrder/getOrderDetail","/dict/get", "/getAllButtons","/order/qrCode/**","/appUser/userInfoGet",
-                                "/appUser/distributorInvite","/appUser/invitationRegister").permitAll()
+                                "/appUser/distributorInvite","/appUser/invitationRegister","/system/sysListAccountLinking","/signIn/updateSignCompleteRuleIn").permitAll()
                         .anyRequest().authenticated()  // 其他接口需认证
                         .anyRequest().authenticated()  // 其他接口需认证
                 )
                 )
 //                .formLogin((form) -> form
 //                .formLogin((form) -> form

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

@@ -34,6 +34,9 @@ public class CostExternalPageParam extends PageRequest {
     @Schema(description = "协议id")
     @Schema(description = "协议id")
     private String ptlAgreementId;
     private String ptlAgreementId;
 
 
+    @Schema(description = "协议id集")
+    private String[] agreementIds;
+
     @Schema(description = "生效时间")
     @Schema(description = "生效时间")
     private List<String> effectiveTime;
     private List<String> effectiveTime;
 
 

+ 3 - 3
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateFollow.java

@@ -39,15 +39,15 @@ public class ExcelContent4PrivateFollow implements Serializable {
     private String jyPolicyNo;
     private String jyPolicyNo;
 
 
     @Schema(description = "交强险跟单费比例")
     @Schema(description = "交强险跟单费比例")
-    @ExcelProperty(value = "交强险跟单费比例,单位:百分比(%)", index = 4)
+    @ExcelProperty(value = "交强险跟单费比例,单位:小数", index = 4)
     private String jqOtherCostsProportion;
     private String jqOtherCostsProportion;
 
 
     @Schema(description = "商业险跟单费比例")
     @Schema(description = "商业险跟单费比例")
-    @ExcelProperty(value = "商业险跟单费比例,单位:百分比(%)", index = 5)
+    @ExcelProperty(value = "商业险跟单费比例,单位:小数", index = 5)
     private String syOtherCostsProportion;
     private String syOtherCostsProportion;
 
 
     @Schema(description = "非车险跟单费比例")
     @Schema(description = "非车险跟单费比例")
-    @ExcelProperty(value = "非车险跟单费比例,单位:百分比(%)", index = 6)
+    @ExcelProperty(value = "非车险跟单费比例,单位:小数", index = 6)
     private String jyOtherCostsProportion;
     private String jyOtherCostsProportion;
 
 
 }
 }

+ 2 - 2
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseCar.java

@@ -34,12 +34,12 @@ public class ExcelContent4PrivateSuperviseCar implements InsuranceData {
     private String syPolicyNo;
     private String syPolicyNo;
 
 
     @Schema(description = "交强险手续费比例")
     @Schema(description = "交强险手续费比例")
-    @ExcelProperty(value = "交强险手续费比例,单位:百分比(%)", index = 3)
+    @ExcelProperty(value = "交强险手续费比例,单位:小数", index = 3)
     private String jqSuperviseCostsProportion;
     private String jqSuperviseCostsProportion;
 
 
 
 
     @Schema(description = "商业险手续费比例")
     @Schema(description = "商业险手续费比例")
-    @ExcelProperty(value = "商业险手续费比例,单位:百分比(%)", index = 4)
+    @ExcelProperty(value = "商业险手续费比例,单位:小数", index = 4)
     private String sySuperviseCostsProportion;
     private String sySuperviseCostsProportion;
 
 
 
 

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

@@ -31,7 +31,7 @@ public class ExcelContent4PrivateSuperviseNoCar implements InsuranceData {
 
 
 
 
     @Schema(description = "非车险手续费比例")
     @Schema(description = "非车险手续费比例")
-    @ExcelProperty(value = "非车险手续费比例,单位:百分比(%)", index = 2)
+    @ExcelProperty(value = "非车险手续费比例,单位:小数", index = 2)
     private String jySuperviseCostsProportion;
     private String jySuperviseCostsProportion;
 
 
 }
 }

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

@@ -107,6 +107,8 @@ public class RuleAttrMappingVo {
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("OwnersInfoSex", ownerInfo.getGender().equals("男") ? "1" : "2"));
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("OwnersInfoSex", ownerInfo.getGender().equals("男") ? "1" : "2"));
             //车主 地址
             //车主 地址
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersAddress", ownerInfo.getAddr()));
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersAddress", ownerInfo.getAddr()));
+            //车主姓名
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersName" ,ownerInfo.getName()));
         }
         }
         // 投保人
         // 投保人
         InsOrdersCarUserInfo policyHolderInfo = insOrdersCarUserInfos.stream()
         InsOrdersCarUserInfo policyHolderInfo = insOrdersCarUserInfos.stream()
@@ -120,6 +122,8 @@ public class RuleAttrMappingVo {
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoSex", policyHolderInfo.getGender().equals("男") ? "1" : "2"));
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoSex", policyHolderInfo.getGender().equals("男") ? "1" : "2"));
             //投保人 地址
             //投保人 地址
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoAddress", policyHolderInfo.getAddr()));
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoAddress", policyHolderInfo.getAddr()));
+            //投保人姓名
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("PolicyHolderInfoName", policyHolderInfo.getName()));
         }
         }
         //被保人
         //被保人
         InsOrdersCarUserInfo insuredPersonInfo = insOrdersCarUserInfos.stream()
         InsOrdersCarUserInfo insuredPersonInfo = insOrdersCarUserInfos.stream()
@@ -133,6 +137,8 @@ public class RuleAttrMappingVo {
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoSex", insuredPersonInfo.getGender().equals("男") ? "1" : "2"));
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoSex", insuredPersonInfo.getGender().equals("男") ? "1" : "2"));
             //被保人 地址
             //被保人 地址
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoAddress", insuredPersonInfo.getAddr()));
             ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoAddress", insuredPersonInfo.getAddr()));
+            //被保人 姓名
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredPersonInfoName", insuredPersonInfo.getName()));
         }
         }
         String OPIConsistent = "0";
         String OPIConsistent = "0";
         if(StringUtils.isNotBlank(ownerInfo.getCerType().toString())){
         if(StringUtils.isNotBlank(ownerInfo.getCerType().toString())){

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

@@ -10,6 +10,7 @@ import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.core.annotation.Order;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -94,6 +95,11 @@ public class AuthGlobalFilter implements GlobalFilter {
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
         String path = exchange.getRequest().getURI().getPath();
         String path = exchange.getRequest().getURI().getPath();
 
 
+        // 跳过 CORS 预检请求
+        if (HttpMethod.OPTIONS.matches(exchange.getRequest().getMethod().name())) {
+            return chain.filter(exchange);
+        }
+
         // 1. 白名单路径直接放行
         // 1. 白名单路径直接放行
         if (isWhitelisted(path)) {
         if (isWhitelisted(path)) {
             return chain.filter(exchange);
             return chain.filter(exchange);

+ 11 - 0
gateway/src/main/java/com/jzg/filter/DecryptFilter.java

@@ -15,6 +15,7 @@ import org.springframework.cloud.gateway.filter.GlobalFilter;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.core.io.buffer.DataBufferFactory;
 import org.springframework.core.io.buffer.DataBufferFactory;
 import org.springframework.core.io.buffer.DataBufferUtils;
 import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.HttpMethod;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
 import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -25,6 +26,7 @@ import reactor.core.publisher.Mono;
 import java.nio.ByteBuffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.StandardCharsets;
 import java.security.PrivateKey;
 import java.security.PrivateKey;
+import java.util.List;
 
 
 
 
 @Component
 @Component
@@ -41,8 +43,17 @@ public class DecryptFilter implements GlobalFilter {
     @Override
     @Override
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
         ServerHttpRequest request = exchange.getRequest();
         ServerHttpRequest request = exchange.getRequest();
+        // CORS 预检请求直接放行,避免 NPE
+        if (HttpMethod.OPTIONS.matches(request.getMethod().name())) {
+            return chain.filter(exchange);
+        }
         boolean contains = request.getURI().getPath().contains("/publicKeyExchange");
         boolean contains = request.getURI().getPath().contains("/publicKeyExchange");
         if(isEncrypted && !contains) {
         if(isEncrypted && !contains) {
+            // 空指针保护
+            List<String> authHeaders = exchange.getRequest().getHeaders().get("authorization");
+            if (authHeaders == null || authHeaders.isEmpty()) {
+                return chain.filter(exchange);
+            }
             String token = exchange.getRequest().getHeaders().get("authorization").get(0);
             String token = exchange.getRequest().getHeaders().get("authorization").get(0);
             String userName = baseController.getUserName(token);
             String userName = baseController.getUserName(token);
             // 使用 ServerHttpRequestDecorator 包装请求
             // 使用 ServerHttpRequestDecorator 包装请求

+ 1 - 8
partner/src/main/java/com/jzg/service/Impl/PartnerUserServiceImpl.java

@@ -94,15 +94,8 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     @Override
     @Override
     public List<RelationalVo> relationalQuery(String id) {
     public List<RelationalVo> relationalQuery(String id) {
         SysUserJzgInfo sysUserJzgInfo = getSysUserJzgInfo(id);
         SysUserJzgInfo sysUserJzgInfo = getSysUserJzgInfo(id);
-        List<RelationalVo> list = new ArrayList<>();
         Integer grade = baseMapper.selectGradeMin(sysUserJzgInfo.getId());
         Integer grade = baseMapper.selectGradeMin(sysUserJzgInfo.getId());
-        List<RelationalVo> partnerUsers = baseMapper.selectByUserId(sysUserJzgInfo.getId(), grade);
-        if (1 < grade) {
-            querySuperiors(list, grade, partnerUsers);
-        }
-        list.addAll(partnerUsers);
-        querySubordinates(partnerUsers, grade, list);
-        return list;
+        return baseMapper.selectByUserId(sysUserJzgInfo.getId(), grade);
     }
     }
 
 
     public void querySuperiors(List<RelationalVo> list, Integer grade, List<RelationalVo> partnerUsers) {
     public void querySuperiors(List<RelationalVo> list, Integer grade, List<RelationalVo> partnerUsers) {

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

@@ -124,8 +124,8 @@ public class DistributionUtils {
         details.setUserName("");
         details.setUserName("");
         details.setIssuerId(userId);
         details.setIssuerId(userId);
         details.setIssuerName("");
         details.setIssuerName("");
-        details.setOrderno(insOrders.getQuoteNo());
-        details.setCompanyId(insOrders.getId());
+        details.setOrderno(insOrders.getId());
+        details.setCompanyId(insOrders.getCompanyId());
         details.setDeptId(partnerUser.getDeptId());
         details.setDeptId(partnerUser.getDeptId());
         details.setLicenseno(licenseNo);
         details.setLicenseno(licenseNo);
         details.setSumpremium(feeOrders.getTotalPremium());
         details.setSumpremium(feeOrders.getTotalPremium());

+ 33 - 20
partner/src/main/resources/mapper/PartnerUserMapper.xml

@@ -144,25 +144,39 @@
     </select>
     </select>
 
 
     <select id="selectByUserId" resultType="com.jzg.entity.vo.RelationalVo">
     <select id="selectByUserId" resultType="com.jzg.entity.vo.RelationalVo">
-        SELECT
-        p.id,
-        p.NAME AS userName,
-        p.mobile,
-        p.user_id,
-        p.dept_id,
-        (SELECT `name` FROM sys_dept d WHERE d.id = p.dept_id AND d.is_delete = 0) AS deptName,
-        (SELECT username FROM sys_user u WHERE u.id = p.referrer_id AND u.is_delete = 0) AS suggestName,
-        p.grade AS type,
-        p.referrer_id,
-        p.create_time
-        FROM
-        partner_user p
-        LEFT JOIN sys_user_jzg_info u ON u.user_id = p.user_id AND u.is_delete = 0
-        <where>
-            AND p.is_delete = 0
-            AND p.user_id = #{id}
-            AND p.grade = #{grade}
-        </where>
+        WITH RECURSIVE cte_name AS (
+            SELECT
+            p.id,
+            p.NAME AS userName,
+            p.mobile,
+            p.user_id,
+            p.dept_id,
+            (SELECT `name` FROM sys_dept d WHERE d.id = p.dept_id AND d.is_delete = 0) AS deptName,
+            (SELECT username FROM sys_user u WHERE u.id = p.referrer_id AND u.is_delete = 0) AS suggestName,
+            p.grade AS type,
+            p.referrer_id,
+            p.create_time
+            FROM
+            partner_user p
+            WHERE p.user_id = #{id} AND grade = #{grade}
+            UNION ALL
+            SELECT
+                pu.id,
+                pu.NAME AS userName,
+                pu.mobile,
+                pu.user_id,
+                pu.dept_id,
+                    (SELECT `name` FROM sys_dept d WHERE d.id = pu.dept_id AND d.is_delete = 0) AS deptName,
+                    (SELECT username FROM sys_user u WHERE u.id = pu.referrer_id AND u.is_delete = 0) AS suggestName,
+                pu.grade AS type,
+                pu.referrer_id,
+                pu.create_time
+                    FROM
+                    partner_user pu
+                    INNER JOIN cte_name rt ON pu.referrer_id = rt.user_id
+                    WHERE  pu.grade = (rt.type + 1)
+                    )
+        SELECT * FROM cte_name
     </select>
     </select>
 
 
     <select id="selectTodayOverview" resultType="com.jzg.entity.vo.TodayOverview">
     <select id="selectTodayOverview" resultType="com.jzg.entity.vo.TodayOverview">
@@ -893,7 +907,6 @@
         LEFT JOIN sys_user_jzg_info u ON u.id = p.user_id AND u.is_delete = 0
         LEFT JOIN sys_user_jzg_info u ON u.id = p.user_id AND u.is_delete = 0
         <where>
         <where>
             p.is_delete = 0
             p.is_delete = 0
-            AND u.`status` = 3
             AND p.user_id = #{userId}
             AND p.user_id = #{userId}
             AND p.grade = #{grade}
             AND p.grade = #{grade}
         </where>
         </where>

+ 4 - 1
tenant/costsorrule/src/main/java/com/jzg/costsorrule/constants/OperatorConstant.java

@@ -41,7 +41,10 @@ public class OperatorConstant {
         //选择框
         //选择框
         GT("4","大于"),
         GT("4","大于"),
         //单选框
         //单选框
-        GE("5","大于等于");
+        GE("5","大于等于"),
+        //不等于
+        NE("6","不等于");
+
 
 
         private final String code;
         private final String code;
         private final String name;
         private final String name;

+ 32 - 24
tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/impl/RuleServiceImpl.java

@@ -130,13 +130,11 @@ public class RuleServiceImpl implements RuleService {
         if (min == null || min.isEmpty()) {
         if (min == null || min.isEmpty()) {
             return false;
             return false;
         }
         }
-        String[] split = min.split(",");
-        for (String sp : split) {
-            if (sp.equals(value)) {
-                return true;
-            }
-        }
-        return false;
+        boolean contains = Arrays.stream(min.split(","))
+                .anyMatch(sp -> sp.trim().equals(value.trim()));
+        // "1"(EQ):在列表中匹配;"6"(NE):不在列表中匹配
+        boolean isEqgate = OperatorConstant.InputNumber.EQ.getCode().equals(linkVo.getOperator());
+        return isEqgate ? contains : !contains;
     }
     }
 
 
     private boolean inputNumberEqual(RuleAttrLinkVo linkVo, String value) {
     private boolean inputNumberEqual(RuleAttrLinkVo linkVo, String value) {
@@ -165,7 +163,7 @@ public class RuleServiceImpl implements RuleService {
                 return true;
                 return true;
             }
             }
         } else if (OperatorConstant.InputNumber.NE.getCode().equals(linkVo.getOperator())) {// 不包含:不在 [min, max] 区间内
         } else if (OperatorConstant.InputNumber.NE.getCode().equals(linkVo.getOperator())) {// 不包含:不在 [min, max] 区间内
-            if (min > v && max < v) {
+            if (min > v || max < v) {
                 return true;
                 return true;
             }
             }
         }
         }
@@ -174,27 +172,32 @@ public class RuleServiceImpl implements RuleService {
 
 
 
 
     private boolean inputTagEqual(RuleAttrLinkVo linkVo, String value) {
     private boolean inputTagEqual(RuleAttrLinkVo linkVo, String value) {
-        //将值进行分割
-
-        AtomicBoolean returnBool = new AtomicBoolean(false);
-
-        List<String> equalsMap = new ArrayList<>();
-        //字符型评分
-        equalsMap.add("CharacterBasedRating");
-        //交强字符型评分
-        equalsMap.add("JqCharacterBasedRating");
-        //商业字符型评分
-        equalsMap.add("SyCharacterBasedRating");
-
-        return returnBool.get();
+        String min = linkVo.getMin();
+        if (min == null || min.isEmpty() || value == null) {
+            return false;
+        }
+        String[] split = min.split(",");
+        List<String> equalsMap = Arrays.asList(
+                "CharacterBasedRating", "JqCharacterBasedRating", "SyCharacterBasedRating");
+        boolean matched;
+        if (equalsMap.contains(linkVo.getAttrCode())) {
+            matched = Arrays.stream(split).anyMatch(value::equals);
+        } else {
+            matched = Arrays.stream(split).anyMatch(value::contains);
+        }
+        boolean isEqgate = OperatorConstant.InputNumber.EQ.getCode().equals(linkVo.getOperator());
+        return isEqgate ? matched : !matched;
     }
     }
 
 
 
 
     private boolean selectEqual(RuleAttrLinkVo linkVo, String value) {
     private boolean selectEqual(RuleAttrLinkVo linkVo, String value) {
-        if (linkVo.getMin() != null && linkVo.getMin().contains(value)) {
-            return true;
+        String min = linkVo.getMin();
+        if (min == null || min.isEmpty() || value == null) {
+            return false;
         }
         }
-        return false;
+        boolean contains = min.contains(value);
+        boolean isEqgate = OperatorConstant.InputNumber.EQ.getCode().equals(linkVo.getOperator());
+        return isEqgate ? contains : !contains;
     }
     }
 
 
     private boolean radioEqual(RuleAttrLinkVo linkVo, String value) {
     private boolean radioEqual(RuleAttrLinkVo linkVo, String value) {
@@ -204,6 +207,7 @@ public class RuleServiceImpl implements RuleService {
             boolean valueBool = Boolean.valueOf(value);
             boolean valueBool = Boolean.valueOf(value);
             if (linkVo.getMin().equals("5") || linkVo.getMin().equals("6")) {
             if (linkVo.getMin().equals("5") || linkVo.getMin().equals("6")) {
                 minValue = linkVo.getMin().equals("5") ? false : true;
                 minValue = linkVo.getMin().equals("5") ? false : true;
+                valueBool = value.equals("5") ? false : true;
             }
             }
             if (linkVo.getOperator().equals(OperatorConstant.InputNumber.EQ.getCode())) {
             if (linkVo.getOperator().equals(OperatorConstant.InputNumber.EQ.getCode())) {
                 return minValue == valueBool;
                 return minValue == valueBool;
@@ -249,6 +253,10 @@ public class RuleServiceImpl implements RuleService {
             if (v.isAfter(max) || v.isEqual(max)) {
             if (v.isAfter(max) || v.isEqual(max)) {
                 return true;
                 return true;
             }
             }
+        } else if (OperatorConstant.DateTime.NE.getCode().equals(linkVo.getOperator())) {
+            if (!(v.isAfter(min) && v.isBefore(max))) {
+                return true;
+            }
         }
         }
         return false;
         return false;
     }
     }

+ 7 - 5
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java

@@ -345,14 +345,15 @@ public class FactorMatch {
 
 
     private static boolean checkBoxEqual(PtlAgreementCostRule rule, String value) {
     private static boolean checkBoxEqual(PtlAgreementCostRule rule, String value) {
         if (rule.getMin() == null || value == null) return false;
         if (rule.getMin() == null || value == null) return false;
-        return Arrays.stream(rule.getMin().split(",")).anyMatch(o -> o.trim().equals(value.trim()));
+        boolean contains = Arrays.stream(rule.getMin().split(",")).anyMatch(o -> o.trim().equals(value.trim()));
+        return "1".equals(rule.getOperator()) ? contains : !contains;
     }
     }
 
 
     private static boolean selectEqual(PtlAgreementCostRule rule, String value, PtlAgreementUndwrtRulesAttr meta) {
     private static boolean selectEqual(PtlAgreementCostRule rule, String value, PtlAgreementUndwrtRulesAttr meta) {
         if (rule.getMin() == null || value == null) return false;
         if (rule.getMin() == null || value == null) return false;
         if ("LicenseArea".equals(meta.getAttrCode()) || "LicenseNo".equals(meta.getAttrCode())) return inputTextEqual(rule, value);
         if ("LicenseArea".equals(meta.getAttrCode()) || "LicenseNo".equals(meta.getAttrCode())) return inputTextEqual(rule, value);
         if ("VehicleAge".equals(meta.getAttrCode())) return inputNumberEqual(rule, value);
         if ("VehicleAge".equals(meta.getAttrCode())) return inputNumberEqual(rule, value);
-        return rule.getMin().contains(value);
+        return "1".equals(rule.getOperator()) ? rule.getMin().contains(value) : !rule.getMin().contains(value);
     }
     }
 
 
     private static boolean radioEqual(PtlAgreementCostRule rule, String value) {
     private static boolean radioEqual(PtlAgreementCostRule rule, String value) {
@@ -362,7 +363,7 @@ public class FactorMatch {
             // min 为 "1" 表示新能源,否则表示非新能源
             // min 为 "1" 表示新能源,否则表示非新能源
             // operator "1"(等于):新能源状态与规则一致即匹配;operator "6"(不包含):相反
             // operator "1"(等于):新能源状态与规则一致即匹配;operator "6"(不包含):相反
             boolean matched = EnergyTypeCode.isNewEnergy(value) == "1".equals(min);
             boolean matched = EnergyTypeCode.isNewEnergy(value) == "1".equals(min);
-            return "6".equals(rule.getOperator()) ? !matched : matched;
+            return "1".equals(rule.getOperator()) ? matched : !matched;
         }
         }
         return "1".equals(rule.getOperator()) ? min.contains(value) : !min.contains(value);
         return "1".equals(rule.getOperator()) ? min.contains(value) : !min.contains(value);
     }
     }
@@ -389,12 +390,12 @@ public class FactorMatch {
         String[] split = rule.getMin().split(",");
         String[] split = rule.getMin().split(",");
         List<String> equalsMap = Arrays.asList("CharacterBasedRating", "JqCharacterBasedRating", "SyCharacterBasedRating");
         List<String> equalsMap = Arrays.asList("CharacterBasedRating", "JqCharacterBasedRating", "SyCharacterBasedRating");
         if (equalsMap.contains(rule.getAttrCode())) {
         if (equalsMap.contains(rule.getAttrCode())) {
-            return Arrays.stream(split).anyMatch(value::equals);
+            return "1".equals(rule.getOperator()) ? Arrays.stream(split).anyMatch(value::equals) : Arrays.stream(split).noneMatch(value::equals);
         }
         }
         boolean contains = Arrays.stream(split).anyMatch(value::contains);
         boolean contains = Arrays.stream(split).anyMatch(value::contains);
         boolean notOp = ("BrandandModel".equals(rule.getAttrCode()) || "CarOwnerName".equals(rule.getAttrCode())
         boolean notOp = ("BrandandModel".equals(rule.getAttrCode()) || "CarOwnerName".equals(rule.getAttrCode())
                 || "CarOwnersAddress".equals(rule.getAttrCode()) || "ApplicantAddress".equals(rule.getAttrCode())
                 || "CarOwnersAddress".equals(rule.getAttrCode()) || "ApplicantAddress".equals(rule.getAttrCode())
-                || "InsuredAddress".equals(rule.getAttrCode())) && "2".equals(rule.getOperator());
+                || "InsuredAddress".equals(rule.getAttrCode())) && ("6".equals(rule.getOperator()) || "2".equals(rule.getOperator()));
         return notOp ? !contains : contains;
         return notOp ? !contains : contains;
     }
     }
 
 
@@ -422,6 +423,7 @@ public class FactorMatch {
             case "3": return !v.isAfter(min);
             case "3": return !v.isAfter(min);
             case "4": return v.isAfter(max);
             case "4": return v.isAfter(max);
             case "5": return !v.isBefore(max);
             case "5": return !v.isBefore(max);
+            case "6": return !v.isAfter(min) || !v.isBefore(max);
             default:  return false;
             default:  return false;
         }
         }
     }
     }

+ 8 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java

@@ -301,4 +301,12 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      * @date 2026/8/6 9:38
      * @date 2026/8/6 9:38
      */
      */
     List<String> queryDistinctParternerCompanyId(@Param("incomeIds") List<String> incomeIds);
     List<String> queryDistinctParternerCompanyId(@Param("incomeIds") List<String> incomeIds);
+
+    /**
+     * 查询应收订单涉及到的对接人
+     *
+     * @author lipf
+     * @date 2026/9/1 19:17
+     */
+    List<String> queryConcatCount(@Param("incomeIds") List<String> incomeIds);
 }
 }

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

@@ -414,6 +414,8 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
 
 
         Map<String, String> userName2Name = sysUserJzgInfoService.queryUserInfoUserName2Name(baseController.getSystemCode());
         Map<String, String> userName2Name = sysUserJzgInfoService.queryUserInfoUserName2Name(baseController.getSystemCode());
         Page<CostManagementVo> costManagementVoPage = baseMapper.pageList(costParam.getPage(), costParam);
         Page<CostManagementVo> costManagementVoPage = baseMapper.pageList(costParam.getPage(), costParam);
+        // 按承保规则属性 sort 正序,重新排列 cost_rules 各段描述
+        reorderCostRules(costManagementVoPage.getRecords());
         costManagementVoPage.getRecords().forEach(item->{
         costManagementVoPage.getRecords().forEach(item->{
             if(item.getCostRules() != null && !item.getCostRules().isEmpty()){
             if(item.getCostRules() != null && !item.getCostRules().isEmpty()){
                 item.setCostRules(item.getCostRules().substring(0,item.getCostRules().length()-1));
                 item.setCostRules(item.getCostRules().substring(0,item.getCostRules().length()-1));
@@ -428,6 +430,67 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
         return HttpResult.ok(costManagementVoPage);
         return HttpResult.ok(costManagementVoPage);
     }
     }
 
 
+    /**
+     * 重新排序费用规则描述(cost_rules)
+     * 流程:
+     * 1. 查询所有 ptl_agreement_undwrt_rules_attr,按 sort 正序排列
+     * 2. 将 cost_rules 按 ";\t\t" 分段
+     * 3. 用 contains 判断每段包含哪个属性名(attr_name),按 sort 顺序重新排列各段
+     * 4. 重新拼接并赋值 cost_rules
+     *
+     * @param records 费用管理分页记录
+     */
+    private void reorderCostRules(List<CostManagementVo> records) {
+        if (CollectionUtils.isEmpty(records)) {
+            return;
+        }
+        // 查询所有承保规则属性,按 sort 正序排列
+        List<PtlAgreementUndwrtRulesAttr> sortedAttrs = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList().stream()
+                .filter(attr -> StrUtil.isNotEmpty(attr.getAttrName()))
+                .sorted(Comparator.comparing(PtlAgreementUndwrtRulesAttr::getSort, Comparator.nullsLast(Integer::compareTo)))
+                .collect(Collectors.toList());
+        if (sortedAttrs.isEmpty()) {
+            return;
+        }
+        // cost_rules 各段以 ";\t\t" 分隔
+        String separator = ";\t\t";
+        for (CostManagementVo item : records) {
+            String costRules = item.getCostRules();
+            if (StrUtil.isEmpty(costRules)) {
+                continue;
+            }
+            // 按 separator 分段,过滤空段
+            List<String> segList = Arrays.stream(costRules.split(separator))
+                    .filter(s -> !s.isEmpty())
+                    .collect(Collectors.toList());
+            if (segList.isEmpty()) {
+                continue;
+            }
+            // 为每段确定排序值:用 contains 判断包含哪个属性名,取对应 sort
+            List<Map.Entry<String, Integer>> segWithSort = new ArrayList<>();
+            for (String seg : segList) {
+                Integer sortVal = null;
+                for (PtlAgreementUndwrtRulesAttr attr : sortedAttrs) {
+                    if (seg.contains(attr.getAttrName())) {
+                        sortVal = attr.getSort();
+                        break;
+                    }
+                }
+                segWithSort.add(new AbstractMap.SimpleEntry<>(seg, sortVal));
+            }
+            // 按 sort 正序排列(未匹配到的段置后,保持原顺序)
+            segWithSort.sort(Comparator.comparing(e -> e.getValue() == null ? Integer.MAX_VALUE : e.getValue()));
+            // 重新拼接并赋值 cost_rules
+            String newCostRules = segWithSort.stream()
+                    .map(Map.Entry::getKey)
+                    .collect(Collectors.joining(separator));
+            if (StrUtil.isNotBlank(newCostRules)) {
+                newCostRules = newCostRules + separator;
+            }
+            item.setCostRules(newCostRules);
+        }
+    }
+
     @GlobalTransactional
     @GlobalTransactional
     @Override
     @Override
     public HttpResult costCopy(PtlAgreementCostCopyParam costCopyParam) {
     public HttpResult costCopy(PtlAgreementCostCopyParam costCopyParam) {

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

@@ -172,7 +172,6 @@ public class PtlAgreementUndwrtRulesAttrServiceImpl extends ServiceImpl<PtlAgree
     @Override
     @Override
     public Map<String, List<PtlAgreementUndwrtRulesAttr>> attrGroup(RulesAttParam param) {
     public Map<String, List<PtlAgreementUndwrtRulesAttr>> attrGroup(RulesAttParam param) {
         try {
         try {
-
             LambdaQueryWrapper<PtlAgreementUndwrtRulesAttr> lambdaQueryWrapper = new LambdaQueryWrapper<>();
             LambdaQueryWrapper<PtlAgreementUndwrtRulesAttr> lambdaQueryWrapper = new LambdaQueryWrapper<>();
             lambdaQueryWrapper.like(StringUtils.isNotEmpty(param.getScopeApplication()), PtlAgreementUndwrtRulesAttr::getScopeApplication, param.getScopeApplication());
             lambdaQueryWrapper.like(StringUtils.isNotEmpty(param.getScopeApplication()), PtlAgreementUndwrtRulesAttr::getScopeApplication, param.getScopeApplication());
             if(Objects.nonNull(param.getCompanyId())){
             if(Objects.nonNull(param.getCompanyId())){

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

@@ -2254,6 +2254,12 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if (StrUtil.isBlank(platformSettlementVo.getInvoicingVo().getContactPerson())){
         if (StrUtil.isBlank(platformSettlementVo.getInvoicingVo().getContactPerson())){
             throw new SystemException("对接人信息不能为空");
             throw new SystemException("对接人信息不能为空");
         }
         }
+        // add by lipf 校验对接人一致
+        List<String> incomeIds = invoicingVo.getIncomeIds();
+        List<String> concatPersons = baseMapper.queryConcatCount(incomeIds);
+        if(CollUtil.size(concatPersons) == 0 || CollUtil.size(concatPersons) >1){
+            throw new SystemException("所选记录的对接人不唯一");
+        }
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         LocalDateTime settlementDateTime = LocalDateTime.parse(platformSettlementVo.getSettlementVo().getReceivePaymentDate(), formatter);
         LocalDateTime settlementDateTime = LocalDateTime.parse(platformSettlementVo.getSettlementVo().getReceivePaymentDate(), formatter);
         try {
         try {

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

@@ -101,7 +101,9 @@ public class SysUserJzgAppServiceImpl extends ServiceImpl<SysUserJzgAppMapper, S
         }
         }
         log.info("获取用户信息:systemCode=[{}],userName=[{}]", systemCode, userName);
         log.info("获取用户信息:systemCode=[{}],userName=[{}]", systemCode, userName);
         UserInfoVo infoVo = sysUserJzgAppMapper.userInfoGet(userName,systemCode);
         UserInfoVo infoVo = sysUserJzgAppMapper.userInfoGet(userName,systemCode);
-        infoVo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", infoVo.getHeadSculpture()));
+        if(Objects.nonNull(infoVo.getHeadSculpture())) {
+            infoVo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", infoVo.getHeadSculpture()));
+        }
         // 获取身份信息
         // 获取身份信息
         LambdaQueryWrapper<SysUserJzgInfo> queryWrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<SysUserJzgInfo> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.select(SysUserJzgInfo::getTypeAttr)
         queryWrapper.select(SysUserJzgInfo::getTypeAttr)

+ 9 - 1
tenant/organization/src/main/resources/mapper/PtlAgreementCostExternalMapper.xml

@@ -58,6 +58,7 @@
         <result column="update_by" property="updateBy" />
         <result column="update_by" property="updateBy" />
         <result column="is_delete" property="isDelete" />
         <result column="is_delete" property="isDelete" />
         <result column="system_code" property="systemCode" />
         <result column="system_code" property="systemCode" />
+        <result column="agreement_title" property="agreementTitle" />
         <collection property="costExternalTypeAdds" column="id" ofType="com.jzg.commons.entity.vo.CostExternalTypeVo" select="selectCostExternalTypeVo" />
         <collection property="costExternalTypeAdds" column="id" ofType="com.jzg.commons.entity.vo.CostExternalTypeVo" select="selectCostExternalTypeVo" />
     </resultMap>
     </resultMap>
 
 
@@ -155,7 +156,8 @@
         ce.add_throw,
         ce.add_throw,
         ce.keep_point_ratio,
         ce.keep_point_ratio,
         pa.agreement_code,
         pa.agreement_code,
-        pa.agreement_abbreviation
+        pa.agreement_abbreviation,
+        pa.agreement_title
         FROM
         FROM
         ptl_agreement_cost_external ce
         ptl_agreement_cost_external ce
         LEFT JOIN ptl_agreement pa ON pa.id = ce.ptl_agreement_id AND pa.is_delete = 0
         LEFT JOIN ptl_agreement pa ON pa.id = ce.ptl_agreement_id AND pa.is_delete = 0
@@ -173,6 +175,12 @@
             <if test="costParam.ptlAgreementId != null and costParam.ptlAgreementId != ''">
             <if test="costParam.ptlAgreementId != null and costParam.ptlAgreementId != ''">
                 AND ce.ptl_agreement_id = #{costParam.ptlAgreementId}
                 AND ce.ptl_agreement_id = #{costParam.ptlAgreementId}
             </if>
             </if>
+            <if test="costParam.agreementIds.length > 0 ">
+                AND ce.ptl_agreement_id in
+                <foreach collection="costParam.agreementIds" item="ptlAgreementId" separator="," open="(" close=")">
+                    #{ptlAgreementId}
+                </foreach>
+            </if>
             <if test="costParam.rulesName != null and costParam.rulesName != ''">
             <if test="costParam.rulesName != null and costParam.rulesName != ''">
                 AND ce.rule_description  like concat('%',#{costParam.rulesName},'%')
                 AND ce.rule_description  like concat('%',#{costParam.rulesName},'%')
             </if>
             </if>

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

@@ -2371,6 +2371,16 @@
             </foreach>
             </foreach>
         </where>
         </where>
     </select>
     </select>
+    <!-- 查询应收订单涉及到的对接人 lipf 2026年9月1日19:18:26 -->
+    <select id="queryConcatCount" resultType="java.lang.String">
+        select distinct ipi.contact_person   from ins_ply_income ipi
+        <where>
+            ipi.id in
+            <foreach collection="incomeIds" separator="," close=")" open="(" item="id">
+                #{id}
+            </foreach>
+        </where>
+    </select>
 
 
 
 
 </mapper>
 </mapper>

+ 23 - 12
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -126,38 +126,49 @@
         order by suji.create_time desc
         order by suji.create_time desc
     </select>
     </select>
     <select id="queryBJYwy" resultMap="BaseResultMap">
     <select id="queryBJYwy" resultMap="BaseResultMap">
-        select
+
+        WITH RECURSIVE leader_tree AS (
+        SELECT id, leader_id, 1 AS depth,system_code
+        FROM sys_user_jzg_info
+        WHERE leader_id = #{leaderId}
+        AND is_delete = 0
+        UNION ALL
+        SELECT t.id, t.leader_id, lt.depth + 1,t.system_code
+        FROM sys_user_jzg_info t
+        INNER JOIN leader_tree lt ON t.leader_id = lt.id
+        WHERE t.is_delete = 0
+        AND lt.depth <![CDATA[  <  ]]> 10
+        )
+        SELECT
         suji.id,
         suji.id,
         suji.user_id,
         suji.user_id,
         suji.work_number,
         suji.work_number,
         su.username,
         su.username,
-        su.mobile ,
+        su.mobile,
         suji.name,
         suji.name,
         suji.dept_id,
         suji.dept_id,
         sd.name AS dept_name,
         sd.name AS dept_name,
         suji.status,
         suji.status,
         suji.is_enable,
         suji.is_enable,
         lsu.name AS leader_name,
         lsu.name AS leader_name,
-        ( select  aa.mobile from sys_user aa
-        where aa.id = lsu.user_id AND aa.is_delete = 0 ) AS leader_id,
-        (select re.name from sys_user_jzg_info re where re.id = suji.referrer_id) referrer_name,
+        (SELECT aa.mobile FROM sys_user aa
+        WHERE aa.id = lsu.user_id AND aa.is_delete = 0) AS leader_id,
+        (SELECT re.name FROM sys_user_jzg_info re WHERE re.id = suji.referrer_id) AS referrer_name,
         suji.referrer_id,
         suji.referrer_id,
         suji.create_time AS createTime,
         suji.create_time AS createTime,
         suji.create_by AS createBy
         suji.create_by AS createBy
-        from
+        FROM
         sys_user_jzg_info suji
         sys_user_jzg_info suji
-        left join sys_user su on su.id = suji.user_id AND su.is_delete = 0
-        LEFT JOIN sys_user_jzg_info lsu on lsu.id = suji.leader_id AND lsu.is_delete = 0
-        left join sys_dept sd on sd.id = suji.dept_id AND sd.is_delete = 0
+        INNER JOIN leader_tree lt ON suji.id = lt.id
+        LEFT JOIN sys_user su ON su.id = suji.user_id AND su.is_delete = 0
+        LEFT JOIN sys_user_jzg_info lsu ON lsu.id = suji.leader_id AND lsu.is_delete = 0
+        LEFT JOIN sys_dept sd ON sd.id = suji.dept_id AND sd.is_delete = 0
         LEFT JOIN sys_dept d ON suji.dept_id = d.id AND d.is_delete = 0
         LEFT JOIN sys_dept d ON suji.dept_id = d.id AND d.is_delete = 0
         <where>
         <where>
             suji.is_delete = 0
             suji.is_delete = 0
             and suji.id  in (
             and suji.id  in (
             select sujis.sys_user_jzg_info_id  from sys_user_jzg_info_salesman sujis  where  sujis.type_attr != 2 AND sujis.type_attr != 3
             select sujis.sys_user_jzg_info_id  from sys_user_jzg_info_salesman sujis  where  sujis.type_attr != 2 AND sujis.type_attr != 3
             )
             )
-            <if test="leaderId != null and leaderId != ''">
-                and suji.leader_id = #{leaderId}
-            </if>
             <if test="sysUserInfoListVo.deptId != null and sysUserInfoListVo.deptId != ''">
             <if test="sysUserInfoListVo.deptId != null and sysUserInfoListVo.deptId != ''">
                 and d.route LIKE CONCAT('%', #{sysUserInfoListVo.deptId}, '%')
                 and d.route LIKE CONCAT('%', #{sysUserInfoListVo.deptId}, '%')
             </if>
             </if>