Bläddra i källkod

修改:<用户管理>

张旭锋 4 timmar sedan
förälder
incheckning
6b20d0b941

+ 0 - 69
src/main/java/com/jtzx/crm/module/api/web/sys/AdminCurrentSysUserController.java

@@ -1,69 +0,0 @@
-package com.jtzx.crm.module.api.web.sys;
-
-import cc.uncarbon.framework.core.exception.BusinessException;
-import cc.uncarbon.framework.web.model.response.ApiResult;
-import com.jtzx.crm.module.api.constant.ApiConstant;
-import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
-import com.jtzx.crm.module.sys.annotation.SysLog;
-import com.jtzx.crm.module.sys.model.request.AdminUpdateCurrentSysUserAvatarDTO;
-import com.jtzx.crm.module.sys.model.request.AdminUpdateCurrentSysUserInfoDTO;
-import com.jtzx.crm.module.sys.model.request.AdminUpdateCurrentSysUserPasswordDTO;
-import com.jtzx.crm.module.sys.model.response.VbenAdminUserInfoVO;
-import com.jtzx.crm.module.sys.service.SysUserService;
-import cn.dev33.satoken.annotation.SaCheckLogin;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.validation.Valid;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-
-
-@SaCheckLogin(type = CrmAdminStpUtil.TYPE)
-@Tag(name = "当前后台用户信息接口")
-@RequestMapping(value = ApiConstant.HTTP_API_URL_PREFIX + "/api/v1")
-@RequiredArgsConstructor
-@RestController
-@Slf4j
-public class AdminCurrentSysUserController {
-
-    private final SysUserService sysUserService;
-
-
-    @Operation(summary = "取当前用户信息资料")
-    // 新路由与旧路由并行
-    @GetMapping(value = {"/sys/users/me/info", "/sys/users/info"})
-    public ApiResult<VbenAdminUserInfoVO> getMyInfo() {
-        return ApiResult.data(sysUserService.adminGetCurrentUserInfo());
-    }
-
-    @SysLog(value = "修改当前用户密码")
-    @Operation(summary = "修改当前用户密码")
-    @PostMapping(value = "/sys/users/me/password:update")
-    public ApiResult<Void> updatePassword(@RequestBody @Valid AdminUpdateCurrentSysUserPasswordDTO dto) {
-        if (!dto.getConfirmNewPassword().equals(dto.getNewPassword())) {
-            throw new BusinessException(400, "密码与确认密码不同,请检查");
-        }
-        sysUserService.adminUpdateCurrentUserPassword(dto);
-
-        // 用户更改密码后使其当前会话直接过期
-        CrmAdminStpUtil.logout();
-
-        return ApiResult.success();
-    }
-
-    @Operation(summary = "更新当前用户信息资料")
-    @PutMapping(value = "/sys/users/me/info")
-    public ApiResult<Void> updateMyInfo(@RequestBody @Valid AdminUpdateCurrentSysUserInfoDTO dto) {
-        sysUserService.adminUpdateCurrentUserInfo(dto);
-        return ApiResult.success();
-    }
-
-    @Operation(summary = "更新当前用户头像")
-    @PutMapping(value = "/sys/users/me/avatar")
-    public ApiResult<Void> updateMyAvatar(@RequestBody @Valid AdminUpdateCurrentSysUserAvatarDTO dto) {
-        sysUserService.adminUpdateCurrentUserAvatar(dto);
-        return ApiResult.success();
-    }
-
-}

+ 60 - 74
src/main/java/com/jtzx/crm/module/api/web/sys/AdminSysUserController.java

@@ -1,31 +1,26 @@
 package com.jtzx.crm.module.api.web.sys;
 
-import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.framework.core.page.PageParam;
+import cc.uncarbon.framework.core.context.UserContextHolder;
+import cc.uncarbon.framework.core.exception.BusinessException;
 import cc.uncarbon.framework.core.page.PageResult;
-import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import com.google.common.collect.Lists;
 import com.jtzx.crm.module.api.constant.ApiConstant;
+import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
 import com.jtzx.crm.module.sys.annotation.SysLog;
-import com.jtzx.crm.module.sys.enums.SysUserStatusEnum;
-import com.jtzx.crm.module.sys.model.request.AdminBindUserRoleRelationDTO;
-import com.jtzx.crm.module.sys.model.request.AdminInsertOrUpdateSysUserDTO;
 import com.jtzx.crm.module.sys.model.request.AdminListSysUserDTO;
-import com.jtzx.crm.module.sys.model.request.AdminResetSysUserPasswordDTO;
+import com.jtzx.crm.module.sys.model.request.InsertOrUpdateSysUserDTO;
+import com.jtzx.crm.module.sys.model.request.UpdateSysUserPasswordDTO;
 import com.jtzx.crm.module.sys.model.response.SysUserBO;
 import com.jtzx.crm.module.sys.service.SysUserService;
-import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
-import cn.dev33.satoken.annotation.SaCheckLogin;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
-import jakarta.validation.Valid;
-import java.util.Set;
-
 
 @SaCheckLogin(type = CrmAdminStpUtil.TYPE)
 @Tag(name = "后台用户管理接口")
