2026-07-30-oa-resignation-kit-design.md 6.4 KB

OA 表单设计 · 离职套件(Resignation Kit)设计文档

日期: 2026-07-30
状态: 已实现
范围: web-admin 用户管理补齐最后工作日;审批套件 Tab 离职套件;发起默认入职日期;backend 审批通过后回写发起人 last_work_day
界面模式: 对齐请假/转正套件;视觉 Fresh Mint
前置:

  • docs/superpowers/specs/2026-07-30-oa-leave-kit-design.md
  • docs/superpowers/specs/2026-07-30-oa-confirmation-kit-design.md(回写模式)

1. 背景与目标

套件 Tab 增加 离职套件:采集入职日期、最后工作日、离职原因及备注;审批通过后将最后工作日回写发起人用户主数据。

1.1 目标

  • sys_user 增补 最后工作日;用户管理新增/编辑/详情可维护。
  • 拖入离职套件得到 4 个子字段。
  • 发起时入职日期默认申请人(可改)。
  • 离职原因内置 5 项,设计器可维护 options。
  • 审批 全部通过 后仅回写发起人 last_work_day。

1.2 非目标(首期)

  • 通过后自动停用账号。
  • 入职日期、离职原因、备注回写用户表。
  • 「最后工作日 ≥ 入职日期」交叉校验。
  • 代他人离职并回写他人主数据。

2. 产品决策(已确认)

项 决策
实现方案 套件容器 + 子字段拼装
容器类型 resignationKit
回写时机 审批全部通过
回写对象 始终发起人
回写字段 仅最后工作日
账号状态 不动
用户管理 最后工作日可新增/编辑/详情
入职日期 默认申请人,可改,不回写
最后工作日 默认必填(设计器可改);手填
交叉校验 首期不做
原因/备注 仅审批单

3. 信息模型

3.1 心智模型

┌─ 离职套件(resignationKit)──────────────────────────┐
│  · datePicker   入职日期        ← userInfo.hireDate    │
│  · datePicker   最后工作日      ← 手填;通过后回写     │
│  · select       离职原因        ← 5 默认项,可配置     │
│  · textarea     离职原因备注                           │
└──────────────────────────────────────────────────────┘

运行时不渲染套件边框/标题。

3.2 子字段

语义 key title type 必填默认 回写
hireDate 入职日期 datePicker 仅日期 是 ✗
lastWorkDay 最后工作日 datePicker 仅日期 是 ✓ → last_work_day
resignReason 离职原因 select 是 ✗
resignRemark 离职原因备注 textarea 否 ✗

离职原因默认 options:

  • 家庭原因
  • 个人原因
  • 发展原因
  • 合同到期不续签
  • 其他

语义识别:props._fc_kit_field;容器 props 可挂各 *Field id。

3.3 Schema 示意

{
  "type": "resignationKit",
  "props": {
    "hireDateField": "...",
    "lastWorkDayField": "...",
    "resignReasonField": "...",
    "resignRemarkField": "..."
  },
  "children": [
    {
      "type": "datePicker",
      "title": "入职日期",
      "props": { "_fc_kit_field": "hireDate", "type": "date", "valueFormat": "YYYY-MM-DD" },
      "$required": true
    },
    {
      "type": "datePicker",
      "title": "最后工作日",
      "props": { "_fc_kit_field": "lastWorkDay", "type": "date", "valueFormat": "YYYY-MM-DD" },
      "$required": true
    },
    {
      "type": "select",
      "title": "离职原因",
      "options": [
        { "label": "家庭原因", "value": "家庭原因" },
        { "label": "个人原因", "value": "个人原因" },
        { "label": "发展原因", "value": "发展原因" },
        { "label": "合同到期不续签", "value": "合同到期不续签" },
        { "label": "其他", "value": "其他" }
      ],
      "props": { "_fc_kit_field": "resignReason" },
      "$required": true
    },
    {
      "type": "textarea",
      "title": "离职原因备注",
      "props": { "_fc_kit_field": "resignRemark", "rows": 3 },
      "$required": false
    }
  ]
}

4. 用户主数据

4.1 增列

ALTER TABLE `sys_user`
  ADD COLUMN `last_work_day` date DEFAULT NULL COMMENT '最后工作日' AFTER `probation_months`;

(若库中无 probation_months,则 AFTER hire_date 或 phone_no。)

同步:SysUser、_row_to_dict(lastWorkDay)、Create/Update Body、用户管理表单与详情、userInfo 可选带出 lastWorkDay(套件默认不依赖此项)。


5. 运行时

5.1 发起默认

仅对空的入职日期写入 userInfo.hireDate。其余字段不默认。

5.2 提交 / 发布

  • 可见必填按 FormCreate 校验。
  • LAYOUT_TYPES 纳入 resignationKit。
  • 打印 unwrap 同其它套件。

5.3 通过后回写

挂在实例 status = completed 后(可与转正 sync 并列调用):

apply_resignation_kit_user_sync(db, inst)

  • 扫描 resignationKit → 取 lastWorkDay
  • 有合法 YYYY-MM-DD 则更新发起人 last_work_day
  • 空 / 非法:跳过 + log;异常不回滚通过状态

6. 建议文件落点

区域 路径
SQL docs/sql/sys_user_last_work_day.sql
模型/CRUD/API/用户管理 同转正补字段路径
容器 OaResignationKit.vue
DragRule / 注册 oa-resignation-kit-rule.ts、oa-form-create-resignation-kit.ts
默认值 oa-resignation-kit-runtime.ts
回写 oa_resignation_kit_sync.py + oa_engine completed 钩子
发布/打印 oa_publish.py、oa-approval-print.ts
设计器拖入刷新 oa-fc-host/App.vue(纳入 kit 名列表)

7. 验收标准

  1. 用户管理可维护最后工作日。
  2. 套件 Tab 可拖「离职」;原因默认 5 项且设计器可改。
  3. 发起:入职日期自动带出可改;最后工作日/原因/备注按规则校验。
  4. 通过前主数据最后工作日不变;通过后写入发起人;空不写。
  5. 入职日期、原因、备注不回写;账号状态不变。

8. 开放细节(不阻塞)

  • userInfo 是否带出 lastWorkDay:可选,套件不依赖。
  • 与转正 sync 共用一个 hook 文件或并列两个函数:实现任选,逻辑分离即可。