【组织】工作台、组织架构
组织模块由 yudao-module-hrm 的 home、employee 包和 System 部门能力共同实现,前端位于 @/views/hrm/home、@/views/hrm/dept 和 @/views/hrm/portal/home 目录。
- HR 工作台:面向 HR,汇总员工、招聘、薪资、待办和日历事项。
- 团队工作台:面向主管,按员工直属汇报线统计直属下属。
- 组织架构:复用 System 部门树,叠加员工人数和部门员工列表。
- 个人工作台:员工端首页,只展示当前登录员工的数据。
工作台是实时查询与聚合能力,不单独建立“工作台表”。组织关系如下:
# 1. 工作台
三类工作台由 HrmHomeController(/hrm/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。后端通过当前登录账号反查员工编号,不允许请求方指定其他员工。
② 工作台日历把个人备忘与员工生日、入职、转正、离职和候选人面试合并返回;备忘仍由 HrmEmployeePersonalNoteController(/hrm/employee/personal-note)独立维护。
# 1.2 管理后台
# HR 工作台
对应 [HRM 人力资源 -> HR 工作台] 菜单,页面位于 @/views/hrm/home/hr/index.vue。它组合 HrmHomeEmployeeSurvey.vue、HrmHomeRecruitSurvey.vue、HrmHomeSalarySurvey.vue、HrmHomeTodoSurvey.vue 和 HrmHomeCalendar.vue:员工概览展示当前在职、本月入职、待入职、离职、待离职、转正和调岗人数;招聘概览展示招聘中职位和候选人进度;薪资概览读取上一自然月已经归档的工资表。
页面调用 HrmHomeController 的 GET /hrm/home/hr-statistics-summary 和 GET /hrm/home/hr-calendar 接口,工作台数据均为实时聚合,不写入统计快照表。

# 新增与删除个人备忘
HR 工作台、团队工作台和员工个人工作台共用 HrmHomeCalendar.vue。选中日期后点击【添加备忘录】,通过 PersonalNoteForm.vue 调用 HrmEmployeePersonalNoteController(/hrm/employee/personal-note)的 POST /hrm/employee/personal-note/create 接口;点击个人备忘右侧的【删除】,调用 DELETE /hrm/employee/personal-note/delete。
个人备忘只归属于当前登录账号绑定的员工,请求方不能指定其他员工。当前页面没有“编辑备忘”操作,需要调整内容时,应删除旧记录后重新新增。
# 团队工作台
对应 [HRM 人力资源 -> 团队工作台] 菜单,页面位于 @/views/hrm/home/team/index.vue,通过 HrmHomeController 的 GET /hrm/home/team-statistics-summary 和 GET /hrm/home/team-calendar 查询团队概况与日历。
后端先用当前登录 userId 定位员工,再查询 leader_employee_id = 当前员工 id 的直属下属,因此这里展示的是“我的团队”,不是整个部门,也不会递归包含下属的下属。主管账号既要绑定员工档案,也要获得团队工作台菜单权限。

# 2. 组织架构
组织架构不迁移另一套 HRM 部门表,而是直接复用 system_dept。员工通过 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 逻辑关联 system_dept.id。组织架构按该字段统计各部门的在职、全职和非全职人数;完整员工表见 《【员工】员工管理》。
# 2.2 管理后台
# 组织树与部门详情
对应 [HRM 人力资源 -> 组织管理] 菜单。@/views/hrm/dept/index.vue 使用整页树形表格展示部门及直属人数、包含下级人数,通过 System 的 DeptController 调用 GET /system/dept/simple-list,并通过 HrmEmployeeController 的 GET /hrm/employee/dept-statistics 汇总人数。点击部门名称跳转 @/views/hrm/dept/detail/index.vue,详情页通过 GET /system/dept/get 展示“详细资料”和“员工列表”两个页签,员工页签调用 GET /hrm/employee/page 查询当前部门的直属员工。
父节点括号内人数包含全部子部门;部门详情中的员工列表只展示该部门的直属员工。

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

Portal 接口不接收任意 employeeId,而是通过当前登录账号反查本人档案。管理员在员工管理中绑定后台账号并分配员工端菜单后,该账号即可使用个人工作台。工作台除个人备忘的新增、删除外,其余信息均为只读。