【组织】工作台、组织架构
工作台与组织架构模块,由 yudao-module-hrm 后端模块的 home、employee、portal.home 包实现,前端实现在 @/views/hrm/home、@/views/hrm/dept 和 @/views/hrm/portal/home 目录。
它是 HRM 的入口页面,把分散在各业务域的数据聚合成三类工作台,并复用 System 部门树呈现组织关系:
- HR 工作台:面向 HR,汇总员工、招聘、薪资、待办和日历事项。
- 团队工作台:面向主管,按员工直属汇报线统计直属下属。
- 个人工作台:员工端首页,只展示当前登录员工的数据。
- 组织架构:复用 System 部门树,叠加员工人数和部门员工列表。
工作台是实时查询与聚合能力,不建立统计快照表,因此本文只涉及一张个人备忘表。表关系如下图所示:
# 1. 工作台
三类工作台,由 HrmHomeController 提供管理端接口(/hrm/home),由 HrmPortalHomeController 提供员工端接口(/hrm/portal/home)。它们共用 HrmHomeCalendar.vue 日历组件,登录员工可以在日历中维护个人备忘。
# 1.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `hrm_employee_personal_note` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '备忘编号',
`employee_id` bigint NOT NULL COMMENT '员工编号',
`content` varchar(1024) NOT NULL COMMENT '备忘内容',
`reminder_time` datetime NOT NULL COMMENT '提醒时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='HRM 员工个人备忘';
① employee_id 逻辑关联 hrm_employee 表的 id 字段。后端通过当前登录账号反查员工编号,不允许请求方指定其他员工。
② 工作台日历把个人备忘与员工生日、入职、转正、离职和候选人面试合并返回(日历事项类型见 HrmHomeCalendarItemTypeEnum);备忘本身仍由 HrmEmployeePersonalNoteController 独立维护(/hrm/employee/personal-note)。
# 1.2 管理后台
对应 [HRM 人力资源 -> HR 工作台]、[HRM 人力资源 -> 团队工作台] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/hrm/home 目录。
# HR 工作台
页面为 @/views/hrm/home/hr/index.vue,由 HrmHomeEmployeeSurvey.vue、HrmHomeRecruitSurvey.vue、HrmHomeSalarySurvey.vue、HrmHomeTodoSurvey.vue 和 HrmHomeCalendar.vue 五个卡片组合而成:
- 员工概览:展示当前在职、本月入职、待入职、离职、待离职、转正和调岗人数,统计口径见
HrmEmployeeSurveyTypeEnum。 - 招聘概览:展示招聘中职位和候选人进度。
- 薪资概览:读取上一自然月已经归档的工资表,未归档月份不参与统计。
- 待办概览:展示待离职、合同到期、待转正、待入职、员工生日和待核算薪资六类待办;前五类员工待办类型见
HrmEmployeeTodoTypeEnum,待核算薪资单独读取月度工资待办统计。
工作台数据均为实时聚合,不写入统计快照表。

# 团队工作台
页面为 @/views/hrm/home/team/index.vue,展示的是「我的团队」,而不是整个部门。
后端先用当前登录 userId 定位员工,再查询 leader_employee_id = 当前员工 id 的直属下属,不会递归包含下属的下属。因此主管账号既要绑定员工档案,也要获得团队工作台的菜单权限。

# 个人工作台
第三类工作台是个人工作台,它属于员工端菜单,只展示当前登录员工本人的数据,详见 §3 个人工作台。
# 新增与删除个人备忘
HR 工作台、团队工作台和个人工作台共用 HrmHomeCalendar.vue。选中日期后点击【添加备忘录】,由 PersonalNoteForm.vue 创建备忘;点击备忘右侧的【删除】即可移除。
个人备忘只归属于当前登录账号绑定的员工。当前页面没有「编辑备忘」操作,需要调整内容时,应删除旧记录后重新新增。

# 2. 组织架构
组织架构直接复用 System 模块的 system_dept 部门表,HRM 不新建部门表。员工通过 dept_id 归属部门,通过 leader_employee_id 建立直属汇报线。
# 2.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `system_dept` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门编号',
`name` varchar(30) NOT NULL DEFAULT '' COMMENT '部门名称',
`parent_id` bigint NOT NULL DEFAULT '0' COMMENT '父部门编号',
`sort` int NOT NULL DEFAULT '0' COMMENT '显示顺序',
`leader_user_id` bigint DEFAULT NULL COMMENT '部门负责人后台用户编号',
`phone` varchar(11) DEFAULT NULL COMMENT '联系电话',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`status` tinyint NOT NULL COMMENT '部门状态',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='部门表';
① parent_id 关联本表的 id 字段,值为 0 表示根部门,构成无限层级部门树。
② leader_user_id 关联 system_users 表的 id 字段,表示部门负责人账号;员工的直属上级则由 hrm_employee.leader_employee_id 关联员工主档。两者是不同维度的关系,不能混用:绩效流程中的「部��负责人」按前者解析,「上级」按后者解析。
③ hrm_employee.dept_id 逻辑关联本表的 id 字段。组织架构按该字段统计各部门的在职、全职和非全职人数,完整员工表见 《【员工】员工管理》。
# 2.2 管理后台
对应 [HRM 人力资源 -> 组织管理] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/hrm/dept 目录。
# 列表
@/views/hrm/dept/index.vue 使用整页树形表格展示部门,每个节点显示直属人数与包含下级人数:部门数据来自 System 的 DeptController,人数由 HrmEmployeeController 按 dept_id 汇总。父节点括号内的人数包含全部子部门。

# 部门详情
点击部门名称进入 @/views/hrm/dept/detail/index.vue,包含「详细资料」和「员工列表」两个页签。员工页签只展示该部门的直属员工,不包含子部门员工。

# 新增、修改与删除部门
HRM 组织架构是只读消费页面,不重复实现部门 CRUD。点击部门维护入口时,仍跳转 [系统管理 -> 组织管理 -> 部门管理],由 System 模块完成新增、修改、启停和删除;HRM 只保存员工的 dept_id 关联。
# 3. 个人工作台
个人工作台位于同一个 Vue3 管理后台,由 HrmPortalEmployeeController、HrmPortalHomeController 和 HrmPortalSalarySlipController 提供本人数据接口。
# 3.1 员工端
对应 [HRM 人力资源 -> HRM 员工端 -> 个人工作台] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/hrm/portal/home 目录。
# 查看个人工作台
进入页面时,先检查当前账号是否已绑定员工档案:绑定后,展示本人任职摘要、未读工资条和个人日历;未绑定时展示开通引导(@/views/hrm/portal/opening-guide)。

管理端与员工端的关系
员工端不是另一套账号、前端或数据库。Portal 接口不接收任意 employeeId,而是通过当前登录账号反查本人档案,因此拥有 HR 管理菜单也不会自动获得他人数据。
管理员在员工管理中绑定后台账号并分配员工端菜单后,该账号即可使用个人工作台。工作台除个人备忘的新增、删除外,其余信息均为只读。
