149 lines
3.5 KiB
Markdown
149 lines
3.5 KiB
Markdown
|
|
# 出差申请模块 (Business Trip Module)
|
||
|
|
|
||
|
|
## 概述
|
||
|
|
|
||
|
|
出差申请模块是审批流程的具体业务实现,支持出差行程管理、审批人选择、抄送人选择、草稿自动保存等功能。
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 核心功能
|
||
|
|
|
||
|
|
| 功能 | 说明 |
|
||
|
|
|------|------|
|
||
|
|
| 行程管理 | 支持添加多个出差行程(城市、日期、住宿) |
|
||
|
|
| 审批人选择 | 单选审批人,支持搜索 |
|
||
|
|
| 抄送人选择 | 多选抄送人,支持搜索 |
|
||
|
|
| 草稿保存 | 自动保存到 localStorage,刷新后恢复 |
|
||
|
|
| 默认审批人 | 自动加载历史审批人 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## API 接口
|
||
|
|
|
||
|
|
| 接口 | 方法 | 说明 |
|
||
|
|
|------|------|------|
|
||
|
|
| `/api/v1/business-trip/list` | GET | 获取出差列表 |
|
||
|
|
| `/api/v1/business-trip/detail/:id` | GET | 获取出差详情 |
|
||
|
|
| `/api/v1/business-trip/create` | POST | 创建出差申请 |
|
||
|
|
| `/api/v1/business-trip/update/:id` | POST | 更新出差申请 |
|
||
|
|
| `/api/v1/business-trip/submit/:id` | POST | 提交审批 |
|
||
|
|
| `/api/v1/business-trip/cancel/:id` | POST | 撤销申请 |
|
||
|
|
| `/api/v1/business-trip/delete/:id` | DELETE | 删除草稿 |
|
||
|
|
| `/api/v1/business-trip/default-approvers` | GET | 获取默认审批人 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 前端关键文件
|
||
|
|
|
||
|
|
```
|
||
|
|
frontend/src/pages/business-trip/
|
||
|
|
├── list.tsx # 出差列表页
|
||
|
|
├── apply.tsx # 出差申请页
|
||
|
|
├── detail.tsx # 出差详情页
|
||
|
|
├── select-approver.tsx # 选择审批人
|
||
|
|
└── select-cc.tsx # 选择抄送人
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 草稿自动保存
|
||
|
|
|
||
|
|
### 保存时机
|
||
|
|
- 表单字段变化时
|
||
|
|
- 添加/删除行程时
|
||
|
|
- 选择审批人/抄送人时
|
||
|
|
|
||
|
|
### 保存内容
|
||
|
|
```typescript
|
||
|
|
{
|
||
|
|
trips: [...], // 出差行程
|
||
|
|
approvers: [...], // 审批人列表
|
||
|
|
ccUsers: [...], // 抄送人列表
|
||
|
|
reason: string, // 出差事由
|
||
|
|
savedAt: timestamp // 保存时间
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 恢复逻辑
|
||
|
|
- 进入申请页时检查 localStorage
|
||
|
|
- 如果存在草稿且未超过24小时,提示恢复
|
||
|
|
- 用户可选择恢复或放弃
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 表单验证
|
||
|
|
|
||
|
|
### 必填字段
|
||
|
|
- 出差行程(至少一条)
|
||
|
|
- 每条行程:出发城市、目的城市、出发日期、返回日期
|
||
|
|
- 审批人(至少一人)
|
||
|
|
- 出差事由
|
||
|
|
|
||
|
|
### 日期验证
|
||
|
|
- 出发日期不能早于今天
|
||
|
|
- 返回日期不能早于出发日期
|
||
|
|
- 多条行程日期不能重叠
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 数据库表结构
|
||
|
|
|
||
|
|
### business_trip (出差申请)
|
||
|
|
```sql
|
||
|
|
id -- 主键
|
||
|
|
company_id -- 公司ID
|
||
|
|
applicant_id -- 申请人ID
|
||
|
|
title -- 标题
|
||
|
|
reason -- 出差事由
|
||
|
|
status -- 状态 (draft, pending, approved, rejected, cancelled)
|
||
|
|
current_node_id -- 当前节点ID
|
||
|
|
created_at
|
||
|
|
updated_at
|
||
|
|
```
|
||
|
|
|
||
|
|
### business_trip_trip (出差行程)
|
||
|
|
```sql
|
||
|
|
id -- 主键
|
||
|
|
business_trip_id -- 出差申请ID
|
||
|
|
from_city -- 出发城市
|
||
|
|
to_city -- 目的城市
|
||
|
|
start_date -- 出发日期
|
||
|
|
end_date -- 返回日期
|
||
|
|
hotel_required -- 是否需要住宿
|
||
|
|
hotel_name -- 酒店名称(可选)
|
||
|
|
```
|
||
|
|
|
||
|
|
### business_trip_approver (审批人)
|
||
|
|
```sql
|
||
|
|
id -- 主键
|
||
|
|
business_trip_id -- 出差申请ID
|
||
|
|
approver_id -- 审批人ID
|
||
|
|
is_default -- 是否默认审批人
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 状态流转
|
||
|
|
|
||
|
|
```
|
||
|
|
draft (草稿)
|
||
|
|
│ 提交
|
||
|
|
▼
|
||
|
|
pending (待审批)
|
||
|
|
│ 通过 │ 拒绝 │ 撤销
|
||
|
|
▼ ▼ ▼
|
||
|
|
approved rejected cancelled
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 相关文档
|
||
|
|
|
||
|
|
- [审批流程模块](../approval/README.md)
|
||
|
|
- [PROJECT_ISSUES.md](../../PROJECT_ISSUES.md)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**负责人**: 待分配
|
||
|
|
**最后更新**: 2026-02-28
|