diff --git a/src/main/java/com/yunhai/userbase/controller/oapi/UserController.java b/src/main/java/com/yunhai/userbase/controller/oapi/UserController.java
index 6a812ec..245cc4f 100644
--- a/src/main/java/com/yunhai/userbase/controller/oapi/UserController.java
+++ b/src/main/java/com/yunhai/userbase/controller/oapi/UserController.java
@@ -10,6 +10,8 @@ import com.yunhai.userbase.common.annotation.OapiLog;
import com.yunhai.userbase.common.validation.ValidationGroups;
import com.yunhai.userbase.config.Config;
import com.yunhai.userbase.entity.ApplicationInfo;
+import com.yunhai.userbase.model.sysuser.BatchChangeStatusRequest;
+import com.yunhai.userbase.model.sysuser.SysUserChangeStatusRequest;
import com.yunhai.userbase.model.sysuser.SysUserGroupDeleteItem;
import com.yunhai.userbase.model.sysuser.SysUserGroupStateRequest;
import com.yunhai.userbase.model.sysuser.SysUserMoveRequest;
@@ -272,4 +274,24 @@ public class UserController {
request.getSchoolId(), request.getGroupId());
return userCenterService.getUserInfoWithDeptById(request.getUserId());
}
+
+ /**
+ * 设置单个用户状态(启用/禁用账号,语义同管理端 sysuser/Enable、sysuser/Disable 的合并版)。
+ * disabled=true 禁用、false 启用;变更后自动推送「编辑用户」订阅。
+ * 鉴权由过滤器层强制签名;POST 自动记 OapiLog。
+ */
+ @PostMapping("changeStatus")
+ public void changeStatus(@RequestBody @Validated SysUserChangeStatusRequest request) {
+ sysUserService.changeStatus(request.getUserId(), request.getDisabled());
+ }
+
+ /**
+ * 批量设置用户状态(启用/禁用,语义同管理端 sysuser/BatchChangeStatus)。
+ * 任一 userId 无效则整体拒绝;变更后自动推送「编辑用户」订阅。
+ * 鉴权由过滤器层强制签名;POST 自动记 OapiLog。
+ */
+ @PostMapping("batchChangeStatus")
+ public void batchChangeStatus(@RequestBody @Validated BatchChangeStatusRequest request) {
+ sysUserService.batchChangeStatus(request.getUserIds(), request.getDisabled());
+ }
}
diff --git a/src/main/java/com/yunhai/userbase/model/groupauthz/UserGroupNodeVo.java b/src/main/java/com/yunhai/userbase/model/groupauthz/UserGroupNodeVo.java
index 5212e4f..3dbfc81 100644
--- a/src/main/java/com/yunhai/userbase/model/groupauthz/UserGroupNodeVo.java
+++ b/src/main/java/com/yunhai/userbase/model/groupauthz/UserGroupNodeVo.java
@@ -21,7 +21,7 @@ public class UserGroupNodeVo {
/** 组名称。 */
private String name;
- /** 是否用户直接归属的组(叶子高亮用);祖先组为 false。 */
+ /** 是否用户主归属组(isMain=1,无主归属时取第一个直接归属组);祖先组为 false。 */
private Boolean own;
/** 子节点(仅含祖先链上的节点)。 */
diff --git a/src/main/java/com/yunhai/userbase/model/sysuser/SysUserChangeStatusRequest.java b/src/main/java/com/yunhai/userbase/model/sysuser/SysUserChangeStatusRequest.java
new file mode 100644
index 0000000..31c981f
--- /dev/null
+++ b/src/main/java/com/yunhai/userbase/model/sysuser/SysUserChangeStatusRequest.java
@@ -0,0 +1,20 @@
+package com.yunhai.userbase.model.sysuser;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @description 开放接口:设置用户状态请求(启用/禁用账号)。
+ */
+@Data
+public class SysUserChangeStatusRequest {
+
+ /** 用户ID。 */
+ @NotNull(message = "用户ID不能为空")
+ private Integer userId;
+
+ /** 是否禁用:true=禁用,false=启用。 */
+ @NotNull(message = "状态不能为空")
+ private Boolean disabled;
+}
diff --git a/src/main/java/com/yunhai/userbase/service/impl/GroupAuthzService.java b/src/main/java/com/yunhai/userbase/service/impl/GroupAuthzService.java
index a7cfe08..eec531b 100644
--- a/src/main/java/com/yunhai/userbase/service/impl/GroupAuthzService.java
+++ b/src/main/java/com/yunhai/userbase/service/impl/GroupAuthzService.java
@@ -1026,12 +1026,22 @@ public class GroupAuthzService implements IGroupAuthzService {
if (!sysUserRepository.existsById(userId)) {
throw new DException("用户不存在");
}
- // 1. 用户直接归属的组
+ // 1. 用户直接归属的组;主归属组(isMain=1)用于「本组」标记,无主归属时取第一个兜底(与 searchUsers 一致)
List rels = sysUserGroupRelRepository.findByUserId(userId);
Set selfGroupIds = new LinkedHashSet<>();
+ Integer mainGroupId = null;
+ boolean hasMainGroup = false;
for (SysUserGroupRel rel : rels) {
- if (rel.getGroupId() != null) {
- selfGroupIds.add(rel.getGroupId());
+ if (rel.getGroupId() == null) {
+ continue;
+ }
+ selfGroupIds.add(rel.getGroupId());
+ if (!hasMainGroup && rel.getIsMain() != null && rel.getIsMain() == 1) {
+ mainGroupId = rel.getGroupId();
+ hasMainGroup = true;
+ }
+ if (mainGroupId == null) {
+ mainGroupId = rel.getGroupId();
}
}
if (selfGroupIds.isEmpty()) {
@@ -1053,7 +1063,7 @@ public class GroupAuthzService implements IGroupAuthzService {
UserGroupNodeVo vo = new UserGroupNodeVo();
vo.setId(id);
vo.setName(g == null || g.getName() == null ? String.valueOf(id) : g.getName());
- vo.setOwn(selfGroupIds.contains(id));
+ vo.setOwn(mainGroupId != null && id.equals(mainGroupId));
voMap.put(id, vo);
}
List roots = new ArrayList<>();