TRX 1 год назад
Родитель
Сommit
b99b4faa10

+ 31 - 28
src/main/java/com/zswl/dataservice/controller/user/UserManagerController.java

@@ -1,8 +1,6 @@
 package com.zswl.dataservice.controller.user;
 
-import com.zswl.dataservice.model.user.UpdateUserPassWordParam;
-import com.zswl.dataservice.model.user.UserInfoModel;
-import com.zswl.dataservice.model.user.UserUpdateParam;
+import com.zswl.dataservice.model.user.*;
 import com.zswl.dataservice.service.mqtt.DeviceInfoService;
 import com.zswl.dataservice.service.user.impl.UserManagerServiceImpl;
 import com.zswl.dataservice.service.user.impl.UserServiceImpl;
@@ -12,6 +10,9 @@ import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.enums.ParameterIn;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
 import org.springframework.util.Assert;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -38,46 +39,48 @@ public class UserManagerController {
     UserManagerServiceImpl userManagerService;
 
     @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
-    @Operation(summary = "修改当前用户密码", description = "")
-    @RequestMapping(value = "updateUserPassWord", method = {RequestMethod.POST})
-    public ResultContent updateUserPassWord(@RequestBody UpdateUserPassWordParam param) {
-        Assert.hasText(param.getOldPass(), "原密码不能为空");
-        Assert.hasText(param.getPassWord(), "密码不能为空");
+    @Operation(summary = "添加-编辑用户", description = "添加-编辑用户")
+    @RequestMapping(value = "addUser", method = {RequestMethod.POST})
+    public ResultContent addUser(@RequestBody UserCountParam param) {
+        Assert.hasText(param.getNewPassWord(), "密码不能为空");
         Assert.hasText(param.getConfirmPass(), "验证密码不能为空");
-        return userService.updateUserPassWord(param);
-    }
-
-    @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
-    @Operation(summary = "得到当前用户信息", description = "")
-    @RequestMapping(value = "getCurrentUserInfo", method = {RequestMethod.GET})
-    public ResultContent<UserInfoModel> getCurrentUserInfo() {
-        return userService.getCurrentUserInfo();
+        return userManagerService.addUser(param);
     }
 
     @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
     @Operation(summary = "重置用户密码", description = "")
     @RequestMapping(value = "resetUserPassWord", method = {RequestMethod.GET})
-    public ResultContent<UserInfoModel> resetUserPassWord(
+    public ResultContent resetUserPassWord(
             @Parameter(name = "id", description = "用户id", example = "")
             @RequestParam("id") String id) {
         return userManagerService.resetUserPassWord(id);
     }
 
     @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
-    @Operation(summary = "修改当前用户基本信息", description = "")
-    @RequestMapping(value = "updateUserInfo", method = {RequestMethod.POST})
-    public ResultContent<UserInfoModel> updateUserInfo(@RequestBody UserUpdateParam param) {
-        Assert.hasText(param.getUserName(), "userName不能为空");
-        return userService.updateUserInfo(param);
+    @Operation(summary = "用户列表-分页查询", description = "用户列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<UserInfoModel>> page(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) UserSearchParams param) {
+        return userManagerService.page(param, pageable);
+    }
+
+    @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
+    @Operation(summary = "得到用户详情", description = "得到用户详情")
+    @RequestMapping(value = "getUserInfo", method = {RequestMethod.GET})
+    public ResultContent<UserInfoModel> getUserInfo(
+            @Parameter(name = "id", description = "用户id", example = "")
+            @RequestParam("id") String id) {
+        return userManagerService.getUserInfo(id);
     }
 
     @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
-    @Operation(summary = "修改当前用户头像", description = "")
-    @RequestMapping(value = "updateUserHead", method = {RequestMethod.GET})
-    public ResultContent<UserInfoModel> updateUserHead(
-            @Parameter(name = "url", description = "头像地址", example = "")
-            @RequestParam("url") String url) {
-        return userService.updateUserHead(url);
+    @Operation(summary = "删除用户", description = "删除用户")
+    @RequestMapping(value = "delUser", method = {RequestMethod.GET})
+    public ResultContent delUser(
+            @Parameter(name = "id", description = "用户id", example = "")
+            @RequestParam("id") String id) {
+        return userManagerService.delUser(id);
     }
 
 }

+ 1 - 0
src/main/java/com/zswl/dataservice/dao/DepartmentDao.java

@@ -17,4 +17,5 @@ public interface DepartmentDao extends MongoDao<Department> {
     List<Department> findByIdIn(List<String> ids);
 
     List<Department> findByParentId(String parentId);
+
 }

+ 2 - 0
src/main/java/com/zswl/dataservice/dao/RoleDao.java

@@ -17,4 +17,6 @@ public interface RoleDao extends MongoDao<Role>, RoleDaoExtend {
 
     Role findTopByCode(String code);
 
+    List<Role> findByIdIn(List<String> ids);
+
 }

+ 2 - 0
src/main/java/com/zswl/dataservice/dao/UserDao.java

@@ -9,4 +9,6 @@ public interface UserDao extends MongoDao<User>, UserDaoExtend {
 
     User findTopById(String id);
 
+
+
 }

+ 12 - 0
src/main/java/com/zswl/dataservice/dao/impl/UserDaoImpl.java

@@ -41,6 +41,11 @@ public class UserDaoImpl extends BaseImpl implements UserDaoExtend {
             criteria.and("userType").is(param.getUserType());
         }
 
+        // 用户状态
+        if (param.getUserState() != null) {
+            criteria.and("userState").is(param.getUserState());
+        }
+
         // 模糊搜索
         List<Criteria> criterias = new ArrayList<>();
         if (StringUtils.isNotEmpty(param.getLoginName())) {
@@ -59,6 +64,13 @@ public class UserDaoImpl extends BaseImpl implements UserDaoExtend {
             criteria.andOperator(criterias.toArray(new Criteria[]{}));
         }
 
+        if (StringUtils.isNotEmpty(param.getKeyWord())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getKeyWord() + ".*$");
+            criteria.orOperator(
+                    Criteria.where("userName").regex(pattern),
+                    Criteria.where("phone").regex(pattern)
+            );
+        }
         criteria.and("loginName").ne("admin");
 
         Sort sort = buildSort(param);

+ 4 - 0
src/main/java/com/zswl/dataservice/dao/mqtt/ProjectInfoDao.java

@@ -6,6 +6,8 @@ import com.zswl.dataservice.dao.mqtt.extend.ProjectInfoDaoExtend;
 import com.zswl.dataservice.domain.mqtt.DeviceInfo;
 import com.zswl.dataservice.domain.mqtt.ProjectInfo;
 
+import java.util.List;
+
 /**
  * @author TRX
  * @date 2024/3/21
@@ -15,4 +17,6 @@ public interface ProjectInfoDao extends MongoDao<ProjectInfo>, ProjectInfoDaoExt
     ProjectInfo findTopById(String id);
 
     ProjectInfo findTopByCode(String code);
+
+    List<ProjectInfo> findByIdIn(List<String> ids);
 }

+ 6 - 1
src/main/java/com/zswl/dataservice/domain/user/User.java

@@ -1,6 +1,7 @@
 package com.zswl.dataservice.domain.user;
 
 import com.zswl.dataservice.domain.base.SuperEntity;
+import com.zswl.dataservice.domain.mqtt.ProjectInfo;
 import com.zswl.dataservice.type.UserState;
 import com.zswl.dataservice.type.UserType;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -66,12 +67,16 @@ public class User extends SuperEntity {
     @Schema(description = "最后登录时间")
     private Long lastLoginTime;
 
+    @Schema(description = "项目信息")
+    @DBRef(lazy = true)
+    private List<ProjectInfo> projectInfos = new ArrayList<>();
+
     @Schema(description = "角色信息")
     @DBRef(lazy = true)
     private List<Role> roles = new ArrayList<>();
 
     @Schema(description = "部门信息")
     @DBRef(lazy = true)
-    private List<Department> departments = new ArrayList<>();
+    private Department department;
 
 }

+ 12 - 2
src/main/java/com/zswl/dataservice/model/user/UserCountParam.java

@@ -1,8 +1,10 @@
 package com.zswl.dataservice.model.user;
 
+import com.zswl.dataservice.domain.mqtt.ProjectInfo;
 import com.zswl.dataservice.domain.user.Department;
 import com.zswl.dataservice.domain.user.Role;
 import com.zswl.dataservice.model.baseParam.SuperParam;
+import com.zswl.dataservice.type.UserState;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -32,11 +34,19 @@ public class UserCountParam extends SuperParam {
     private String phone;
 
     @Schema(description = "密码")
-    private String passWord;
+    private String newPassWord;
+
+    @Schema(description = "密码")
+    private String confirmPass;
+
+    private UserState userState = UserState.Enable;
+
+    @Schema(description = "关联项目ID集合")
+    private List<String> projectInfos;
 
     @Schema(description = "角色信息")
     private List<String> roles = new ArrayList<>();
 
     @Schema(description = "部门信息")
-    private List<String> departments = new ArrayList<>();
+    private String departmentId;
 }

+ 26 - 0
src/main/java/com/zswl/dataservice/model/user/UserInfoModel.java

@@ -1,8 +1,10 @@
 package com.zswl.dataservice.model.user;
 
+import com.zswl.dataservice.domain.mqtt.ProjectInfo;
 import com.zswl.dataservice.domain.user.Department;
 import com.zswl.dataservice.domain.user.Role;
 import com.zswl.dataservice.model.baseParam.SuperModel;
+import com.zswl.dataservice.model.mqtt.ProjectInfoModel;
 import com.zswl.dataservice.type.UserState;
 import com.zswl.dataservice.type.UserType;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -41,15 +43,39 @@ public class UserInfoModel extends SuperModel {
     @Schema(description = "用户类型")
     private UserType userType;
 
+    public String userTypeStr;
+
+    public String getUserTypeStr() {
+        if (userType != null) {
+            return userType.getRemark();
+        }
+        return "";
+    }
+
     @Schema(description = "用户状态:是否可用")
     private UserState userState;
 
+    private String userStateStr;
+
+    public String getUserStateStr() {
+        if (userState != null) {
+            return userState.getRemark();
+        }
+        return "";
+    }
+
     @Schema(description = "最后登录时间")
     private Long lastLoginTime;
 
     @Schema(description = "角色信息")
     private List<RoleModel> roles = new ArrayList<>();
 
+    @Schema(description = "所属部门信息")
+    DepartmentModel department;
+
     @Schema(description = "部门信息")
     private List<DepartmentModel> departments = new ArrayList<>();
+
+    @Schema(description = "所属项目信息")
+    private List<ProjectInfoModel> projectInfos = new ArrayList<>();
 }

+ 13 - 9
src/main/java/com/zswl/dataservice/model/user/UserSearchParams.java

@@ -2,6 +2,7 @@ package com.zswl.dataservice.model.user;
 
 import com.zswl.dataservice.model.baseParam.SuperParam;
 import com.zswl.dataservice.model.baseParam.SuperSearchParam;
+import com.zswl.dataservice.type.UserState;
 import com.zswl.dataservice.type.UserType;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -12,19 +13,22 @@ import lombok.Data;
  */
 @Data
 public class UserSearchParams extends SuperSearchParam {
-    /**
-     * 登录名
-     */
+
+    @Schema(description = "登录名")
     private String loginName;
-    /**
-     * 用户名
-     */
+
+    @Schema(description = "用户名")
     private String userName;
-    /**
-     * 电话号码
-     */
+
+    @Schema(description = "电话号码")
     private String phone;
 
     @Schema(hidden = true)
     private UserType userType;
+
+    @Schema(description = "用户状态")
+    private UserState userState;
+
+    @Schema(description = "搜索关键字")
+    private String keyWord;
 }

+ 4 - 0
src/main/java/com/zswl/dataservice/service/user/impl/DepartmentServiceImpl.java

@@ -21,6 +21,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -131,6 +132,9 @@ public class DepartmentServiceImpl extends SuperService implements DepartmentSer
         List<Department> list = new ArrayList<>();
         loopLoad(id, list);
         List<DepartmentModel> models = list.stream().map(this::toModel).collect(Collectors.toList());
+        if (ObjectUtils.isNotEmpty(models)) {
+            Collections.reverse(models);
+        }
         return models;
     }
 

+ 2 - 1
src/main/java/com/zswl/dataservice/service/user/impl/RoleServiceImpl.java

@@ -165,8 +165,9 @@ public class RoleServiceImpl extends SuperService {
     }
 
     public RoleModel toModel(Role role) {
-        RoleModel roleModel = new RoleModel();
+        RoleModel roleModel = null;
         if (ObjectUtils.isNotEmpty(role)) {
+            roleModel = new RoleModel();
             BeanUtils.copyProperties(role, roleModel);
         }
         return roleModel;

+ 203 - 0
src/main/java/com/zswl/dataservice/service/user/impl/UserManagerServiceImpl.java

@@ -1,18 +1,42 @@
 package com.zswl.dataservice.service.user.impl;
 
 import com.zswl.dataservice.config.SystemDefaultConfig;
+import com.zswl.dataservice.dao.DepartmentDao;
+import com.zswl.dataservice.dao.RoleDao;
 import com.zswl.dataservice.dao.UserDao;
+import com.zswl.dataservice.dao.mqtt.ProjectInfoDao;
+import com.zswl.dataservice.dataConfig.ResultMessage;
+import com.zswl.dataservice.domain.mqtt.ProjectInfo;
+import com.zswl.dataservice.domain.user.Department;
+import com.zswl.dataservice.domain.user.Role;
 import com.zswl.dataservice.domain.user.User;
+import com.zswl.dataservice.model.mqtt.ProjectInfoModel;
+import com.zswl.dataservice.model.user.*;
 import com.zswl.dataservice.service.base.SuperService;
+import com.zswl.dataservice.service.mqtt.ProjectInfoService;
 import com.zswl.dataservice.type.ResultState;
+import com.zswl.dataservice.type.UserState;
+import com.zswl.dataservice.type.UserType;
+import com.zswl.dataservice.utils.ValidateResult;
+import com.zswl.dataservice.utils.ValidateUtils;
+import com.zswl.dataservice.utils.bean.BeanUtils;
+import com.zswl.dataservice.utils.page.PageEntityUtil;
 import com.zswl.dataservice.utils.result.ResultContent;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * 用户管理
  *
@@ -26,6 +50,144 @@ public class UserManagerServiceImpl extends SuperService {
     @Autowired
     private UserDao userDao;
 
+    @Autowired
+    RoleDao roleDao;
+
+    @Autowired
+    ProjectInfoDao projectInfoDao;
+
+    @Autowired
+    DepartmentDao departmentDao;
+
+    @Autowired
+    DepartmentServiceImpl departmentService;
+
+    @Autowired
+    ProjectInfoService projectInfoService;
+
+    @Autowired
+    RoleServiceImpl roleService;
+
+    /**
+     * 添加编辑用户
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent addUser(UserCountParam param) {
+        initDefaultUser(param);
+        String loginName = param.getPhone();
+        boolean b = ValidateUtils.isPhoneNumber(param.getPhone());
+        if (!b) {
+            return ResultContent.buildFail("电话号码格式不正确");
+        }
+        if (!param.getNewPassWord().equals(param.getConfirmPass())) {
+            return ResultContent.buildFail("密码和验证密码不一致");
+        }
+        ValidateResult validateResult = ValidateUtils.validatePassWord(param.getNewPassWord());
+        if (!validateResult.isSuccess()) {
+            return ResultContent.buildFail(validateResult.getMsg());
+        }
+
+        User user = null;
+        User temp = userDao.findByLoginName(loginName);
+        if (StringUtils.isNotEmpty(param.getId())) {
+            user = userDao.findTopById(param.getId());
+            if (ObjectUtils.isEmpty(user)) {
+                return ResultContent.buildFail(String.format("用户ID不存在:%s", param.getId()));
+            }
+            if (ObjectUtils.isNotEmpty(temp) && !temp.getId().equals(user.getId())) {
+                return ResultContent.buildFail(String.format("该账号已存在:%s", loginName));
+            }
+            BeanUtils.copyProperties(param, user);
+        } else {
+            if (ObjectUtils.isNotEmpty(temp)) {
+                return ResultContent.buildFail(String.format("该账号已存在:%s", loginName));
+            }
+            PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+            user = new User();
+            BeanUtils.copyProperties(param, user);
+            user.setLoginName(loginName);
+            user.setPassWord(passwordEncoder.encode(param.getNewPassWord()));
+            user.setUserType(UserType.Consumer);
+            user.setIsAdmin(Boolean.FALSE);
+        }
+
+        // 项目 角色 部门
+        List<ProjectInfo> projectInfos = new ArrayList<>();
+        List<String> projectInfoIds = param.getProjectInfos();
+        if (ObjectUtils.isNotEmpty(projectInfoIds)) {
+            projectInfos = projectInfoDao.findAllById(projectInfoIds);
+        }
+
+        // 角色
+        List<Role> roles = new ArrayList<>();
+        List<String> roleIds = param.getRoles();
+        if (ObjectUtils.isNotEmpty(roleIds)) {
+            roles = roleDao.findAllById(roleIds);
+        }
+
+        // 部门
+        Department department = null;
+        String departmentId = param.getDepartmentId();
+        if (StringUtils.isNotEmpty(departmentId)) {
+            department = departmentDao.findTopById(departmentId);
+        }
+        user.setProjectInfos(projectInfos);
+        user.setRoles(roles);
+        user.setDepartment(department);
+        userDao.save(user);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 用户列表
+     *
+     * @param param
+     * @param pageable
+     * @return
+     */
+    public ResultContent<Page<UserInfoModel>> page(UserSearchParams param, Pageable pageable) {
+        initSearchParam(param);
+        Page<User> page = userDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    /**
+     * 用户详情
+     *
+     * @param id
+     * @return
+     */
+    public ResultContent<UserInfoModel> getUserInfo(String id) {
+        User user = userDao.findTopById(id);
+        if (ObjectUtils.isEmpty(user)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        UserInfoModel model = toModel(user);
+        return ResultContent.buildSuccess(model);
+    }
+
+    /**
+     * 删除用户
+     *
+     * @param id
+     * @return
+     */
+    public ResultContent delUser(String id) {
+        User user = userDao.findTopById(id);
+        if (ObjectUtils.isEmpty(user)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        if (user.getIsAdmin() != null && user.getIsAdmin()) {
+            return ResultContent.buildFail(String.format("该用户不能删除"));
+        }
+        if (user.getId().equals(getCurrentUserId())) {
+            return ResultContent.buildFail("不能删除当前用户");
+        }
+        userDao.delete(user);
+        return ResultContent.buildSuccess();
+    }
 
     /**
      * 重置用户密码
@@ -43,4 +205,45 @@ public class UserManagerServiceImpl extends SuperService {
         return ResultContent.buildSuccess();
     }
 
+    public UserInfoModel toModel(User user) {
+        UserInfoModel model = new UserInfoModel();
+        if (ObjectUtils.isNotEmpty(user)) {
+            BeanUtils.copyProperties(user, model);
+
+            // 部门信息
+            Department department = user.getDepartment();
+            if (ObjectUtils.isNotEmpty(department)) {
+                DepartmentModel departmentModel = departmentService.toModel(department);
+                model.setDepartment(departmentModel);
+                model.setDepartments(departmentService.getParents(department.getId()));
+            }
+            // 角色信息
+            List<Role> roles = user.getRoles();
+            if (ObjectUtils.isNotEmpty(roles)) {
+                List<RoleModel> roleModels = new ArrayList<>();
+                roles.stream().forEach(it -> {
+                    RoleModel roleModel = roleService.toModel(it);
+                    if (roleModel != null) {
+                        roleModels.add(roleModel);
+                    }
+                });
+                model.setRoles(roleModels);
+            }
+
+            // 项目信息
+            List<ProjectInfo> projectInfos = user.getProjectInfos();
+            if (ObjectUtils.isNotEmpty(projectInfos)) {
+                List<ProjectInfoModel> projectInfoModels = new ArrayList<>();
+                projectInfos.stream().forEach(it -> {
+                    ProjectInfoModel projectInfoModel = projectInfoService.toModel(it);
+                    if (projectInfoModel != null) {
+                        projectInfoModels.add(projectInfoModel);
+                    }
+                });
+                model.setProjectInfos(projectInfoModels);
+            }
+        }
+        return model;
+    }
+
 }

+ 4 - 9
src/main/java/com/zswl/dataservice/service/user/impl/UserServiceImpl.java

@@ -52,6 +52,9 @@ public class UserServiceImpl extends SuperService implements UserService {
     @Autowired
     MQClient mqClient;
 
+    @Autowired
+    UserManagerServiceImpl userManagerService;
+
     /**
      * 初始超级管理员
      *
@@ -122,7 +125,7 @@ public class UserServiceImpl extends SuperService implements UserService {
         if (ObjectUtils.isEmpty(user)) {
             return ResultContent.buildFail("当前用户信息为空");
         }
-        model = toModel(user);
+        model = userManagerService.toModel(user);
         return ResultContent.buildSuccess(model);
     }
 
@@ -146,14 +149,6 @@ public class UserServiceImpl extends SuperService implements UserService {
         return ResultContent.buildSuccess();
     }
 
-    public UserInfoModel toModel(User entity) {
-        UserInfoModel model = new UserInfoModel();
-        if (ObjectUtils.isNotEmpty(entity)) {
-            BeanUtils.copyProperties(entity, model);
-        }
-        return model;
-    }
-
     /**
      * 验证用户密码是否正确
      *

+ 2 - 2
src/main/java/com/zswl/dataservice/type/UserState.java

@@ -6,8 +6,8 @@ import lombok.Getter;
  * 用户状态
  */
 public enum UserState {
-    Enable("可用"),
-    Disable("不可用"),
+    Enable("正常"),
+    Disable("用"),
     Locked("已锁定"),
     Freeze("已冻结"),
     ;