@@ -35,105 +30,96 @@ import java.util.Set;
 @Slf4j
 public class AdminSysUserController {
 
-    private static final String PERMISSION_PREFIX = "SysUser:";
 
     private final SysUserService sysUserService;
 
 
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @Operation(summary = "分页列表")
-    @GetMapping(value = "/sys/users")
-    public ApiResult<PageResult<SysUserBO>> list(PageParam pageParam, AdminListSysUserDTO dto) {
-        return ApiResult.data(sysUserService.adminList(pageParam, dto));
+    @PostMapping(value = "/sys/users/userLists")
+    public ApiResult<PageResult<SysUserBO>> list(@RequestBody AdminListSysUserDTO dto) {
+        return ApiResult.data(sysUserService.adminList(dto));
     }
 
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @Operation(summary = "详情")
-    @GetMapping(value = "/sys/users/{id}")
-    public ApiResult<SysUserBO> getById(@PathVariable Long id) {
-        return ApiResult.data(sysUserService.getOneById(id, true));
-    }
 
     @SysLog(value = "新增后台用户")
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @Operation(summary = "新增")
-    @PostMapping(value = "/sys/users")
-    public ApiResult<Void> insert(@RequestBody @Valid AdminInsertOrUpdateSysUserDTO dto) {
+    @PostMapping(value = "/sys/users/add")
+    public ApiResult<Void> insert(@RequestBody @Valid InsertOrUpdateSysUserDTO dto) {
         sysUserService.adminInsert(dto);
-
         return ApiResult.success();
     }
 
     @SysLog(value = "编辑后台用户")
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @Operation(summary = "编辑")
-    @PutMapping(value = "/sys/users/{id}")
-    public ApiResult<Void> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysUserDTO dto) {
-        dto.setId(id);
-        sysUserService.adminUpdate(dto);
-
-        // 新状态是禁用,连带踢出登录
-        if (dto.getStatus() == SysUserStatusEnum.BANNED) {
-            kickOut(dto.getId());
+    @PostMapping(value = "/sys/users/update/{id}")
+    public ApiResult<Void> update(@Valid InsertOrUpdateSysUserDTO dto) {
+        if (dto.getId() == 1 && UserContextHolder.getUserId() != 1) {
+            throw new BusinessException(400, "无权修改系统默认管理员账号信息");
         }
-
+        sysUserService.adminUpdate(dto);
         return ApiResult.success();
     }
 
     @SysLog(value = "删除后台用户")
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @Operation(summary = "删除")
-    @DeleteMapping(value = "/sys/users")
-    public ApiResult<Void> delete(@RequestBody @Valid IdsDTO<Long> dto) {
-        sysUserService.adminDelete(dto.getIds());
-
+    @GetMapping(value = "/sys/users/delete/{userId}")
+    public ApiResult<Void> delete(@PathVariable Long userId) {
+        if (userId == 1) {
+            throw new BusinessException(400, "无权删除默认管理员账号");
+        }
+        sysUserService.adminDelete(Lists.newArrayList(userId));
         // 连带踢出登录
-        dto.getIds().forEach(this::kickOut);
-
+        CrmAdminStpUtil.kickout(userId);
         return ApiResult.success();
     }
 
-    @SysLog(value = "重置某用户密码")
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + "resetPassword")
     @Operation(summary = "重置某用户密码")
-    @PutMapping(value = "/sys/users/{userId}/password")
-    public ApiResult<Void> resetPassword(@PathVariable Long userId, @RequestBody @Valid AdminResetSysUserPasswordDTO dto) {
-        dto.setUserId(userId);
-        sysUserService.adminResetUserPassword(dto);
-
+    @PostMapping(value = "/sys/users/updatePwd")
+    public ApiResult<Void> resetPassword(@RequestBody @Valid UpdateSysUserPasswordDTO dto) {
+        if (dto.getUserId() == 1 && UserContextHolder.getUserId() != 1) {
+            throw new BusinessException(400, "无权修改系统默认管理员账号密码");
+        }
+        sysUserService.UpdateUserPassword(dto);
         // 踢出原登录
-        CrmAdminStpUtil.kickout(dto.getUserId());
-
+        if (dto.getUserId() != 1) {
+            CrmAdminStpUtil.kickout(dto.getUserId());
+        }
         return ApiResult.success();
     }
 
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + "bindRoles")
-    @Operation(summary = "绑定用户与角色关联关系")
-    @PutMapping(value = "/sys/users/{userId}/roles")
-    public ApiResult<Void> bindRoles(@PathVariable Long userId, @RequestBody AdminBindUserRoleRelationDTO dto) {
-        dto.setUserId(userId);
-        sysUserService.adminBindRoles(dto);
-
-        // 该用户会被强制踢下线,以更新对应权限;可以视业务需要决定是否删除该代码
-        this.kickOut(dto.getUserId());
+    @Operation(summary = "启用,禁用用户")
+    @GetMapping(value = "/sys/users/status/{userId}")
+    public ApiResult<Integer> updateUserStatus(@PathVariable Long userId) {
+        if (userId == 1) {
+            throw new BusinessException(400, "无权修改系统默认管理员账号状态");
+        }
+        Integer result = sysUserService.updateUserStatus(userId);
+        // 连带踢出登录
+        CrmAdminStpUtil.kickout(userId);
+        return ApiResult.data(result);
+    }
 
-        return ApiResult.success();
+    @Operation(summary = "启用,关闭,公海,历史跟进状态", description = "公海跟进固定值(publicFollow),历史跟进固定值(historyFollow)")
+    @GetMapping(value = "/sys/users/follow/{userId}/{followType}")
+    public ApiResult<Integer> updateUserFollow(@PathVariable Long userId, @PathVariable String followType) {
+        if (userId == 1 && UserContextHolder.getUserId() != 1) {
+            throw new BusinessException(400, "无权修改系统默认管理员账号状态");
+        }
+        Integer result = sysUserService.updateUserFollow(userId, followType);
+        return ApiResult.data(result);
     }
 
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + "kickOut")
     @Operation(summary = "踢某用户下线")
     @PostMapping(value = "/sys/users/{userId}:kick-out")
     public ApiResult<Void> kickOut(@PathVariable Long userId) {
+        if(userId == 1){
+            throw new BusinessException(400, "无权下线系统默认管理员");
+        }
+        if(userId.equals(UserContextHolder.getUserId())){
+            throw new BusinessException(400, "不能下线自己");
+        }
         CrmAdminStpUtil.kickout(userId);
-
         return ApiResult.success();
     }
 
-    @SaCheckPermission(type = CrmAdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @Operation(summary = "取指定用户关联角色ID")
-    @GetMapping(value = "/sys/users/{userId}/roles")
-    public ApiResult<Set<Long>> listRelatedRoleIds(@PathVariable Long userId) {
-        return ApiResult.data(sysUserService.listRelatedRoleIds(userId));
-    }
-
 }

+ 34 - 0
src/main/java/com/jtzx/crm/module/api/web/sys/CurrentSysUserController.java

@@ -0,0 +1,34 @@
+package com.jtzx.crm.module.api.web.sys;
+
+import cc.uncarbon.framework.web.model.response.ApiResult;
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import com.jtzx.crm.module.api.constant.ApiConstant;
+import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
+import com.jtzx.crm.module.sys.model.response.VbenAdminUserInfoVO;
+import com.jtzx.crm.module.sys.service.SysUserService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@SaCheckLogin(type = CrmAdminStpUtil.TYPE)
+@Tag(name = "当前后台用户信息接口")
+@RequestMapping(value = ApiConstant.HTTP_API_URL_PREFIX + "/api/v1")
+@RequiredArgsConstructor
+@RestController
+@Slf4j
+public class CurrentSysUserController {
+
+    private final SysUserService sysUserService;
+
+
+    @Operation(summary = "取当前用户登陆用户信息接口")
+    @GetMapping(value = "/sys/users/me/info")
+    public ApiResult<VbenAdminUserInfoVO> getMyInfo() {
+        return ApiResult.data(sysUserService.getCurrentUserInfo());
+    }
+}

+ 5 - 16
src/main/java/com/jtzx/crm/module/sys/entity/SysUserEntity.java

@@ -1,11 +1,9 @@
 package com.jtzx.crm.module.sys.entity;
 
-import cc.uncarbon.framework.core.enums.GenderEnum;
 import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
 import cn.hutool.core.annotation.Alias;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.jtzx.crm.module.sys.enums.SysUserStatusEnum;
 import com.jtzx.crm.module.sys.model.request.AdminUpdateCurrentSysUserAvatarDTO;
 import com.jtzx.crm.module.sys.model.request.AdminUpdateCurrentSysUserInfoDTO;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -44,21 +42,14 @@ public class SysUserEntity extends HelioBaseEntity<Long> {
 	@TableField(value = "salt")
 	private String salt;
 
-	@Schema(description = "昵称")
-	@TableField(value = "nickname")
-	private String nickname;
-
-	@Schema(description = "状态")
+	@Schema(description = "状态(0=禁用 1=启用)")
 	@TableField(value = "status")
-	private SysUserStatusEnum status;
+	private Integer status;
 
-	@Schema(description = "性别")
+	@Schema(description = "性别,0-男,1-女,null-未知")
 	@TableField(value = "gender")
-	private GenderEnum gender;
+	private Integer gender;
 
-	@Schema(description = "邮箱")
-	@TableField(value = "email")
-	private String email;
 
 	@Schema(description = "手机号")
 	@TableField(value = "phone_no")
@@ -103,9 +94,7 @@ public class SysUserEntity extends HelioBaseEntity<Long> {
 
 	public static SysUserEntity of(AdminUpdateCurrentSysUserInfoDTO dto) {
 		SysUserEntity ret = new SysUserEntity();
-		ret.setNickname(dto.getNickname())
-		   .setGender(dto.getGender())
-		   .setEmail(dto.getEmail())
+		ret.setGender(dto.getGender())
 		   .setPhoneNo(dto.getPhoneNo());
 		return ret;
 	}

+ 0 - 84
src/main/java/com/jtzx/crm/module/sys/model/request/AdminInsertOrUpdateSysUserDTO.java

@@ -1,84 +0,0 @@
-package com.jtzx.crm.module.sys.model.request;
-
-import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.framework.core.enums.GenderEnum;
-import cc.uncarbon.framework.core.exception.BusinessException;
-import com.jtzx.crm.module.sys.enums.SysUserStatusEnum;
-import cn.hutool.core.text.CharSequenceUtil;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Pattern;
-import jakarta.validation.constraints.Size;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-
-/**
- * 后台管理-新增/编辑后台用户
- */
-@Accessors(chain = true)
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class AdminInsertOrUpdateSysUserDTO implements Serializable {
-
-    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
-    private Long id;
-
-    @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(min = 6, max = 16, message = "【账号】最短6位,最长16位")
-    @NotBlank(message = "账号不能为空")
-    private String username;
-
-    @Schema(description = "密码字符串(仅注册时有效)")
-    private String passwordOfNewUser;
-
-    @Schema(description = "昵称", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(max = 100, message = "【昵称】最长100位")
-    @NotBlank(message = "昵称不能为空")
-    private String nickname;
-
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "状态不能为空")
-    private SysUserStatusEnum status;
-
-    @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "性别不能为空")
-    private GenderEnum gender;
-
-    @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Pattern(message = "邮箱格式有误", regexp = HelioConstant.Regex.EMAIL)
-    @Size(max = 255, message = "【邮箱】最长255位")
-    @NotBlank(message = "邮箱不能为空")
-    private String email;
-
-    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Pattern(message = "手机号格式有误", regexp = HelioConstant.Regex.CHINA_MAINLAND_PHONE_NO)
-    @Size(max = 20, message = "【手机号】最长20位")
-    @NotBlank(message = "手机号不能为空")
-    private String phoneNo;
-
-    @Schema(description = "所属部门ID")
-    private Long deptId;
-
-
-    public void validate() {
-        boolean isUpdate = Objects.nonNull(id);
-        if (!isUpdate) {
-            // 新增
-            int passwordOfNewUserLen = CharSequenceUtil.length(passwordOfNewUser);
-            if (passwordOfNewUserLen < 8 || passwordOfNewUserLen > 20) {
-                throw new BusinessException("【密码】最短8位,最长20位");
-            }
-        }
-    }
-
-}

+ 9 - 12
src/main/java/com/jtzx/crm/module/sys/model/request/AdminListSysUserDTO.java

@@ -1,6 +1,5 @@
 package com.jtzx.crm.module.sys.model.request;
 
-import com.jtzx.crm.module.sys.constant.SysConstant;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -9,7 +8,6 @@ import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
-import java.util.Objects;
 
 
 /**
@@ -22,17 +20,16 @@ import java.util.Objects;
 @Data
 public class AdminListSysUserDTO implements Serializable {
 
-    @Schema(description = "手机号(关键词)")
-    private String phoneNo;
+    @Schema(description = "模糊搜索")
+    private String queryStr;
 
-    @Schema(description = "手动选择的部门ID")
-    private Long selectedDeptId;
+    @Schema(defaultValue = "状态(0=禁用 1=启用)")
+    private Integer status;
 
-    /**
-     * 是否需要根据【手动选择的部门】筛选用户
-     */
-    public boolean needFilterBySelectedDeptId() {
-        return Objects.nonNull(selectedDeptId) && selectedDeptId > SysConstant.ROOT_PARENT_ID;
-    }
+    @Schema(defaultValue = "当前页码")
+    private Integer pageNum;
+
+    @Schema(defaultValue = "每页行数")
+    private Integer pageSize;
 
 }

+ 1 - 8
src/main/java/com/jtzx/crm/module/sys/model/request/AdminUpdateCurrentSysUserInfoDTO.java

@@ -1,7 +1,6 @@
 package com.jtzx.crm.module.sys.model.request;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.framework.core.enums.GenderEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
@@ -32,13 +31,7 @@ public class AdminUpdateCurrentSysUserInfoDTO implements Serializable {
 
     @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotNull(message = "性别不能为空")
-    private GenderEnum gender;
-
-    @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Pattern(message = "邮箱格式有误", regexp = HelioConstant.Regex.EMAIL)
-    @Size(max = 255, message = "【邮箱】最长255位")
-    @NotBlank(message = "邮箱不能为空")
-    private String email;
+    private Integer gender;
 
     @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
     @Pattern(message = "手机号格式有误", regexp = HelioConstant.Regex.CHINA_MAINLAND_PHONE_NO)

+ 66 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/InsertOrUpdateSysUserDTO.java

@@ -0,0 +1,66 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import cc.uncarbon.framework.core.enums.GenderEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+
+/**
+ * 后台管理-新增/编辑后台用户
+ */
+@Accessors(chain = true)
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class InsertOrUpdateSysUserDTO implements Serializable {
+
+    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
+    private Long id;
+
+    @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "账号不能为空")
+    private String account;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "姓名不能为空")
+    private String username;
+
+    @Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "性别不能为空")
+    private GenderEnum gender;
+
+
+    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Pattern(message = "手机号格式有误", regexp = HelioConstant.Regex.CHINA_MAINLAND_PHONE_NO)
+    @Size(max = 11, message = "【手机号】最长11位")
+    @NotBlank(message = "手机号不能为空")
+    private String phoneNo;
+
+
+    @Schema(description = "公海跟进状态开关,0-关,1-开")
+    private Integer publicFollowStatus;
+
+    @Schema(description = "历史跟进状态开关,0-关,1-开")
+    private Integer historyFollowStatus;
+
+    @Schema(description = "持有上限")
+    private Integer holdTopCount;
+
+    @Schema(description = "日退上限")
+    private Integer dayBackTopCount;
+
+    @Schema(description = "退回公海天数")
+    private Integer backPublicDayCount;
+}

+ 11 - 8
src/main/java/com/jtzx/crm/module/sys/model/request/AdminUpdateCurrentSysUserPasswordDTO.java → src/main/java/com/jtzx/crm/module/sys/model/request/UpdateSysUserPasswordDTO.java

@@ -20,20 +20,23 @@ import java.io.Serializable;
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
-public class AdminUpdateCurrentSysUserPasswordDTO implements Serializable {
+public class UpdateSysUserPasswordDTO implements Serializable {
 
-    @Schema(description = "原密码", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotBlank(message = "原密码不能为空")
-    private String oldPassword;
+//    @Schema(description = "原密码", requiredMode = Schema.RequiredMode.REQUIRED)
+//    @NotBlank(message = "原密码不能为空")
+//    private String oldPassword;
 
     @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED)
     @Size(min = 8, max = 20, message = "【密码】长度须在 8 至 20 位之间")
     @NotBlank(message = "密码不能为空")
     private String newPassword;
 
-    @Schema(description = "确认新密码", requiredMode = Schema.RequiredMode.REQUIRED)
-    @Size(min = 8, max = 20, message = "【确认密码】长度须在 8 至 20 位之间")
-    @NotBlank(message = "确认密码不能为空")
-    private String confirmNewPassword;
+//    @Schema(description = "确认新密码", requiredMode = Schema.RequiredMode.REQUIRED)
+//    @Size(min = 8, max = 20, message = "【确认密码】长度须在 8 至 20 位之间")
+//    @NotBlank(message = "确认密码不能为空")
+//    private String confirmNewPassword;
+
+    @Schema(description = "用户id")
+    private Long userId;
 
 }

+ 21 - 12
src/main/java/com/jtzx/crm/module/sys/model/response/SysUserBO.java

@@ -1,8 +1,6 @@
 package com.jtzx.crm.module.sys.model.response;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.framework.core.enums.GenderEnum;
-import com.jtzx.crm.module.sys.enums.SysUserStatusEnum;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
@@ -39,20 +37,17 @@ public class SysUserBO implements Serializable {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
     private LocalDateTime updatedAt;
 
-    @Schema(description = "账号")
+    @Schema(description = "姓名")
     private String username;
 
-    @Schema(description = "昵称")
-    private String nickname;
-
-    @Schema(description = "状态")
-    private SysUserStatusEnum status;
+    @Schema(description = "账号")
+    private String account;
 
-    @Schema(description = "性别")
-    private GenderEnum gender;
+    @Schema(description = "状态(0=禁用 1=启用)")
+    private Integer status;
 
-    @Schema(description = "邮箱")
-    private String email;
+    @Schema(description = "性别,0-男,1-女,null-未知")
+    private Integer gender;
 
     @Schema(description = "手机号")
     private String phoneNo;
@@ -69,4 +64,18 @@ public class SysUserBO implements Serializable {
     @Schema(description = "头像URL")
     private String avatarUrl;
 
+    @Schema(description = "公海跟进状态开关,0-关,1-开")
+    private Integer publicFollowStatus;
+
+    @Schema(description = "历史跟进状态开关,0-关,1-开")
+    private Integer historyFollowStatus;
+
+    @Schema(description = "持有上限")
+    private Integer holdTopCount;
+
+    @Schema(description = "日退上限")
+    private Integer dayBackTopCount;
+
+    @Schema(description = "退回公海天数")
+    private Integer backPublicDayCount;
 }

+ 3 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysUserLoginBO.java

@@ -38,6 +38,9 @@ public class SysUserLoginBO implements Serializable {
     @Schema(description = "手机号")
     private String phoneNo;
 
+    @Schema(description = "性别,0-男,1-女,null-未知")
+    private Integer gender;
+
     @Schema(description = "对应角色ID")
     private Set<Long> roleIds;
 

+ 9 - 9
src/main/java/com/jtzx/crm/module/sys/model/response/VbenAdminUserInfoVO.java

@@ -1,6 +1,5 @@
 package com.jtzx.crm.module.sys.model.response;
 
-import cc.uncarbon.framework.core.enums.GenderEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -10,6 +9,7 @@ import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.List;
 
 
 /**
@@ -22,20 +22,17 @@ import java.time.LocalDateTime;
 @Data
 public class VbenAdminUserInfoVO implements Serializable {
 
-    @Schema(description = "账号")
+    @Schema(description = "姓名")
     private String username;
 
-    @Schema(description = "昵称")
-    private String nickname;
+    @Schema(description = "账号")
+    private String account;
 
     @Schema(description = "最后登录时刻")
     private LocalDateTime lastLoginAt;
 
-    @Schema(description = "性别")
-    private GenderEnum gender;
-
-    @Schema(description = "邮箱")
-    private String email;
+    @Schema(description = "性别,0-男,1-女,null-未知")
+    private Integer gender;
 
     @Schema(description = "手机号")
     private String phoneNo;
@@ -43,4 +40,7 @@ public class VbenAdminUserInfoVO implements Serializable {
     @Schema(description = "头像URL")
     private String avatar;
 
+    @Schema(description = "对应角色名")
+    private List<String> roles;
+
 }

+ 103 - 250
src/main/java/com/jtzx/crm/module/sys/service/SysUserService.java

@@ -1,35 +1,29 @@
 package com.jtzx.crm.module.sys.service;
 
-import cc.uncarbon.framework.core.context.TenantContext;
-import cc.uncarbon.framework.core.context.TenantContextHolder;
 import cc.uncarbon.framework.core.context.UserContextHolder;
-import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.framework.core.exception.BusinessException;
-import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
-import cc.uncarbon.framework.core.props.HelioProperties;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.jtzx.crm.module.sys.constant.SysConstant;
 import com.jtzx.crm.module.sys.entity.SysUserEntity;
 import com.jtzx.crm.module.sys.enums.SysErrorEnum;
-import com.jtzx.crm.module.sys.enums.SysUserStatusEnum;
 import com.jtzx.crm.module.sys.mapper.SysUserMapper;
-import com.jtzx.crm.module.sys.model.interior.UserRoleContainer;
-import com.jtzx.crm.module.sys.model.request.*;
+import com.jtzx.crm.module.sys.model.request.AdminListSysUserDTO;
+import com.jtzx.crm.module.sys.model.request.InsertOrUpdateSysUserDTO;
+import com.jtzx.crm.module.sys.model.request.UpdateSysUserPasswordDTO;
 import com.jtzx.crm.module.sys.model.response.SysUserBO;
 import com.jtzx.crm.module.sys.model.response.SysUserLoginBO;
 import com.jtzx.crm.module.sys.model.response.VbenAdminUserInfoVO;
 import com.jtzx.crm.module.sys.util.PwdUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -47,58 +41,43 @@ public class SysUserService {
 
     private final SysUserMapper sysUserMapper;
     private final SysRoleService sysRoleService;
-    private final SysMenuService sysMenuService;
-    private final SysUserRoleRelationService sysUserRoleRelationService;
-    private final SysRoleMenuRelationService sysRoleMenuRelationService;
-    private final HelioProperties helioProperties;
 
     /**
      * 后台管理-分页列表
      */
-    public PageResult<SysUserBO> adminList(PageParam pageParam, AdminListSysUserDTO dto) {
-        // 预处理:根据【手动选择的部门】筛选用户
-        Set<Long> deptUserIds = Collections.emptySet();
-
+    public PageResult<SysUserBO> adminList(AdminListSysUserDTO dto) {
+        if (dto.getStatus() == null) {
+            dto.setStatus(1);
+        }
         Page<SysUserEntity> entityPage = sysUserMapper.selectPage(
-                new Page<>(pageParam.getPageNum(), pageParam.getPageSize()),
+                new Page<>(dto.getPageNum(), dto.getPageSize()),
                 new QueryWrapper<SysUserEntity>()
                         .lambda()
-                        // 手机号
-                        .like(CharSequenceUtil.isNotBlank(dto.getPhoneNo()), SysUserEntity::getPhoneNo, CharSequenceUtil.cleanBlank(dto.getPhoneNo()))
-                        // 根据【手动选择的部门ID】筛选用户
-                        .in(CollUtil.isNotEmpty(deptUserIds), SysUserEntity::getId, deptUserIds)
+                        .eq(SysUserEntity::getStatus, dto.getStatus())
+                        .and(
+                                CharSequenceUtil.isNotBlank(dto.getQueryStr()),
+                                z -> z.like(SysUserEntity::getPhoneNo, CharSequenceUtil.cleanBlank(dto.getQueryStr()))
+                                        .or(x -> x.like(SysUserEntity::getUserName, dto.getQueryStr()))
+                        )
                         // 排序
                         .orderByDesc(SysUserEntity::getCreatedAt)
         );
-
         return this.entityPage2BOPage(entityPage);
     }
 
-    /**
-     * 根据 ID 取详情
-     *
-     * @param id 主键ID
-     * @return null or BO
-     */
-    public SysUserBO getOneById(Long id) {
-        return this.getOneById(id, false);
-    }
-
     /**
      * 根据 ID 取详情
      *
      * @param id               主键ID
-     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
      * @return null or BO
      */
-    public SysUserBO getOneById(Long id, boolean throwIfInvalidId) throws BusinessException {
+    public SysUserBO getOneById(Long id) throws BusinessException {
 
         SysUserEntity entity = sysUserMapper.selectById(id);
-        if (throwIfInvalidId) {
-            SysErrorEnum.INVALID_ID.assertNotNull(entity);
+        if (entity == null) {
+            throw new BusinessException(400, "用户不存在");
         }
-
-        return this.entity2BO(entity, true);
+        return this.entity2BO(entity);
     }
 
     /**
@@ -107,18 +86,18 @@ public class SysUserService {
      * @return 主键ID
      */
     @Transactional(rollbackFor = Exception.class)
-    public void adminInsert(AdminInsertOrUpdateSysUserDTO dto) {
+    public void adminInsert(InsertOrUpdateSysUserDTO dto) {
         log.info("[后台管理-新增后台用户] >> 入参={}", dto);
         this.checkExistence(dto);
         dto.setId(null);
         SysUserEntity entity = new SysUserEntity();
         BeanUtil.copyProperties(dto, entity);
-
+        entity.setStatus(1);
         String salt = IdUtil.randomUUID();
         entity
                 .setSalt(salt)
-                .setPin(dto.getUsername())
-                .setPwd(PwdUtil.encrypt(dto.getPasswordOfNewUser(), salt));
+                .setPin(dto.getAccount())
+                .setPwd(PwdUtil.encrypt(dto.getAccount(), salt));
 
         sysUserMapper.insert(entity);
     }
@@ -127,15 +106,13 @@ public class SysUserService {
      * 后台管理-编辑
      */
     @Transactional(rollbackFor = Exception.class)
-    public void adminUpdate(AdminInsertOrUpdateSysUserDTO dto) {
+    public void adminUpdate(InsertOrUpdateSysUserDTO dto) {
         log.info("[后台管理-编辑后台用户] >> 入参={}", dto);
-        preUpdateCheck(dto.getId(), dto.getStatus());
         this.checkExistence(dto);
-
         SysUserEntity entity = new SysUserEntity();
         BeanUtil.copyProperties(dto, entity);
         // 手动处理异名字段
-        entity.setPin(dto.getUsername());
+        entity.setPin(dto.getAccount());
         sysUserMapper.updateById(entity);
     }
 
@@ -163,7 +140,7 @@ public class SysUserService {
             return null;
         }
 
-        if (SysUserStatusEnum.BANNED == sysUserEntity.getStatus()) {
+        if (sysUserEntity.getStatus() == 0) {
             return null;
         }
 
@@ -174,23 +151,16 @@ public class SysUserService {
         this.updateLastLoginAt(sysUserEntity.getId(), LocalDateTimeUtil.now());
 
         // 取账号完整信息
-        SysUserBO sysUserBO = this.entity2BO(sysUserEntity, false);
+        SysUserBO sysUserBO = this.entity2BO(sysUserEntity);
 
         Map<Long, String> roleMap = sysRoleService.getRoleMapByUserId(sysUserBO.getId());
 
-//        Map<Long, Set<String>> roleIdPermissionMap = sysMenuService.getRoleIdPermissionMap(roleMap.keySet());
-
         // 包装返回体;有的字段类型不一致, 单独转换
         SysUserLoginBO ret = new SysUserLoginBO();
         BeanUtil.copyProperties(sysUserBO, ret);
-
-//        Set<String> permissions = roleIdPermissionMap.values().stream().flatMap(Collection::stream).collect(Collectors.toSet());
-
         ret
                 .setRoleIds(new HashSet<>(roleMap.keySet()))
                 .setRoles(new ArrayList<>(roleMap.values()));
-//                .setPermissions(permissions)
-//                .setRoleIdPermissionMap(roleIdPermissionMap);
 
         return ret;
     }
@@ -198,121 +168,98 @@ public class SysUserService {
     /**
      * 后台管理-取当前用户信息
      */
-    public VbenAdminUserInfoVO adminGetCurrentUserInfo() {
-        SysUserBO sysUserBO = this.getOneById(UserContextHolder.getUserId(), true);
+    public VbenAdminUserInfoVO getCurrentUserInfo() {
+        SysUserBO sysUserBO = this.getOneById(UserContextHolder.getUserId());
+        if (sysUserBO == null) {
+            throw new BusinessException(400, "用户不存在");
+        }
+        Map<Long, String> roleMap = sysRoleService.getRoleMapByUserId(sysUserBO.getId());
         return VbenAdminUserInfoVO.builder()
                 .username(sysUserBO.getUsername())
-                .nickname(sysUserBO.getNickname())
+                .account(sysUserBO.getAccount())
                 .lastLoginAt(sysUserBO.getLastLoginAt())
                 .gender(sysUserBO.getGender())
-                .email(sysUserBO.getEmail())
                 .phoneNo(sysUserBO.getPhoneNo())
                 .avatar(sysUserBO.getAvatarUrl())
+                .roles(new ArrayList<>(roleMap.values()))
                 .build();
     }
 
-    /**
-     * 后台管理-重置某用户密码
-     */
-    public void adminResetUserPassword(AdminResetSysUserPasswordDTO dto) {
-        preUpdateCheck(dto.getUserId(), null);
-        SysUserEntity sysUserEntity = sysUserMapper.selectById(dto.getUserId());
-
-        SysUserEntity templateEntity = new SysUserEntity();
-        templateEntity
-                .setPwd(PwdUtil.encrypt(dto.getRandomPassword(), sysUserEntity.getSalt()))
-                .setId(dto.getUserId());
-
-        sysUserMapper.updateById(templateEntity);
-    }
 
     /**
-     * 后台管理-修改当前用户密码
+     * 后台管理-修改用户密码
      */
-    public void adminUpdateCurrentUserPassword(AdminUpdateCurrentSysUserPasswordDTO dto) {
-        SysUserEntity sysUserEntity = sysUserMapper.selectById(UserContextHolder.getUserId());
-        if (sysUserEntity == null || !sysUserEntity.getPwd().equals(PwdUtil.encrypt(dto.getOldPassword(), sysUserEntity.getSalt()))) {
-            throw new BusinessException(SysErrorEnum.INCORRECT_OLD_PASSWORD);
+    public void UpdateUserPassword(UpdateSysUserPasswordDTO dto) {
+        if (StrUtil.isEmpty(dto.getNewPassword())) {
+            throw new BusinessException(400, "密码不能为空");
+        }
+        SysUserEntity sysUserEntity = sysUserMapper.selectById(dto.getUserId());
+        if (sysUserEntity == null) {
+            throw new BusinessException(400, "用户不存在");
         }
-
         sysUserEntity
-                .setPwd(PwdUtil.encrypt(dto.getConfirmNewPassword(), sysUserEntity.getSalt()))
-                .setId(UserContextHolder.getUserId());
-
+                .setPwd(PwdUtil.encrypt(dto.getNewPassword(), sysUserEntity.getSalt()))
+                .setId(dto.getUserId());
         sysUserMapper.updateById(sysUserEntity);
     }
 
     /**
-     * 后台管理-绑定用户与角色关联关系
+     * 启用或禁用用户状态
+     * @param userId
      */
-    public void adminBindRoles(AdminBindUserRoleRelationDTO dto) {
-        preBindUserRoleRelationCheck(dto);
-        sysUserRoleRelationService.cleanAndBind(dto.getUserId(), dto.getRoleIds());
+    public Integer updateUserStatus(Long userId) {
+        SysUserEntity sysUserEntity = sysUserMapper.selectById(userId);
+        if (sysUserEntity == null) {
+            throw new BusinessException(400, "用户不存在");
+        }
+        if (sysUserEntity.getStatus().equals(1)) {
+            sysUserEntity.setStatus(0);
+        } else {
+            sysUserEntity.setStatus(1);
+        }
+        return sysUserEntity.getStatus();
     }
 
-    /**
-     * 根据用户账号查询
-     */
-    public SysUserEntity getUserByPin(String pin) {
-        return sysUserMapper.getUserByPin(pin);
-    }
 
     /**
-     * 后台管理 - 取指定用户关联角色ID
-     *
-     * @param userId 用户ID
-     * @return 角色Ids
+     * 启用或禁用用户跟进状态
+     * @param userId
+     * @param followType 开关的跟进类型,公海跟进-publicFollow,历史跟进 -historyFollow
      */
-    public Set<Long> listRelatedRoleIds(Long userId) {
-        if (ObjectUtil.isNull(userId)) {
-            return Collections.emptySet();
+    public Integer updateUserFollow(Long userId,String followType) {
+        SysUserEntity sysUserEntity = sysUserMapper.selectById(userId);
+        if (sysUserEntity == null) {
+            throw new BusinessException(400, "用户不存在");
         }
-        return sysRoleService.getRoleMapByUserId(userId).keySet();
-    }
-
-    /**
-     * 后台管理 - 取租户用户IDs
-     *
-     * @param tenantId    租户ID,非主键ID
-     * @param statusEnums 仅保留符合指定状态的,可以为null
-     */
-    public List<Long> listUserIdsByTenantId(Long tenantId, Collection<EnabledStatusEnum> statusEnums) {
-        if (Objects.isNull(tenantId)) {
-            return Collections.emptyList();
+        if(followType.equals("publicFollow")){
+            if(sysUserEntity.getPublicFollowStatus().equals(1)) {
+                sysUserEntity.setPublicFollowStatus(0);
+            }else {
+                sysUserEntity.setPublicFollowStatus(1);
+            }
+            return sysUserEntity.getPublicFollowStatus();
         }
-        // 备份原始租户上下文;以下查询方式可同时兼容行级、数据源级多租户
-        TenantContext originContext = TenantContextHolder.getTenantContext();
-        try {
-            // 临时切换租户
-            TenantContextHolder.setTenantContext(new TenantContext(tenantId, CharSequenceUtil.EMPTY));
-            return sysUserMapper.selectIds(statusEnums);
-        } finally {
-            TenantContextHolder.setTenantContext(originContext);
+        if(followType.equals("historyFollow")){
+            if(sysUserEntity.getHistoryFollowStatus().equals(1)) {
+                sysUserEntity.setHistoryFollowStatus(0);
+            }else {
+                sysUserEntity.setHistoryFollowStatus(1);
+            }
+            return sysUserEntity.getHistoryFollowStatus();
         }
+        return null;
     }
 
-    /**
-     * 后台管理-更新当前用户信息资料
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void adminUpdateCurrentUserInfo(AdminUpdateCurrentSysUserInfoDTO dto) {
-        SysUserEntity update = SysUserEntity.of(dto);
-        update.setId(UserContextHolder.getUserId());
-        sysUserMapper.updateById(update);
-    }
+
 
     /**
-     * 后台管理-更新当前用户头像
+     * 根据用户账号查询
      */
-    @Transactional(rollbackFor = Exception.class)
-    public void adminUpdateCurrentUserAvatar(AdminUpdateCurrentSysUserAvatarDTO dto) {
-        dto.securityCheck();
-
-        SysUserEntity update = SysUserEntity.of(dto);
-        update.setId(UserContextHolder.getUserId());
-        sysUserMapper.updateById(update);
+    public SysUserEntity getUserByPin(String pin) {
+        return sysUserMapper.getUserByPin(pin);
     }
 
+
     /*
     ----------------------------------------------------------------
                         私有方法 private methods
@@ -323,19 +270,18 @@ public class SysUserService {
      * 实体转 BO
      *
      * @param entity       实体
-     * @param fillDeptInfo 是否根据实体部门ID,查询关联部门信息并填充到BO
      * @return BO
      */
-    private SysUserBO entity2BO(SysUserEntity entity, boolean fillDeptInfo) {
+    private SysUserBO entity2BO(SysUserEntity entity) {
         if (entity == null) {
             return null;
         }
-
         SysUserBO bo = new SysUserBO();
         BeanUtil.copyProperties(entity, bo);
 
         // 可以在此处为BO填充字段
-        bo.setUsername(entity.getPin());
+        bo.setUsername(entity.getUserName());
+        bo.setAccount(entity.getPin());
         return bo;
     }
 
@@ -353,7 +299,7 @@ public class SysUserService {
         // 深拷贝
         List<SysUserBO> ret = new ArrayList<>(entityList.size());
         entityList.forEach(
-                entity -> ret.add(this.entity2BO(entity, true))
+                entity -> ret.add(this.entity2BO(entity))
         );
 
         return ret;
@@ -378,15 +324,22 @@ public class SysUserService {
      *
      * @param dto DTO
      */
-    private void checkExistence(AdminInsertOrUpdateSysUserDTO dto) {
-        SysUserEntity existingEntity = this.getUserByPin(dto.getUsername());
+    private void checkExistence(InsertOrUpdateSysUserDTO dto) {
+        SysUserEntity existingEntity = this.getUserByPin(dto.getAccount());
 
         if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
             throw new BusinessException(400, "已存在相同账号,请重新输入");
         }
-    }
-
+        SysUserEntity entity =
+                sysUserMapper.selectOne(
+                        new LambdaQueryWrapper<>(SysUserEntity.class)
+                                .eq(SysUserEntity::getPhoneNo, dto.getPhoneNo())
+                );
+        if (entity != null && !entity.getId().equals(dto.getId())) {
+            throw new BusinessException(400, "已存在相同手机号,请重新输入");
+        }
 
+    }
 
 
     private void updateLastLoginAt(Long userId, LocalDateTime lastLoginAt) {
@@ -397,37 +350,6 @@ public class SysUserService {
         sysUserMapper.updateById(entity);
     }
 
-    /**
-     * 编辑后台用户信息前检查
-     *
-     * @param specifiedUserId 被操作用户ID
-     * @param statusEnum      用户状态枚举,可以为null
-     */
-    private void preUpdateCheck(Long specifiedUserId, @Nullable SysUserStatusEnum statusEnum) {
-        UserRoleContainer currentUser = sysRoleService.getCurrentUserRoleContainer();
-        if (currentUser.isAdmin()) {
-            // 超级管理员除禁用自己外为所欲为
-            if (statusEnum == SysUserStatusEnum.BANNED && Objects.equals(specifiedUserId, UserContextHolder.getUserId())) {
-                throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_SELF_USER);
-            }
-            return;
-        }
-
-        if (Objects.equals(specifiedUserId, UserContextHolder.getUserId())) {
-            // 不能动自身用户
-            throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_SELF_USER);
-        }
-
-        // 目标是超级管理员or租户管理员时,均不能编辑
-        UserRoleContainer specifiedUser = sysRoleService.getSpecifiedUserRoleContainer(specifiedUserId);
-        if (specifiedUser.isGroupManager()) {
-            throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_THIS_USER);
-        }
-
-//        dataScopeCheck(Collections.singleton(specifiedUserId));
-        // 暂未实现角色层级,一律平级
-    }
-
     /**
      * 删除后台用户前检查
      */
@@ -437,81 +359,12 @@ public class SysUserService {
             throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_SELF_USER);
         }
 
-        // 目标是超级管理员时,不能删除
-        List<UserRoleContainer> specifiedUsers = ids.stream().map(sysRoleService::getSpecifiedUserRoleContainer).toList();
-        if (specifiedUsers.stream().anyMatch(UserRoleContainer::isAdmin)) {
-            throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_THIS_USER);
-        }
-
-        // 只有超级管理员可以删租户管理员用户
-        UserRoleContainer currentUser = sysRoleService.getCurrentUserRoleContainer();
-        if (!currentUser.isGroupManager()) {
-            throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_THIS_USER);
-        }
-    }
-
-    /**
-     * 绑定后台用户与角色关联关系前检查
-     * 防止越权访问漏洞
-     */
-    private void preBindUserRoleRelationCheck(AdminBindUserRoleRelationDTO dto) {
-        UserRoleContainer currentUser = sysRoleService.getCurrentUserRoleContainer();
-        // 是否对自己操作
-        boolean selfFlag = Objects.equals(dto.getUserId(), UserContextHolder.getUserId());
-        if (currentUser.isAdmin()) {
-            // 超级管理员不能去掉自己的超级管理员角色
-            if (selfFlag && !CollUtil.contains(dto.getRoleIds(), SysConstant.SUPER_ADMIN_ROLE_ID)) {
-                throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_SELF_USER);
-            }
-            // 也不能赋予其他人超级管理员角色
-            if (!selfFlag && CollUtil.contains(dto.getRoleIds(), SysConstant.SUPER_ADMIN_ROLE_ID)) {
-                throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_THIS_USER);
-            }
-            return;
-        }
-
-        if (selfFlag) {
-            // 不能动自身用户
-            throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_SELF_USER);
-        }
-
-        // 目标已经是超级管理员or租户管理员时,均不能绑定
-        UserRoleContainer specifiedUser = sysRoleService.getSpecifiedUserRoleContainer(dto.getUserId());
-        if (specifiedUser.isAdmin()) {
+        if (CollUtil.contains(ids, 1)) {
+            // 不能删除默认的管理员数据
             throw new BusinessException(SysErrorEnum.CANNOT_OPERATE_THIS_USER);
         }
 
-        // 超级管理员之外的用户,都需要校验自身角色范围是否满足输入值
-        currentUserNotSuperAdmin(dto, currentUser);
     }
 
-    /**
-     * 绑定后台用户与角色关联关系前检查
-     * 超级管理员之外的用户,都需要校验自身角色范围是否满足输入值
-     * 拆分子方法以降低Cognitive Complexity
-     */
-    private void currentUserNotSuperAdmin(AdminBindUserRoleRelationDTO dto, UserRoleContainer currentUser) {
-        if (CollUtil.isNotEmpty(dto.getRoleIds()) && !currentUser.isAdmin()) {
-            boolean overRoles = !CollUtil.containsAll(currentUser.getRelatedRoleIds(), dto.getRoleIds());
-            if (overRoles && currentUser.isGroupManager()) {
-                // 普通用户超自身角色授予了;如果当前用户拥有新角色的所有菜单,那么也放行
-                Set<Long> grantedMenuIds = sysRoleMenuRelationService.listMenuIdsByRoleIds(currentUser.getRelatedRoleIds());
-                Set<Long> needMenuIds = sysRoleMenuRelationService.listMenuIdsByRoleIds(dto.getRoleIds());
-                if (!CollUtil.containsAll(grantedMenuIds, needMenuIds)) {
-                    throw new BusinessException(SysErrorEnum.BEYOND_AUTHORITY_BIND_ROLES);
-                }
-            }
-
-//            if (currentUser.isTenantAdmin()) {
-//                // 超自身权限,但作为租户管理员有额外情况
-//                Set<Long> invisibleRoleIds = sysRoleService.determineInvisibleRoleIds();
-//                // 除非超越了可见角色IDs授予 or 想要授予用户租户管理员角色,否则不管
-//                invisibleRoleIds.addAll(currentUser.getRelatedRoleIds());
-//                if (CollUtil.containsAny(invisibleRoleIds, dto.getRoleIds())) {
-//                    throw new BusinessException(SysErrorEnum.BEYOND_AUTHORITY_BIND_ROLES);
-//                }
-//            }
-        }
-    }
 
 }