Files
x-server-mobile/docs/DATABASE_SCHEMA.md
T
root 7c7f8493c4 docs: 更新数据库文档,添加 feishu_message_log 表记录
- 添加 feishu_message_log 表结构文档(飞书消息日志表)
- 更新文档版本至 1.1.0
- 更新最后更新时间至 2026-03-01

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:21:48 +08:00

424 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据库结构文档
**版本**: 1.1.0
**更新时间**: 2026-03-01
**状态**: 线上稳定版本
---
## 📋 数据库概述
**数据库名**: `xserver`
---
## 表结构
### 1. users - 用户表
用户基本信息表,存储员工账户信息。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 用户ID |
| sn | varchar(36) | ✓ | | SN编号(员工工号) |
| company_id | bigint unsigned | ✓ | | 公司ID |
| name | varchar(50) | ✓ | | 姓名 |
| avatar | varchar(255) | | | 头像URL |
| sex | tinyint | | | 性别 |
| email | varchar(100) | | | 邮箱 |
| phone | varchar(20) | | | 手机号 |
| password | varchar(255) | | | 密码哈希 |
| status | tinyint | ✓ | 1 | 状态:1=在职,0=离职 |
| user_type | tinyint | ✓ | 1 | 用户类型 |
| union_id | varchar(60) | | | 飞书union_id |
| feishu_app_id | int unsigned | | | 登录来源飞书应用ID |
| sign_img | varchar(255) | | | 签名图片 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `company_id` (`company_id`)
- KEY `status` (`status`)
- KEY `union_id` (`union_id`)
- KEY `feishu_app_id` (`feishu_app_id`)
---
### 2. companies - 公司表
公司信息表。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 公司ID |
| name | varchar(100) | ✓ | | 公司名称 |
| abbr | varchar(50) | ✓ | | 公司简称 |
| tenant_key | varchar(36) | ✓ | | 飞书tenant_key |
| sort | int | ✓ | 0 | 排序 |
| status | tinyint | ✓ | 1 | 状态 |
| feishu_enabled | tinyint(1) | ✓ | 0 | 是否启用飞书 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `status` (`status`)
---
### 3. company_feishu_apps - 公司飞书应用配置表
每个公司的飞书应用配置。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | int unsigned | ✓ | AUTO_INCREMENT | 配置ID |
| company_id | int | ✓ | | 公司ID |
| system_id | int | ✓ | 1 | 系统ID:1=默认应用 |
| name | varchar(90) | ✓ | | 应用名称 |
| app_id | varchar(60) | ✓ | | 飞书App ID |
| app_secret | varchar(150) | ✓ | | 飞书App Secret |
| encrypt_key | varchar(60) | | | 加密Key |
| verification_token | varchar(60) | | | 验证Token |
| callback_url | varchar(255) | | | 回调URL(PC端) |
| mobile_callback_url | varchar(255) | | | 回调URL(移动端) |
| status | tinyint(1) | ✓ | 1 | 状态 |
| sort | int | | 0 | 排序 |
| created_at | int | ✓ | 0 | 创建时间 |
| updated_at | int | ✓ | 0 | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `company_id` (`company_id`)
- KEY `system_id` (`system_id`)
---
### 4. user_feishu_apps - 用户飞书应用关联表
用户在不同飞书应用下的登录信息。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 关联ID |
| user_id | bigint unsigned | ✓ | | 用户ID |
| company_id | bigint unsigned | ✓ | | 公司ID |
| feishu_app_id | int unsigned | ✓ | | 飞书应用ID |
| feishu_user_id | varchar(60) | | | 飞书user_id |
| feishu_open_id | varchar(60) | | | 飞书open_id |
| tenant_key | varchar(60) | | | tenant_key |
| is_default | tinyint | ✓ | 0 | 是否默认应用 |
| last_login_at | timestamp | | | 最后登录时间 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `user_id` (`user_id`)
- KEY `feishu_user_id` (`feishu_user_id`)
- KEY `feishu_open_id` (`feishu_open_id`)
---
### 5. user_sn - 用户SN分配表
用户SN编号池。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| user_sn | int unsigned | ✓ | 0 | SN编号 |
| user_id | int unsigned | ✓ | 0 | 分配给的用户ID(0=未分配) |
**索引**:
- KEY `user_sn` (`user_sn`)
- KEY `user_id` (`user_id`)
---
### 6. approval_flow - 审批流程表
审批流程定义。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 流程ID |
| business_type | varchar(50) | ✓ | | 业务类型 |
| name | varchar(100) | ✓ | | 流程名称 |
| description | varchar(255) | | | 描述 |
| status | tinyint | ✓ | 1 | 状态 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `business_type` (`business_type`)
- KEY `status` (`status`)
---
### 7. approval_node - 审批节点表
审批流程节点定义。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 节点ID |
| flow_id | bigint unsigned | ✓ | | 流程ID |
| type | enum | ✓ | | 节点类型:approver=单人审批,and_approve=会签,or_approve=或签,notify=通知 |
| name | varchar(100) | ✓ | | 节点名称 |
| order | int | ✓ | 0 | 节点顺序 |
| approvers | json | | | 审批人列表 |
| conditions | json | | | 条件配置 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `flow_id` (`flow_id`)
- KEY `order` (`order`)
---
### 8. approval_order - 审批订单表
审批订单主表。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 订单ID |
| business_type | varchar(50) | ✓ | | 业务类型 |
| business_id | bigint unsigned | ✓ | | 业务ID |
| title | varchar(200) | ✓ | | 标题 |
| applicant_id | bigint unsigned | ✓ | | 申请人ID |
| status | enum | ✓ | draft | 状态:draft=草稿,pending=审批中,approved=已通过,rejected=已拒绝,cancelled=已撤销 |
| current_nodes | json | | | 当前节点 |
| flow_id | bigint unsigned | ✓ | | 流程ID |
| form_data | json | | | 表单数据 |
| attachments | json | | | 附件 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `business_type` (`business_type`)
- KEY `applicant_id` (`applicant_id`)
- KEY `status` (`status`)
- KEY `created_at` (`created_at`)
---
### 9. approval_record - 审批记录表
审批操作记录。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 记录ID |
| order_id | bigint unsigned | ✓ | | 订单ID |
| node_id | bigint unsigned | ✓ | | 节点ID |
| node_type | varchar(20) | ✓ | | 节点类型 |
| approver_id | bigint unsigned | ✓ | | 审批人ID |
| action | enum | ✓ | | 操作:submit=提交,approve=通过,reject=拒绝,cancel=撤销 |
| comment | varchar(500) | | | 审批意见 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `order_id` (`order_id`)
- KEY `approver_id` (`approver_id`)
- KEY `created_at` (`created_at`)
---
### 10. business_trip - 出差申请表
出差申请主表。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 申请ID |
| user_id | bigint unsigned | ✓ | | 用户ID |
| reason | varchar(500) | ✓ | | 出差事由 |
| start_date | date | ✓ | | 开始日期 |
| end_date | date | | | 结束日期 |
| destination | varchar(200) | ✓ | | 目的地 |
| estimated_cost | decimal(10,2) | | 0.00 | 预估费用 |
| status | enum | ✓ | draft | 状态 |
| approval_order_id | bigint unsigned | | | 关联的审批订单ID |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `user_id` (`user_id`)
- KEY `status` (`status`)
- KEY `approval_order_id` (`approval_order_id`)
---
### 11. business_trip_itinerary - 出差行程表
出差申请行程明细。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 行程ID |
| business_trip_id | bigint unsigned | ✓ | | 出差申请ID |
| start_time | datetime | ✓ | | 开始时间 |
| end_time | datetime | | | 结束时间 |
| departure | varchar(100) | | | 出发地 |
| destination | varchar(100) | ✓ | | 目的地 |
| transport | varchar(50) | | | 交通工具 |
| trip_type | varchar(20) | | oneway | 行程类型:oneway=单程,roundtrip=往返 |
| remark | varchar(255) | | | 备注 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | ✓ | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `business_trip_id` (`business_trip_id`)
- KEY `start_time` (`start_time`)
---
### 12. feishu_login_session - 飞书扫码登录会话表
飞书扫码登录临时会话。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 会话ID |
| company_id | bigint unsigned | ✓ | | 公司ID |
| tenant_key | varchar(64) | ✓ | | tenant_key |
| feishu_app_id | int unsigned | | | 飞书应用ID |
| status | varchar(20) | ✓ | pending | 状态:pending=待扫码,scanning=已扫码,success=成功,expired=过期 |
| user_id | bigint unsigned | | | 用户ID |
| expires_at | datetime | ✓ | | 过期时间 |
| created_at | timestamp | | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `company_id` (`company_id`)
- KEY `expires_at` (`expires_at`)
---
### 13. feishu_message - 飞书审批消息映射表
用于存储飞书消息与审批订单、节点、用户的映射关系,支持消息卡片更新。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 记录ID |
| order_id | bigint unsigned | ✓ | | 审批订单ID |
| node_id | bigint unsigned | ✓ | | 审批节点ID |
| user_id | bigint unsigned | ✓ | | 审批人ID |
| message_id | varchar(64) | ✓ | | 飞书消息ID |
| msg_token | varchar(128) | | | 消息Token(用于更新卡片) |
| status | varchar(20) | ✓ | active | 状态:active=有效,updated=已更新,deleted=已删除 |
| created_at | timestamp | | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | timestamp | | CURRENT_TIMESTAMP | 更新时间 |
**索引**:
- PRIMARY KEY (`id`)
- UNIQUE KEY `idx_order_node_user` (`order_id`, `node_id`, `user_id`)
- KEY `idx_message_id` (`message_id`)
- KEY `idx_user_id` (`user_id`)
---
### 14. feishu_message_log - 飞书消息日志表
飞书消息发送和更新的操作日志,用于调试和审计。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| id | bigint unsigned | ✓ | AUTO_INCREMENT | 记录ID |
| action | varchar(20) | ✓ | | 操作类型:send=发送,update=更新,update_card=更新卡片 |
| order_id | bigint unsigned | ✓ | | 审批订单ID |
| node_id | bigint unsigned | | | 审批节点ID |
| user_id | bigint unsigned | | | 用户ID |
| message_id | varchar(64) | | | 飞书消息ID |
| status | varchar(10) | ✓ | | 状态:success=成功,failed=失败 |
| request_data | text | | | 请求数据(JSON) |
| response_data | text | | | 响应数据(JSON) |
| error_message | text | | | 错误信息 |
| created_at | timestamp | ✓ | CURRENT_TIMESTAMP | 创建时间 |
**索引**:
- PRIMARY KEY (`id`)
- KEY `idx_order_id` (`order_id`)
- KEY `idx_action` (`action`)
- KEY `idx_status` (`status`)
- KEY `idx_created_at` (`created_at`)
---
## 📊 表关系图
```
users (1) ----< (N) user_feishu_apps
| |
| +----> company_feishu_apps
|
+----> companies (1) ----< (N) company_feishu_apps
|
+----> user_sn (N)
users (1) ----< (N) business_trip
| |
| +----> business_trip_itinerary (N)
|
+----> approval_order (1) ----< (N) approval_record
|
+----> approval_flow (1) ----< (N) approval_node
```
---
## 🔒 数据库变更规范
### 变更流程
1. 在 `feature/mzl-dev` 分支进行开发
2. 创建迁移脚本(migration)
3. 更新本文档
4. 提交时在 commit message 中注明数据库变更
### 变更记录格式
```markdown
## [变更日期] - [变更内容]
### 新增表
- 表名:用途说明
### 修改表
- 表名:字段变更说明
### 删除表
- 表名(需谨慎)
### 索引变更
- 表名:索引变更说明
```
---
## 📝 注意事项
1. **密码字段**:`users.password` 使用 PHP `password_hash()` 加密,格式为 `$2y$...`
2. **默认密码**:新用户默认密码为 SN 编号
3. **软删除**:用户表使用 `status` 字段标记状态(1=在职,0=离职)
4. **时间字段**:统一使用 `timestamp` 类型,自动更新
5. **JSON字段**:用于存储复杂数据结构
---
**维护人**: 开发团队
**最后更新**: 2026-03-01
**版本**: 1.1.0 (线上稳定版)