# 数据库结构文档 **版本**: 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 (线上稳定版)