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

bugfix: 业务员管理相关的接口

1. 添加一个个代,业务员管理列表里没有这个人,推荐人里面有
2. 添加渠道可以显示,添加个代,团队,电销业务员里表里面都不显示
3. 一个业务员在一个租户里面注册以后,可以登录APP,但是同样的信息在另一个租户注册以后,单独添加为团队业务员,列表里不显示,团队管理列表里找到以后显示未人证,同时APP也不能登录了
lipf 4 месяцев назад
Родитель
Сommit
329b295a93
19 измененных файлов с 427 добавлено и 35 удалено
  1. 5 2
      authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java
  2. 4 2
      authentication/src/main/java/com/jzg/mapper/SysUserJzgInfoMapper.java
  3. 61 0
      authentication/src/main/resources/mapper/SysUserJzgInfoMapper.xml
  4. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java
  5. 4 0
      platform/src/main/resources/mapper/SysUserJzgInfoMapper.xml
  6. 8 1
      tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java
  7. 34 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java
  8. 6 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserMapper.java
  9. 11 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoSalesmanService.java
  10. 21 2
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoService.java
  11. 1 6
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserRoleService.java
  12. 7 1
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java
  13. 11 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysOrganizationUserLinkServiceImpl.java
  14. 36 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoSalesmanServiceImpl.java
  15. 18 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoServiceImpl.java
  16. 44 5
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java
  17. 1 0
      tenant/organization/src/main/resources/mapper/SysOrganizationMapper.xml
  18. 151 14
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml
  19. 1 1
      tenant/organization/src/main/resources/mapper/SysUserMapper.xml

+ 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/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;

+ 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>

+ 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;
@@ -175,10 +176,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()));
     }
 

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

@@ -14,10 +14,36 @@ 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);
+
+    /**
+     * 查询成员
+     *
+     * @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 +69,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);

+ 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);
 
     /**
@@ -145,7 +151,7 @@ public interface SysUserService extends IService<SysUser> {
     /**
      * 获取用户租户列表
      *
-     * @return
+     * @return userId 用户序号(sys_user 表的序号)
      */
     List<SysTennatVo> getTenantList(String userId);
 

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

@@ -9,6 +9,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;
@@ -21,6 +22,8 @@ public class SysOrganizationUserLinkServiceImpl extends ServiceImpl<SysOrganizat
 
     @Autowired
     private SysOrganizationUserLinkServiceMapper sysOrganizationUserLinkServiceMapper;
+    @Autowired
+    private SysUserJzgInfoService sysUserJzgInfoService;
 
     @Override
     public Long selectByOrgIdCount(String id) {
@@ -40,7 +43,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("删除失败");
     }
 

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

@@ -1,11 +1,19 @@
 package com.jzg.organization.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 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 +21,32 @@ 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.debug("查询出[{}]个人员的类型信息", CollectionUtil.size(sysUserJzgInfoSalesmen));
+        Map<String, String> resultMap = sysUserJzgInfoSalesmen.stream()
+                .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;
+    }
 }

+ 18 - 0
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);
@@ -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));
+    }
 }

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

@@ -196,8 +196,36 @@ 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();
+        // 查询业务员
+        if("2".equals(sysUserInfoListVo.getIsMember())){
+            userInfoList = sysUserJzgInfoMapper.queryYwy(page, sysUserInfoListVo, systemCode);
+        }else if("1".equals(sysUserInfoListVo.getIsMember())){
+            // 查询成员
+            userInfoList = sysUserJzgInfoMapper.queryMember(page, sysUserInfoListVo);
+        }else{
+            userInfoList = new Page<>();
+        }
+        List<SysUserJzgInfoDto> records = userInfoList.getRecords();
+        if(CollectionUtil.isNotEmpty(records)){
+            // 填充岗位信息
+            Map<String, String> attrTypeMap = sysUserJzgInfoSalesmanService.queryAllTypeAttrMap();
+            records = records.stream().peek(action->{
+                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);
+                }
+
+            }).toList();
+            userInfoList.setRecords(records);
+        }
+        //Page<SysUserJzgInfoDto> userInfoList = sysUserJzgInfoMapper.getUserInfoList(page, sysUserInfoListVo);
+        log.info("获取业务员/成员列表:查询出[{}]个业务员。 查询参数: sysUserInfoListVo=[{}]", CollUtil.size(userInfoList.getRecords()),JSONUtil.toJsonStr(sysUserInfoListVo));
         return userInfoList;
     }
 
@@ -317,8 +345,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);
@@ -412,6 +447,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("")) {
@@ -527,6 +566,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) {
@@ -1031,7 +1071,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)
@@ -1040,8 +1079,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) {

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

@@ -59,6 +59,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>

+ 151 - 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,149 @@
             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="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 +289,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 +300,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 +350,6 @@
             suji.user_id = #{userId}
     </select>
 
-
-
     <select id="selectByUserNameAndMobile" resultType="com.jzg.commons.entity.vo.PartnerRecommenderVo">
         SELECT
             p.grade,
@@ -229,8 +372,6 @@
             p.user_id
     </select>
 
-
-
     <select id="selectPartnerReviewVo" resultType="com.jzg.commons.entity.vo.PartnerReviewVo">
         SELECT
             info.id userInfoId,
@@ -259,7 +400,6 @@
           AND sa.partner_status = #{partnerReviewParam.partnerStatus}
     </select>
 
-
     <select id="isPartnerPresent" resultType="java.lang.Boolean">
         SELECT
             IF(COUNT(*) > 0, 1, 0)
@@ -276,7 +416,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 +423,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 +436,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>