hr-system/docs/01-design/ui-design.md

23 KiB
Raw Blame History

一期批次1总体设计 —— UI/页面设计hr-webocai 口径)

  • 版本v3.0批次1设计定稿v3.0 变更:对齐 SRS v3.1 —— 新增编制看板(F16)/项目式组织(F17)页面、工作台工资条/绩效桩位、入职登记链接与二维码交互扫码入职降级、证件手工录入交互D1、合同文本生成打印、离职交接钉钉占位项
  • 状态:设计定稿批次1评审修订版
  • 规范依据ocai 技能集 bricks-framework、bricks-layout-patterns、module-development-specindex.ui 强制、crud-definition-spec交互基线 docs/01-design/architecture.md

1. 界面体系与总体布局

  1. 技术形态:无 Vue/无手写 HTML。页面 = wwwroot/*.ui(纯 JSON bricks 组件树)+ *.dspy数据端点CRUD 列表/表单页由 json/*.json 经 xls2ui 自动生成 DataViewer/Form/Tree 页面。
  2. 入口/index.ui(应用门户,菜单聚合 6 模块入口);每模块强制 /{module}/index.uiResponsableBox 功能卡片导航)。
  3. 权限渲染:菜单与按钮可见性由 rbac 角色控制Menu 只注册已授权路径;操作按钮 binds 前按角色渲染)。
  4. 核心 widgetsVBox/HBox、ResponsableBox自适应员工自助移动端兼容、Menu、DataViewer列表data_filter 筛选/toolbar binds/子表 subtables、Tree组织树/项目树、Form、PopupWindow、Chart报表/编制看板、Text、FileUpload/FilePreview、UrlWidget。
  5. binds actiontype 仅 5 种urlwidget / script / url / datawidget / event禁止 script 内 fetch弹窗走 PopupWindow + urlwidget
  6. URL 规则.ui 内全部 url 使用 {{entire_url('/module/xxx.ui')}} 绝对路径json/ 内引用别名用 {{entire_url('../alias')}}

1.1 应用门户 /index.ui

index.ui (VBox, height:100%)
├── Header(HBox): Text「Web版人事系统」+ 用户信息 + [消息铃铛(message_unread_count.dspy 未读数)]
├── 内容区(HBox, flex:1)
│   ├── Menu(id:app.menu, width:220px)
│   │   ├── 工作台        → /hrsystem/workbench_*.ui按角色路由
│   │   ├── 组织管理      → /hrorg/index.ui
│   │   ├── 花名册        → /hrroster/index.ui
│   │   ├── 审批中心      → /hrflow/index.ui
│   │   ├── 合同管理      → /hrcontract/index.ui
│   │   ├── 编制管理      → /hrorg/headcount_board.uiF16
│   │   ├── 项目组织      → /hrorg/project_tree.uiF17
│   │   ├── 人事报表      → /hrreport/index.ui
│   │   ├── 员工服务      → /hrsystem/service.ui公告/政策)
│   │   └── 系统管理      → /hrsystem/index.ui角色/范围/管理员/日志)
│   └── VBox(id:app.content, flex:1)   ← Menu items url 统一加载到此
└── 说明Menu 不加 binds内部处理点击内容区置于 sidebar 之前DOM 顺序)

2. 路由表wwwroot 自动路由)

URL 页面 说明 角色
/index.ui 应用门户 全局导航 L
/hrorg/index.ui 组织模块入口 卡片:组织树/架构图/时间轴/职位职级/入转调离工作台/编制/项目组织/黑名单 L
/hrorg/org_tree.ui 组织管理 Tree + 详情表单 + 变更时间轴 L
/hrorg/org_chart.ui 组织架构图 层级展开/as_of 历史/导出 PNG/XMind A,H
/hrorg/position_list.ui 等 职位/职务/职级/职等/序列 CRUD xls2ui 生成 DataViewer A,H
/hrorg/company_list.ui 合同公司台账 CRUDFEAT-B1-02 A,H
/hrorg/entry_workbench.ui 入职工作台 待入职/审批中/黑名单高亮/登记二维码 A,H
/hrorg/entry_register.tmpl 入职登记表(免登录) 候选人扫码填表页(内网 token 鉴权,扫码入职降级) 匿名(token)
/hrorg/transfer_list.ui 调动查询 待确定/已确定/已取消筛选 A,H,M
/hrorg/leave_workbench.ui 离职工作台 待离职名单/交接/证明/黑名单 A,H,M
/hrorg/headcount_board.ui 编制看板F16 方案/细分/超缺编状态/历史回溯 A,H,M
/hrorg/headcount_config.ui 编制配置F16 方案+细分项+占编范围条件编辑 A,H
/hrorg/project_tree.ui 项目式组织F17 项目树+属性+任职维护 L
/hrroster/index.ui 花名册入口 卡片:花名册/字段配置/工号规则/导入导出 A,H
/hrroster/roster_list.ui 花名册列表 DataViewer + data_filter + 自定义列 A,H,M(团队)
/hrroster/employee_detail.ui 员工档案 Tabs 分组 + 时间轴(含证件信息分组,脱敏展示) L(按范围)
/hrroster/field_config.ui 字段/分组/类型规则配置 拖拽排序 A,H
/hrflow/index.ui 审批中心入口 待办/已办/我发起/我收到/流程配置 L
/hrflow/todo_list.ui 待办列表 DataViewer行内审批 L
/hrflow/inst_detail.ui 审批单 表单渲染 + 流转记录 + 操作按钮 参与者
/hrflow/flow_design.ui 流程/表单/节点/审批角色配置 含考勤桩位表单、四类流程模板 A,H
/hrcontract/index.ui 合同入口 台账/类型/模板/提醒规则 A,H
/hrcontract/contract_list.ui 合同台账 DataViewer + 到期高亮 + 文本生成 A,H
/hrreport/index.ui 报表看板 五类分析卡片 A,H,M
/hrreport/report_board.ui 看板页 Chart 组件 + 导出 A,H,M
/hrsystem/index.ui 系统管理入口 角色/管理员/数据范围/日志/提醒配置 A
/hrsystem/workbench_employee.ui 员工工作台 个人档案/发起审批/待办;工资条/绩效桩位 E
/hrsystem/workbench_manager.ui 经理工作台 团队统计/入转调离审批/关怀;考勤/团队绩效桩位 M
/hrsystem/workbench_admin.ui 管理员工作台 人事统计/合同/提醒 A,H
/hrsystem/audit_log_list.ui 操作日志 DataViewer + 详情对比弹窗 A
/hrsystem/service.ui 员工服务 公告/政策查询预览(下载按权限) L
/hrsystem/message_list.ui 站内消息 未读/已读 L

3. 关键页面结构与组件树

3.1 组织管理 /hrorg/org_tree.uiF01

org_tree.ui (HBox)
├── 左侧 VBox(width:320px)
│   ├── 搜索行(HBox): Input(keyword) + Button[搜索](binds script → 触发 Tree 刷新)
│   ├── Tree(id:org_tree, dataurl=/hrorg/api/org_tree.dspy, 点击节点→右侧详情)
│   └── 工具按钮行: [新增子组织][新增同级](PopupWindow → org_unit_form.dspy) [导入](FileUpload→org_import.dspy)
└── 右侧 VBox(flex:1)
    ├── 组织详情 Form(id:org_detail, dataurl=/hrorg/api/org_unit_detail.dspy?id=..)
    │   字段: org_code/org_name/org_type(codes:ORG_TYPE)/leader_id(dataurl:employee_options)/effective_date/自定义字段(动态渲染 org_field_def)
    ├── 操作按钮行: [编辑][移动(PopupWindow)][停用(二次确认)]  ← A/H 角色可见
    └── 变更时间轴 VBox(id:org_timeline, dataurl=/hrorg/api/org_change_timeline.dspy)
        每条: Text(时间+操作人+类型 add/edit/disable/move/split/merge) + before/after 对比展开

交互Tree 节点点击 → urlwidget 刷新 org_detail 与 org_timelineparams_mapping 传 id停用前弹确认 PopupWindow停用后该组织在入职/调动表单 options 中不可选(服务端过滤 status=active组织移动后员工任职部门随组织联动服务端处理页面提示影响人数

3.2 组织架构图 /hrorg/org_chart.uiF01

org_chart.ui (VBox)
├── 工具行(HBox): DatePicker(as_of 历史日期) + TreeSelect(根节点) + 显示内容多选(姓名/职位/负责人) + Button[查看][导出PNG][导出XMind]
└── Chart/Tree 容器(id:chart_box, dataurl=/hrorg/api/org_tree.dspy?as_of=..&root_id=..)

交互as_of 变更后重查(按生效时间重建当时结构);导出经 PopupWindow 提示后浏览器下载org_chart_export.dspy 返回文件)。

3.3 花名册列表 /hrroster/roster_list.uiF03CRUD 生成)

roster_list.ui = DataViewer(json/roster_employee_list.json 生成)
├── data_filter: keyword(姓名/工号 LIKE) + org_id(TreeSelect:org_options) + employee_status(codes) + employee_type(codes) + 自定义字段筛选(动态追加≤3 项)
├── toolbar binds:
│   ├── [新增员工] → PopupWindow → roster_employee_create.dspy含证件信息分组证件类型/号码/有效期起止/签发机关,手工录入 D1
│   ├── [导入] → PopupWindow: 模板下载链接 + FileUpload(roster_import.dspy, mode=new/update) + 结果文件下载
│   ├── [导出] → PopupWindow: 字段多选(拖拽排序) + as_of 日期 → roster_export.dspy
│   └── [字段配置] → url 跳转 field_config.uiA/H
├── 列: 工号/姓名(点击→employee_detail.ui?id=)/组织/职位/员工类型/状态/入职日期 + 自定义显示列
└── 行操作: [详情][发起转正][发起调动][办理离职](按角色与员工状态显隐)

3.4 员工档案 /hrroster/employee_detail.uiF03

employee_detail.ui (VBox)
├── 头部卡片(HBox): 头像 + 姓名/工号/状态标签 + 快捷操作[编辑][发起审批](PopupWindow 选择 biz_type)
├── Tabs(id:profile_tabs)
│   ├── Tab 分组字段(按 roster_field_group 动态生成证件信息组展示脱敏证件号前3后3+有效期+签发机关): Form 只读/可编辑(按 editable_self+角色)
│   ├── Tab 时间轴(id:timeline, dataurl=timeline.dspy, 垂直时间线) + [添加记录](A/H)
│   ├── Tab 兼岗记录(DataViewer subtables: org_concurrent_post by employee_id)
│   ├── Tab 合同(DataViewer subtables: contract_info by employee_id)
│   ├── Tab 项目任职F17org_project_post by employee_id横向项目+横向职务)
│   └── Tab 审批记录(dataurl=inst_mine.dspy?about=..)
└── 附件: 字段类型=file → FileUpload + FilePreview(file_preview_url.dspy)

交互自助修改——employee 角色仅看到 editable_self=1 字段可编辑;提交时若字段 need_audit=1服务端走 roster_self_edit 审批流,页面提示"已提交审核";否则直接生效。复职员工档案头部显示"复职"标签并链接原档案prev_employee_id

3.5 入转调离工作台F04~F07

entry_workbench.ui (VBox)
├── 状态卡片行(ResponsableBox): 待入职数/审批中数/本月入职数dataurl=workbench_transfer.dspy
├── 待入职列表 DataViewer(org_entry by entry_status=pending_entry)
│   ├── 黑名单命中行: 高亮样式 + [拦截原因]BLACKLIST_HIT
│   ├── 登记表状态列: none/invited/filled + [复制链接][二维码(PopupWindow 展示二维码图片+有效期)]
│   └── 行操作: [邀请填登记表(entry_invite_register.dspy)][发送入职通知][直接入花名册][复职匹配提示(命中历史档案时高亮)]
└── 工具行: [手动入职(批量 PopupWindow)][发起入职审批(含证件信息手工录入分组)]

transfer_list.ui: DataViewer(org_transfer) + data_filter(status=pending/confirmed/cancelled, transfer_type, effective_date)
  行操作: [查看明细(org_transfer_detail subtable批量逐人)][取消](pending 状态)
  [发起调动] PopupWindow: 多人选择(批量) + 调动类型 + 生效日期 + 逐人目标组织/职位/职级

leave_workbench.ui (VBox)
├── 待离职名单 DataViewer(org_leave by status=pending_leave)
│   行操作: [交接管理(PopupWindow: org_leave_handover 编辑,交接项类型含"钉钉资源交接(占位,手工登记内容)")][办理离职][开具证明][加入黑名单(确认弹窗)]
├── 交接完成率: 每个离职单展示交接项完成进度条done/total
└── 已离职列表 DataViewer(status=left) + [离职证明下载(PDF)] + [加入黑名单]

3.6 审批中心F10

todo_list.ui = DataViewer(dataurl=task_todo.dspy)
  列: 审批编号/标题/发起人/发起时间/当前节点  行操作:[审批]→ inst_detail.ui?instance_id=

inst_detail.ui (VBox)
├── 表单渲染区(id:form_box, dataurl=inst_detail.dspy) —— 按 flow_form_def 动态渲染,节点字段权限控制可编辑性
├── 流转记录 VBox: 节点链(提交→各审批人意见/时间)
└── 操作行(binds urlwidget POST): [同意(task_approve.dspy)][驳回(task_reject.dspy)][转交(PopupWindow 选人)][撤回(发起人)][打印(inst_print.dspyA4 版式)]
  操作完成后 script 刷新页面 → 列表刷新

flow_design.ui (A/H): 三区块
├── 表单定义 DataViewer(flow_form_def) + 字段引用器(勾选 roster_field_defbiz_type 含考勤桩位 attendance_* 分组提示"桩位,不联动考勤系统")
├── 流程定义 DataViewer(flow_def含初始化预置的人事四类模板入职/转正/异动/离职/离职交接) + 节点编辑 PopupWindow(审批人类型/通过规则 any-all/字段权限/抄送)
└── 审批角色 DataViewer(flow_role, 仅 admin三维配置流程范围/操作权限/数据查看)

3.7 编制管理F16新增

headcount_config.ui (A/H) (VBox)
├── 编制方案 DataViewer(org_headcount_scheme): 方案名/周期类型(年/季/月)/起止/状态  行操作:[编辑][停用]
└── [新增方案] PopupWindow + 方案展开行内编辑细分项:
    细分项表格(headcount_item): 占编范围条件编辑器(scope_json: 员工类型/状态/职位/职级/自定义字段多条件) + 细分维度(seg_json) + 编制数量(head_limit)

headcount_board.ui (VBox)
├── 顶部: 方案选择器 + 快照日期 DatePicker(历史回溯)
├── 状态卡片区(ResponsableBox): 总编制/在编/超编/缺编
├── Chart(柱状: 各细分项 head_limit vs used_count超编红色标注) dataurl=headcount_status.dspy
└── 明细 DataViewer: 细分项/编制数/占编数/超编数/缺编数(超编行红色高亮 + 提醒消息入口)
交互:异动(入转调)生效后看板 ≤1 分钟刷新(事件触发重算);历史日期选择 → headcount_history.dspy 按快照取数。

3.8 项目式组织F17新增

project_tree.ui (HBox)
├── 左侧 VBox: Tree(org_project 多层级) + [新增项目][新增子项目]
└── 右侧 VBox
    ├── 项目详情 Form: 编码/名称/负责人/时间范围(到期自动标识 expired 状态)/属性(attrs_json)
    └── 项目任职 DataViewer(org_project_post): 员工/横向职务(horizontal_job_options)/起止日期
        行操作:[添加任职(PopupWindow 选人+选横向职务)][移除]
交互员工同时挂纵向部门roster_employee.org_id与横向项目横向职务数据可被花名册任职信息与薪酬模块引用options 端点)。

3.9 报表看板 /hrreport/report_board.uiF13

report_board.ui (VBox)
├── 顶部 Tab: 花名册分析 | 入职 | 转正 | 调岗 | 离职
├── 花名册分析 Tab: 维度选择器(codes: type/status/age/edu/location/gender + 自定义字段) + Chart(饼图/柱状, dataurl=roster_analysis.dspy) + 明细 DataViewer
├── 入职 Tab: 维度(部门/地区/岗位) + 周期选择 + Chart(趋势折线 + 分布柱)
├── 转正 Tab: Chart(趋势) + 近期待转正 DataViewer(regular_analysis.dspy)
├── 调岗 Tab: 日期范围 + Chart(按类型柱状)
├── 离职 Tab: 卡片(待离职人数/离职率/同比/环比) + Chart(离职原因饼图)
└── 各 Tab 右上 [导出] → report_export.dspy与页面数据一致

所有看板查询服务端叠加数据范围manager 仅见团队。

3.10 合同管理F09

contract_list.ui = DataViewer(contract_info)
├── data_filter: 员工/类型/合同公司/状态/到期日期前
├── toolbar: [新增合同][批量导入][类型管理][模板管理][提醒规则]
├── 行操作: [发起审批(新签/续签/变更/终止 PopupWindow 选类型)][生成合同文本(contract_text_gen.dspy按模板填充下载 docx/pdf 供打印——电子签二期)][到期高亮(end_date 临近橙色)]
└── 模板管理页: contract_template CRUD + 占位符映射编辑(field_marks_json)

3.11 系统管理F11/F12/F15

index.ui(hrsystem): 卡片导航 → role_admin.ui / data_scope.ui / audit_log_list.ui / remind_config.ui / service.ui
role_admin.ui: DataViewer(角色) + 权限树勾选 PopupWindow(rbac paths)
data_scope.ui: 管理员列表 + 范围编辑 PopupWindow(scope_type 切换: 组织 TreeSelect 多选(含子树) / 花名册字段多选;两类可叠加)
audit_log_list.ui: DataViewer(module/operation/date_range 筛选) + 行[详情] → PopupWindow 前后 JSON 对比(左右双栏 Text)
remind_config.ui: DataViewer(sys_remind_rule场景≥6 类 entry/regular/leave/retire/contract_expire/health_cert/social_insurance/custom) + DataViewer(sys_care_config 生日/周年文案)
service.ui: Tabs[公告 DataViewer(sys_announcement 在线预览)][政策 DataViewer(sys_policy, 行内预览/下载按 view_scope+downloadable 权限)]
message_list.ui: DataViewer(msg_type/is_read 筛选) 行点击标已读

3.12 工作台F14

workbench_employee.ui (ResponsableBox 移动端自适应)
├── 卡片: 个人档案(→employee_detail.ui?id=self) | 工资条(桩位卡片:显示"薪酬模块上线后可用"FEAT-B1-09) | 个人绩效(桩位:同上) | 发起审批(PopupWindow 选择流程类型→flow_start)
├── 待办/已办/我发起/我收到 四 Tab DataViewer(task_todo/done/inst_mine/received)
└── 企业政策/公告入口(service.ui)
workbench_manager.ui (VBox)
├── 统计卡片行(dataurl=team_stats.dspy): 团队人数/本月入离职/待审批数(考勤统计/团队绩效为桩位卡片"未接入"
├── 待审批 DataViewer(task_todo 范围=团队) | 团队入转调离 DataViewer(workbench_transfer.dspy scope=team)
└── 关怀提醒 VBox(生日/周年/合同到期 近期列表)
workbench_admin.ui (VBox)
├── 人事统计卡片(team_stats scope=all) + 合同即将到期 DataViewer(contract_expire_soon.dspy) + 编制超编提醒入口(headcount_board.ui)
└── 待审批 + 关怀提醒(同经理视图,范围=数据权限内全部)

4. 核心交互流程(页面级时序)

  1. 入职(审批)entry_workbench [发起入职审批] → PopupWindow 表单(含证件信息手工录入分组)→ entry_approval.dspy →BLACKLIST_HIT 则红色高亮提示)成功 → 待审批列表出现;审批人在 todo_list 处理 → inst_detail 同意 → 花名册新增记录 → message_list 收到入职通知。
  2. 入职登记表(扫码降级):待入职行 [邀请填登记表] → 生成链接+二维码PopupWindow 展示,内网访问)→ 候选人扫码打开 entry_register.tmpl → 填写提交 → 列表登记表状态 filled → 继续审批/入职。
  3. 复职:发起入职审批输入证件号 → entry_rehire_match 命中历史档案 → 表单提示"复职:原部门/职位"并自动带出关联 → 入职后档案显示复职标签。
  4. 员工自助修改employee_detail → 编辑可改字段 → 保存 → 提示"直接生效"或"已提交审核"need_audit→ 审核通过后字段更新、时间轴留痕。
  5. 调动批量transfer_list [发起调动] → PopupWindow 多人选择 + 调动类型 + 逐人目标 → transfer_apply.dspy → 生成批量审批单 → 通过后逐人更新(明细可追溯)→ 编制联动校验提醒。
  6. 离职全流程leave_workbench 发起/手动 → 待离职名单 → [交接管理]逐项勾选(含钉钉资源占位项手工登记)→ 到期自动生效remind_scan→leave_effect→ [开具证明]下载 PDF → 可选[加入黑名单]。
  7. 合同到期提醒remind_scan后台→ message_list 消息 → workbench_admin 到期卡片 → contract_list 行内到期高亮 → [生成合同文本]续签打印。
  8. 历史架构图org_chart 选择 as_of 日期 → 查看 → 导出 PNG/XMind。
  9. 编制看板headcount_config 配置方案与细分(占编范围条件)→ headcount_board 实时查看超/缺编 → 异动后自动刷新并推送超编提醒 → 选择历史日期回溯快照。

5. 设计规范

  1. 布局:左侧 Menu 固定 220px内容区 VBox 滚动;卡片统一圆角 8px、间距 16px表单 label 右对齐;列表默认每页 50。
  2. 状态色active/在职=绿、probation/审批中=橙、inactive/离职/驳回=灰、黑名单/超编/到期=红。
  3. 反馈:操作成功 message 提示并刷新当前视图;不可逆操作(停用/加黑名单)一律 PopupWindow 二次确认;耗时操作(导入导出)返回 task_id 后轮询/消息通知结果。
  4. 空态/加载DataViewer 自带 loading 与空数据提示;桩位卡片(工资条/绩效/考勤)统一"未接入"样式与文案。
  5. 权限感知按钮与列按角色渲染load_path + CRUD confidential_fields敏感字段服务端脱敏后展示证件号前3后3、手机前3后4
  6. 移动端兼容:员工自助页面(工作台/档案/待办/服务/消息/登记表)使用 ResponsableBox 自适应,窄屏卡片化;管理类页面 PC 优先NFR-6
  7. 打印:审批单 inst_print.dspy 输出 A4 打印样式页面;合同文本 docx/pdf 直接打印。

6. 页面-接口追溯

页面 主要接口(见 api-design.md
org_tree.ui org_tree / org_unit_create / org_unit_update / org_unit_move / org_unit_disable / org_change_timeline / org_import / org_field_def_save
org_chart.ui org_tree(as_of) / org_chart_export
company_list.ui company_saveCRUD
position_list.ui 等 position/job/grade/rank/sequence CRUD + *_import/_export + *_options
roster_list.ui roster_list / roster_employee_create / roster_import / roster_export / check_employee_no / roster_field_def_save
employee_detail.ui employee_detail / roster_employee_update / timeline / timeline_add / file_preview_url
entry_workbench.ui entry_approval / entry_manual / entry_invite_register / entry_qrcode / entry_blacklist_check / entry_notify / entry_rehire_match
entry_register.tmpl entry_register_page / entry_register_submit
transfer_list.ui transfer_apply / transfer_cancel
leave_workbench.ui leave_apply / leave_manual / leave_handover_save / leave_certificate / blacklist_add
headcount_config.ui / headcount_board.ui headcount_scheme_save / headcount_item_save / headcount_status / headcount_history
project_tree.ui project_tree / project_save / project_post_save / horizontal_job_options
todo_list.ui / inst_detail.ui task_todo / inst_detail / task_approve / task_reject / task_forward / inst_withdraw / inst_print
flow_design.ui form_def_save / flow_def_save / flow_node_save / flow_role_save / flow_match
contract_list.ui contract_list / contract_create / contract_import / contract_apply / contract_text_gen / contract_remind_rule_save / contract_template_save / esign_stub
report_board.ui roster_analysis / entry_analysis / regular_analysis / transfer_analysis / leave_analysis / report_export
workbench_*.ui workbench_employee / workbench_manager / workbench_admin / team_stats / contract_expire_soon
audit_log_list.ui audit_log_list / audit_log_detail
remind_config.ui / service.ui remind_rule_save / care_config_save / announcement_save / policy_save / policy_download
message_list.ui message_list / message_read / message_unread_count