feat(dept): 科室管理——flw_dept/flw_dept_member 组+成员模型取代单用户映射行(议题3,拍板D1选B)
build / build-push (push) Successful in 54s
build / build-push (push) Successful in 54s
- deptKey=本地自增 id;source_group_id 幂等(一键拉取=初始化/刷新语义,不重复建组);不做存量迁移 - 四处读源全部切新表:AssigneeResolver(宽容口径:deptKey 不存在/停用返回空,图示/轨迹不炸)、 enabledDeptKeys 发布校验白名单、DeptLabelSupport 唯一出口(图示科室视图+轨迹富化)、编辑器 deptList 聚合 - /admin/dept/* 全套端点(CRUD/成员/拉取预览导入);旧 /map/* 映射 CRUD 端点删除 (保留 /map/lookupUser 选人检索与 /user/teacherTree);flw_assignee_map 实体/表保留不删 - IT 种子切源(FlowTestSupport tag→deptKey 注册表,用例主体零改动);全量 191 绿;E2E 22/22 (local-debug/four-topics-e-e2e.py,含切源后果验证与生产盘点 SQL)
This commit is contained in:
@@ -51,6 +51,7 @@ public class FlowAdminController {
|
||||
private final com.yunhai.flowcenter.service.DiagramImageService imageService;
|
||||
private final com.fasterxml.jackson.databind.ObjectMapper objectMapper;
|
||||
private final com.yunhai.flowcenter.service.FlowAppAdminService appAdminService;
|
||||
private final com.yunhai.flowcenter.service.FlowDeptAdminService deptAdminService;
|
||||
|
||||
// ==================== 流程定义 ====================
|
||||
|
||||
@@ -161,35 +162,91 @@ public class FlowAdminController {
|
||||
.body(imageService.renderPng(diagramService.build(def, null, mode)));
|
||||
}
|
||||
|
||||
// ==================== 办理人映射 ====================
|
||||
// ==================== 科室管理(2026-10-10 四议题·议题3,取代 /map/* 映射 CRUD) ====================
|
||||
|
||||
@GetMapping("/map/list")
|
||||
public List<FlwAssigneeMap> mapList(BoaUser user,
|
||||
@RequestParam(value = "deptKey", required = false) String deptKey) {
|
||||
return mapAdminService.listByDept(adminGuard.requireAdmin(user, null), deptKey);
|
||||
/** 科室列表(编辑器 ctx.depts 同结构:deptKey=id 字符串 + 启用成员数) */
|
||||
@GetMapping("/dept/list")
|
||||
public List<com.yunhai.flowcenter.service.FlowDeptAdminService.DeptVo> deptList(BoaUser user) {
|
||||
return deptAdminService.list(adminGuard.requireAdmin(user, null));
|
||||
}
|
||||
|
||||
@PostMapping("/map/save")
|
||||
public FlwAssigneeMap mapSave(BoaUser user, @RequestBody Map<String, Object> body) {
|
||||
@PostMapping("/dept/create")
|
||||
public com.yunhai.flowcenter.entity.FlwDept deptCreate(BoaUser user, @RequestBody Map<String, Object> body) {
|
||||
return deptAdminService.create(adminGuard.requireAdmin(user, null), (String) body.get("deptName"));
|
||||
}
|
||||
|
||||
@PostMapping("/dept/rename")
|
||||
public com.yunhai.flowcenter.entity.FlwDept deptRename(BoaUser user, @RequestBody Map<String, Object> body) {
|
||||
Long schId = adminGuard.requireAdmin(user, null);
|
||||
return mapAdminService.save(schId,
|
||||
(String) body.get("deptKey"), (String) body.get("deptName"),
|
||||
body.get("userId") == null ? null : Integer.valueOf(String.valueOf(body.get("userId"))),
|
||||
(String) body.get("userName"));
|
||||
return deptAdminService.rename(schId, longVal(body.get("id")), (String) body.get("deptName"));
|
||||
}
|
||||
|
||||
@PostMapping("/map/disable/{id}")
|
||||
public void mapDisable(BoaUser user, @PathVariable("id") Long id) {
|
||||
mapAdminService.disable(adminGuard.requireAdmin(user, null), id);
|
||||
/** 停用/启用科室(停用=解析不出办理人、发布校验拦新引用;成员不动) */
|
||||
@PostMapping("/dept/status")
|
||||
public void deptStatus(BoaUser user, @RequestBody Map<String, Object> body) {
|
||||
Long schId = adminGuard.requireAdmin(user, null);
|
||||
deptAdminService.setStatus(schId, longVal(body.get("id")), boolVal(body.get("enabled")));
|
||||
}
|
||||
|
||||
/** 启用映射(停用行的恢复入口;DEPT_KEY 解析只取启用行) */
|
||||
@PostMapping("/map/enable/{id}")
|
||||
public FlwAssigneeMap mapEnable(BoaUser user, @PathVariable("id") Long id) {
|
||||
return mapAdminService.enable(adminGuard.requireAdmin(user, null), id);
|
||||
/** 删除科室(级联删成员;被流程引用的 deptKey 将解析失败——发布校验/办理时会拦) */
|
||||
@PostMapping("/dept/delete")
|
||||
public void deptDelete(BoaUser user, @RequestBody Map<String, Object> body) {
|
||||
Long schId = adminGuard.requireAdmin(user, null);
|
||||
deptAdminService.delete(schId, longVal(body.get("id")));
|
||||
}
|
||||
|
||||
/** 成员检索(UserBase /oapi/user/byId) */
|
||||
@GetMapping("/dept/members")
|
||||
public List<com.yunhai.flowcenter.entity.FlwDeptMember> deptMembers(BoaUser user,
|
||||
@RequestParam("deptId") Long deptId) {
|
||||
return deptAdminService.members(adminGuard.requireAdmin(user, null), deptId);
|
||||
}
|
||||
|
||||
/** 批量加成员(已存在跳过;姓名经 UserBase 补全),返回新增数 */
|
||||
@PostMapping("/dept/memberAdd")
|
||||
public int deptMemberAdd(BoaUser user, @RequestBody Map<String, Object> body) {
|
||||
Long schId = adminGuard.requireAdmin(user, null);
|
||||
List<Integer> userIds = new java.util.ArrayList<>();
|
||||
Object raw = body.get("userIds");
|
||||
if (raw instanceof List) {
|
||||
for (Object o : (List<?>) raw) {
|
||||
if (o != null) {
|
||||
userIds.add(Integer.valueOf(String.valueOf(o)));
|
||||
}
|
||||
}
|
||||
}
|
||||
return deptAdminService.memberAdd(schId, longVal(body.get("deptId")), userIds);
|
||||
}
|
||||
|
||||
@PostMapping("/dept/memberRemove")
|
||||
public void deptMemberRemove(BoaUser user, @RequestBody Map<String, Object> body) {
|
||||
Long schId = adminGuard.requireAdmin(user, null);
|
||||
deptAdminService.memberRemove(schId, longVal(body.get("memberId")));
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键拉取教师组·预览:学校子树内教师组容器 → 科室+组内成员(UserBase 组 id 即将落
|
||||
* flw_dept.source_group_id)。导入前先展示给管理员确认,不落库。
|
||||
*/
|
||||
@GetMapping("/dept/groupPreview")
|
||||
public List<com.yunhai.flowcenter.service.FlowMapAdminService.GroupDeptVo> groupPreview(BoaUser user) {
|
||||
return mapAdminService.previewGroupDepts(adminGuard.requireAdmin(user, null));
|
||||
}
|
||||
|
||||
/** 一键拉取教师组·导入:upsert flw_dept(source_group_id 幂等,重复拉取=刷新组名与成员集) */
|
||||
@PostMapping("/dept/importGroups")
|
||||
public com.yunhai.flowcenter.service.FlowDeptAdminService.GroupImportResultVo importGroups(BoaUser user) {
|
||||
return deptAdminService.importGroups(adminGuard.requireAdmin(user, null));
|
||||
}
|
||||
|
||||
private static Long longVal(Object o) {
|
||||
return o == null ? null : Long.valueOf(String.valueOf(o));
|
||||
}
|
||||
|
||||
private static boolean boolVal(Object o) {
|
||||
return o == null ? false : Boolean.parseBoolean(String.valueOf(o));
|
||||
}
|
||||
|
||||
/** 成员检索(UserBase /oapi/user/byId;编辑器选人/姓名补全共用,非映射 CRUD,保留) */
|
||||
@GetMapping("/map/lookupUser")
|
||||
public com.yunhai.platform.utils.model.BoaUser lookupUser(BoaUser user,
|
||||
@RequestParam("userId") Integer userId) {
|
||||
@@ -197,21 +254,6 @@ public class FlowAdminController {
|
||||
return mapAdminService.lookupUser(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键拉取教师组·预览:学校子树内教师组容器 → 科室+组内成员(deptKey=UserBase 组 id)。
|
||||
* 导入前先展示给管理员确认,不落库。
|
||||
*/
|
||||
@GetMapping("/map/groupPreview")
|
||||
public List<com.yunhai.flowcenter.service.FlowMapAdminService.GroupDeptVo> groupPreview(BoaUser user) {
|
||||
return mapAdminService.previewGroupDepts(adminGuard.requireAdmin(user, null));
|
||||
}
|
||||
|
||||
/** 一键拉取教师组·导入:批量落映射(已存在且启用中的 sch+dept+user 跳过),返回计数 */
|
||||
@PostMapping("/map/importGroups")
|
||||
public com.yunhai.flowcenter.service.FlowMapAdminService.GroupImportResultVo importGroups(BoaUser user) {
|
||||
return mapAdminService.importGroups(adminGuard.requireAdmin(user, null));
|
||||
}
|
||||
|
||||
// ==================== 选人组件数据源 ====================
|
||||
|
||||
/** 选人组件树:学校组树(组→组内用户叶子),管理端「选择用户」弹窗共用 */
|
||||
|
||||
Reference in New Issue
Block a user