From 5a7d93a48f6f8b619bf4f3ee54795ee2bfe7005f Mon Sep 17 00:00:00 2001 From: chenxing Date: Thu, 17 Sep 2026 11:09:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E9=80=89=E4=BA=BA=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=95=B0=E6=8D=AE=E6=BA=90-userTree=E2=80=94=E2=80=94?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=AB=AF=E3=80=8C=E9=80=89=E6=8B=A9=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E3=80=8D=E5=BC=B9=E7=AA=97=E6=8E=A5=E5=AD=A6=E6=A0=A1?= =?UTF-8?q?=E7=BB=84=E6=A0=91=20(=E7=BB=84=E2=86=92=E7=BB=84=E5=86=85?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=8F=B6=E5=AD=90,=20GET=20/admin/user/tree)?= =?UTF-8?q?,=20=E6=9B=BF=E4=BB=A3=E7=AE=A1=E7=90=86=E9=A1=B5=E6=89=8B?= =?UTF-8?q?=E8=BE=93=E7=94=A8=E6=88=B7ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/FlowAdminController.java | 8 +++ .../service/FlowMapAdminService.java | 60 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/main/java/com/yunhai/flowcenter/controller/api/FlowAdminController.java b/src/main/java/com/yunhai/flowcenter/controller/api/FlowAdminController.java index 71bfbe2..db6fa97 100644 --- a/src/main/java/com/yunhai/flowcenter/controller/api/FlowAdminController.java +++ b/src/main/java/com/yunhai/flowcenter/controller/api/FlowAdminController.java @@ -138,6 +138,14 @@ public class FlowAdminController { return mapAdminService.importGroups(adminGuard.requireAdmin(user, null)); } + // ==================== 选人组件数据源 ==================== + + /** 选人组件树:学校组树(组→组内用户叶子),管理端「选择用户」弹窗共用 */ + @GetMapping("/user/tree") + public List userTree(BoaUser user) { + return mapAdminService.userTree(adminGuard.requireAdmin(user, null)); + } + // ==================== 回调注册/推送日志/死信 ==================== @GetMapping("/callback/regList") diff --git a/src/main/java/com/yunhai/flowcenter/service/FlowMapAdminService.java b/src/main/java/com/yunhai/flowcenter/service/FlowMapAdminService.java index 641c23d..316bfdb 100644 --- a/src/main/java/com/yunhai/flowcenter/service/FlowMapAdminService.java +++ b/src/main/java/com/yunhai/flowcenter/service/FlowMapAdminService.java @@ -17,6 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -92,6 +93,65 @@ public class FlowMapAdminService { } } + // ==================== 选人组件数据源 ==================== + + /** 选人组件树节点:组=isParent(true)+children;用户=叶子(isParent 缺省 false) */ + @Getter + @Setter + public static class SelectUserNodeVo { + private Integer id; + private String name; + private Boolean isParent; + private List children = new ArrayList<>(); + } + + /** + * 学校组树(组→组内用户叶子),供管理端「选择用户」弹窗(多选指定用户/单选映射办理人)。 + * 与 {@link #previewGroupDepts(Long)} 同源:UserBase getGroupById(schId, withSub) 子树 + 逐组挂成员。 + */ + public List userTree(Long schId) { + BoaGroup subtree; + try { + subtree = groupClient.getGroupById(schId.intValue(), true); + } catch (Exception e) { + throw new BizException(ErrorCode.PARAM_ERROR, "UserBase 组树不可达:" + e.getMessage()); + } + if (subtree == null || subtree.getId() == null) { + throw new BizException(ErrorCode.PARAM_ERROR, "学校组不存在(schId=" + schId + ")"); + } + return Collections.singletonList(groupNode(subtree)); + } + + /** 组节点:先挂用户叶子再递归子组;isParent=UserBase 已宣告子组,防"空组"被当作用户叶子 */ + private SelectUserNodeVo groupNode(BoaGroup group) { + SelectUserNodeVo vo = new SelectUserNodeVo(); + vo.setId(group.getId()); + vo.setName(group.getName()); + boolean declaredSub = group.getChildren() != null && !group.getChildren().isEmpty(); + try { + List members = groupClient.getGroupUsers(group.getId(), false, null); + if (members != null) { + for (BoaUser u : members) { + if (u != null && u.getId() != null) { + SelectUserNodeVo leaf = new SelectUserNodeVo(); + leaf.setId(u.getId()); + leaf.setName(u.getName() == null ? "" : u.getName()); + vo.getChildren().add(leaf); + } + } + } + } catch (Exception e) { + log.warn("[flow-center] 组成员拉取失败(groupId={}, name={}):{}", group.getId(), group.getName(), e.getMessage()); + } + for (BoaGroup child : group.getChildren() == null ? Collections.emptyList() : group.getChildren()) { + if (child != null && child.getId() != null) { + vo.getChildren().add(groupNode(child)); + } + } + vo.setIsParent(declaredSub || !vo.getChildren().isEmpty()); + return vo; + } + // ==================== 一键拉取教师组 ==================== /** 科室预览/导入项(deptKey=UserBase 组 id) */