Эх сурвалжийг харах

Merge branch 'dev_jzb_lipf_v20260427' into dev_jzg_lipf_cxbj_v20260416

# Conflicts:
#	tenant/organization/src/main/resources/mapper/SysOrganizationUserLinkServiceMapper.xml
lipf 5 сар өмнө
parent
commit
a3bd54f0c7
77 өөрчлөгдсөн 1324 нэмэгдсэн , 179 устгасан
  1. 12 1
      README.md
  2. 5 2
      authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java
  3. 4 2
      authentication/src/main/java/com/jzg/mapper/SysUserJzgInfoMapper.java
  4. 61 0
      authentication/src/main/resources/mapper/SysUserJzgInfoMapper.xml
  5. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/CostManagementVo.java
  6. 12 0
      commons/src/main/java/com/jzg/commons/entity/dto/JyxConfigAdd.java
  7. 12 0
      commons/src/main/java/com/jzg/commons/entity/dto/JyxConfigEnd.java
  8. 9 0
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostExternalAdd.java
  9. 6 2
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoDto.java
  10. 10 0
      commons/src/main/java/com/jzg/commons/entity/po/JyxConfig.java
  11. 5 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementCostExternal.java
  12. 7 1
      commons/src/main/java/com/jzg/commons/entity/po/SysDistributionSetting.java
  13. 53 0
      commons/src/main/java/com/jzg/commons/entity/po/SysDistributionSettingVO.java
  14. 36 0
      commons/src/main/java/com/jzg/commons/entity/po/SysOrganizationVO.java
  15. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java
  16. 5 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/AccidentalDrivingVo.java
  17. 78 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/SalespersonInfoVo.java
  18. 2 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/SchemeResultVo.java
  19. 4 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/SchemeRuleFilterVo.java
  20. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/CostExternalListVo.java
  21. 12 0
      commons/src/main/java/com/jzg/commons/entity/vo/JyxConfigVo.java
  22. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/SysUserInfoListVo.java
  23. 4 0
      platform/src/main/resources/mapper/SysUserJzgInfoMapper.xml
  24. 1 1
      rocketmq/src/main/java/com/jzg/templete/RocketMQEnhanceTemplate.java
  25. 14 3
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Request/NonAutoInsOrderRequest.java
  26. 1 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java
  27. 2 1
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java
  28. 1 2
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/constant/enums/RequestUrl.java
  29. 2 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java
  30. 9 1
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java
  31. 64 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerRecordResponse.java
  32. 106 76
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  33. 0 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java
  34. 4 1
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java
  35. 2 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java
  36. 3 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  37. 2 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  38. 10 4
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/component/ZiJinApiCacheComponent.java
  39. 9 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/component/ZiJinApiRequestComponent.java
  40. 47 2
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/service/Impl/ZiJinApiRequestImpl.java
  41. 5 10
      tenant/organization/src/main/java/com/jzg/organization/controller/AccountController.java
  42. 49 14
      tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java
  43. 7 1
      tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementCostController.java
  44. 8 1
      tenant/organization/src/main/java/com/jzg/organization/controller/SysDistributionSettingController.java
  45. 8 1
      tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java
  46. 9 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysOrganizationMapper.java
  47. 35 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java
  48. 6 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserMapper.java
  49. 8 1
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java
  50. 11 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementService.java
  51. 8 1
      tenant/organization/src/main/java/com/jzg/organization/service/SysDistributionSettingService.java
  52. 11 1
      tenant/organization/src/main/java/com/jzg/organization/service/SysOrganizationService.java
  53. 11 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoSalesmanService.java
  54. 21 2
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoService.java
  55. 1 6
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserRoleService.java
  56. 7 1
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java
  57. 6 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/InvAccountCardServiceImpl.java
  58. 13 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/InvAccountServiceImpl.java
  59. 7 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java
  60. 37 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java
  61. 78 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  62. 4 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  63. 1 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDictServiceImpl.java
  64. 5 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDistributionSettingServiceImpl.java
  65. 22 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysOrganizationServiceImpl.java
  66. 11 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysOrganizationUserLinkServiceImpl.java
  67. 3 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgAppServiceImpl.java
  68. 40 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoSalesmanServiceImpl.java
  69. 20 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoServiceImpl.java
  70. 63 5
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java
  71. 3 1
      tenant/organization/src/main/resources/mapper/PtlAgreementCostExternalMapper.xml
  72. 1 0
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  73. 4 0
      tenant/organization/src/main/resources/mapper/PtlSchemeMapper.xml
  74. 15 0
      tenant/organization/src/main/resources/mapper/SysOrganizationMapper.xml
  75. 2 4
      tenant/organization/src/main/resources/mapper/SysOrganizationUserLinkServiceMapper.xml
  76. 154 14
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml
  77. 1 1
      tenant/organization/src/main/resources/mapper/SysUserMapper.xml

+ 12 - 1
README.md

@@ -17,7 +17,18 @@
 | 10 | operation-Backend                 | xxx  | 前端:平台管理系统 | 否      |
 | 11 | tenant-Platform                   | xxx  | 前端:租户系统   | 否      |
 
-
+## 应用版本依赖
+| 序号 | 依赖软件         | 版本     | 备注     |
+|:---|:-------------|:-------|:-------|
+| 1  | JDK          | JDK17  | JDK8不行 |
+| 2  | Apache Maven | 3.9.14 |        |
+
+## 相关命令
+```shell
+mvn clean
+mvn package -DskipTests
+mvn clean install -DskipTests
+```
 
 ## 其它
 

+ 5 - 2
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -1,5 +1,6 @@
 package com.jzg.config;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONUtil;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
@@ -121,11 +122,13 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
             if(Objects.isNull(weblogUser)){
                 throw new SystemException("用户名不存在");
             }
