docs(R11-3,R11-4): 规格书补齐请假/采购/资产/差旅/集成五大业务域
这个提交包含在:
+372
-49
@@ -60,52 +60,74 @@
|
||||
|
||||
> 说明:一个员工可同时拥有多个 `role_code`(例如 `finance` + `admin`),权限按并集生效。
|
||||
|
||||
### 2.2 权限码(Permission Codes,P0 必需)
|
||||
> 命名规则:`domain.action[_scope]`。后端接口必须声明所需权限码并统一校验。
|
||||
### 2.2 权限码(当前实现)
|
||||
> 命名规则:`domain.action[_scope]`。后端接口必须声明所需权限码并统一校验;前端仅用于菜单与按钮显隐,不作为最终授权依据。
|
||||
|
||||
#### 2.2.1 报销 / 票据 / 系统基础权限
|
||||
|
||||
| permission | 说明 |
|
||||
| :--- | :--- |
|
||||
| `expense.create` | 创建报销单(草稿) |
|
||||
| `expense.view_own` | 查看自己的报销单 |
|
||||
| `expense.view_all` | 查看所有报销单(数据范围由角色决定:`manager`=直属下属(`owner.direct_manager_id = me`,不递归);`ceo/finance/finance_mgr`=全公司;`hr`=全公司只读) |
|
||||
| `expense.view_all` | 查看所有报销单(数据范围由角色决定) |
|
||||
| `expense.edit_own` | 编辑自己的报销单(仅草稿/驳回) |
|
||||
| `expense.delete_own` | 删除自己的报销单(仅草稿) |
|
||||
| `expense.submit` | 提交报销单(发起工作流) |
|
||||
| `expense.withdraw` | 撤回报销单(将流程取消并回到草稿) |
|
||||
| `expense.approve` | 审批报销单(处理工作流任务) |
|
||||
| `expense.transfer` | 转审(转交当前待办任务) |
|
||||
| `expense.finance.pay` | 付款标记(approved → paid) |
|
||||
| `expense.finance.pay` | 付款标记(`approved -> paid`) |
|
||||
| `expense.finance.override_duplicate` | 发票重复例外(需填原单号 + 原因) |
|
||||
| `expense.proxy_submit` | 行政代提交 |
|
||||
| `expense.proxy_manage` | 代提交授权管理(Delegation Grants:本人可管自己的授权;`hr/admin` 可代维护) |
|
||||
| `expense.proxy_manage` | 代提交授权管理(principal 自管;`hr/admin` 可代维护) |
|
||||
| `invoice.upload` | 上传发票 / 附件 |
|
||||
| `invoice.view_own` | 查看自己的发票 / 附件 |
|
||||
| `invoice.manage` | 票据中心管理(可查看全量附件/发票信息) |
|
||||
| `system.settings` | 系统设置(含费用类型/单号规则/审批规则等配置入口) |
|
||||
| `invoice.manage` | 票据中心管理(可查看全量) |
|
||||
| `invoice.verify` | 票据验真与重试 |
|
||||
| `system.settings` | 系统设置(审批规则 / 文档序列 / 通知渠道等配置入口) |
|
||||
| `system.users` | 用户与组织管理 |
|
||||
| `system.audit` | 审计日志查看 |
|
||||
| `*` | 超级权限(仅 admin 可授予) |
|
||||
| `system.users_sensitive` | 查看或维护员工敏感字段 |
|
||||
| `system.audit.view` | 审计日志查看 |
|
||||
| `report.dashboard.view` | 查看经营 / 审批看板 |
|
||||
| `budget.view` | 查看预算池与预算余额 |
|
||||
| `budget.manage` | 维护预算池与预算规则 |
|
||||
| `masterdata.view` | 查看法体 / 成本中心 / 供应商等共享主数据 |
|
||||
| `masterdata.manage` | 维护共享主数据 |
|
||||
| `notification.channel.manage` | 通知渠道与模板配置 |
|
||||
| `integration.manage` | 集成轨道管理、补发、重试、主数据同步 |
|
||||
| `ai.assist` | 调用只读 AI 建议能力 |
|
||||
| `*` | 超级权限(仅 `admin` 可授予) |
|
||||
|
||||
### 2.3 角色默认权限映射(P0 定案)
|
||||
- `employee`:`expense.create/view_own/edit_own/delete_own/submit/withdraw` + `invoice.upload/invoice.view_own` + `expense.proxy_manage`(仅管自己的授权)
|
||||
- `manager`:在 `employee` 基础上 + `expense.approve/expense.transfer`(仅对其审批范围内单据)+ `expense.view_all`(数据范围=直属下属,`owner.direct_manager_id = me`,不递归)
|
||||
- `ceo`:`expense.approve/expense.transfer`(仅对其审批范围内单据)+ `expense.view_all`(数据范围=全公司)
|
||||
- `finance`:`invoice.manage` + `expense.approve`(财务复核任务)+ `expense.finance.pay` + `expense.view_all`(数据范围=全公司)
|
||||
- `finance_mgr`:在 `finance` 基础上 + `expense.finance.override_duplicate`(判重例外)+ `system.settings`(审批规则/费用类型配置,P1 提供 UI)
|
||||
- `administration`:`expense.proxy_submit` + `expense.view_own`(不含审批/付款;授权管理由 principal 本人或 hr/admin 执行)
|
||||
- `hr`:`system.users`(仅员工/组织域)+ `expense.view_all`(数据范围=全公司只读)
|
||||
#### 2.2.2 已扩展业务域权限(P15-P22 当前实现)
|
||||
|
||||
- `leave.*`:`leave.create`、`leave.view_own`、`leave.view_all`、`leave.submit`、`leave.approve`、`leave.manage`
|
||||
- `procurement.*`:`procurement.create`、`procurement.view_own`、`procurement.view_all`、`procurement.submit`、`procurement.approve`、`procurement.manage`
|
||||
- `travel.*`:`travel.create`、`travel.view_own`、`travel.view_all`、`travel.submit`、`travel.approve`、`travel.manage`、`travel.payment.manage`
|
||||
- `asset.*`:`asset.view_own`、`asset.view_all`、`asset.manage`、`asset.transfer`、`asset.inventory`
|
||||
|
||||
### 2.3 角色默认权限映射(当前实现)
|
||||
> 默认角色权限以 `server/src/constants/permissions.js` 为单一事实源;下表仅描述当前主干中的默认映射与职责边界。
|
||||
|
||||
- `employee`:报销自助权限 + 请假自助权限 + 采购自助权限 + 差旅自助权限 + `asset.view_own`
|
||||
- `manager`:在 `employee` 基础上 + `expense.approve/transfer/view_all` + `leave.approve` + `procurement.approve/view_all` + `travel.approve/view_all` + `asset.view_all` + `report.dashboard.view` + `budget.view/manage`
|
||||
- `ceo`:在经理审批视角基础上 + `leave.view_all` + `masterdata.view` + 公司级只读视角
|
||||
- `finance`:`invoice.manage/verify` + `expense.approve/finance.pay/view_all` + `procurement.view_all` + `travel.view_all/payment.manage` + `asset.view_all` + `report.dashboard.view` + `budget.view` + `masterdata.view`
|
||||
- `finance_mgr`:在 `finance` 基础上 + `expense.finance.override_duplicate` + `procurement.manage` + `travel.manage/payment.manage` + `asset.manage/inventory` + `integration.manage` + `system.settings` + `system.audit.view` + `budget.manage` + `masterdata.manage`
|
||||
- `administration`:`expense.proxy_submit` + 员工基础自助权限 + `procurement.view_all/manage` + `travel.view_all/manage/payment.manage` + `asset.view_all/manage/transfer`
|
||||
- `hr`:请假自助权限 + `leave.view_all/manage` + `system.users/system.users_sensitive` + `expense.view_all` + `report.dashboard.view`
|
||||
- `admin`:`*`
|
||||
|
||||
### 2.4 权限校验原则(实现约束)
|
||||
- 后端为单一事实源:所有关键动作必须在服务端做权限码校验(前端仅用于 UI 隐藏)。
|
||||
- `*_own` 语义(P0 定案):
|
||||
- 对报销单(reimbursement),`own` 定义为:`owner_id = me OR submitter_id = me`(代提交场景)。
|
||||
- 因此 `expense.view_own/edit_own/delete_own/withdraw` 均按该规则判定(另受状态约束:edit 仅 `draft/rejected`;delete 仅 `draft`;withdraw 仅“审批人未处理前”)。
|
||||
- `administration` 持有 `expense.view_own` 的目的,是允许其查看“自己代提交”的单据(submitter 维度),不代表可查看全公司。
|
||||
- “审批范围”由工作流任务的 `assignee_id/assignee_role` 决定:只有当前待办任务的处理人/处理角色可执行审批/转审。
|
||||
- “财务例外”必须写入审计日志(见第 12 章),且需要 `expense.finance.override_duplicate`。
|
||||
|
||||
---
|
||||
- 后端为单一事实源:所有关键动作必须在服务端校验权限码与数据范围;前端只负责界面显隐。
|
||||
- `*_own` 语义:
|
||||
- 对报销单(reimbursement),`own` 定义为:`owner_id = me OR submitter_id = me`(代提交场景)
|
||||
- 对采购单(purchase_request)与差旅申请(travel_request),`own` 定义为:`applicant/applicant_employee_id = me OR submitter_id = me`
|
||||
- 对请假单(leave_request),`own` 定义为:`owner_id = me`
|
||||
- 对资产卡片(asset_card),`own` 定义为:`assignee_employee_id = me`
|
||||
- `view_all` / `manage` 不是前端列表参数,而是服务端数据范围收敛规则:许多列表 / 详情接口只做 `authenticate`,实际权限在 handler 内按 `view_own/view_all/manage` 做二次判断。
|
||||
- 工作流审批范围由 `workflow_tasks.assignee_id/assignee_role` 决定:只有当前待办处理人 / 处理角色可执行 approve/reject/return;当前前端仅对报销任务暴露 `transfer` 入口。
|
||||
- `travel.payment.manage` 控制差旅支付运营面板(授权、交易、`mark-paid`、冻结建议、对账确认);`integration.manage` 控制主数据同步、ERP/IM 轨道查看增强、重试与补发。
|
||||
- 所有例外操作(判重例外、预算释放、主数据重试、集成补发等)都必须进入 `audit_logs`,并保留最小必要上下文。
|
||||
|
||||
## 3. 组织架构与部门模型
|
||||
|
||||
@@ -359,6 +381,166 @@ cancelled (作废/终止,终态)
|
||||
|
||||
---
|
||||
|
||||
### 4.7 请假管理
|
||||
|
||||
#### 4.7.1 范围与边界
|
||||
- 当前请假域以 `LeaveType`、`LeavePolicy`、`LeaveLedger`、`LeaveRequest` 四层模型为核心,支持余额查询、列表/详情、草稿创建、提交、审批与撤回闭环。
|
||||
- 当前实现支持半天粒度(`am/pm`)请假、同人同时间段冲突阻断、余额强设闸、附件规则校验与审批后账本消耗。
|
||||
- 假期类型与年度额度由 HR 维护;法定节假日、调休日等共享主数据能力归入主数据域,不在本节单独展开日历算法。
|
||||
|
||||
#### 4.7.2 角色与权限
|
||||
- `employee`:`leave.create/view_own/submit`,可发起、查看、提交和撤回本人请假。
|
||||
- `manager`、`ceo`:`leave.approve`,通过通用 workflow 待办处理请假审批。
|
||||
- `hr`:`leave.view_all/manage`,可维护假期类型、年度配额与全量查看请假单。
|
||||
|
||||
#### 4.7.3 状态机 / 工作流语义
|
||||
- 请假单状态:`draft -> reviewing -> approved/rejected`;申请人 `withdraw` 或审批人 `return` 均回到 `draft`。
|
||||
- `submit`:创建 workflow 实例与首条待办,同时写入 `LeaveLedger(entry_type=reserve)` 冻结额度。
|
||||
- `approved`:消费冻结额度(`consume`);`rejected`、`return`、`withdraw`:释放冻结额度(`release`)。
|
||||
- 当前 workflow 复用通用 `workflow_definitions / instances / tasks / history` 四表,`entity_type=leave`,不引入独立请假审批引擎。
|
||||
|
||||
#### 4.7.4 核心数据对象
|
||||
| 对象 | 作用 |
|
||||
| :--- | :--- |
|
||||
| `LeaveType` | 假别定义,含是否必传附件、附件 MIME 白名单、排序等配置 |
|
||||
| `LeavePolicy` | 假别对应年度额度与启用开关 |
|
||||
| `LeaveRequest` | 请假申请主单,包含日期范围、半天粒度、附件信息与状态 |
|
||||
| `LeaveLedger` | 假期余额账本,记录 `grant/reserve/consume/release/adjust` 五类流水 |
|
||||
|
||||
#### 4.7.5 显式不做项
|
||||
- 不在请假域内单独实现复杂排班、倒班、加班换休或跨法域假期累计规则。
|
||||
- 不单独开放“请假转审”专用 UI;当前仅复用通用 workflow 的 approve/reject/return 能力。
|
||||
- 不把日历主数据、法定节假日策略和跨年结转算法写死到请假申请 API 中。
|
||||
|
||||
### 4.8 采购管理
|
||||
|
||||
#### 4.8.1 范围与边界
|
||||
- 当前采购域覆盖 `PurchaseRequest` 草稿 / 提交 / 审批 / 撤回主流程,以及 `PurchaseOrderArchive` 的 PO / 合同归档闭环。
|
||||
- 采购二期已补齐预算 `reserve/confirm/release` 语义,并允许在 approved 采购单详情内完成归档留痕。
|
||||
- 采购域当前不进入收货、入库、三单匹配、供应商门户或发票核销。
|
||||
|
||||
#### 4.8.2 角色与权限
|
||||
- `employee`:`procurement.create/view_own/submit`,可创建和提交本人的采购申请。
|
||||
- `manager`、`ceo`:`procurement.approve`,处理采购审批待办;具备 `procurement.view_all` 的角色可查看全量。
|
||||
- `administration`、`finance_mgr`:当前默认具备 `procurement.manage`,可执行归档留痕等运营动作。
|
||||
- `integration.manage`:用于查看或补发采购 ERP 轨道,不参与采购主业务编辑。
|
||||
|
||||
#### 4.8.3 状态机 / 工作流语义
|
||||
- 采购申请状态:`draft -> reviewing -> approved/rejected/cancelled`。
|
||||
- `submit`:校验法体、成本中心、供应商、预算池等必填项,创建 workflow 并写预算预留。
|
||||
- `approved`:确认预算占用;`rejected`、`return`、`withdraw`:释放预算预留并回到草稿或终止实例。
|
||||
- PO / 合同归档仅允许在 `approved` 状态下执行,且归档不触发新的审批实例。
|
||||
|
||||
#### 4.8.4 核心数据对象
|
||||
| 对象 | 作用 |
|
||||
| :--- | :--- |
|
||||
| `PurchaseRequest` | 采购申请主单,承载申请人、法体、成本中心、供应商、预算池、总金额与状态 |
|
||||
| `PurchaseRequestItem` | 采购明细,记录规格、数量、单价、金额与资产候选标记 |
|
||||
| `PurchaseAttachment` | 采购附件,支持上传、删除、签名 URL 预览 |
|
||||
| `PurchaseOrderArchive` | 已审批采购单的 PO / 合同归档记录 |
|
||||
|
||||
#### 4.8.5 显式不做项
|
||||
- 不实现收货、入库、应付、发票核销、三单匹配或供应商协同门户。
|
||||
- 不把采购归档拆成独立后台模块;当前固定在采购详情内完成。
|
||||
- 不在核心采购表注入 ERP 私有字段;ERP 外部编号统一走集成层 binding 维护。
|
||||
|
||||
### 4.9 资产管理
|
||||
|
||||
#### 4.9.1 范围与边界
|
||||
- 当前资产域覆盖分类、卡片、领用归还、人员 / 位置调拨、盘点任务与资产 ERP 摘要轨道。
|
||||
- 资产卡片可关联采购来源(approved 采购单),并维护法体、成本中心、位置、领用人、状态等台账信息。
|
||||
- 资产域当前不引入独立审批流;所有领用、归还、调拨、盘点都属于受控运营动作。
|
||||
|
||||
#### 4.9.2 角色与权限
|
||||
- `employee`:`asset.view_own`,查看本人名下资产。
|
||||
- `manager`、`ceo`、`finance`:通常具备 `asset.view_all`,查看全量资产台账。
|
||||
- `administration`、`finance_mgr`:通常具备 `asset.manage` / `asset.transfer`,负责建卡、变更、领用归还与调拨。
|
||||
- `asset.inventory`:专用于盘点任务创建、启动、录入与完成;`integration.manage` 负责资产 ERP 轨道重试。
|
||||
|
||||
#### 4.9.3 状态机 / 工作流语义
|
||||
- 资产卡片状态:`in_stock`、`in_use`、`under_repair`、`retired`、`archived`;状态变化由运营动作直接驱动,不经审批流。
|
||||
- 领用与归还通过 `AssetAssignment` 维护当前持有人;调拨通过 `AssetTransfer` 维护人员 / 位置变更历史。
|
||||
- 盘点任务状态:`draft -> counting -> completed`;盘点明细以 `inventory_check_id + asset_id` 唯一键幂等 upsert。
|
||||
- 资产 ERP 一期只在建卡和财务维度关键变更时触发摘要出站;领用、归还、位置调拨不触发 ERP 导出。
|
||||
|
||||
#### 4.9.4 核心数据对象
|
||||
| 对象 | 作用 |
|
||||
| :--- | :--- |
|
||||
| `AssetCategory` | 资产分类,绑定默认文档分类并控制是否启用 |
|
||||
| `AssetCard` | 资产主卡片,记录编号、法体、成本中心、位置、领用人、状态等台账字段 |
|
||||
| `AssetAssignment` | 资产领用 / 归还流水,维护当前 open assignment |
|
||||
| `AssetTransfer` | 资产人员 / 位置调拨历史 |
|
||||
| `InventoryCheck` / `InventoryCheckItem` | 盘点任务与盘点结果明细 |
|
||||
|
||||
#### 4.9.5 显式不做项
|
||||
- 不做折旧、净值、总账过账、会计科目自动分录等资产财务深化能力。
|
||||
- 不引入资产专属 workflow 审批实例;资产流转保持受控操作模型。
|
||||
- 不做原生扫码壳或仓储 WMS 深度集成;移动扫码与盘点增强由 PWA 路线承接。
|
||||
|
||||
### 4.10 差旅管理
|
||||
|
||||
#### 4.10.1 范围与边界
|
||||
- 当前差旅域按三阶段交付:`TRAVEL-1` 申请与行程入站、`TRAVEL-2` 对公支付与发票绑定、`TRAVEL-3` 对账批次与 ERP 摘要桥。
|
||||
- 差旅申请主单承载出差目的、法体、成本中心、预算池、起止日期与行程段;支付域承接订单导入、企业卡授权 / 交易导入、`mark-paid` 与发票绑定;对账域承接批次快照、异常确认与 ERP 摘要桥接。
|
||||
- 当前差旅域不接真实商旅供应商 API,也不自动改写订单、申请或预算原值。
|
||||
|
||||
#### 4.10.2 角色与权限
|
||||
- `employee`:`travel.create/view_own/submit`,创建和提交差旅申请。
|
||||
- `manager`、`ceo`:`travel.approve`,处理差旅审批待办;具备 `travel.view_all` 的角色可查看全量。
|
||||
- `administration`、`finance_mgr`:可持有 `travel.manage` 与 `travel.payment.manage`,用于支付运营、异常处理和对账确认。
|
||||
- `integration.manage`:负责 ERP 轨道、requeue 与主数据同步控制,不参与差旅主单编辑。
|
||||
|
||||
#### 4.10.3 状态机 / 工作流语义
|
||||
- 差旅申请状态:`draft -> reviewing -> approved/rejected`;`return` 与 `withdraw` 均回到 `draft`。
|
||||
- `submit`:创建 workflow,并写预算预留;`approved`:确认预算;`rejected` / `return` / `withdraw`:释放预算。
|
||||
- `TravelOrder` 当前采用运行时字符串状态(如 `imported/confirmed/paid`)承载支付轨道,不作为独立公共枚举对外承诺;`mark-paid` 会写入付款时间、渠道、操作人并触发订单支付闭环。
|
||||
- `TravelReconciliationBatch` 状态固定为 `draft/reconciled`;异常明细必须人工 `confirm` 或 `reopen`,`finalize` 后只允许新建下一批,不回刷历史批次。
|
||||
|
||||
#### 4.10.4 核心数据对象
|
||||
| 对象 | 作用 |
|
||||
| :--- | :--- |
|
||||
| `TravelRequest` | 差旅申请主单,含申请人、法体、成本中心、预算池、目的与预计金额 |
|
||||
| `TravelRequestSegment` | 行程段明细,含往返 / 中转角色、交通方式、起讫城市与时间 |
|
||||
| `TravelOrder` | 导入或运营维护的差旅订单,承载支付确认与发票绑定 |
|
||||
| `CardAuthorization` / `CardTransaction` | 企业卡授权与交易轨道,用于 `authorize/settle/reverse` 预算语义与支付明细 |
|
||||
| `TravelReconciliationBatch` / `TravelReconciliationItem` | 差旅对账批次与异常明细快照 |
|
||||
|
||||
#### 4.10.5 显式不做项
|
||||
- 不接真实商旅供应商出票、改签、退票、拒付、退款回调或银行清结算。
|
||||
- 不把 `card_authorization` / `card_transaction` 导入事实提升为长期稳定公共业务事件名。
|
||||
- 不做自动修账、自动改申请、自动冲销预算;对账只做差异发现与人工接受。
|
||||
|
||||
### 4.11 集成与外部适配
|
||||
|
||||
#### 4.11.1 范围与边界
|
||||
- 当前集成层只通过边界适配核心域,不向报销、采购、资产、差旅等事务主表注入 ERP / IM 私有字段。
|
||||
- 已实现范围包括:共享主数据同步、IM-1 通知渠道、ERP-1 报销付款凭证切片、ERP-2 采购 commitment/archive、ERP-3 资产摘要、TRAVEL-3 批次级 `erp.travel.export`。
|
||||
- `docs/integration-boundaries.md` 与 `docs/domain-events.md` 是本章的边界与事件语义事实源;本规格只吸收已实现部分。
|
||||
|
||||
#### 4.11.2 角色与权限
|
||||
- `integration.manage`:主数据同步、ERP / IM 轨道查看增强、补发、重试、手工触发。
|
||||
- 业务可读角色可以查看与自身实体相关的轨道摘要,但外部编号、重试与补发动作继续由 `integration.manage` 控制。
|
||||
- `notification.channel.manage`:维护通知渠道与模板;当前默认由 `finance_mgr` 持有。
|
||||
|
||||
#### 4.11.3 状态机 / 工作流语义
|
||||
- 集成统一采用“业务事务提交成功 -> Outbox 异步派发 -> Binding / Track 回写”的交付模型;外部失败不回滚业务主事务。
|
||||
- `IntegrationOutbox` 负责 `pending/processed/dead-letter` 等投递状态、重试窗口与 `dedupe_key` 幂等;`IntegrationBinding` 负责本地实体与外部编号映射;`IntegrationSyncState` 负责主数据资源级同步状态。
|
||||
- 公开业务事件名保持最小集;`erp.travel.export`、`erp.journal.export` 等属于集成事件,不等同于新的业务领域事件名。
|
||||
- 当前后置 backlog 固定包括 `IM-2/IM-3/IM-4`、`P22+VEH-1`、`P22+ASSET-FIN-1`,不进入本轮已实现范围。
|
||||
|
||||
#### 4.11.4 核心数据对象
|
||||
| 对象 | 作用 |
|
||||
| :--- | :--- |
|
||||
| `IntegrationOutbox` | 统一出站事件队列,负责重试、死信与去重 |
|
||||
| `IntegrationBinding` | provider / entity / localId / externalId 绑定关系 |
|
||||
| `IntegrationSyncState` | 主数据同步状态、上次结果与错误摘要 |
|
||||
| `NotificationChannel` | IM / 邮件等通知渠道配置与模板 |
|
||||
|
||||
#### 4.11.5 显式不做项
|
||||
- 不直接在核心事务表写入第三方私有字段或回调状态列。
|
||||
- 不在本轮实现 `IM-2/3/4`、车辆管理、资产财务深化,也不把这些方向提前写入已完成事实源。
|
||||
- 不把 AI、MCP、PWA、生产化治理并入本章主体;这些能力继续由边界文档和运维文档承载。
|
||||
|
||||
## 5. 工作流引擎(Workflow,P0 采用)
|
||||
> 采用 4 表式通用工作流,审批任务由 `workflow_tasks` 表驱动。P0 仅用线性审批链,但表结构支持后续扩展为条件分支/动作节点。
|
||||
|
||||
@@ -368,8 +550,8 @@ cancelled (作废/终止,终态)
|
||||
| 字段 | 类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| id | UUID | 主键 |
|
||||
| name | String | 流程名称(如“报销审批流程”) |
|
||||
| entity_type | String | 实体类型(如 `reimbursement`) |
|
||||
| name | String | 流程名称(如“报销 / 请假 / 采购 / 差旅审批流程”) |
|
||||
| entity_type | String | 实体类型(如 `reimbursement` / `leave` / `purchase_request` / `travel_request`) |
|
||||
| definition_json | JSON | 流程配置(见 5.2) |
|
||||
| version | Int | 版本号(递增) |
|
||||
| is_active | Bool | 是否启用 |
|
||||
@@ -379,7 +561,7 @@ cancelled (作废/终止,终态)
|
||||
| :--- | :--- | :--- |
|
||||
| id | UUID | 主键 |
|
||||
| workflow_id | UUID | 关联 `workflow_definitions` |
|
||||
| entity_type | String | 实体类型(`reimbursement`) |
|
||||
| entity_type | String | 实体类型(如 `reimbursement` / `leave` / `purchase_request` / `travel_request`) |
|
||||
| entity_id | UUID | 业务实体 ID(报销单 ID) |
|
||||
| submitter_id | UUID | 发起人(提交者) |
|
||||
| current_status | String | `pending/approved/rejected/cancelled/terminated` |
|
||||
@@ -452,7 +634,7 @@ cancelled (作废/终止,终态)
|
||||
支持类型:
|
||||
- `specific_user`:指派到指定用户 ID
|
||||
- `role`:指派到指定 `role_code`
|
||||
- `department_manager`:对报销(`entity_type=reimbursement`),必须基于 `owner_id`(费用归属人)的直属上级链向上寻找经理(最多 10 层;若经理=owner 本人则继续向上;找不到则该步骤可被跳过并写入 history)
|
||||
- `department_manager`:对报销 / 请假 / 采购 / 差旅四类审批实体,统一基于 `owner_id` 或 `applicant` 映射出的直属上级链向上寻找经理(最多 10 层;若经理=本人则继续向上;找不到则该步骤可被跳过并写入 history)
|
||||
- `submitter_manager`:基于 `submitter_id` 的直属上级链向上寻找经理(为未来其他流程预留;报销流程默认不使用该规则)
|
||||
|
||||
### 5.4 一致性与并发要求(实现约束)
|
||||
@@ -972,6 +1154,96 @@ cancelled (作废/终止,终态)
|
||||
- 次数:`ocr_attempts <= 3`;超过返回 429 `VALID_006`(OCR 重试次数超限)。
|
||||
- 间隔:同一条目两次重试间隔 `>= 60s`;过于频繁返回 429 `VALID_007`(OCR 重试过于频繁)。
|
||||
|
||||
#### 13.2.7 请假 API
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| GET | `/api/leave-types` | `leave.view_own` | 列出启用假别;`leave.manage` 可查看禁用项与配额配置 |
|
||||
| POST | `/api/leave-types` | `leave.manage` | 创建假别与年度配额策略 |
|
||||
| PATCH | `/api/leave-types/:id` | `leave.manage` | 更新假别启用状态、附件要求与年度额度 |
|
||||
| GET | `/api/leave-balances` | `leave.view_own` | 查看当前员工请假余额;查询他人需 `leave.view_all/leave.manage` |
|
||||
| GET | `/api/leave-requests` | `leave.view_own`(或 `leave.view_all/leave.manage`) | 请假列表;服务端按本人或全量视角收敛 |
|
||||
| POST | `/api/leave-requests` | `leave.create` | 创建请假草稿并校验基础日期 / 附件规则 |
|
||||
| GET | `/api/leave-requests/:id` | 登录即可(服务端鉴权) | 获取请假详情;仅本人或具备全量权限的角色可读 |
|
||||
| POST | `/api/leave-requests/:id/submit` | `leave.submit` | 提交请假申请,触发冲突校验、额度强设闸与 workflow 启动 |
|
||||
| POST | `/api/leave-requests/:id/withdraw` | `leave.submit` | 在审批人未处理前撤回,请假状态回到 `draft` 并释放冻结额度 |
|
||||
|
||||
> 请假的 approve / reject / return 继续复用通用 workflow API,审批权限码为 `leave.approve`。
|
||||
|
||||
#### 13.2.8 采购 API
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| GET | `/api/purchase-requests` | 登录即可(服务端鉴权) | 采购列表;按 `procurement.view_own/view_all/manage` 收敛 `mine` 视角 |
|
||||
| POST | `/api/purchase-requests` | `procurement.create` | 创建采购草稿 |
|
||||
| GET | `/api/purchase-requests/:id` | 登录即可(服务端鉴权) | 获取采购详情;仅申请人 / 提交人或可读角色可读 |
|
||||
| PATCH | `/api/purchase-requests/:id` | `procurement.create` | 更新采购草稿;仅 `draft` 可编辑 |
|
||||
| POST | `/api/purchase-requests/:id/submit` | `procurement.submit` | 提交采购申请并写预算预留 |
|
||||
| POST | `/api/purchase-requests/:id/withdraw` | `procurement.submit` | 在审批人未处理前撤回,释放预算并回到 `draft` |
|
||||
| GET | `/api/purchase-requests/:id/archive-order` | 登录即可(服务端鉴权) | 查看 PO / 合同归档信息 |
|
||||
| POST | `/api/purchase-requests/:id/archive-order` | `procurement.manage` | 在 approved 采购单上创建或更新归档记录 |
|
||||
| POST | `/api/purchase-requests/:id/attachments` | `procurement.create` | 上传采购附件 |
|
||||
| DELETE | `/api/purchase-requests/:id/attachments/:attachmentId` | `procurement.create` | 删除采购附件 |
|
||||
| POST | `/api/purchase-requests/:id/attachments/:attachmentId/signed-url` | 登录即可(服务端鉴权) | 获取附件签名 URL |
|
||||
| GET | `/api/purchase-requests/:id/attachments/:attachmentId/file` | 登录即可(服务端鉴权) | 下载附件文件 |
|
||||
|
||||
> 采购 approve / reject / return 继续复用通用 workflow API,审批权限码为 `procurement.approve`。
|
||||
|
||||
#### 13.2.9 资产与盘点 API
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| GET | `/api/asset-categories` | 登录即可(服务端鉴权) | 资产分类列表;按 `asset.view_own/view_all/manage` 收敛 |
|
||||
| POST | `/api/asset-categories` | `asset.manage` | 创建资产分类 |
|
||||
| PATCH | `/api/asset-categories/:id` | `asset.manage` | 更新资产分类 |
|
||||
| GET | `/api/assets/assignees` | 登录即可(服务端鉴权) | 资产领用人候选查询;内部要求具备 `asset.manage` |
|
||||
| GET | `/api/assets` | 登录即可(服务端鉴权) | 资产卡片列表;按 `asset.view_own/view_all/manage/transfer/inventory` 收敛 |
|
||||
| POST | `/api/assets` | `asset.manage` | 创建资产卡片;可在建卡时初始化领用状态 |
|
||||
| GET | `/api/assets/:id` | 登录即可(服务端鉴权) | 资产详情 |
|
||||
| PATCH | `/api/assets/:id` | `asset.manage` | 更新资产卡片;当前领用 / 归还 / 调拨语义在此受控落账 |
|
||||
| GET | `/api/inventory-checks` | `asset.inventory` | 盘点任务列表 |
|
||||
| POST | `/api/inventory-checks` | `asset.inventory` | 创建盘点任务 |
|
||||
| POST | `/api/inventory-checks/:id/start` | `asset.inventory` | 启动盘点 |
|
||||
| POST | `/api/inventory-checks/:id/items` | `asset.inventory` | 录入或覆盖盘点明细 |
|
||||
| POST | `/api/inventory-checks/:id/complete` | `asset.inventory` | 完成盘点任务 |
|
||||
|
||||
#### 13.2.10 差旅 API
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| GET | `/api/travel-requests` | 登录即可(服务端鉴权) | 差旅申请列表;按 `travel.view_own/view_all/manage` 收敛 |
|
||||
| POST | `/api/travel-requests` | `travel.create` | 创建差旅草稿 |
|
||||
| GET | `/api/travel-requests/:id` | 登录即可(服务端鉴权) | 差旅申请详情 |
|
||||
| PATCH | `/api/travel-requests/:id` | `travel.create` | 更新差旅草稿 |
|
||||
| POST | `/api/travel-requests/:id/submit` | `travel.submit` | 提交差旅申请并写预算预留 |
|
||||
| POST | `/api/travel-requests/:id/withdraw` | `travel.submit` | 撤回差旅申请并释放预算 |
|
||||
| GET | `/api/travel-requests/:id/payment-track` | 登录即可(服务端鉴权) | 查看订单支付轨道摘要 |
|
||||
| POST | `/api/travel/orders/import` | `integration.manage` | 导入差旅订单 |
|
||||
| POST | `/api/travel-orders/:id/mark-paid` | `travel.payment.manage` | 手工结算差旅订单并写支付凭证字段 |
|
||||
| GET | `/api/travel/authorizations` | `travel.payment.manage` | 查看企业卡授权记录 |
|
||||
| POST | `/api/travel/authorizations/import` | `integration.manage` | 导入企业卡授权 |
|
||||
| GET | `/api/travel/transactions` | `travel.payment.manage` | 查看企业卡交易 |
|
||||
| POST | `/api/travel/transactions/import` | `integration.manage` | 导入企业卡交易 |
|
||||
| POST | `/api/travel/transactions/:id/freeze-suggestion` | `travel.payment.manage` | 标记冻结建议 |
|
||||
| GET | `/api/travel/reconciliation/batches` | 登录即可(服务端鉴权) | 查看对账批次列表;服务端按差旅 / 集成读权限过滤 |
|
||||
| POST | `/api/travel/reconciliation/batches` | `travel.payment.manage` | 创建对账批次快照 |
|
||||
| GET | `/api/travel/reconciliation/batches/:batchId` | 登录即可(服务端鉴权) | 获取批次详情与 KPI |
|
||||
| POST | `/api/travel/reconciliation/items/:itemId/confirm` | `travel.payment.manage` | 确认异常明细 |
|
||||
| POST | `/api/travel/reconciliation/items/:itemId/reopen` | `travel.payment.manage` | 重开异常明细 |
|
||||
| POST | `/api/travel/reconciliation/batches/:batchId/finalize` | `travel.payment.manage` | 将批次从 `draft` 收口到 `reconciled` |
|
||||
|
||||
> 差旅 approve / reject / return 继续复用通用 workflow API,审批权限码为 `travel.approve`。
|
||||
|
||||
#### 13.2.11 集成 API
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| GET | `/api/integrations/erp/master-data/status` | `integration.manage` | 查看 ERP 主数据同步状态 |
|
||||
| POST | `/api/integrations/erp/master-data/sync` | `integration.manage` | 手工触发主数据同步 |
|
||||
| GET | `/api/integrations/erp/journals/reimbursements/:reimbursementId/preview` | `integration.manage` | 查看报销凭证切片预览 |
|
||||
| POST | `/api/integrations/erp/journals/reimbursements/:reimbursementId/export` | `integration.manage` | 手工触发报销 ERP 导出 |
|
||||
| GET | `/api/integrations/erp/procurement/purchase-requests/:purchaseRequestId/track` | 登录即可(服务端鉴权) | 查看采购 ERP 轨道;仅具备该采购单读权限的用户可见 |
|
||||
| POST | `/api/integrations/erp/procurement/purchase-requests/:purchaseRequestId/requeue` | `integration.manage` | 补发或重试采购 ERP 轨道 |
|
||||
| GET | `/api/integrations/erp/assets/:assetId/track` | 登录即可(服务端鉴权) | 查看资产 ERP 轨道 |
|
||||
| POST | `/api/integrations/erp/assets/:assetId/requeue` | `integration.manage` | 补发或重试资产 ERP 轨道 |
|
||||
| GET | `/api/integrations/erp/travel/reconciliation-batches/:batchId/track` | 登录即可(服务端鉴权) | 查看差旅对账批次 ERP 轨道 |
|
||||
| POST | `/api/integrations/erp/travel/reconciliation-batches/:batchId/requeue` | `integration.manage` | 补发或重试差旅 ERP 摘要桥 |
|
||||
| POST | `/api/integrations/erp/sync/:reimbursementId` | `integration.manage` | 兼容性手工同步入口 |
|
||||
### 13.3 配置读取 API(P0 只读)
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
@@ -1038,7 +1310,6 @@ erDiagram
|
||||
employees ||--o{ employee_roles : assigns
|
||||
employees ||--o{ delegation_grants : principal
|
||||
employees ||--o{ delegation_grants : delegate
|
||||
|
||||
employees ||--o{ auth_sessions : has
|
||||
employees ||--o{ audit_logs : writes
|
||||
|
||||
@@ -1046,30 +1317,56 @@ erDiagram
|
||||
employees ||--o{ reimbursement_forms : owns
|
||||
reimbursement_forms ||--|{ reimbursement_items : has
|
||||
reimbursement_items }o--|| expense_types : uses
|
||||
|
||||
employees ||--o{ invoice_pool : owns
|
||||
employees ||--o{ invoice_pool : uploads
|
||||
ocr_results ||--o{ invoice_pool : caches
|
||||
reimbursement_forms ||--o{ invoice_pool : binds
|
||||
reimbursement_items ||--o{ invoice_pool : links
|
||||
|
||||
leave_types ||--o{ leave_policies : configures
|
||||
leave_types ||--o{ leave_requests : classifies
|
||||
employees ||--o{ leave_requests : owns
|
||||
leave_requests ||--o{ leave_ledgers : anchors
|
||||
employees ||--o{ leave_ledgers : accrues
|
||||
|
||||
employees ||--o{ purchase_requests : applies
|
||||
purchase_requests ||--|{ purchase_request_items : has
|
||||
purchase_requests ||--o{ purchase_attachments : stores
|
||||
purchase_requests ||--o| purchase_order_archives : archives
|
||||
|
||||
asset_categories ||--o{ asset_cards : classifies
|
||||
purchase_requests ||--o{ asset_cards : sources
|
||||
asset_cards ||--o{ asset_assignments : assigns
|
||||
asset_cards ||--o{ asset_transfers : transfers
|
||||
inventory_checks ||--o{ inventory_check_items : records
|
||||
asset_cards ||--o{ inventory_check_items : counted
|
||||
|
||||
employees ||--o{ travel_requests : applies
|
||||
travel_requests ||--|{ travel_request_segments : has
|
||||
travel_requests ||--o{ travel_orders : imports
|
||||
travel_requests ||--o{ card_authorizations : authorizes
|
||||
travel_requests ||--o{ card_transactions : settles
|
||||
travel_reconciliation_batches ||--o{ travel_reconciliation_items : includes
|
||||
travel_orders ||--o{ travel_reconciliation_items : snapshots
|
||||
card_transactions ||--o{ travel_reconciliation_items : snapshots
|
||||
|
||||
workflow_definitions ||--o{ workflow_instances : defines
|
||||
reimbursement_forms ||--o{ workflow_instances : starts
|
||||
leave_requests ||--o{ workflow_instances : starts
|
||||
purchase_requests ||--o{ workflow_instances : starts
|
||||
travel_requests ||--o{ workflow_instances : starts
|
||||
workflow_instances ||--o{ workflow_tasks : has
|
||||
workflow_instances ||--o{ workflow_history : logs
|
||||
|
||||
reimbursement_forms ||--o{ approval_transfers : transfers
|
||||
```
|
||||
|
||||
> 说明:上图为概念关系图,具体字段以各章节表结构为准。
|
||||
> 说明:
|
||||
> - 上图为概念关系图,具体字段与索引以各章节表结构和 `server/prisma/schema.prisma` 为准。
|
||||
> - `IntegrationOutbox`、`IntegrationBinding`、`IntegrationSyncState`、`NotificationChannel` 构成集成层私有模型,不回写核心事务表。
|
||||
|
||||
---
|
||||
|
||||
## 16. 迭代计划
|
||||
|
||||
> 状态口径说明(2026-02-09):
|
||||
> - 以 `issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` 与 `docs/feature-matrix.md` 为实现状态事实源。
|
||||
> - 本节清单用于规格分期表达;具体执行状态以 Issue CSV 与实现状态矩阵为准。
|
||||
> 状态口径说明(2026-03-13):
|
||||
> - 以 `docs/feature-matrix.md`、`docs/todo-reconciliation.md` 与各已完成执行合同为实现状态事实源。
|
||||
> - 本节用于规格分期表达;具体执行状态仍以 Issue CSV 和实现状态矩阵为准。
|
||||
> - 本轮规格书正文新增覆盖请假 / 采购 / 资产 / 差旅 / 集成五大业务域;AI / MCP / PWA / 生产化治理继续以边界与运维文档承载。
|
||||
|
||||
### Phase 1(核心 / P0)
|
||||
- [x] 技术栈确定(Fastify + Prisma + PostgreSQL)
|
||||
@@ -1084,14 +1381,40 @@ erDiagram
|
||||
- [x] 报销单 CRUD + 提交 / 撤回 / 审批 / 付款标记
|
||||
- [x] 站内通知 + 邮件
|
||||
|
||||
### Phase 2(扩展 / P1-P2)
|
||||
- [x] OCR 能力增强(更多票种/批量处理/队列与更完整的失败重试策略)
|
||||
- [ ] 企微/钉钉通知
|
||||
- [x] 报表导出
|
||||
- [x] 对象存储(MinIO/OSS)
|
||||
- [x] 工作流扩展到其他实体(请假/采购等)
|
||||
### Phase 2(基础增强 / P3-P14)
|
||||
- [x] 审计回归、OCR mock 回归、全量回归入口与最小 CI 门禁
|
||||
- [x] 验真、预算、看板、对象存储、通知渠道、集成框架等基础能力
|
||||
- [x] 权限解耦、主数据(法体 / 成本中心 / 供应商)、假期日历与路线治理收口
|
||||
|
||||
---
|
||||
### Phase 3(请假 / P15B)
|
||||
- [x] 请假类型、年度配额、余额账本与半天粒度模型
|
||||
- [x] 请假申请列表 / 详情 / 提交 / 撤回与 workflow 审批闭环
|
||||
- [x] 冲突日期阻断、余额强设闸、审批后 consume / release 台账语义
|
||||
|
||||
### Phase 4(采购 / P17A-P17B)
|
||||
- [x] 采购申请主流程、明细、附件与员工端页面
|
||||
- [x] 采购预算 `reserve/confirm/release` 闭环
|
||||
- [x] PO / 合同归档、详情区运营入口与 ERP 轨道挂件
|
||||
|
||||
### Phase 5(资产 / P18A-P18B)
|
||||
- [x] 资产分类、卡片、建卡与采购来源关联
|
||||
- [x] 资产领用 / 归还 / 调拨与盘点任务闭环
|
||||
- [x] 资产 ERP 摘要桥、详情轨道与只读同步状态
|
||||
|
||||
### Phase 6(集成 / P19 + IM-1 + ERP-1/2/3)
|
||||
- [x] 集成边界、领域事件、MCP 只读基线与路线治理冻结
|
||||
- [x] IM-1 通知渠道、Outbox 派发与业务事件接入
|
||||
- [x] ERP-1 报销凭证切片、ERP-2 采购 commitment / archive、ERP-3 资产摘要桥
|
||||
|
||||
### Phase 7(差旅 / P20TRAVEL1-3)
|
||||
- [x] `TRAVEL-1`:差旅申请、行程段、订单入站与预算语义
|
||||
- [x] `TRAVEL-2`:企业卡授权 / 交易导入、订单 `mark-paid`、发票绑定与支付轨道
|
||||
- [x] `TRAVEL-3`:对账批次快照、异常确认、Finalize 与 `erp.travel.export` 摘要桥
|
||||
|
||||
### Phase 8(移动与生产化 / P21-P22)
|
||||
- [x] 浏览器 PWA 资产扫码、盘点录入、移动审批 deep link 与离线草稿
|
||||
- [x] 路由懒加载、E2E 补齐、benchmark 基线与生产化治理收口
|
||||
- [ ] 后置 backlog:`IM-2/IM-3/IM-4`、`P22+VEH-1`、`P22+ASSET-FIN-1`
|
||||
|
||||
## 附录 A:系统默认费用类型(P0:37 项启用)
|
||||
> 来源:`shenzhou-business-suite/supabase/seed.sql`(启用 35 项)+ hyb-oa 补齐启用 `utilities/rent`(2 项)。
|
||||
|
||||
在新工单中引用
屏蔽一个用户