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) */