-            SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoMapper.queryJzgInfoByUserId(weblogUser.getId());
-            if(sysUserJzgInfo == null){
+            // 同一个业务可能存在于多个租户,因此这里可能查询出多个
+            List<SysUserJzgInfo> sysUserJzgInfos = sysUserJzgInfoMapper.queryJzgInfoByUserId(weblogUser.getId());
+            if(CollectionUtil.isEmpty(sysUserJzgInfos)){
                 log.info("登录异常:用户不存在。 userId=[{}]",weblogUser.getId());
                 throw new SystemException("业务员不存在");
             }
+            SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfos.get(0);
             if (!sysUserJzgInfo.canLogin()) {
                 log.info("用户被禁用,不能登录。sysUserJzgInfo=[{}]", JSONUtil.toJsonStr(sysUserJzgInfo));
                 throw new SystemException("用户已被禁用,无法登录");

+ 4 - 2
authentication/src/main/java/com/jzg/mapper/SysUserJzgInfoMapper.java

@@ -3,8 +3,11 @@ package com.jzg.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jzg.commons.entity.po.SysUserJzgInfo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.util.List;
+
 @Mapper
 public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
 
@@ -17,6 +20,5 @@ public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
      * @author lipf
      * @date 2026/4/22 11:13
      */
-    @Select("select * from sys_user_jzg_info a where a.user_id  = #{userId,jdbcType=DECIMAL}")
-    SysUserJzgInfo queryJzgInfoByUserId(String userId);
+    List<SysUserJzgInfo> queryJzgInfoByUserId(@Param("userId") String userId);
 }

+ 61 - 0
authentication/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.mapper.SysUserJzgInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.jzg.commons.entity.po.SysUserJzgInfo">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+            <result property="systemCode" column="system_code" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="deptId" column="dept_id" jdbcType="VARCHAR"/>
+            <result property="openId" column="open_id" jdbcType="VARCHAR"/>
+            <result property="alipay" column="alipay" jdbcType="VARCHAR"/>
+            <result property="approvalOpinion" column="approval_opinion" jdbcType="VARCHAR"/>
+            <result property="identity" column="identity" jdbcType="VARCHAR"/>
+            <result property="identityTimeStart" column="identity_time_start" jdbcType="VARCHAR"/>
+            <result property="identityTimeEnd" column="identity_time_end" jdbcType="VARCHAR"/>
+            <result property="logoutTime" column="logout_time" jdbcType="DATE"/>
+            <result property="headSculpture" column="head_sculpture" jdbcType="VARCHAR"/>
+            <result property="factorVerify" column="factor_verify" jdbcType="TINYINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
+            <result property="address" column="address" jdbcType="VARCHAR"/>
+            <result property="nations" column="nations" jdbcType="VARCHAR"/>
+            <result property="bankName" column="bank_name" jdbcType="VARCHAR"/>
+            <result property="bankCardId" column="bank_card_id" jdbcType="VARCHAR"/>
+            <result property="koseki" column="koseki" jdbcType="VARCHAR"/>
+            <result property="birthday" column="birthday" jdbcType="DATE"/>
+            <result property="maritalStatus" column="marital_status" jdbcType="VARCHAR"/>
+            <result property="politicsStatus" column="politics_status" jdbcType="VARCHAR"/>
+            <result property="health" column="health" jdbcType="VARCHAR"/>
+            <result property="postalCode" column="postal_code" jdbcType="VARCHAR"/>
+            <result property="bloodType" column="blood_type" jdbcType="VARCHAR"/>
+            <result property="education" column="education" jdbcType="VARCHAR"/>
+            <result property="school" column="school" jdbcType="VARCHAR"/>
+            <result property="graduationTime" column="graduation_time" jdbcType="DATE"/>
+            <result property="isComputer" column="is_computer" jdbcType="TINYINT"/>
+            <result property="formerEmployer" column="former_employer" jdbcType="VARCHAR"/>
+            <result property="entryTime" column="entry_time" jdbcType="DATE"/>
+            <result property="agentQualificationCode" column="agent_qualification_code" jdbcType="VARCHAR"/>
+            <result property="emergencyContactTel" column="emergency_contact_tel" jdbcType="VARCHAR"/>
+            <result property="emergencyContactName" column="emergency_contact_name" jdbcType="VARCHAR"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+            <result property="email" column="email" jdbcType="VARCHAR"/>
+            <result property="sex" column="sex" jdbcType="VARCHAR"/>
+            <result property="speciality" column="speciality" jdbcType="VARCHAR"/>
+            <result property="salary" column="salary" jdbcType="DECIMAL"/>
+            <result property="salaryLevel" column="salary_level" jdbcType="VARCHAR"/>
+            <result property="liveAddress" column="live_address" jdbcType="VARCHAR"/>
+            <result property="province" column="province" jdbcType="VARCHAR"/>
+            <result property="city" column="city" jdbcType="VARCHAR"/>
+            <result property="district" column="district" jdbcType="VARCHAR"/>
+    </resultMap>
+    <!-- 一个业务员可能存在于多个租户 lipf 2026年4月24日17:56:31  -->
+    <select id="queryJzgInfoByUserId" resultMap="BaseResultMap">
+        select * from sys_user_jzg_info a where a.user_id  = #{userId,jdbcType=DECIMAL} and a.is_delete = 0
+    </select>
+</mapper>

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

@@ -80,4 +80,7 @@ public class CostManagementVo {
     @Schema(description = "规则条件集合")
     private List<PtlAgreementCostRuleVo> ruleConditions;
 
+    @Schema(description = "协议描述")
+    private String agreementName;
+
 }

+ 12 - 0
commons/src/main/java/com/jzg/commons/entity/dto/JyxConfigAdd.java

@@ -49,6 +49,18 @@ public class JyxConfigAdd {
     @Schema(description = "总保费")
     private BigDecimal premium;
 
+    /**
+     * 附加Code
+     */
+    @Schema(description = "附加Code")
+    private String riskCode;
+
+    /**
+     * 父产品编码
+     */
+    @Schema(description = "父产品编码")
+    private String parentProductCode;
+
 
     @Schema(description = "保险责任")
     //@NotEmpty(message = "保险责任不能为空")

+ 12 - 0
commons/src/main/java/com/jzg/commons/entity/dto/JyxConfigEnd.java

@@ -57,6 +57,18 @@ public class JyxConfigEnd {
     @Schema(description = "租户编码")
     private String systemCode;
 
+    /**
+     * 附加Code
+     */
+    @Schema(description = "附加Code")
+    private String riskCode;
+
+    /**
+     * 父产品编码
+     */
+    @Schema(description = "父产品编码")
+    private String parentProductCode;
+
     @Schema(description = "保险责任")
     private List<JyxBlame> blameList;
 

+ 9 - 0
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostExternalAdd.java

@@ -49,6 +49,9 @@ public class PtlAgreementCostExternalAdd {
     @Schema(description = "对接人手机号")
     private String contactMobile;
 
+    @Schema(description = "优先级")
+    private String priorityLevel;
+
     @Schema(description = "费用类型集合")
     private List<PtlAgreementCostExternalTypeAdd> costExternalTypeAdds;
 
@@ -66,6 +69,12 @@ public class PtlAgreementCostExternalAdd {
         @Schema(description = "出口比例")
         private BigDecimal export;
 
+        @Schema(description = "加投比例")
+        private BigDecimal addThrow;
+
+        @Schema(description = "留点比例")
+        private BigDecimal keepPointRatio;
+
         @Schema(description = "总费用比例")
         private BigDecimal totalCost;
 

+ 6 - 2
commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoDto.java

@@ -1,7 +1,5 @@
 package com.jzg.commons.entity.dto;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -15,6 +13,12 @@ import java.time.LocalDateTime;
 
 @Data
 public class SysUserJzgInfoDto {
+
+    /**
+     * 是否默认选中
+     */
+    private boolean defaultSelected;
+
     public String id;
 
     public String userId;

+ 10 - 0
commons/src/main/java/com/jzg/commons/entity/po/JyxConfig.java

@@ -38,4 +38,14 @@ public class JyxConfig extends BaseModel {
 
     private String systemCode;
 
+    /**
+     * 附加Code
+     */
+    private String riskCode;
+
+    /**
+     * 父产品编码
+     */
+    private String parentProductCode;
+
 }

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementCostExternal.java

@@ -47,5 +47,10 @@ public class PtlAgreementCostExternal extends BaseModel {
 
     private String auditPerson;
 
+    /**
+     * 优先级
+     */
+    private String priorityLevel;
+
 
 }

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

@@ -9,6 +9,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -21,7 +23,11 @@ import java.util.List;
 @TableName("sys_distribution_setting")
 @NoArgsConstructor
 @AllArgsConstructor
-public class SysDistributionSetting {
+public class SysDistributionSetting implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5283654276005417794L;
+
     @TableId(type = IdType.ASSIGN_ID)
     private String id;
 

+ 53 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysDistributionSettingVO.java

@@ -0,0 +1,53 @@
+package com.jzg.commons.entity.po;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/6 11:16
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysDistributionSettingVO implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = -5860522632566061177L;
+
+    private String id;
+
+    @Schema(description = "分销模式 1-一级分销 2-二级分销 3-三级分销")
+    private String distributionMode;
+
+    @Schema(description = "一级佣金比例(%)")
+    private BigDecimal commissionRatioLevel1;
+
+    @Schema(description = "二级佣金比例(%)")
+    private BigDecimal commissionRatioLevel2;
+
+    @Schema(description = "三级佣金比例(%)")
+    private BigDecimal commissionRatioLevel3;
+
+    @Schema(description = "分销员招募方式:1-手动申请 2-加入组织自动成为分销员")
+    private String recruitmentMethod;
+
+    @Schema(description = "不参与分销的机构范围:1-全部机构 2-部分机构")
+    private String excludeDeptScope;
+
+    @Schema(description = "租户code")
+    private String systemCode;
+
+    @Schema(description = "不参与分销的机构")
+    private List<SysDept> excludeDept;
+}

+ 36 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysOrganizationVO.java

@@ -0,0 +1,36 @@
+package com.jzg.commons.entity.po;
+
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+
+
+@Data
+public class SysOrganizationVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -4723253479496099256L;
+    private String id;
+
+    private String systemCode;
+
+    private String name;
+
+    private String deptId;
+
+    private String managerId;
+
+    private String describeInformation;
+
+    private int attribute;
+
+    private String userId;
+
+    private String organizationId;
+
+    private int memberNumber;
+
+    private String deptName;
+
+
+}

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

@@ -12,6 +12,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serial;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -27,6 +28,8 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class SysUserJzgInfo extends BaseModel implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -6698888651817300899L;
     @TableId(value = "id")
     @Schema(description = "主键")
     private String id;

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

@@ -41,6 +41,11 @@ public class AccidentalDrivingVo implements Serializable {
      */
     @Schema(description = "产品编码")
     private String productCode;
+    /**
+     * 父产品编码
+     */
+    @Schema(description = "父产品编码")
+    private String parentProductCode;
     /**
      * 产品名称
      */

+ 78 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/SalespersonInfoVo.java

@@ -0,0 +1,78 @@
+package com.jzg.commons.entity.quote.vo;
+
+
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.IDCardUtils;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.format.DateTimeFormatter;
+import java.util.Objects;
+
+/**
+ * @description: 业务员信息
+ * @author: wenks
+ * @date: 2025/2/18 10:56
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SalespersonInfoVo implements Serializable {
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "用户ID")
+    private String userId;
+
+    @Schema(description = "用户名")
+    private String username;
+
+    @Schema(description = "姓名")
+    private String name;
+
+    @Schema(description = "手机号")
+    private String mobile;
+
+    @Schema(description = "部门ID")
+    private String deptId;
+
+    @Schema(description = "部门名称")
+    private String deptName;
+
+    @Schema(description = "类型属性")
+    private String typeAttr;
+
+    @Schema(description = "状态")
+    private String status;
+
+    @Schema(description = "负责人ID")
+    private String leaderId;
+
+    @Schema(description = "负责人名称")
+    private String leaderName;
+
+    @Schema(description = "推荐人ID")
+    private String referrerId;
+
+    @Schema(description = "推荐人名称")
+    private String referrerName;
+
+    @Schema(description = "工号")
+    private String workNumber;
+
+    @Schema(description = "角色名称")
+    private String roleName;
+
+    @Schema(description = "组织ID")
+    private String organizationId;
+
+    @Schema(description = "组织名称")
+    private String organizationName;
+
+}

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

@@ -92,6 +92,8 @@ public class SchemeResultVo {
         private String id;
         private String productName;
         private String productCode;
+        private String riskCode;
+        private String parentProductCode;
         private String alias;
         private String coverage;
         private String premium;

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

@@ -2,6 +2,7 @@ package com.jzg.commons.entity.scheme.vo;
 
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.SalespersonInfoVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
 import lombok.Data;
@@ -29,6 +30,9 @@ public class SchemeRuleFilterVo {
     @Schema(description =  "被保人信息")
     private CustomerInfoVo insureInfo;
 
+    @Schema(description =  "业务员信息")
+    private SalespersonInfoVo salespersonInfo;
+
     @Schema(description =  "用户id")
     private String userId;
 

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

@@ -82,6 +82,9 @@ public class CostExternalListVo {
     @Schema(description = "审核描述")
     private String reviewDescription;
 
+    @Schema(description = "优先级")
+    private String priorityLevel;
+
     @Schema(description = "费用类型")
     private List<CostExternalTypeVo>  costExternalTypeAdds;
 

+ 12 - 0
commons/src/main/java/com/jzg/commons/entity/vo/JyxConfigVo.java

@@ -41,6 +41,18 @@ public class JyxConfigVo {
     @Schema(description = "保费设置")
     private String premiumSetting;
 
+    /**
+     * 附加Code
+     */
+    @Schema(description = "附加Code")
+    private String riskCode;
+
+    /**
+     * 父产品编码
+     */
+    @Schema(description = "父产品编码")
+    private String parentProductCode;
+
     @Schema(description = "总保额")
     private  String coverage;
 

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

@@ -14,6 +14,12 @@ import java.util.List;
 @Data
 public class SysUserInfoListVo extends PageRequest {
 
+    /**
+     * 不同页面可能对数据存在不同的过滤条件
+     * fromPage = 10 表示,在报价页面查询业务员的请求(这个页面要求只查询自己作为管理员的业务员)
+     */
+    @Schema(description = "对应页面来源")
+    private String fromPage;
     // 姓名
     @Schema(description = "业务员")
     private String salesman;

+ 4 - 0
platform/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -73,4 +73,8 @@
         salary,salary_level,live_address,
         province,city,district
     </sql>
+    <!-- 一个业务员可能存在于多个租户 lipf 2026年4月24日17:56:31  -->
+    <select id="queryJzgInfoByUserId" resultMap="BaseResultMap">
+        select * from sys_user_jzg_info a where a.user_id  = #{userId,jdbcType=DECIMAL} and a.is_delete = 0
+    </select>
 </mapper>

+ 1 - 1
rocketmq/src/main/java/com/jzg/templete/RocketMQEnhanceTemplate.java

@@ -19,7 +19,7 @@ import org.springframework.util.StringUtils;
  * RocketMQ增强模板类,优先使用
  */
 @Slf4j
-@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@RequiredArgsConstructor
 public class RocketMQEnhanceTemplate {
     private final RocketMQTemplate template;
 

+ 14 - 3
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Request/NonAutoInsOrderRequest.java

@@ -1,7 +1,9 @@
 package com.jzg.quotation.guoren.api.entity.Request;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson2.JSON;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
@@ -14,6 +16,8 @@ import com.jzg.quotation.guoren.api.entity.Response.VinQueryResponse;
 import com.jzg.quotation.guoren.api.entity.vo.GuoRenAccidentalDrivingVo;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -32,6 +36,8 @@ import java.util.List;
 @NoArgsConstructor
 public class NonAutoInsOrderRequest {
 
+    private static final Logger log = LoggerFactory.getLogger(NonAutoInsOrderRequest.class);
+
     /**
      * 渠道代码
      */
@@ -146,9 +152,13 @@ public class NonAutoInsOrderRequest {
                 this.orderAppl = new OrderApplDTO(policyHolder);
 
                 // 订单信息
-                List<RiskInfoVo> riskList = new ArrayList<>(); 
-                riskList.add(quoteVo.getCiRiskInfoVo());
-                riskList.add(quoteVo.getBiRiskInfoVo());
+                List<RiskInfoVo> riskList = new ArrayList<>();
+                if(quoteVo.getCiRiskInfoVo() != null) {
+                    riskList.add(quoteVo.getCiRiskInfoVo());
+                }
+                if(quoteVo.getBiRiskInfoVo() != null) {
+                    riskList.add(quoteVo.getBiRiskInfoVo());
+                }
 
                 this.orderMain = new OrderMainDTO(riskList, accidentalDrivingVo, parameters.getHandlerCode(), carPriceUuid);
 
@@ -303,6 +313,7 @@ public class NonAutoInsOrderRequest {
                     if (riskList.size() == 1) {
                         return riskList.get(0);
                     } else {
+                        log.info("国任riskList:{}", JSON.toJSONString(riskList));
                         RiskInfoVo riskInfoVo1 = riskList.get(0);
                         RiskInfoVo riskInfoVo2 = riskList.get(1);
                         String startDate1 = riskInfoVo1.getStartDate();

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

@@ -514,7 +514,7 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
             guoRenAccidentalDrivingVo.setRiskCode(accidentalDrivingVo.getRiskCode());
             guoRenAccidentalDrivingVo.setQuantity(accidentalDrivingVo.getQuantity());
             guoRenAccidentalDrivingVo.setProdCode(accidentalDrivingVo.getProductCode());
-            guoRenAccidentalDrivingVo.setGoodsCode(accidentalDrivingVo.getProductCategoryCode());
+            guoRenAccidentalDrivingVo.setGoodsCode(accidentalDrivingVo.getParentProductCode());
             guoRenAccidentalDrivingVo.setGoodsName(accidentalDrivingVo.getProductCategoryName());
         }
         return guoRenAccidentalDrivingVo;

+ 2 - 1
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java

@@ -296,7 +296,7 @@ public class HengBangCrawlerRequestComponent {
             HbCrawlerSaleInfoResponse response = requestComponent.toStringPost(RequestUrl.CALCULATION.getRequestUrl(hbCrawlerProperties.getBaseUrl()), req, RequestUrl.CALCULATION.getRequestDescription(),HbCrawlerSaleInfoResponse.class, headers);
             System.out.println(HengBangAESUtil.decryptStr(response.getHbEncD()));
             String resJson = HengBangAESUtil.decryptStr(response.getHbEncD());
-            return JSONObject.parseObject(resJson).getString("message");
+            return resJson;
         } catch (WebClientResponseException e) {
             if(e.getStatusCode().equals(HttpStatusCode.valueOf(500))){
                 return JSONObject.parseObject(e.getMessage()).getString("detail");
@@ -329,6 +329,7 @@ public class HengBangCrawlerRequestComponent {
         HbCrawlerSaleInfoResponse response = requestComponent.get(RequestUrl.PROPOSAL.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, RequestUrl.PROPOSAL.getRequestDescription(), HbCrawlerSaleInfoResponse.class, headers);
         try {
             String resJson = HengBangAESUtil.decryptStr(response.getHbEncD());
+            System.out.println(resJson);
             HbCrawlerProposalResponse proposalResponse = JSONObject.parseObject(resJson).toJavaObject(HbCrawlerProposalResponse.class);
             return proposalResponse;
         } catch (Exception e) {

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

@@ -38,8 +38,7 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     GET_POLICY("/interflow/api/policy-archive-list", "获取保单信息"),
     DOWNLOAD_POLICY("/interflow/api/sftp/v3/download/policy/", "下载保单"),
 
-    LAST_ACCIDENT("/new-insure/api/carinsurenew/lastAccident?plyAppNo=", "非车列表")
-    ;
+    LAST_ACCIDENT("/new-insure/api/carinsurenew/lastAccident?plyappno=", "非车列表");
 
     private final String url;
     private final String description;

+ 2 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.quotation.commons.utils.DateUtil;
+import com.jzg.quotation.hengbang.crawler.entity.response.HbCrawlerRecordResponse;
 import lombok.Data;
 
 import java.io.Serial;
@@ -136,6 +137,7 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest{
     private String accidentEpolicyFlag;
     private String begintimeAccident;
     private String endtimeAccident;
+    private HbCrawlerRecordResponse transferVehicle;
 
     @Data
     public static class EpersonliabilityDTO implements Serializable {

+ 9 - 1
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java

@@ -80,6 +80,9 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureItemDTO.setSpecialCarFlag("1");
         carInsureItemDTO.setTotalTonCount("0.00");
         carInsureItemDTO.setNoticeType(contentDTO.getNoticeType());
+        carInsureItemDTO.setCarKindShow("81");
+        carInsureItemDTO.setCountrynature("");
+        carInsureItemDTO.setCarColor("01");
         this.carInsureItem = carInsureItemDTO;
         //设置被保人
         CarInsureRiskRelatedPartyDTO riskRelatedPartyDTO = new CarInsureRiskRelatedPartyDTO();
@@ -126,6 +129,7 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureRelatedPartyDTO.setCustomerType("00");
         carInsureRelatedPartyDTO.setVipInd("0");
         carInsureRelatedPartyDTO.setInvoiceRequest("05");
+        carInsureRelatedPartyDTO.setMoneyLaunderingInd("低风险");
         this.carInsureRelatedParty = carInsureRelatedPartyDTO;
         //设置归属数据
         CarInsureMainDTO carInsureMainDTO = new CarInsureMainDTO();
@@ -146,7 +150,7 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureMainDTO.setMobile(salesMan.getMobile());
         carInsureMainDTO.setSalesmanname(salesMan.getSalesmanname());
         carInsureMainDTO.setUsertype(salesMan.getUsertype());
-        carInsureMainDTO.setInvoiceRequest("05");
+        carInsureMainDTO.setInvoiceRequest("03");
         carInsureMainDTO.setOperatorCode(quoteVo.getOrder().getAttributionInformationVo().getUsername());
         carInsureMainDTO.setCreator(quoteVo.getOrder().getAttributionInformationVo().getUsername());
         carInsureMainDTO.setBusinessMode("2");
@@ -366,6 +370,10 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         private String carSequenceNo;
         private String styleUniqueId;
         private String noticeType;
+        /**
+         * 车辆颜色
+         */
+        private String carColor;
         /**
          * 车主姓名
          */

+ 64 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerRecordResponse.java

@@ -0,0 +1,64 @@
+package com.jzg.quotation.hengbang.crawler.entity.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 备案 返回参数
+ * @author: shenwd
+ * @date: 2025/4/22 10:30
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class HbCrawlerRecordResponse extends HbBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 7654321987612345678L;
+
+    /**
+     * 投保单号
+     */
+    private String plyappno;
+
+    /**
+     * 交强险验证码图片(base64)
+     */
+    private String checkcodeJqImg;
+
+    /**
+     * 商业险投保单号
+     */
+    private String querynoSy;
+
+    /**
+     * 交强险投保单号
+     */
+    private String querynoJq;
+
+    /**
+     * 交强险验证码类型
+     */
+    private String checktypeJq;
+
+    /**
+     * 商业险验证码类型
+     */
+    private String checktypeSy;
+
+    /**
+     * 商业险验证码图片(base64)
+     */
+    private String checkcodeSyImg;
+
+    /**
+     * 交强险验证码
+     */
+    private String checkcodeJq;
+
+}

+ 106 - 76
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -8,6 +8,7 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.DigestUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.constants.ProductsType;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
@@ -64,6 +65,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     /**
      * 登录
+     *
      * @param loginBase 登录信息
      */
     @Override
@@ -73,6 +75,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     /**
      * 报价
+     *
      * @param quoteVo 报价实体
      * @return 报价信息
      */
@@ -90,7 +93,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         // 2.2 获取行业车型信息
         HbCrawlerQueryCarInfoRequest queryCarInfoRequest = new HbCrawlerQueryCarInfoRequest(carInfoVo, userInfoResponse);
-        HbCrawlerQueryCarRequest.CbitDataDTO cbitDataDTO = hbCrawlerRequestComponent.queryCarInfo(queryCarInfoRequest,headers);
+        HbCrawlerQueryCarRequest.CbitDataDTO cbitDataDTO = hbCrawlerRequestComponent.queryCarInfo(queryCarInfoRequest, headers);
         // 2.3 车型查询
         HbCrawlerQueryCarRequest hbCrawlerQueryCarRequest = new HbCrawlerQueryCarRequest(cbitDataDTO);
         List<HbCrawlerQueryCarResponse.ContentDTO> contentDTOS = hbCrawlerRequestComponent.queryCar(hbCrawlerQueryCarRequest, headers);
@@ -106,7 +109,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
             throw new SystemException(e.getMessage());
         }
         // 4.0 获取折旧价
-        HbCrawlerDepreciationRequest depreciationRequest = new HbCrawlerDepreciationRequest(quoteVo,contentDTO);
+        HbCrawlerDepreciationRequest depreciationRequest = new HbCrawlerDepreciationRequest(quoteVo, contentDTO);
         String depreciationPrice = hbCrawlerRequestComponent.getDepreciationPrice(depreciationRequest, headers);
 
         // 5.0 报价第一步,提交基础数据,返回订单号
@@ -116,22 +119,45 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         HbCrawlerCalculationRequest calculationRequest = new HbCrawlerCalculationRequest(quoteVo, plyappno);
         // 非车信息匹配核心
         matchingAccident(quoteVo, headers, plyappno, calculationRequest);
-        String calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+        String resJson = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+        String errorMsg = JSONObject.parseObject(resJson).getString("message");
+        String status = JSONObject.parseObject(resJson).getString("status");
+
         HbCrawlerProposalResponse proposalResponse = null;
         // 脱保情况 重新赋值核心建议起保时间 二次报价
-        if(calculationResult.contains("脱保")){
+        if (errorMsg.contains("脱保")) {
+            calculationRequest.setOutofwarrantytype("N");
+            resJson = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+            errorMsg = JSONObject.parseObject(resJson).getString("message");
+            status = JSONObject.parseObject(resJson).getString("status");
+        }
+
+        if (errorMsg.contains("该车是转保车,请输入对应的转保验证码")) {
+            JSONObject resJsonObj = JSONObject.parseObject(resJson);
+            String responseBody = resJsonObj.getString("responseBody");
+            HbCrawlerRecordResponse recordResponse = JSONObject.parseObject(responseBody, HbCrawlerRecordResponse.class);
             calculationRequest.setOutofwarrantytype("N");
-            calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
-        // 重复投保 重新赋值核心建议起保时间 二次报价
-        } else if(calculationResult.contains("重复投保")){
-            String time = extractDuplicateEndTime(calculationResult);
+            calculationRequest.setTransferVehicle(recordResponse);
+
+            resJson = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+            errorMsg = JSONObject.parseObject(resJson).getString("message");
+            status = JSONObject.parseObject(resJson).getString("status");
+        }
+
+        if (errorMsg.contains("重复投保")) {
+            String time = extractDuplicateEndTime(errorMsg);
             if (time != null) {
                 calculationRequest.setBegintimeCi(time);
                 calculationRequest.setBegintimeBi(time);
             }
-            calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+
+            resJson = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+            errorMsg = JSONObject.parseObject(resJson).getString("message");
+            status = JSONObject.parseObject(resJson).getString("status");
         }
-        if(calculationResult.equals("成功")){
+
+        if (errorMsg.equals("成功") || status.equals("9")) {
+            errorMsg = "成功";
             // 5.2 报价第三步,获取报价数据
             proposalResponse = hbCrawlerRequestComponent.proposal(plyappno, headers);
             HbCrawlerOrder hbCrawlerOrder = new HbCrawlerOrder();
@@ -139,18 +165,18 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
             hbCrawlerOrder.setPlyappno(plyappno);
             hbCrawlerOrderService.save(hbCrawlerOrder);
         }
-        return HbCrawlerQuoteResultVoBuild.build(quoteVo, proposalResponse, calculationResult);
+        return HbCrawlerQuoteResultVoBuild.build(quoteVo, proposalResponse, errorMsg);
     }
 
     /**
      * 注释
+     *
      * @param quoteVo
      * @param headers
      * @param plyappno
      * @param calculationRequest
      */
-    private void matchingAccident(final QuoteVo quoteVo, final HttpHeaders headers,
-                           final String plyappno, final HbCrawlerCalculationRequest calculationRequest) {
+    private void matchingAccident(final QuoteVo quoteVo, final HttpHeaders headers, final String plyappno, final HbCrawlerCalculationRequest calculationRequest) {
         if (quoteVo.getAccidentalDrivings() == null) {
             return;
         }
@@ -164,17 +190,16 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         });
 
         List<Object> accidnentList = new ArrayList<>();
-        quoteVo.getAccidentalDrivings().stream()
-                .filter(e -> StrUtil.isNotEmpty(e.getProductCode()))
-                .filter(e -> ObjectUtil.isNull(contentMap.get(e.getProductCode().trim())))
-                .forEach(accidnentList::add);
+        quoteVo.getAccidentalDrivings().stream().filter(e -> StrUtil.isNotEmpty(e.getProductCode())).filter(e -> ObjectUtil.isNull(contentMap.get(e.getProductCode().trim()))).forEach(accidnentList::add);
         calculationRequest.setAccidentInsuranceList(accidnentList);
     }
 
     // 重复投保提取时间
     private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
+
     /**
      * 提取系统自动分配的起保时间
+     *
      * @param calculationResult 核心提示
      * @return 提取到的时间字符串,未提取到返回 null
      */
@@ -187,9 +212,19 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         return null;
     }
 
+    /**
+     * 获取当前时间2小时以后的时间
+     *
+     * @return 2小时后的时间字符串,格式为 yyyy-MM-dd HH:mm:ss
+     */
+    private String getTimeTwoHoursLater() {
+        return LocalDateTime.now().plusHours(2).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+    }
+
 
     /**
      * 提交核保 子订单
+     *
      * @param underwritingVo
      */
     @Override
@@ -199,38 +234,38 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         HbCrawlerOrder hbCrawlerOrder = hbCrawlerOrderService.findByOrdersNo(underwritingVo.getOrder().getOrdersNo());
         String productCode = underwritingVo.getInsOrders().getProductId();
         List<Map<String, String>> paramList = new ArrayList<>();
-        if(productCode.equals(ProductsType.PT_0330.getCode())){
+        if (productCode.equals(ProductsType.PT_0330.getCode())) {
             Map<String, String> params = new HashMap<>();
-            params.put("clauseCode","T001_1");
-            params.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
-            params.put("clauseName","第一现场报案");
-            params.put("riskCode","0801");
+            params.put("clauseCode", "T001_1");
+            params.put("clauseContext", "为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params.put("clauseName", "第一现场报案");
+            params.put("riskCode", "0801");
             paramList.add(params);
-        } else if(productCode.equals(ProductsType.PT_034001.getCode())){
+        } else if (productCode.equals(ProductsType.PT_034001.getCode())) {
             Map<String, String> params = new HashMap<>();
-            params.put("clauseCode","T001_1");
-            params.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
-            params.put("clauseName","第一现场报案");
-            params.put("riskCode","0808");
+            params.put("clauseCode", "T001_1");
+            params.put("clauseContext", "为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params.put("clauseName", "第一现场报案");
+            params.put("riskCode", "0808");
             paramList.add(params);
-        } else{
+        } else {
             Map<String, String> params1 = new HashMap<>();
-            params1.put("clauseCode","T001_1");
-            params1.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
-            params1.put("clauseName","第一现场报案");
-            params1.put("riskCode","0801");
+            params1.put("clauseCode", "T001_1");
+            params1.put("clauseContext", "为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params1.put("clauseName", "第一现场报案");
+            params1.put("riskCode", "0801");
             paramList.add(params1);
             Map<String, String> params2 = new HashMap<>();
-            params2.put("clauseCode","T001_1");
-            params2.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
-            params2.put("clauseName","第一现场报案");
-            params2.put("riskCode","0808");
+            params2.put("clauseCode", "T001_1");
+            params2.put("clauseContext", "为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params2.put("clauseName", "第一现场报案");
+            params2.put("riskCode", "0808");
             paramList.add(params2);
         }
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
 
-        String message = hbCrawlerRequestComponent.coreProposal(hbCrawlerOrder.getPlyappno(), headers,paramList);
-        if("成功".equals(message)){
+        String message = hbCrawlerRequestComponent.coreProposal(hbCrawlerOrder.getPlyappno(), headers, paramList);
+        if ("成功".equals(message)) {
             // 获取核保信息
             HbCrawlerCoreProposalResponse response = hbCrawlerRequestComponent.coreProposalResult(hbCrawlerOrder.getPlyappno(), headers);
             hbCrawlerOrder.setCiProposalNo(response.getEfcProposalNo());
@@ -238,7 +273,12 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
             hbCrawlerOrderService.update(hbCrawlerOrder);
             underwritingResultsVo.setJyApplyNo(response.getEfcProposalNo());
             underwritingResultsVo.setSyApplyNo(response.getBizProposalNo());
-            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+            if (response.getStatus().equals("2")) {
+                underwritingResultsVo.setUnderwritingResult("核保失败:" + response.getDesCription());
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            } else {
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+            }
             return underwritingResultsVo;
         } else {
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
@@ -249,6 +289,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     /**
      * 获取支付链接
+     *
      * @param paymentLinkVo
      */
     @Override
@@ -267,27 +308,20 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     /**
      * 上传影像
+     *
      * @param insuranceUploadImageVo
      */
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-        AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder()
-                .getAttributionInformationVo();
+        AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder().getAttributionInformationVo();
         HttpHeaders headers = hbCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
-        HbCrawlerOrder hbCrawlerOrder = hbCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder()
-                .getOrdersNo());
+        HbCrawlerOrder hbCrawlerOrder = hbCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
 
         // 获取车主/投保人/被保人信息
         List<InsOrdersCarUserInfo> userInfos = insuranceUploadImageVo.getInsOrdersCarUserInfoList();
-        InsOrdersCarUserInfo ownerInfo = userInfos.stream()
-                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(1))
-                .findFirst().orElse(null);
-        InsOrdersCarUserInfo policyHolderInfo = userInfos.stream()
-                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(2))
-                .findFirst().orElse(null);
-        InsOrdersCarUserInfo insuredHolder = userInfos.stream()
-                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(3))
-                .findFirst().orElse(null);
+        InsOrdersCarUserInfo ownerInfo = userInfos.stream().filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(1)).findFirst().orElse(null);
+        InsOrdersCarUserInfo policyHolderInfo = userInfos.stream().filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(2)).findFirst().orElse(null);
+        InsOrdersCarUserInfo insuredHolder = userInfos.stream().filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(3)).findFirst().orElse(null);
         CarInfoVo carInfo = insuranceUploadImageVo.getCarInfo();
         //暂时将图片默认为01,06,09,投保业务-旧车-其他资料
         Integer fileNum = 0;
@@ -301,9 +335,9 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         if (CollUtil.isNotEmpty(imageVoList)) {
             for (InsuranceImageVo insuranceImageVo : imageVoList) {
                 List<InsuranceImageVo.ImageDTO> imageBase64List = insuranceImageVo.getImageBase64List();
-                if(CollUtil.isNotEmpty(imageBase64List)){
+                if (CollUtil.isNotEmpty(imageBase64List)) {
                     fileBuff.add("data:image/jpeg;base64," + imageBase64List.get(0).getImageBase64Str());
-                    if(InsuranceImageEnum.C02.getCode().equals(insuranceImageVo.getImageCode())){
+                    if (InsuranceImageEnum.C02.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,03,投保业务-旧车-证件");
                         mark3.add("6");
                         HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
@@ -311,7 +345,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                         extArrDTO.setName(ownerInfo.getName());
                         extArrDTO.setId_number(ownerInfo.getIdentifyNumber());
                         extArrDTOS.add(extArrDTO);
-                    } else if(InsuranceImageEnum.C01.getCode().equals(insuranceImageVo.getImageCode())){
+                    } else if (InsuranceImageEnum.C01.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,02,投保业务-旧车-行驶证");
                         mark3.add("8");
                         HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
@@ -323,15 +357,15 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                         extArrDTO.setIssue_date(carInfo.getIssueDate());
                         extArrDTO.setRegister_date(carInfo.getRegisterDate());
                         extArrDTOS.add(extArrDTO);
-                    } else if(InsuranceImageEnum.D02.getCode().equals(insuranceImageVo.getImageCode())){
+                    } else if (InsuranceImageEnum.D02.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,03,投保业务-旧车-证件");
                         mark3.add("7");
                         extArrDTOS.add(new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO());
-                    } else if(InsuranceImageEnum.D01.getCode().equals(insuranceImageVo.getImageCode())){
+                    } else if (InsuranceImageEnum.D01.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,02,投保业务-旧车-行驶证");
                         mark3.add("9");
                         extArrDTOS.add(new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO());
-                    } else if(InsuranceImageEnum.C03.getCode().equals(insuranceImageVo.getImageCode())){
+                    } else if (InsuranceImageEnum.C03.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,03,投保业务-旧车-证件");
                         mark3.add("11");
                         HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
@@ -339,7 +373,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                         extArrDTO.setName(policyHolderInfo.getName());
                         extArrDTO.setId_number(policyHolderInfo.getIdentifyNumber());
                         extArrDTOS.add(extArrDTO);
-                    } else if(InsuranceImageEnum.D03.getCode().equals(insuranceImageVo.getImageCode())){
+                    } else if (InsuranceImageEnum.D03.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,03,投保业务-旧车-证件");
                         mark3.add("12");
                         HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
@@ -347,7 +381,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                         extArrDTO.setName(policyHolderInfo.getName());
                         extArrDTO.setId_number(policyHolderInfo.getIdentifyNumber());
                         extArrDTOS.add(extArrDTO);
-                    } else if(InsuranceImageEnum.C04.getCode().equals(insuranceImageVo.getImageCode())){
+                    } else if (InsuranceImageEnum.C04.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,03,投保业务-旧车-证件");
                         mark3.add("13");
                         HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
@@ -355,7 +389,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                         extArrDTO.setName(insuredHolder.getName());
                         extArrDTO.setId_number(insuredHolder.getIdentifyNumber());
                         extArrDTOS.add(extArrDTO);
-                    } else if(InsuranceImageEnum.D04.getCode().equals(insuranceImageVo.getImageCode())){
+                    } else if (InsuranceImageEnum.D04.getCode().equals(insuranceImageVo.getImageCode())) {
                         fileType.add("01,06,03,投保业务-旧车-证件");
                         mark3.add("14");
                         HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
@@ -378,12 +412,12 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     /**
      * 下载保单
-     * @param downloadPolicyVo
-     * sign参数:
-     * 商业险:下载日期+policy+syx+H070104080820210005632   md5加密
-     * 交强先:下载日期+policy+jqx+H070104080820210005632   md5加密
-     * 示例:20250414policysyxH070104080820210005632
-     * https://car.hbins.com.cn/interflow/api/sftp/v3/download/policy/syx/H070104080820210005632?sign=c03d2c533722ff8c3d722d35664e9fa1
+     *
+     * @param downloadPolicyVo sign参数:
+     *                         商业险:下载日期+policy+syx+H070104080820210005632   md5加密
+     *                         交强先:下载日期+policy+jqx+H070104080820210005632   md5加密
+     *                         示例:20250414policysyxH070104080820210005632
+     *                         https://car.hbins.com.cn/interflow/api/sftp/v3/download/policy/syx/H070104080820210005632?sign=c03d2c533722ff8c3d722d35664e9fa1
      */
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
@@ -396,18 +430,13 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         getPolicyRequest.setCarMark(parameters.getLicenseNo());
         HbCrawlerGetPolicyResponse policyResponse = hbCrawlerRequestComponent.getPolicy(getPolicyRequest, headers);
         List<String> downloadUrls = new ArrayList<>();
-        List<HbCrawlerGetPolicyResponse.ResponseBodyDTO.ContentDTO> contentDTOList = policyResponse.getResponseBody()
-                .getContent();
+        List<HbCrawlerGetPolicyResponse.ResponseBodyDTO.ContentDTO> contentDTOList = policyResponse.getResponseBody().getContent();
         if (contentDTOList != null && !contentDTOList.isEmpty()) {
             contentDTOList.forEach(contentDTO -> {
                 //获取参数sign的值
                 String sign = getSign(contentDTO.getPOLICY_CATEGORY(), contentDTO.getBUSINESS_NO());
                 StringBuilder downloadUrl = new StringBuilder(RequestUrl.DOWNLOAD_POLICY.getRequestUrl(hbCrawlerProperties.getBaseUrl()));
-                downloadUrl.append(contentDTO.getPOLICY_CATEGORY())
-                        .append("/")
-                        .append(contentDTO.getBUSINESS_NO())
-                        .append("?sign=")
-                        .append(sign);
+                downloadUrl.append(contentDTO.getPOLICY_CATEGORY()).append("/").append(contentDTO.getBUSINESS_NO()).append("?sign=").append(sign);
                 downloadUrls.add(downloadUrl.toString());
             });
         }
@@ -416,6 +445,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     /**
      * 获取sign参数
+     *
      * @param riskType
      * @param businessNo
      * @return
@@ -428,8 +458,8 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     /**
      * 查询订单状态
-     * @param orderStatusVo
-     * 恒邦订单状态代码:待提核:-1;审核通过:1,3,5;下发修改:2;拒保:4;承保确认:6;初始状态:0
+     *
+     * @param orderStatusVo 恒邦订单状态代码:待提核:-1;审核通过:1,3,5;下发修改:2;拒保:4;承保确认:6;初始状态:0
      */
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java


+ 4 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java

@@ -116,7 +116,10 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
                     HuaTaiQuotedPriceResponse.class, parameters.getInsuredCode(), url);
             if (ObjectUtil.isNotNull(quotedPriceResponse) && !quotedPriceResponse.getHead().getReturnCode().equals("0")) {
                 log.error("报价失败,返回信息:{}", quotedPriceResponse.getHead().getReturnMessage());
-                throw new SystemException("报价失败");
+                QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+                quoteResultsVo.setErrorMessage(quotedPriceResponse.getHead().getReturnMessage());
+                quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+                return quoteResultsVo;
             }else {
                 log.info("报价成功,返回信息:{}", JSONObject.toJSONString(quotedPriceResponse));
             }

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

@@ -140,9 +140,9 @@ public class FactorMatch {
                         .toList();
 
                 if (ptlAgreementProductCostsAttrLink.getMin() != null) {
-                    logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMin() + "\n");
+                    logs.append("检验的值4:" + ptlAgreementProductCostsAttrLink.getMin() + "\n");
                 } else {
-                    logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMax() + "\n");
+                    logs.append("检验的值5:" + ptlAgreementProductCostsAttrLink.getMax() + "\n");
                 }
 
                 logs.append("传入的值:" + ruleAttrMappingVo.getValue() + "\n");

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

@@ -259,8 +259,9 @@ public class UnifyOrderManager {
         } catch (Exception e) {
             log.error("车险报价异常", e);
             Throwable root = e.getCause() != null ? e.getCause() : e;
-            insOrdersService.orderAfterUpdateFailedQuote(ordersNo, root.getMessage());
-            throw new SystemException(root.getMessage());
+            String errMsg = root.getMessage() != null ? root.getMessage() : "系统异常,报价失败";
+            insOrdersService.orderAfterUpdateFailedQuote(ordersNo, errMsg);
+            throw new SystemException(errMsg);
         }
         return quoteResultsVo.getQuoteStatusEnum()
                 .equals(InsOrderStatusEnum.WAIT_AUDIT) ? HttpResult.ok(quoteResultsVo) : HttpResult.error(500, quoteResultsVo, quoteResultsVo.getErrorMessage());

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

@@ -870,6 +870,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         //设置订单状态
         StateResult stateResult = orderStateListener.statusChange(underwritingResultsVo.getUnderwritingStatus(), insOrders.getOrderStatus());
         insOrders.setOrderStatus(String.valueOf(stateResult.getCurrentState()));
+        insOrders.setErrorMessage(underwritingResultsVo.getUnderwritingResult());
 
         //如果保司订单号存在则进行更新  有的保司在核保获取订单号
         if (Objects.nonNull(underwritingResultsVo.getCompanyOrderNo())) {
@@ -1002,7 +1003,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         }
         String productName = ProductsType.getProductNameByCode(quoteVo.getOrder().getProductId());
         insOrders.setProductName(productName);
-        if (Objects.isNull(insOrders.getRealQuoteUserId())) {
+        if (Objects.isNull(quoteVo.getOrder().getRealQuoteUserId())) {
             insOrders.setRealQuoteUserId(baseController.getUserName());
         } else {
             insOrders.setRealQuoteUserId(quoteVo.getOrder().getRealQuoteUserId());

+ 10 - 4
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/component/ZiJinApiCacheComponent.java

@@ -1,9 +1,13 @@
 package com.jzg.quotation.zijin.api.component;
 
+import com.jzg.quotation.zijin.api.service.Impl.ZiJinApiRequestImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
+import org.redisson.client.codec.StringCodec;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
 import org.springframework.util.ObjectUtils;
@@ -12,11 +16,12 @@ import java.time.Duration;
 import java.util.HashMap;
 import java.util.Map;
 
-@Log4j2
 @Component
 @RequiredArgsConstructor
 public class ZiJinApiCacheComponent {
 
+    private static final Logger log = LoggerFactory.getLogger(ZiJinApiCacheComponent.class);
+
     private final RedissonClient redissonClient;
     /**
      * 紫金财险授权
@@ -44,7 +49,8 @@ public class ZiJinApiCacheComponent {
         map.put(AUTHORIZATION, authorization);
         map.put(ZKI_API_AUTHORIZATION, ZKIApiAuthorization);
         // 3.1 存入redis中
-        RMap<Object, Object> rMap = redissonClient.getMap(ZIJIN_AUTHORIZATION + appKey);
+
+        RMap<String, String> rMap = redissonClient.getMap(ZIJIN_AUTHORIZATION + appKey, StringCodec.INSTANCE);
         rMap.putAll(map);
         rMap.expire(Duration.ofHours(ZIJIN_AUTHORIZATION_TIME));
     }
@@ -52,10 +58,10 @@ public class ZiJinApiCacheComponent {
     public HttpHeaders getAuthorizationHeader(String appKey) {
         HttpHeaders httpHeaders = new HttpHeaders();
         String authorization = (String) redissonClient
-                .getMap(ZIJIN_AUTHORIZATION + appKey)
+                .getMap(ZIJIN_AUTHORIZATION + appKey, StringCodec.INSTANCE)
                 .get(AUTHORIZATION);
         String zKIApiAuthorization = (String) redissonClient
-                .getMap(ZIJIN_AUTHORIZATION + appKey)
+                .getMap(ZIJIN_AUTHORIZATION + appKey, StringCodec.INSTANCE)
                 .get(ZKI_API_AUTHORIZATION);
         // 缓存中不存在就去请求token
         if (!ObjectUtils.isEmpty(authorization) && !ObjectUtils.isEmpty(zKIApiAuthorization)) {

+ 9 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/component/ZiJinApiRequestComponent.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zijin.api.component;
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.component.RequestComponent;
@@ -9,6 +10,7 @@ import com.jzg.quotation.zijin.api.entity.constants.enums.ResultEnum;
 import com.jzg.quotation.zijin.api.entity.request.*;
 import com.jzg.quotation.zijin.api.entity.response.*;
 import com.jzg.quotation.zijin.api.properties.ZiJinApiProperties;
+import com.jzg.quotation.zijin.api.service.Impl.ZiJinApiRequestImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.Redisson;
@@ -16,6 +18,8 @@ import org.redisson.api.RLock;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.redisson.config.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
@@ -32,6 +36,8 @@ import java.util.concurrent.TimeUnit;
 @RequiredArgsConstructor
 public class ZiJinApiRequestComponent {
 
+    public static final Logger logger = LoggerFactory.getLogger(ZiJinApiRequestComponent.class);
+
     private static final String USER_ID = "28317480921155536850";
 
     private final RedissonClient redissonClient;
@@ -78,6 +84,7 @@ public class ZiJinApiRequestComponent {
         httpHeaders.set(ZiJinApiCacheComponent.ZKI_API_AUTHORIZATION, queryTokenResponse.getToken());
         // 3. 缓存到数据库中
         ziJinApiCacheComponent.cacheAuthorization(accessToken.getToken(), queryTokenResponse.getToken(), ziJinApiConfigureParameters.getAppKey());
+        logger.info("紫金getToken:{}", JSON.toJSONString(httpHeaders));
         return httpHeaders;
     }
 
@@ -93,6 +100,8 @@ public class ZiJinApiRequestComponent {
         }
         number--;
         HttpHeaders httpHeaders = ziJinApiCacheComponent.getAuthorizationHeader(ziJinApiConfigureParameters.getAppKey());
+        logger.info("紫金getHttpHeaders:{}", JSON.toJSONString(httpHeaders));
+
         if (!ObjectUtils.isEmpty(httpHeaders)) {
             return httpHeaders;
         }

+ 47 - 2
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/service/Impl/ZiJinApiRequestImpl.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zijin.api.service.Impl;
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.quote.enums.base.InsuranceImageEnum;
 import com.jzg.commons.core.page.HttpResult;
@@ -38,6 +39,8 @@ import com.jzg.quotation.zijin.api.service.ZiJinOrderService;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.io.IOUtils;
 import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
 
 import java.io.IOException;
@@ -56,6 +59,8 @@ import java.util.Objects;
 @RequiredArgsConstructor
 public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
+    public static final Logger logger = LoggerFactory.getLogger(ZiJinApiRequestImpl.class);
+
     private final ZiJinApiRequestComponent ziJinApiRequestComponent;
 
     private final ZiJinOrderService ziJinOrderService;
@@ -73,31 +78,37 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
+        logger.info("紫金quote请求参数:{}", JSON.toJSONString(quoteVo));
         OrderBase order = quoteVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
         // 配置信息
         ZiJinApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinApiConfigureParameters.class, attributionInformationVo.getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金请求Header为:{}", JSON.toJSONString(httpHeaders));
         // 车型查询
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         ModelQueryRequest modelQueryRequest = new ModelQueryRequest(parameters, carInfoVo.getVinNo(), carInfoVo.getBrandName());
         ModelQueryResponse modelQueryResponse = ziJinApiRequestComponent.modelQuery(modelQueryRequest, httpHeaders);
+        logger.info("紫金请求/modelQuery车型查询接口,结果为:{}", JSON.toJSONString(modelQueryResponse));
         // 过滤车型
         ModelQueryResponse.VehicleModelInfosDTO vehicleModelInfosDTO = CarModelsFilterUtils.to(modelQueryResponse.getVehicleModelInfos(), carInfoVo);
         // 计算车辆价格
         QueryActualValueRequest queryActualValueRequest = new QueryActualValueRequest(carInfoVo, vehicleModelInfosDTO.getPurchasePrice(), quoteVo);
         QueryActualValueResponse queryActualValueResponse = ziJinApiRequestComponent.queryActualValue(queryActualValueRequest, httpHeaders);
+        logger.info("紫金请求/queryActualValue计算车辆价格接口,结果为:{}", JSON.toJSONString(queryActualValueResponse));
         // 补全驾意险的参数
         setAccidentalDriving(quoteVo);
         // 报价
         CalculatePremiumRequest calculatePremiumRequest = new CalculatePremiumRequest(quoteVo, vehicleModelInfosDTO, queryActualValueResponse.getActualValue(), parameters, modelQueryResponse);
         CalculatePremiumResponse calculatePremiumResponse = ziJinApiRequestComponent.calculatePremium(calculatePremiumRequest, httpHeaders,modelQueryRequest,queryActualValueRequest,REPEAT_NUMBER,RETRY_NUMBER);
+        logger.info("紫金请求/calculatePremium保费计算接口,结果为:{}", JSON.toJSONString(calculatePremiumResponse));
         ziJinOrderService.saveOrderInfo(quoteVo, modelQueryResponse);
         return ZiJinAPIQuoteResultsVoBuild.buildQuoteResultsVo(order.getOrdersNo(), quoteVo, calculatePremiumResponse, modelQueryResponse.getOrderNo());
     }
 
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
+        logger.info("紫金underwriting请求参数:{}", JSON.toJSONString(underwritingVo));
         InsOrdersCosts insOrdersCosts = underwritingVo.getInsOrdersCosts();
         OrderBase orderBase = underwritingVo.getOrder();
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(orderBase.getOrdersNo());
@@ -106,12 +117,14 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
                 .getAttributionInformationVo()
                 .getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金请求Header为:{}", JSON.toJSONString(httpHeaders));
         List<SpecialAppointmentsVo> specialAppointmentsVos = underwritingVo.getSpecialAppointmentsVos();
         SubmitVerifyRequest submitVerifyRequest = new SubmitVerifyRequest(ziJinApiOrder, specialAppointmentsVos);
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         try {
             SubmitVerifyResponse submitVerifyResponse = ziJinApiRequestComponent.submitVerify(submitVerifyRequest, httpHeaders);
+            logger.info("紫金/submitVerify提交核保接口,结果为:{}", JSON.toJSONString(submitVerifyResponse));
             SubmitVerifyResponse.SubmitVerifyInfoDTO submitVerifyInfo = submitVerifyResponse.getSubmitVerifyInfo();
             underwritingResultsVo.setJqPolicyno(submitVerifyInfo.getPolicyNoCI());
             underwritingResultsVo.setJqApplyNo(submitVerifyInfo.getProposalNoCI());
@@ -122,18 +135,38 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
             String multiply = insOrdersCosts.getSumPremium().toPlainString();
             NewPayRequest newPayRequest = new NewPayRequest(multiply, ziJinApiOrder.getOrderNo(), parameters);
             NewPayRequestResponse newPayRequestResponse = ziJinApiRequestComponent.newPay(newPayRequest, httpHeaders);
+            logger.info("紫金/newPay获取新支付接口,结果为:{}", JSON.toJSONString(newPayRequestResponse));
             underwritingResultsVo.setPaymentLink(newPayRequestResponse.getTwoDimentionImageUrl());
         } catch (SystemException systemException) {
+            String uwMsg = systemException.getMessage();
+            uwMsg = (uwMsg == null || uwMsg.isBlank()) ? "核保接口异常" : uwMsg;
+
             QueryOrderDetailResponse queryOrderDetailResponse = ziJinApiRequestComponent.getOrderDetail(orderBase.getCompanyOrderNo(), httpHeaders);
+            if (queryOrderDetailResponse == null) {
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                underwritingResultsVo.setUnderwritingResult("核保失败:查询订单状态为空");
+                return underwritingResultsVo;
+            }
+
             QueryOrderDetailResponse.ResultObjDTO resultObj = queryOrderDetailResponse.getResultObj();
-            String uwMsg = systemException.getMessage();
+            logger.info("紫金/getOrderDetail订单详情查询服务接口,结果为:{}", JSON.toJSONString(queryOrderDetailResponse));
+
+            if (resultObj == null) {
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                underwritingResultsVo.setUnderwritingResult("核保失败:订单状态未返回");
+                return underwritingResultsVo;
+            }
+
             if (OrderStatusEnum.O_3.getCode().equals(resultObj.getOrderStatus())) {
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
                 underwritingResultsVo.setUnderwritingResult(OrderStatusEnum.O_3.getName() + ":" + uwMsg);
-                // 人工核保
             } else if (OrderStatusEnum.O_1.getCode().equals(resultObj.getOrderStatus())) {
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
                 underwritingResultsVo.setUnderwritingResult("人工核保" + ":" + uwMsg);
+            } else {
+                // 兜底:未知状态
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                underwritingResultsVo.setUnderwritingResult("核保失败:" + uwMsg);
             }
         }
         return underwritingResultsVo;
@@ -141,6 +174,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
+        logger.info("紫金getPaymentLink请求参数为:{}", JSON.toJSONString(paymentLinkVo));
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
         ZiJinApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinApiConfigureParameters.class, paymentLinkVo.getOrder()
                 .getAttributionInformationVo()
@@ -148,6 +182,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
         NewPayRequest newPayRequest = new NewPayRequest("", ziJinApiOrder.getOrderNo(), parameters.getOrderOrigin(), parameters.getProposalCityCode());
         NewPayRequestResponse newPayRequestResponse = ziJinApiRequestComponent.newPay(newPayRequest, httpHeaders);
+        logger.info("紫金/newPay获取新支付接口,结果为:{}", JSON.toJSONString(newPayRequestResponse));
         PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
         paymentLinkResultsVo.setPaymentLink(newPayRequestResponse.getUrl());
         return paymentLinkResultsVo;
@@ -155,24 +190,30 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+        logger.info("紫金uploadImage请求参数为:{}", JSON.toJSONString(insuranceUploadImageVo));
         // 获取订单信息
         OrderBase orderBase = insuranceUploadImageVo.getOrder();
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(orderBase.getOrdersNo());
+        logger.info("紫金ziJinApiOrder结果为:{}", JSON.toJSONString(ziJinApiOrder));
         // 配置信息
         ZiJinApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinApiConfigureParameters.class, orderBase
                 .getAttributionInformationVo()
                 .getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金httpHeaders:{}", JSON.toJSONString(httpHeaders));
         // 获取影像信息
         List<UploadImageInfoListRequest.ItemFileDataListDTO> itemFileDataListDTOS = uploadFile(insuranceUploadImageVo, ziJinApiOrder, httpHeaders);
+        logger.info("紫金uploadFile拼接的返回结果为:{}", JSON.toJSONString(itemFileDataListDTOS));
         // 文件信息与订单关联
         UploadImageInfoListRequest uploadImageInfoListRequest = new UploadImageInfoListRequest(itemFileDataListDTOS,
                 ziJinApiOrder.getOrderId());
         BaseResponse baseResponse = ziJinApiRequestComponent.uploadImageInfoList(uploadImageInfoListRequest, httpHeaders);
+        logger.info("紫金uploadImageInfoList文件信息与订单关联接口,结果为:{}", JSON.toJSONString(baseResponse));
     }
 
     @Override
     public void queryClauseData(ClauseDataVo clauseDataVo) {
+        logger.info("紫金queryClauseData参数为:{}", JSON.toJSONString(clauseDataVo));
         // 获取订单信息
         OrderBase orderBase = clauseDataVo.getOrder();
         ZiJinApiOrder ziJinApiOrder = ziJinOrderService.getById(orderBase.getOrdersNo());
@@ -181,6 +222,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
                 .getAttributionInformationVo()
                 .getConfigInfo());
         HttpHeaders httpHeaders = ziJinApiRequestComponent.getHttpHeaders(parameters);
+        logger.info("紫金httpHeaders:{}", JSON.toJSONString(httpHeaders));
         // 2 查询特约
         QueryClauseDataRequest queryClauseDataRequest = new QueryClauseDataRequest();
         queryClauseDataRequest.setOrderId(ziJinApiOrder.getOrderId());
@@ -189,6 +231,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
             queryClauseDataRequest.setRiskCode(RiskCodeEnum.RC_0590.getCode());
             QueryClauseDataResponse queryClauseDataResponse = ziJinApiRequestComponent.queryClauseData(queryClauseDataRequest,
                     httpHeaders);
+            logger.info("紫金queryClauseData特约查询接口1,结果为:{}", JSON.toJSONString(queryClauseDataResponse));
             System.out.println(queryClauseDataResponse);
 //            List<QueryClauseDataResponse.ClauseInfoDtoListDTO> clauseInfoDtoList = queryClauseDataResponse.getClauseInfoDtoList();
 //            for (QueryClauseDataResponse.ClauseInfoDtoListDTO clauseInfoDtoListDTO : clauseInfoDtoList) {
@@ -209,6 +252,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
             queryClauseDataRequest.setRiskCode(RiskCodeEnum.RC_050A.getCode());
             QueryClauseDataResponse queryClauseDataResponse = ziJinApiRequestComponent.queryClauseData(queryClauseDataRequest,
                     httpHeaders);
+            logger.info("紫金queryClauseData特约查询接口2,结果为:{}", JSON.toJSONString(queryClauseDataResponse));
 //            List<QueryClauseDataResponse.ClauseInfoDtoListDTO> clauseInfoDtoList = queryClauseDataResponse.getClauseInfoDtoList();
 //            for (QueryClauseDataResponse.ClauseInfoDtoListDTO clauseInfoDtoListDTO : clauseInfoDtoList) {
 //                InsCompanyClause clause = new InsCompanyClause();
@@ -257,6 +301,7 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
                         UploadFileRequest uploadImageRequest = new UploadFileRequest(imageBase64, imageVo.getImageCode(), ziJinApiOrder.getOrderNo());
                         // 文件上传
                         UploadFileResponse uploadFileResponse = ziJinApiRequestComponent.uploadFile(uploadImageRequest, httpHeaders);
+                        logger.info("紫金/uploadFile文件上传接口,结果为:{}", JSON.toJSONString(uploadFileResponse));
                         // 文件信息与订单关联 itemFileDataList
                         UploadImageInfoListRequest.ItemFileDataListDTO itemFileDataListDTO =
                                 new UploadImageInfoListRequest.ItemFileDataListDTO(uploadImageRequest, uploadFileResponse.getFileId());

+ 5 - 10
tenant/organization/src/main/java/com/jzg/organization/controller/AccountController.java

@@ -1,15 +1,10 @@
 package com.jzg.organization.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.jzg.commons.aop.OperatorTrajectory;
-import com.jzg.commons.constants.OperationTypeEnum;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.account.dto.*;
 import com.jzg.commons.entity.account.vo.AccountVo;
-import com.jzg.commons.entity.dto.AgreementAddParam;
-import com.jzg.commons.util.AssertionUtils;
-import com.jzg.organization.mapper.PtlAgreementMapper;
 import com.jzg.organization.service.InvAccountService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -17,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.time.LocalDateTime;
 import java.util.List;
 
 @Tag(name="来往企业管理接口")
@@ -34,7 +28,7 @@ public class AccountController extends BaseController {
      */
     @PostMapping("/accountPage")
     @Operation(summary = "企业管理列表分页")
-    public HttpResult accountPage(@RequestBody AccountParam param){
+    public HttpResult<Page<AccountVo>> accountPage(@RequestBody AccountParam param){
         Page<AccountVo> result = accountService.queryPage(param);
         return HttpResult.ok(result);
     }
@@ -64,12 +58,13 @@ public class AccountController extends BaseController {
 
     /**
      * 来往企业添加
-     * @param param
-     * @return
+     *
+     * @param param 来往企业的信息
+     * @return HttpResult<String>
      */
     @Operation(summary = "来往企业添加")
     @PostMapping("/accountAdd")
-    public HttpResult accountAdd(@Validated @RequestBody AccountAddParam param) {
+    public HttpResult<String> accountAdd(@Validated @RequestBody AccountAddParam param) {
         accountService.cardAdd(param);
         return HttpResult.ok("新增成功");
     }

+ 49 - 14
tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java

@@ -77,14 +77,22 @@ public class AgreementController extends BaseController {
     @Operation(summary = "协议添加")
     @PostMapping("/agreementAdd")
     public HttpResult agreementAdd(@Validated @RequestBody AgreementAddParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), null, 0);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
             AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+        // 2. 通用名称+时间查重(内部=0)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                null,        // 新增传 null
+                0,           // 内部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行新增
         agreementService.agreementAdd(param);
         return HttpResult.ok("新增成功");
     }
@@ -98,14 +106,22 @@ public class AgreementController extends BaseController {
     @Operation(summary = "协议修改")
     @PostMapping("/agreementEdit")
     public HttpResult agreementEdit(@Validated @RequestBody AgreementEditParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), param.getId(), 0);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
             AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+        // 2. 通用名称+时间查重(内部=0,编辑排除自身)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                param.getId(), // 修改传自身ID
+                0,             // 内部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行修改
         agreementService.agreementEdit(param);
         return HttpResult.ok("修改成功");
     }
@@ -205,14 +221,23 @@ public class AgreementController extends BaseController {
     @Operation(summary = "外部协议添加")
     @PostMapping("/contactAdd")
     public HttpResult contactAdd(@Validated @RequestBody AgreementContactAddParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), null,1);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
-            AssertionUtils.isFail(nameExists,"协议生效时间不能大于失效时间!");
+            AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+
+        // 2. 名称+时间双重查重(外部=1)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                null,        // 新增传null
+                1,           // 外部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行保存
         agreementService.contactAdd(param);
         return HttpResult.ok("新增成功");
     }
@@ -226,14 +251,24 @@ public class AgreementController extends BaseController {
     @Operation(summary = "外部协议修改")
     @PostMapping("/contactEdit")
     public HttpResult contactEdit(@Validated @RequestBody AgreementContactEditParam param) {
-
-        boolean nameExists = agreementService.isExistsName(param.getAgreementTitle(), param.getId(),1);
-        AssertionUtils.isFail(nameExists,"协议名称重复!");
         LocalDateTime startDate = param.getStartDate();
         LocalDateTime endDate = param.getEndDate();
+
+        // 1. 时间合法性校验
         if(endDate.isBefore(startDate) || startDate.isEqual(endDate)){
-            AssertionUtils.isFail(nameExists,"协议生效时间不能大于失效时间!");
+            AssertionUtils.isFail(false,"协议生效时间不能大于失效时间!");
         }
+
+        // 2. 名称+时间双重查重(外部=1,编辑排除自身)
+        boolean nameExists = agreementService.checkNameExistsWithDate(
+                param.getAgreementTitle(),
+                param.getId(), // 编辑传自身ID
+                1,            // 外部协议
+                startDate
+        );
+        AssertionUtils.isFail(nameExists,"协议名称已存在,请输入其他名称");
+
+        // 3. 执行修改
         agreementService.contactEdit(param);
         return HttpResult.ok("修改成功");
     }

+ 7 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementCostController.java

@@ -1,6 +1,7 @@
 package com.jzg.organization.controller;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.aop.OperatorTrajectory;
 import com.jzg.commons.constants.OperationTypeEnum;
 import com.jzg.commons.core.page.HttpResult;
@@ -99,9 +100,14 @@ public class PtlAgreementCostController {
     }
 
 
+    /**
+     *
+     * @author lipf
+     * @date 2026/4/25 17:12
+     */
     @Operation(summary = "费用管理分页列表")
     @PostMapping("pageList")
-    public HttpResult<CostManagementVo> pageList(@RequestBody PtlAgreementCostParam costParam){
+    public HttpResult<Page<CostManagementVo>> pageList(@RequestBody PtlAgreementCostParam costParam){
         return ptlAgreementCostService.pageList(costParam);
     }
 

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/SysDistributionSettingController.java

@@ -2,6 +2,7 @@ package com.jzg.organization.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.SysDistributionSettingVO;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.organization.service.SysDistributionSettingService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -20,8 +21,14 @@ public class SysDistributionSettingController {
     @Resource
     private SysDistributionSettingService sysDistributionSettingService;
 
+    /**
+     * 查询租户的分销设置
+     *
+     * @author lipf
+     * @date 2026/4/23 17:38
+     */
     @GetMapping("/getSettingBySystemCode")
-    public HttpResult getSettingBySystemCode(){
+    public HttpResult<SysDistributionSettingVO> getSettingBySystemCode(){
         return sysDistributionSettingService.getSettingBySystemCode();
     }
 

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java

@@ -11,6 +11,7 @@ import com.jzg.commons.entity.dto.SysUserInfoParam;
 import com.jzg.commons.entity.dto.SysUserJzgInfoDto;
 import com.jzg.commons.entity.po.SysUser;
 import com.jzg.commons.entity.po.SysUserJzgInfo;
+import com.jzg.commons.entity.user.vo.SysTennatVo;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.request.RequestSingleParam;
 import com.jzg.organization.mapper.SysUserJzgInfoMapper;
@@ -188,10 +189,16 @@ public class UserController extends BaseController {
         return sysUserService.salesmanAuthFailed(auditSalesmanVo)? HttpResult.ok("业务员审核成功") : HttpResult.error("业务员审核失败");
     }
 
+    /**
+     * 获取用户的租户列表
+     *
+     * @author lipf
+     * @date 2026/4/24 18:05
+     */
     @IgnoreTenant
     @Operation(summary = "获取用户的租户列表",description = "获取用户的租户列表")
     @PostMapping(value = "/getTenantList")
-    public HttpResult getTenantList(){
+    public HttpResult<List<SysTennatVo>> getTenantList(){
         return HttpResult.ok(sysUserService.getTenantList(getUserName()));
     }
 

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysOrganizationMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.dto.SysOrganizationParam;
 import com.jzg.commons.entity.po.SysOrganization;
+import com.jzg.commons.entity.po.SysOrganizationVO;
 import com.jzg.commons.entity.vo.*;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -18,6 +19,14 @@ public interface SysOrganizationMapper extends BaseMapper<SysOrganization> {
 
     List<LeftSysOrganizationVo> selectLeftList(@Param("params") SysOrganizationParam sysOrganizationParam);
 
+    /**
+     * 查询用户关联的团队信息
+     *
+     * @param systemCode 租户代码
+     * @author lipf
+     * @date 2026/4/27 10:09
+     */
+    List<SysOrganizationVO> queryUserBindOrganization(String systemCode);
     /**
      * 获取团队下的人员列表分页
      *

+ 35 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java

@@ -14,10 +14,37 @@ import java.util.List;
 
 @Mapper
 public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
+
+    /**
+     * 查询有效的业务员信息
+     *
+     * @param userId 用户序号
+     * @param identity 身份证号
+     * @author lipf
+     * @date 2026/4/24 15:51
+     */
     List<SysUserJzgInfo> getUserInfoByIdentity(@Param("identity") String identity, @Param("userId") String userId);
 
     Page<SysUserJzgInfoDto> getUserInfoList(Page page, @Param("sysUserInfoListVo") SysUserInfoListVo sysUserInfoListVo);
 
+    /**
+     * 查询业务员
+     *
+     * @author lipf
+     * @date 2026/4/24 11:08
+     */
+    Page<SysUserJzgInfoDto> queryYwy(Page page, @Param("sysUserInfoListVo") SysUserInfoListVo sysUserInfoListVo,
+                                     @Param("systemCode") String systemCode,@Param("leaderId") String leaderId);
+
+    /**
+     * 查询成员
+     *
+     * @author lipf
+     * @date 2026/4/24 11:08
+     */
+    Page<SysUserJzgInfoDto> queryMember(Page page, @Param("sysUserInfoListVo") SysUserInfoListVo sysUserInfoListVo);
+
+
     SysUserJzgInfo getUserByMobile(String mobile);
 
     List<SysTennatVo> getTenantList(String userId);
@@ -43,4 +70,12 @@ public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
     List<String> selectTypeAttrs(@Param("userId") String userId);
 
     SysUserJzgInfo getPartUserInfoByMobile(String mobile);
+
+    /**
+     * 对sys_user_jzg_info 表中的数据进行逻辑删除
+     *
+     * @author lipf
+     * @date 2026/4/24 15:36
+     */
+    void updateUserByUserId(@Param("userId") String userId);
 }

+ 6 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserMapper.java

@@ -16,6 +16,12 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
 
     List<SysUserVo> getUserInfo(@Param("param") SysUserVo sysUserVo);
 
+    /**
+     * 获取用户信息
+     *
+     * @author lipf
+     * @date 2026/4/24 15:56
+     */
     List<SysUserSelectVo> getUserSelect(@Param("param") SysUserInfoListVo sysUserInfoListVo);
 
     SysUser getUserByMobile(@Param("mobile") String mobile);

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java

@@ -1,5 +1,6 @@
 package com.jzg.organization.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.*;
@@ -37,6 +38,12 @@ public interface PtlAgreementCostService extends IService<PtlAgreementCost> {
 
     HttpResult auditFailed(CostReviewParam costReviewParam);
 
-    HttpResult pageList(PtlAgreementCostParam costParam);
+    /**
+     * 查询协议费用
+     *
+     * @author lipf
+     * @date 2026/4/25 17:12
+     */
+    HttpResult<Page<CostManagementVo>> pageList(PtlAgreementCostParam costParam);
 
 }

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementService.java

@@ -11,6 +11,7 @@ import com.jzg.commons.entity.vo.AgreementUserVo;
 import com.jzg.commons.entity.vo.AgreementVo;
 import com.jzg.commons.entity.vo.UpAndDownVo;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -59,6 +60,16 @@ public interface PtlAgreementService extends IService<PtlAgreement> {
      */
     boolean isExistsName(String agreementTitle, String id, int isExternal);
 
+    /**
+     * 通用:协议名称+有效期查重(支持新增/修改、内部/外部)
+     * @param agreementTitle 协议名称
+     * @param id 协议id(新增传null,修改传当前id)
+     * @param isExternal 内外标识 0内部 1外部
+     * @param newStartDate 新的生效时间
+     * @return true=重复不可用,false=可用
+     */
+    boolean checkNameExistsWithDate(String agreementTitle, String id, Integer isExternal, LocalDateTime newStartDate);
+
     /**
      * 协议新增
      * @param param

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/service/SysDistributionSettingService.java

@@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.po.SysDistributionSetting;
+import com.jzg.commons.entity.po.SysDistributionSettingVO;
 import com.jzg.commons.entity.vo.*;
 
 import java.util.List;
 
 public interface SysDistributionSettingService extends IService<SysDistributionSetting> {
 
-    HttpResult getSettingBySystemCode();
+    /**
+     * 查询租户的分销设置
+     *
+     * @author lipf
+     * @date 2026/4/23 17:38
+     */
+    HttpResult<SysDistributionSettingVO> getSettingBySystemCode();
 
     HttpResult saveSetting(SysDistributionSettingVo sysDistributionSettingVo);
 

+ 11 - 1
tenant/organization/src/main/java/com/jzg/organization/service/SysOrganizationService.java

@@ -5,12 +5,22 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.*;
 import com.jzg.commons.entity.po.SysOrganization;
+import com.jzg.commons.entity.po.SysOrganizationVO;
 import com.jzg.commons.entity.vo.SysOrganizationUserLinkQueryVo;
 import com.jzg.commons.entity.vo.SysOrganizationUserLinkVo;
 
-public interface SysOrganizationService extends IService<SysOrganization> {
+import java.util.Map;
 
+public interface SysOrganizationService extends IService<SysOrganization> {
 
+    /**
+     *
+     * @param systemCode 租户代码
+     * @return Map<String, SysOrganizationVO> key表示userId, value表示用户所属的团毒/渠道
+     * @author lipf
+     * @date 2026/4/27 10:10
+     */
+    Map<String, SysOrganizationVO> queryUserBindOrganization(String systemCode);
 
     HttpResult queryPageList(SysOrganizationParam sysOrganizationParam);
 

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoSalesmanService.java

@@ -3,5 +3,16 @@ package com.jzg.organization.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.commons.entity.po.SysUserJzgInfoSalesman;
 
+import java.util.Map;
+
 public interface SysUserJzgInfoSalesmanService extends IService<SysUserJzgInfoSalesman> {
+
+    /**
+     * 查询所有的岗位信息和jzg_info 用户的对应关系
+     *
+     * @return Map<Long, String> key 表示sys_user_jzg_info 表的序号, value 标识多个岗位的标识
+     * @author lipf
+     * @date 2026/4/24 11:32
+     */
+    Map<String, String> queryAllTypeAttrMap();
 }

+ 21 - 2
tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoService.java

@@ -9,6 +9,15 @@ import com.jzg.commons.entity.vo.PartnerRecommenderVo;
 import java.util.List;
 
 public interface SysUserJzgInfoService extends IService<SysUserJzgInfo> {
+
+    /**
+     * 查询有效的业务员信息
+     *
+     * @param userId 用户序号
+     * @param identity 身份证号
+     * @author lipf
+     * @date 2026/4/24 15:51
+     */
     List<SysUserJzgInfo> getUserInfoByIdentity(String identity,String userId);
 
     /**
@@ -22,8 +31,9 @@ public interface SysUserJzgInfoService extends IService<SysUserJzgInfo> {
 
     /**
      * 通过手机号获取晋掌柜用户信息
-     * @param mobile
-     * @return
+     *
+     * @param mobile 手机号
+     * @return SysUserJzgInfo 晋掌柜用户信息
      */
     SysUserJzgInfo getUserByMobile(String mobile);
 
@@ -40,4 +50,13 @@ public interface SysUserJzgInfoService extends IService<SysUserJzgInfo> {
     boolean isGeneration(String id);
 
     List<String> selectTypeAttrs(String userId);
+
+    /**
+     * 逻辑删除 sys_user_jzg_info表中的数据
+     *
+     * @param userId 用户序号
+     * @author lipf
+     * @date 2026/4/24 15:29
+     */
+    void logicDeleteJzgInfo(Long userId);
 }

+ 1 - 6
tenant/organization/src/main/java/com/jzg/organization/service/SysUserRoleService.java

@@ -1,14 +1,8 @@
 package com.jzg.organization.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.jzg.commons.core.page.HttpResult;
-import com.jzg.commons.entity.dto.SysDeptParam;
-import com.jzg.commons.entity.po.SysDept;
 import com.jzg.commons.entity.po.SysRole;
 import com.jzg.commons.entity.po.SysUserRole;
-import com.jzg.commons.entity.vo.ChangeDeptVo;
-import com.jzg.commons.entity.vo.DeptLeaderVo;
-import com.jzg.commons.entity.vo.SysDeptVo;
 
 import java.util.List;
 
@@ -16,6 +10,7 @@ public interface SysUserRoleService extends IService<SysUserRole> {
 
     /**
      * 获取用户角色
+     *
      * @param userId
      * @return
      */

+ 7 - 1
tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java

@@ -32,6 +32,12 @@ public interface SysUserService extends IService<SysUser> {
      */
     List<SysUserVo> getUserInfo(SysUserVo sysUserVo);
 
+    /**
+     * 获取用户信息
+     *
+     * @author lipf
+     * @date 2026/4/24 15:56
+     */
     HttpResult getUserSelect(SysUserInfoListVo sysUserInfoListVo);
 
     /**
@@ -158,7 +164,7 @@ public interface SysUserService extends IService<SysUser> {
     /**
      * 获取用户租户列表
      *
-     * @return
+     * @return userId 用户序号(sys_user 表的序号)
      */
     List<SysTennatVo> getTenantList(String userId);
 

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

@@ -1,5 +1,6 @@
 package com.jzg.organization.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,6 +14,8 @@ import com.jzg.commons.util.StringUtils;
 import com.jzg.organization.mapper.InvAccountCardMapper;
 import com.jzg.organization.service.InvAccountCardService;
 import org.apache.commons.lang3.ObjectUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
@@ -25,8 +28,11 @@ import org.springframework.stereotype.Service;
 public class InvAccountCardServiceImpl extends ServiceImpl<InvAccountCardMapper, InvAccountCard>
     implements InvAccountCardService {
 
+    private static final Logger log = LoggerFactory.getLogger(InvAccountCardServiceImpl.class);
+
     @Override
     public Page<AccountCardVo> queryPage(AccountCardParam param) {
+        log.info("财务中心-账户管理-查询:param=[{}]", JSONUtil.toJsonStr(param));
         Page<AccountCardVo> page = baseMapper.queryPage(param.getPage(), param);
         return page;
     }

+ 13 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/InvAccountServiceImpl.java

@@ -31,6 +31,12 @@ public class InvAccountServiceImpl extends ServiceImpl<InvAccountMapper, InvAcco
 
     private static final Logger log = LoggerFactory.getLogger(InvAccountServiceImpl.class);
 
+    /**
+     * 查询财务的来往企业
+     *
+     * @author lipf
+     * @date 2026/4/25 16:41
+     */
     @Override
     public Page<AccountVo> queryPage(AccountParam param) {
         return baseMapper.queryPage(param.getPage(), param);
@@ -57,8 +63,15 @@ public class InvAccountServiceImpl extends ServiceImpl<InvAccountMapper, InvAcco
         return accountVo;
     }
 
+    /**
+     * 添加来往企业
+     *
+     * @author lipf
+     * @date 2026/4/25 16:36
+     */
     @Override
     public void cardAdd(AccountAddParam param) {
+        log.info("添加来往企业。 param=[{}]", JSONUtil.toJsonStr(param));
         InvAccount account = new InvAccount();
         BeanUtils.copyProperties(param,account);
         save(account);

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

@@ -333,8 +333,15 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
         return !now.isBefore(start) && !now.isAfter(end);
     }
 
+    /**
+     * 查询协议费用
+     *
+     * @author lipf
+     * @date 2026/4/25 17:13
+     */
     @Override
     public HttpResult<Page<CostManagementVo>> pageList(PtlAgreementCostParam costParam) {
+        log.info("查询协议费用信息:costParam=[{}]", JSONUtil.toJsonStr(costParam));
         Page<CostManagementVo> costManagementVoPage = baseMapper.pageList(costParam.getPage(), costParam);
         costManagementVoPage.getRecords().forEach(item->{
             if(item.getCostRules() != null && !item.getCostRules().equals("")){

+ 37 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementServiceImpl.java

@@ -189,6 +189,43 @@ public class PtlAgreementServiceImpl extends ServiceImpl<PtlAgreementMapper, Ptl
         return count > 0;
     }
 
+    /**
+     * 通用:协议名称+有效期查重(支持新增/修改、内部/外部)
+     * @param agreementTitle 协议名称
+     * @param id 协议id(新增传null,修改传当前id)
+     * @param isExternal 内外标识 0内部 1外部
+     * @param newStartDate 新的生效时间
+     * @return true=重复不可用,false=可用
+     */
+    @Override
+    public boolean checkNameExistsWithDate(String agreementTitle, String id, Integer isExternal, LocalDateTime newStartDate) {
+        // 1. 构造查询条件:同名称、同类型、未删除
+        LambdaQueryWrapper<PtlAgreement> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PtlAgreement::getAgreementTitle, agreementTitle)
+                .eq(PtlAgreement::getIsExternal, isExternal)
+                .eq(PtlAgreement::getIsDelete, 0);
+
+        // 2. 编辑时:排除自身ID
+        if (StringUtils.isNotNull(id)) {
+            wrapper.ne(PtlAgreement::getId, id);
+        }
+
+        // 只查一条,性能最优
+        wrapper.last("LIMIT 1");
+        PtlAgreement existAgreement = this.getOne(wrapper);
+
+        // 无重名 → 直接可用
+        if (existAgreement == null) {
+            return false;
+        }
+
+        // 3. 有重名 → 判断时间是否冲突
+        // 已存在止期 >= 新的起期 → 冲突(不可用)
+        LocalDateTime existEndDate = existAgreement.getEndDate();
+        return !existEndDate.isBefore(newStartDate);
+    }
+
+
     @Override
     @GlobalTransactional(rollbackFor = Exception.class)
     public void agreementAdd(AgreementAddParam param) {

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

@@ -2,6 +2,8 @@ package com.jzg.organization.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -16,8 +18,8 @@ import com.jzg.commons.entity.agreement.dispatch.vo.PtlAgreementDispatchQuery;
 import com.jzg.commons.entity.agreement.dispatch.vo.PtlAgreementDispatchVo;
 import com.jzg.commons.entity.agreement.dispatch.vo.ValidateDispatchRuleVo;
 import com.jzg.commons.entity.costs.vo.ValidateSchemeRuleVo;
-import com.jzg.commons.entity.po.EsmInsCompany;
-import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.commons.entity.po.*;
+import com.jzg.commons.entity.quote.vo.SalespersonInfoVo;
 import com.jzg.commons.entity.scheme.po.*;
 import com.jzg.commons.entity.scheme.vo.*;
 import com.jzg.commons.entity.vo.EsmInsCompanyResVo;
@@ -29,6 +31,7 @@ import com.jzg.organization.client.EsmInsCompanyClient;
 import com.jzg.organization.client.OrgClient;
 import com.jzg.organization.mapper.*;
 import com.jzg.organization.service.*;
+import org.jetbrains.annotations.Nullable;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,9 +81,15 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
     @Autowired
     PtlAgreementDispatchService ptlAgreementDispatchService;
 
+    @Autowired
+    PtlAgreementDeptService ptlAgreementDeptService;
+
     @Autowired
     OrgClient orgClient;
 
+    @Autowired
+    SysUserJzgInfoService sysUserJzgInfoService;
+
     /**
      * 添加方案
      * @param ptlSchemeSaveVo 车险报价的方案
@@ -353,6 +362,9 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
         log.info("租户[{}]有权限的保司有[{}]个", systemCode, CollUtil.size(companyListResult.getData()));
         AssertionUtils.isFail(companyListResult.getCode() != 200, companyListResult.getMsg());
         List<EsmInsCompany> companyList = companyListResult.getData();
+        // 业务员的归属权限是可选参数,不选的话不进行过滤
+        companyList = salespersonFilterCompanyList(schemeRuleFilterVo, companyList);
+
         log.info("根据权限获取到的保司个数是[{}].systemCode=[{}]", CollUtil.size(companyList),systemCode);
         if(CollUtil.isEmpty(companyList)){
             log.info("租户[{}]没有可报价的保险公司,请到平台系统的【租户管理】-【功能配置】页面进行配置并且查看对应公司的协议,费用是否维护好",systemCode);
@@ -550,4 +562,68 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
     public List<InsBusinessInsuranceVo> getBusinessInsuranceListByKindType(String kindCode) {
         return insBusinessInsuranceMapper.getBusinessInsuranceListByKindType(kindCode);
     }
+
+    /**
+     * 根据业务员的deptId过滤保险公司列表
+     * @param schemeRuleFilterVo
+     * @param companyList
+     * @return
+     */
+    private List<EsmInsCompany> salespersonFilterCompanyList(SchemeRuleFilterVo schemeRuleFilterVo, List<EsmInsCompany> companyList) {
+        SalespersonInfoVo salespersonInfo = schemeRuleFilterVo.getSalespersonInfo();
+        if (CollUtil.isNotEmpty(companyList) &&
+                ObjectUtil.isNotEmpty(salespersonInfo) && StrUtil.isNotBlank(salespersonInfo.getId())){
+            // 根据业务员ID获取业务员信息(含部门ID)
+            SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoService.getUserById(salespersonInfo.getId());
+            String userDeptId = sysUserJzgInfo.getDeptId(); // 业务员所属部门ID
+
+            // ========== 核心逻辑开始 ==========
+            // 1. 拿到所有协议ID(来自有权限的保司)
+            List<String> allAgreementIds = companyList.stream()
+                    .flatMap(company -> Optional.ofNullable(company.getAgreements()).orElse(Collections.emptyList()).stream())
+                    .map(PtlAgreement::getId)
+                    .collect(Collectors.toList());
+
+            if (CollUtil.isNotEmpty(allAgreementIds)) {
+                // 2. 查询【协议-部门】关联表中,协议在 allAgreementIds 范围内的记录
+                LambdaQueryWrapper<PtlAgreementDept> wrapper = new LambdaQueryWrapper<>();
+                wrapper.in(PtlAgreementDept::getAgreementId, allAgreementIds);
+                List<PtlAgreementDept> agreementDepts = ptlAgreementDeptService.list(wrapper);
+
+                // 3. 筛选:只保留部门ID = 业务员部门ID 的关联记录
+                List<PtlAgreementDept> userValidAgreementDepts = agreementDepts.stream()
+                        .filter(ad -> StrUtil.equals(ad.getDeptId(), userDeptId))
+                        .collect(Collectors.toList());
+
+                // 4. 提取出:当前业务员【有权限的协议ID】
+                Set<String> validAgreementIds = userValidAgreementDepts.stream()
+                        .map(PtlAgreementDept::getAgreementId)
+                        .collect(Collectors.toSet());
+
+                // 5. 过滤保司列表:只保留【包含有效协议】的保司
+                companyList = companyList.stream()
+                        .filter(company -> {
+                            List<PtlAgreement> agreements = company.getAgreements();
+                            if (CollUtil.isEmpty(agreements)) {
+                                return false;
+                            }
+                            // 只要保司下有一个协议在 validAgreementIds 里,就保留
+                            return agreements.stream()
+                                    .anyMatch(agreement -> validAgreementIds.contains(agreement.getId()));
+                        })
+                        .collect(Collectors.toList());
+
+                // 6. 每个保司只保留【业务员有权限的协议】
+                companyList.forEach(company -> {
+                    List<PtlAgreement> filteredAgreements = company.getAgreements().stream()
+                            .filter(agreement -> validAgreementIds.contains(agreement.getId()))
+                            .collect(Collectors.toList());
+                    company.setAgreements(filteredAgreements);
+                });
+            }
+
+            log.info("根据业务员部门权限过滤后,剩余保司数量:{}", companyList.size());
+        }
+        return companyList;
+    }
 }

+ 4 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -3,7 +3,6 @@ package com.jzg.organization.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.nacos.common.utils.CollectionUtils;
@@ -165,6 +164,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public Page<InsPlyIncome> getReceivablePage(ReceivableQueryVo receivableQueryVo) {
+        log.info("获取私有协议手续费列表。receivableQueryVo=[{}]", JSONUtil.toJsonStr(receivableQueryVo));
         return baseMapper.getReceivablePage(receivableQueryVo.getPage(), receivableQueryVo);
     }
 
@@ -919,6 +919,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public Page<InvoiceRecordResult> getInvoiceRecordList(InvoiceRecordQueryVo invoiceRecordQueryVo) {
+        log.info("手续费应收-开票记录-查询:invoiceRecordQueryVo=[{}]", JSONUtil.toJsonStr(invoiceRecordQueryVo));
         return baseMapper.getInvoiceRecordList(invoiceRecordQueryVo.getPage(), invoiceRecordQueryVo);
     }
 
@@ -1305,6 +1306,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public List<CompanySuperviseSettlementReportDto> companySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo) {
+        log.info("私有协议查询结算报表:settlementReportQueryVo=[{}]", JSONUtil.toJsonStr(settlementReportQueryVo));
 //        // 构建查手续费类型的数组
 //        List<String> invoiceTypes = new ArrayList<>();
 //        invoiceTypes.add("1");
@@ -1315,7 +1317,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         Map<String, BigDecimal> invoicingAmountMap = commissionInvoicingAmount.stream()
                 .collect(Collectors.toMap(
                         InvoiceAmountDto::getCompanyId,
-                        dto -> dto.getSuperviseAmount() != null ? dto.getSuperviseAmount() : BigDecimal.ZERO,
+                        dto -> dto.getSuperviseAmount()  != null ? dto.getSuperviseAmount() : BigDecimal.ZERO,
                         (existing, replacement) -> existing
                 ));
 

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

@@ -40,7 +40,7 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> impl
         List<SysDict> list = list(queryWrapper);
         List<SysDictVo> collect = list.stream().map(SysDictVo::new)
                 .sorted(Comparator.comparing(SysDictVo::getCreateTime, Comparator.nullsLast(Comparator.naturalOrder())))
-                .collect(Collectors.toList());
+                .toList();
         Map<String, List<SysDictVo>> map = collect.stream()
                 .collect(Collectors.groupingBy(vo -> Objects.requireNonNullElse(vo.getParentValue(), "0")));
         collect.forEach(i -> i.setChild(map.getOrDefault(i.getId(), new ArrayList<>())));

+ 5 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDistributionSettingServiceImpl.java

@@ -66,7 +66,7 @@ public class SysDistributionSettingServiceImpl extends ServiceImpl<SysDistributi
     @Resource
     private QuoteClient quoteClient;
 
-    public HttpResult getSettingBySystemCode() {
+    public HttpResult<SysDistributionSettingVO> getSettingBySystemCode() {
         SysDistributionSetting sysDistributionSetting = sysDistributionSettingMapper
                 .selectOne(new LambdaQueryWrapper<SysDistributionSetting>().eq(SysDistributionSetting::getSystemCode, baseController.getUserSystemCode()));
         if (sysDistributionSetting == null) {
@@ -75,7 +75,10 @@ public class SysDistributionSettingServiceImpl extends ServiceImpl<SysDistributi
         }
         List<SysDept> sysDeptList = sysDeptService.list(new LambdaQueryWrapper<SysDept>().eq(SysDept::getIsDistribution, "0").eq(SysDept::getSystemCode, baseController.getUserSystemCode()));
         sysDistributionSetting.setExcludeDept(sysDeptList);
-        return HttpResult.ok(sysDistributionSetting);
+        SysDistributionSettingVO vo = new SysDistributionSettingVO();
+        BeanUtils.copyProperties(sysDistributionSetting, vo);
+        vo.setId(String.valueOf(sysDistributionSetting.getId()));
+        return HttpResult.ok(vo);
     }
 
     @Override

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

@@ -9,10 +9,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.base.Functions;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.*;
 import com.jzg.commons.entity.po.SysOrganization;
 import com.jzg.commons.entity.po.SysOrganizationUserLink;
+import com.jzg.commons.entity.po.SysOrganizationVO;
 import com.jzg.commons.entity.vo.LeftSysOrganizationVo;
 import com.jzg.commons.entity.vo.SysOrganizationUserLinkQueryVo;
 import com.jzg.commons.entity.vo.SysOrganizationUserLinkVo;
@@ -27,6 +29,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -40,6 +44,24 @@ public class SysOrganizationServiceImpl extends ServiceImpl<SysOrganizationMappe
     @Autowired
     private SysOrganizationUserLinkService sysOrganizationUserLinkService;
 
+
+    /**
+     *
+     * @param systemCode 租户代码
+     * @return Map<String, SysOrganizationVO> key表示userId, value表示用户所属的团毒/渠道
+     * @author lipf
+     * @date 2026/4/27 10:10
+     */
+    @Override
+    public Map<String, SysOrganizationVO> queryUserBindOrganization(String systemCode) {
+        List<SysOrganizationVO> sysOrganizationVOS = sysOrganizationMapper.queryUserBindOrganization(systemCode);
+        Map<String, SysOrganizationVO> collect = sysOrganizationVOS.stream()
+                .filter(action -> action.getUserId() != null || action.getOrganizationId() != null)
+                .collect(Collectors.toMap(SysOrganizationVO::getUserId, Functions.identity(), (o, n) -> o));
+        log.info("查询出指定租户[{}]下的所有业务员[{}]个",systemCode, CollUtil.size(collect));
+        return collect;
+    }
+
     @Override
     public HttpResult queryPageList(SysOrganizationParam sysOrganizationParam) {
         QueryWrapper<SysOrganization> queryWrapper = new QueryWrapper<>();

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

@@ -10,6 +10,7 @@ import com.jzg.commons.entity.dto.SysOrganizationUserLinkAdd;
 import com.jzg.commons.entity.po.SysOrganizationUserLink;
 import com.jzg.organization.mapper.SysOrganizationUserLinkServiceMapper;
 import com.jzg.organization.service.SysOrganizationUserLinkService;
+import com.jzg.organization.service.SysUserJzgInfoService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +25,8 @@ public class SysOrganizationUserLinkServiceImpl extends ServiceImpl<SysOrganizat
 
     @Autowired
     private SysOrganizationUserLinkServiceMapper sysOrganizationUserLinkServiceMapper;
+    @Autowired
+    private SysUserJzgInfoService sysUserJzgInfoService;
 
     @Override
     public Long selectByOrgIdCount(String id) {
@@ -43,7 +46,14 @@ public class SysOrganizationUserLinkServiceImpl extends ServiceImpl<SysOrganizat
         int count = sysOrganizationUserLinkServiceMapper.delete(new LambdaQueryWrapper<SysOrganizationUserLink>().
                 eq(SysOrganizationUserLink::getOrganizationId,deleteAssociatedUsers.getId()).
                 in(SysOrganizationUserLink::getUserId,deleteAssociatedUsers.getUserIds()));
-        log.debug("删除机构关联的用户信息:删除[{}]个用户。deleteAssociatedUsers=[{}]", count, JSONUtil.toJsonStr(deleteAssociatedUsers));
+        // 逻辑删除
+        Long[] userIds = deleteAssociatedUsers.getUserIds();
+        if(userIds != null){
+            for (Long userId : userIds) {
+                sysUserJzgInfoService.logicDeleteJzgInfo(userId);
+            }
+        }
+        log.info("删除机构关联的用户信息:删除[{}]个用户。deleteAssociatedUsers=[{}]", count, JSONUtil.toJsonStr(deleteAssociatedUsers));
         return count > 0 ? HttpResult.ok("删除成功") : HttpResult.error("删除失败");
     }
 

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

@@ -101,6 +101,9 @@ public class SysUserJzgAppServiceImpl extends ServiceImpl<SysUserJzgAppMapper, S
             List<String> typeAttrs = infos.stream().map(SysUserJzgInfo::getTypeAttr).collect(Collectors.toList());
             infoVo.setTypeNames(typeAttrs);
         }
+        if(infos.size() == 0){
+            throw new SystemException("找不到用户信息");
+        }
         SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoService.getOne(new LambdaQueryWrapper<SysUserJzgInfo>()
                 .eq(SysUserJzgInfo::getUserId, infoVo.getUserId()).eq(SysUserJzgInfo::getSystemCode, baseController.getAppSystemCode()));
         infoVo.setInfoId(sysUserJzgInfo.getId());

+ 40 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoSalesmanServiceImpl.java

@@ -1,11 +1,21 @@
 package com.jzg.organization.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.entity.po.SysUserJzgInfoSalesman;
 import com.jzg.organization.mapper.SysUserJzgInfoSalesmanMapper;
 import com.jzg.organization.service.SysUserJzgInfoSalesmanService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  * @author quchen
  * @date 2025/6/20 10:52
@@ -13,4 +23,34 @@ import org.springframework.stereotype.Service;
 
 @Service
 public class SysUserJzgInfoSalesmanServiceImpl extends ServiceImpl<SysUserJzgInfoSalesmanMapper, SysUserJzgInfoSalesman> implements SysUserJzgInfoSalesmanService {
+
+
+    private static final Logger log = LoggerFactory.getLogger(SysUserJzgInfoSalesmanServiceImpl.class);
+
+    @Autowired
+    private SysUserJzgInfoSalesmanMapper sysUserJzgInfoSalesmanMapper;
+
+    /**
+     * 查询所有成员,业务员的类型信息(团队,渠道,成员,还是合伙人)
+     * @author lipf
+     * @date 2026/4/24 11:43
+     */
+    @Override
+    public Map<String, String> queryAllTypeAttrMap() {
+        List<SysUserJzgInfoSalesman> sysUserJzgInfoSalesmen = sysUserJzgInfoSalesmanMapper.selectList(null);
+        log.info("查询出[{}]个人员的类型信息", CollectionUtil.size(sysUserJzgInfoSalesmen));
+        Map<String, String> resultMap = sysUserJzgInfoSalesmen.stream()
+                .filter(action-> StrUtil.isNotEmpty(action.getSysUserJzgInfoId()) && StrUtil.isNotEmpty(action.getTypeAttr()))
+                .filter(action-> action.getSysUserJzgInfoId() != null && action.getTypeAttr() != null)
+                .collect(Collectors.toMap(
+                        // 1. Key 映射:先获取 String,再转为 Long
+                        SysUserJzgInfoSalesman::getSysUserJzgInfoId,
+                        // 2. Value 映射:直接获取 typeAttr
+                        SysUserJzgInfoSalesman::getTypeAttr,
+                        // 3. 合并策略:遇到重复 Key,将 value 用逗号拼接
+                        (existingValue, newValue) -> existingValue + "," + newValue
+                ));
+        log.info("按照jzg_info表的序号进行划分后。数据个数[{}]", CollectionUtil.size(resultMap));
+        return resultMap;
+    }
 }

+ 20 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoServiceImpl.java

@@ -8,6 +8,7 @@ import com.jzg.commons.entity.po.SysUserJzgInfo;
 import com.jzg.commons.entity.vo.PartnerRecommenderVo;
 import com.jzg.organization.mapper.SysUserJzgInfoMapper;
 import com.jzg.organization.service.SysUserJzgInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -20,6 +21,18 @@ import java.util.List;
 @Service
 public class SysUserJzgInfoServiceImpl extends ServiceImpl<SysUserJzgInfoMapper, SysUserJzgInfo> implements SysUserJzgInfoService {
 
+    @Autowired
+    private SysUserJzgInfoMapper sysUserJzgInfoMapper;
+
+
+    /**
+     * 查询有效的业务员信息
+     *
+     * @param userId 用户序号
+     * @param identity 身份证号
+     * @author lipf
+     * @date 2026/4/24 15:51
+     */
     @Override
     public List<SysUserJzgInfo> getUserInfoByIdentity(String identity, String userId) {
         return baseMapper.getUserInfoByIdentity(identity, userId);
@@ -27,8 +40,7 @@ public class SysUserJzgInfoServiceImpl extends ServiceImpl<SysUserJzgInfoMapper,
 
     @Override
     public SysUserJzgInfo getUserByUserId(String userId) {
-        SysUserJzgInfo sysUserJzgInfo = baseMapper.getUserJzgInfoByUserId(userId);
-        return sysUserJzgInfo;
+        return baseMapper.getUserJzgInfoByUserId(userId);
     }
 
     @Override
@@ -37,6 +49,7 @@ public class SysUserJzgInfoServiceImpl extends ServiceImpl<SysUserJzgInfoMapper,
                 .eq(SysUserJzgInfo::getId, id));
     }
 
+
     @Override
     public SysUserJzgInfo getUserByMobile(String mobile) {
         return baseMapper.getUserByMobile(mobile);
@@ -76,4 +89,9 @@ public class SysUserJzgInfoServiceImpl extends ServiceImpl<SysUserJzgInfoMapper,
     public List<String> selectTypeAttrs(String userId) {
         return baseMapper.selectTypeAttrs(userId);
     }
+
+    @Override
+    public void logicDeleteJzgInfo(Long userId) {
+        sysUserJzgInfoMapper.updateUserByUserId(String.valueOf(userId));
+    }
 }

+ 63 - 5
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java

@@ -197,8 +197,55 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             typeStatus.add(UserState.UserStateEnum.RESIGN_ING.getValue());
             sysUserInfoListVo.setTypeStatus(typeStatus);
         }
-        Page<SysUserJzgInfoDto> userInfoList = sysUserJzgInfoMapper.getUserInfoList(page, sysUserInfoListVo);
-        log.info("获取业务员列表:查询出[{}]个业务员。 查询参数: sysUserInfoListVo=[{}]", CollUtil.size(userInfoList.getRecords()),JSONUtil.toJsonStr(sysUserInfoListVo));
+        // 前端 查询成员和查询业务员的接口,都使用的是这个接口,但是他们区分的时候,差异很大,因此这里将查询成员和查询业务员的接口拆分开来
+        Page<SysUserJzgInfoDto> userInfoList;
+        String systemCode = baseController.getUserSystemCode();
+
+        String loginUserId = baseController.getUserId();
+        // 查询业务员
+        if("2".equals(sysUserInfoListVo.getIsMember())){
+            String jzgInfoId = null;
+            if("10".equals(sysUserInfoListVo.getFromPage())){
+                SysUserJzgInfo userInfoJzgInfo = sysUserJzgInfoService.getUserByUserId(loginUserId);
+                jzgInfoId = userInfoJzgInfo.getId();
+            }
+            log.info("jzgInfoId=[{}]", jzgInfoId);
+            userInfoList = sysUserJzgInfoMapper.queryYwy(page, sysUserInfoListVo, systemCode, jzgInfoId
+            );
+        }else if("1".equals(sysUserInfoListVo.getIsMember())){
+            // 查询成员
+            userInfoList = sysUserJzgInfoMapper.queryMember(page, sysUserInfoListVo);
+        }else{
+            // 其他场景先使用原来的逻辑
+            userInfoList = sysUserJzgInfoMapper.getUserInfoList(page, sysUserInfoListVo);
+        }
+        List<SysUserJzgInfoDto> records = userInfoList.getRecords();
+        if(CollectionUtil.isNotEmpty(records)){
+            // 填充岗位信息
+            Map<String, String> attrTypeMap = sysUserJzgInfoSalesmanService.queryAllTypeAttrMap();
+            Map<String, SysOrganizationVO> stringSysOrganizationVOMap = sysOrganizationService.queryUserBindOrganization(baseController.getSystemCode());
+            records = records.stream().peek(action->{
+                if(loginUserId.equals(action.getUserId())){
+                    action.setDefaultSelected(true);
+                }
+                String typeAttr = attrTypeMap.getOrDefault(action.getId(),null);
+                action.setTypeAttr(typeAttr);
+                List<SysRole> userRole = sysUserRoleService.getUserRole(action.getUserId());
+                if(CollectionUtil.isNotEmpty(userRole)){
+                    String roleNames = userRole.stream().map(SysRole::getName).distinct().collect(Collectors.joining(","));
+                    action.setRoleName(roleNames);
+                }
+                SysOrganizationVO sysOrganizationVO = stringSysOrganizationVOMap.get(action.getUserId());
+                if(sysOrganizationVO != null){
+                    action.setOrganizationId(sysOrganizationVO.getOrganizationId());
+                    action.setOrganizationName(sysOrganizationVO.getName());
+                }
+
+            }).toList();
+            userInfoList.setRecords(records);
+        }
+        //Page<SysUserJzgInfoDto> userInfoList = sysUserJzgInfoMapper.getUserInfoList(page, sysUserInfoListVo);
+        log.info("获取业务员/成员列表:查询出[{}]个业务员。 查询参数: sysUserInfoListVo=[{}]", CollUtil.size(userInfoList.getRecords()),JSONUtil.toJsonStr(sysUserInfoListVo));
         return userInfoList;
     }
 
@@ -318,8 +365,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return auditCountVo;
     }
 
+    /**
+     * 获取用户的租户列表
+     *
+     * @author lipf
+     * @date 2026/4/24 18:05
+     */
     @Override
     public List<SysTennatVo> getTenantList(String userId) {
+        log.info("获取用户的租户列表:userId=[{}]", userId);
         // 租户id
         String systemCode = (String) redissonClient.getBucket(RedisKeyConstants.APP_SYSTEM_CODE + userId).get();
         List<SysTennatVo> tenantList = sysUserJzgInfoMapper.getTenantList(userId);
@@ -414,6 +468,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             if (sysUserVo.getIsAddSalesman() == 1) {
                 addSalesmanList(sysUserJzgInfo, sysUserVo);
             }
+            // 添加业务员到团队,渠道,电销,个代的时候 (需要确保,成员新增的时候,typeAttr为空)
+            if(StrUtil.isNotEmpty(sysUserVo.getTypeAttr())){
+                addSalesmanList(sysUserJzgInfo, sysUserVo);
+            }
             sysUserJzgInfoId = sysUserJzgInfo.getId();
             sysUserId = sysUser.getId();
             if (sysUserVo.getOrganizationId() != null && !sysUserVo.getOrganizationId().equals("")) {
@@ -531,6 +589,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResult<Boolean> deleteUserInfo(IsDeleteVo isDeleteVo) {
+        log.info("删除业务员信息isDeleteVo=[{}]",JSONUtil.toJsonStr(isDeleteVo));
         for (String id : isDeleteVo.getIds()) {
             SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoService.getById(id);
             if (sysUserJzgInfo == null) {
@@ -1052,7 +1111,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     public void verifyUser(String typeAttr, String deptId, String identity, String userId, String leaderId, String referrerId, String mobile) {
         SysDept sysDept = sysDeptService.getById(deptId);
-
         List<SysUserJzgInfo> sysUserJzgInfos = sysUserJzgInfoService.getUserInfoByIdentity(identity, userId);
         SysUserJzgInfo sysUserJzgInfoByLeaderId = sysUserJzgInfoService.getOne
                 (new LambdaQueryWrapper<SysUserJzgInfo>().eq(SysUserJzgInfo::getId, leaderId)
@@ -1061,8 +1119,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 (new LambdaQueryWrapper<SysUserJzgInfo>().eq(SysUserJzgInfo::getId, referrerId)
                         .eq(SysUserJzgInfo::getIsDelete, 0));
         SysUserJzgInfo userByMobile = sysUserJzgInfoService.getUserByMobile(mobile);
-
-        if (sysUserJzgInfos.size() > 0) {
+        if (!sysUserJzgInfos.isEmpty()) {
+            log.warn("特定租户下身份证[{}]已存在",identity);
             throw new SystemException("该身份证号已存在,请检查");
         }
         if (sysDept == null) {

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

@@ -25,6 +25,7 @@
         <result column="audit_time" property="auditTime" />
         <result column="review_description" property="reviewDescription" />
         <result column="agreement_title" property="agreementTitle" />
+        <result column="priority_level" property="priorityLevel" />
         <collection property="costExternalTypeAdds" column="id" ofType="com.jzg.commons.entity.vo.CostExternalTypeVo" select="selectCostExternalTypeVo" />
     </resultMap>
 
@@ -45,6 +46,7 @@
         <result column="contact_person" property="contactPerson" />
         <result column="contact_mobile" property="contactMobile" />
         <result column="audit_method" property="auditMethod" />
+        <result column="priority_level" property="priorityLevel" />
         <result column="create_time" property="createTime" />
         <result column="create_by" property="createBy" />
         <collection property="costExternalTypeAdds" column="id" ofType="com.jzg.commons.entity.vo.CostExternalTypeVo" select="selectCostExternalTypeVo" />
@@ -55,7 +57,7 @@
         SELECT
             ce.id,ce.ptl_agreement_id,ce.product_name,ce.product_id,ce.effective_time,ce.failure_time,ce.audit_method,ce.audit_status,ce.is_enabled,
             ce.review_description,ce.audit_person,ce.audit_time,ce.is_inquiry,ce.cost_describe,ce.contact_person,ce.contact_mobile,ce.is_delete,
-            pa.agreement_title
+            pa.agreement_title, ce.priority_level
         FROM
             ptl_agreement_cost_external ce
             LEFT JOIN ptl_agreement pa ON pa.id = ce.ptl_agreement_id

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

@@ -332,6 +332,7 @@
             pc.create_time,
             pc.create_by,
             pa.agreement_code,
+            pa.agreement_name,
             pa.agreement_title,
             pa.agreement_abbreviation,
             pa.id as ptlAgreementId,

+ 4 - 0
tenant/organization/src/main/resources/mapper/PtlSchemeMapper.xml

@@ -39,6 +39,8 @@
                 <id column="jc_id" property="id"/>
                 <result column="product_name" property="productName"/>
                 <result column="product_code" property="productCode"/>
+                <result column="risk_code" property="riskCode"/>
+                <result column="parent_product_code" property="parentProductCode"/>
                 <result column="alias" property="alias"/>
                 <result column="grouping" property="grouping"/>
                 <result column="premium" property="premium"/>
@@ -155,6 +157,8 @@
             jc.product_code,
             jc.coverage,
             jc.premium,
+            jc.risk_code,
+            jc.parent_product_code,
             psidi.quantity,
             psidi.selected_status
         FROM

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

@@ -32,6 +32,20 @@
         </where>
     </select>
 
+    <!-- 查询用户关联的团队信息 lipf 2026年4月27日10:06:10 -->
+    <select id="queryUserBindOrganization" resultType="com.jzg.commons.entity.po.SysOrganizationVO">
+        SELECT
+        so.name,
+        so.dept_id ,
+        so.system_code,
+        soul.organization_id,
+        soul.user_id
+        FROM
+        sys_organization so
+        INNER JOIN sys_organization_user_link soul ON
+        so.id = soul.organization_id
+    </select>
+
     <select id="getTeamUserPage" resultType="com.jzg.commons.entity.vo.SysOrganizationUserLinkVo">
         SELECT
         su.id as userId,
@@ -59,6 +73,7 @@
         left join sys_user_jzg_info led_suji on led_suji.id = suji.leader_id
         left join sys_user led_su on led_su.id = led_suji.user_id
         <where>
+            su.is_delete = 0 and suji.is_delete = 0
             <if test="param.id != null and param.id != ''">
                 and so.id = #{param.id}
             </if>

+ 2 - 4
tenant/organization/src/main/resources/mapper/SysOrganizationUserLinkServiceMapper.xml

@@ -25,16 +25,14 @@
     <!-- 根据用户ID获取组织关联信息 -->
     <select id="getOrganizationUser" resultMap="BaseResultMap">
         SELECT
-        distinct a.id,
+        a.id,
         a.user_id,
         a.organization_id
         FROM
         sys_organization_user_link a
         join sys_organization b on
         a.organization_id = b.id
-        WHERE
-        user_id = #{userId,jdbcType=DECIMAL}
-        and b.system_code = #{systemCode,jdbcType=VARCHAR}
+        WHERE user_id = #{userId,jdbcType=DECIMAL}
     </select>
 
 </mapper>

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

@@ -27,6 +27,11 @@
         UPDATE partner_user SET name = #{sysUserJzgInfo.name}  WHERE user_id = #{sysUserJzgInfo.userId}
     </update>
 
+    <!-- 对业务员进行逻辑删除 lipf 2026年4月24日15:33:17 -->
+    <delete id="updateUserByUserId">
+        update sys_user_jzg_info a set a.is_delete = 1 where a.user_id = #{userId,jdbcType=DECIMAL}
+    </delete>
+
     <update id="partnerReview">
         UPDATE sys_user_jzg_info_salesman SET partner_status = #{reviewStatus},partner_review_time = NOW(),partner_reviewer = #{userId}  WHERE
         sys_user_jzg_info_id in
@@ -42,7 +47,7 @@
         sys_user_jzg_info suji
         left join sys_user su on su.id = suji.user_id
         WHERE
-        1=1
+        suji.is_delete = 0
         <if test="identity != null and identity != ''">
             AND su.identity = #{identity}
         </if>
@@ -50,7 +55,152 @@
             AND suji.user_id = #{userId}
         </if>
     </select>
+    <!-- 查询业务员 lipf 2026年4月24日11:22:18  -->
+    <select id="queryYwy" resultMap="BaseResultMap">
+        select
+        suji.id,
+        suji.user_id,
+        suji.work_number,
+        su.username,
+        su.mobile,
+        suji.name,
+        suji.dept_id,
+        sd.name as dept_name,
+        suji.status,
+        suji.is_enable,
+        lsu.user_id as leader_id,
+        lsu.name AS leader_name,
+        suji.referrer_id,
+        su.username as referrer_name,
+        -- soul.organization_id as organization_id,
+        suji.create_time as createTime,
+        suji.create_by as createBy
+        from
+        sys_user_jzg_info suji
+        left join sys_user su on su.id = suji.user_id
+        LEFT JOIN sys_user_jzg_info lsu on lsu.id = suji.leader_id
+        left join sys_dept sd on sd.id = suji.dept_id
+        -- left join sys_user_role sur on sur.user_id = su.id
+        -- left join sys_organization_user_link soul on soul.user_id = suji.user_id
+        -- join sys_organization so on so.id = soul.organization_id
+        LEFT JOIN sys_dept d ON suji.dept_id = d.id
+        where 1=1
+        and suji.is_delete = 0
+        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
+        )
+        <if test="leaderId != null and leaderId != ''">
+            and suji.leader_id = #{leaderId}
+        </if>
+        <if test="sysUserInfoListVo.deptId != null and sysUserInfoListVo.deptId != ''">
+            and d.route LIKE CONCAT('%', #{sysUserInfoListVo.deptId}, '%')
+        </if>
+        <if test="sysUserInfoListVo.deptName != null and sysUserInfoListVo.deptName != ''">
+            and so.name like concat('%',#{sysUserInfoListVo.deptName},'%')
+        </if>
+        <if test="sysUserInfoListVo.typeAttr != null and sysUserInfoListVo.typeAttr != ''">
+            and suji.type_attr = #{sysUserInfoListVo.typeAttr}
+        </if>
+        <if test="sysUserInfoListVo.status != null and sysUserInfoListVo.status != '-1'">
+            and suji.status = #{sysUserInfoListVo.status}
+        </if>
+        <if test="sysUserInfoListVo.typeStatus != null and sysUserInfoListVo.typeStatus.size() > 0">
+            AND suji.status IN
+            <foreach item="status" collection="sysUserInfoListVo.typeStatus"
+                     open="(" separator="," close=")">
+                #{status}
+            </foreach>
+        </if>
+        <if test="sysUserInfoListVo.isEnable != null and sysUserInfoListVo.isEnable != ''">
+            and suji.is_enable = #{sysUserInfoListVo.isEnable}
+        </if>
+        <if test="sysUserInfoListVo.sysOrganizationId != null and sysUserInfoListVo.sysOrganizationId != ''">
+            and so.id = #{sysUserInfoListVo.sysOrganizationId}
+        </if>
+        <if test="sysUserInfoListVo.leaderId != null and sysUserInfoListVo.leaderId != ''">
+            and (suji.leader_id = #{sysUserInfoListVo.leaderId}
+            or  lsu.name = #{sysUserInfoListVo.leaderId})
+        </if>
+        <if test="sysUserInfoListVo.salesman != null and sysUserInfoListVo.salesman != ''">
+            and (suji.name like concat('%',#{sysUserInfoListVo.salesman},'%')
+            or  su.mobile = #{sysUserInfoListVo.salesman}
+            or  suji.work_number = #{sysUserInfoListVo.salesman}
+            or  su.id = #{sysUserInfoListVo.salesman})
+        </if>
+        order by suji.create_time desc
+    </select>
 
+    <!-- 查询成员 lipf 2026年4月24日11:10:15 -->
+    <select id="queryMember" resultMap="BaseResultMap">
+        select
+        suji.id,
+        suji.user_id,
+        suji.work_number,
+        su.username,
+        su.mobile,
+        suji.name,
+        suji.dept_id,
+        sd.name as dept_name,
+        suji.status,
+        suji.is_enable,
+        lsu.user_id as leader_id,
+        lsu.name AS leader_name,
+        suji.referrer_id,
+        su.username as referrer_name,
+        soul.organization_id as organization_id,
+        suji.create_time as createTime,
+        suji.create_by as createBy
+        from
+        sys_user_jzg_info suji
+        left join sys_user su on su.id = suji.user_id
+        LEFT JOIN sys_user_jzg_info lsu on lsu.id = suji.leader_id
+        left join sys_dept sd on sd.id = suji.dept_id
+        -- left join sys_user_role sur on sur.user_id = su.id
+        left join sys_organization_user_link soul on soul.user_id = suji.user_id
+        LEFT JOIN sys_dept d ON suji.dept_id = d.id
+        where
+        1=1
+        and suji.is_delete = 0
+        and suji.id  in (
+            select sujis.sys_user_jzg_info_id  from sys_user_jzg_info_salesman sujis  where sujis.type_attr =2
+        )
+        <if test="sysUserInfoListVo.deptId != null and sysUserInfoListVo.deptId != ''">
+            and d.route LIKE CONCAT('%', #{sysUserInfoListVo.deptId}, '%')
+        </if>
+        <if test="sysUserInfoListVo.deptName != null and sysUserInfoListVo.deptName != ''">
+            and so.name like concat('%',#{sysUserInfoListVo.deptName},'%')
+        </if>
+        <if test="sysUserInfoListVo.typeAttr != null and sysUserInfoListVo.typeAttr != ''">
+            and suji.type_attr = #{sysUserInfoListVo.typeAttr}
+        </if>
+        <if test="sysUserInfoListVo.status != null and sysUserInfoListVo.status != '-1'">
+            and suji.status = #{sysUserInfoListVo.status}
+        </if>
+        <if test="sysUserInfoListVo.typeStatus != null and sysUserInfoListVo.typeStatus.size() > 0">
+            AND suji.status IN
+            <foreach item="status" collection="sysUserInfoListVo.typeStatus"
+                     open="(" separator="," close=")">
+                #{status}
+            </foreach>
+        </if>
+        <if test="sysUserInfoListVo.isEnable != null and sysUserInfoListVo.isEnable != ''">
+            and suji.is_enable = #{sysUserInfoListVo.isEnable}
+        </if>
+        <if test="sysUserInfoListVo.sysOrganizationId != null and sysUserInfoListVo.sysOrganizationId != ''">
+            and so.id = #{sysUserInfoListVo.sysOrganizationId}
+        </if>
+        <if test="sysUserInfoListVo.leaderId != null and sysUserInfoListVo.leaderId != ''">
+            and (suji.leader_id = #{sysUserInfoListVo.leaderId}
+            or  lsu.name = #{sysUserInfoListVo.leaderId})
+        </if>
+        <if test="sysUserInfoListVo.salesman != null and sysUserInfoListVo.salesman != ''">
+            and (suji.name like concat('%',#{sysUserInfoListVo.salesman},'%')
+            or  su.mobile = #{sysUserInfoListVo.salesman}
+            or  suji.work_number = #{sysUserInfoListVo.salesman}
+            or  su.id = #{sysUserInfoListVo.salesman})
+        </if>
+        order by suji.create_time desc
+    </select>
     <!-- modify by lipf , 2026年4月14日15:33:13 解决 业务管理-成员管理 页面,管理人和管理人工号不对的问题 -->
     <select id="getUserInfoList" resultMap="BaseResultMap">
         select
@@ -142,7 +292,7 @@
         FROM
             sys_user_jzg_info suji
                 LEFT JOIN sys_user su ON suji.user_id = su.id
-        where su.mobile = #{mobile}
+        where su.mobile = #{mobile} and suji.is_delete = 0 and su.is_delete = 0
     </select>
 
     <select id="getTenantList" resultType="com.jzg.commons.entity.user.vo.SysTennatVo">
@@ -153,14 +303,12 @@
             suf.file_name as sys_icon
         FROM
             sys_user su
-                LEFT JOIN sys_user_jzg_info suji ON su.id = suji.user_id
+                LEFT JOIN sys_user_jzg_info suji ON su.id = suji.user_id and suji.is_delete = 0
                 LEFT JOIN sys_system ss ON suji.system_code = ss.sys_code
                 LEFT JOIN sys_dept sd ON sd.id = suji.dept_id
                 LEFT JOIN sys_upload_files suf on suf.id = ss.sys_icon
         WHERE
-            (
-                        mobile = #{userId}
-                    OR username = #{userId})
+            ( mobile = #{userId} OR username = #{userId})
         AND suji.system_code != 'APP'
         AND suji.is_enable = 0
     </select>
@@ -205,8 +353,6 @@
             suji.user_id = #{userId}
     </select>
 
-
-
     <select id="selectByUserNameAndMobile" resultType="com.jzg.commons.entity.vo.PartnerRecommenderVo">
         SELECT
             p.grade,
@@ -229,8 +375,6 @@
             p.user_id
     </select>
 
-
-
     <select id="selectPartnerReviewVo" resultType="com.jzg.commons.entity.vo.PartnerReviewVo">
         SELECT
             info.id userInfoId,
@@ -259,7 +403,6 @@
           AND sa.partner_status = #{partnerReviewParam.partnerStatus}
     </select>
 
-
     <select id="isPartnerPresent" resultType="java.lang.Boolean">
         SELECT
             IF(COUNT(*) > 0, 1, 0)
@@ -276,7 +419,6 @@
           AND sys_user_jzg_info_id = #{id};
     </select>
 
-
     <select id="selectByUserIdInfo" resultType="com.jzg.commons.entity.po.SysUserJzgInfo">
         SELECT info.*
         FROM sys_user_jzg_info info
@@ -284,7 +426,6 @@
         WHERE sa.type_attr = 3 AND info.user_id = #{userId}
     </select>
 
-
     <select id="selectTypeAttrs" resultType="java.lang.String">
         SELECT
             sjis.type_attr
@@ -298,7 +439,6 @@
           AND sjis.sys_user_jzg_info_id IS NOT NULL
     </select>
 
-
     <select id="getPartUserInfoByMobile" resultType="com.jzg.commons.entity.po.SysUserJzgInfo">
         SELECT DISTINCT info.id
         FROM sys_user_jzg_info info

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

@@ -29,7 +29,7 @@
         sys_user_jzg_info suji
         inner join sys_user su on su.id = suji.user_id
         WHERE
-        1=1
+        suji.is_delete = 0
         <if test="param.deptId!= null and param.deptId!= ''">
             AND suji.dept_id = #{param.deptId}
         </if>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно