Files
baiyue-firstleg/docs/database-schema.md
T
2026-07-30 18:01:36 +08:00

13 KiB

数据库结构与表用途

数据归属原则

本项目采用单 Git 仓库、多 Maven 模块、多服务数据库架构。每个业务服务只访问自己的数据库,禁止跨库查询、跨库外键和共享业务表。服务之间只交换业务 ID,并通过 OpenAPI 或领域事件协作。开发环境可以共用一个 MySQL 8 实例,但 schema、数据库账号和迁移历史应保持独立。

商户业务数据必须包含 tenant_id。商户端接口只能从已认证 JWT 获取可信租户 ID,并将其加入每个数据查询条件;调用方不能通过请求参数自行选择租户。平台后台接口使用独立路由及 PLATFORM 应用身份,并显式指定目标租户。

数据库与表总览

服务 数据库 表 数据所有权
auth-service baiyue_auth auth_account、auth_refresh_token 登录凭据、账号安全状态、刷新令牌生命周期
iam-service baiyue_iam iam_* 租户、企业资料、用户、成员、双端角色、菜单/页面/按钮/API权限、数据范围
order-service baiyue_order ord_* 订单聚合、状态历史和待发布领域事件
warehouse-service baiyue_warehouse wh_* 仓库主数据、地址和服务能力
firstleg-service baiyue_firstleg fl_* 头程履约任务、指派过程和消息消费幂等
file-service baiyue_file file_* 文件元数据、临时下载授权和下载审计
print-service baiyue_print print_* 打印模板、打印任务和任务状态历史
event-bridge-service baiyue_event_bridge bridge_* 跨区事件接收幂等、待发送事件和投递尝试记录
audit-service baiyue_audit sys_audit_log 集中式、追加写入的业务审计轨迹
lastleg-service 后续阶段创建 暂无业务表 尾程派单、配送轨迹和签收凭证

SQL 入口位于各服务的 src/main/resources/db 目录。

认证服务

表名 用途 关键字段
auth_account 平台端与商户端共用的统一登录账号;保存密码哈希、锁定状态、令牌版本和默认租户/应用上下文。IAM用户资料与本表通过逻辑ID关联,本表不保存角色权限。 username、password_hash、account_status、locked_until、token_version、default_tenant_id、operator_tenant_id、default_app_code
auth_refresh_token 保存刷新令牌摘要以及签发时的租户和应用上下文,用于刷新令牌轮换、吊销和到期清理;不保存令牌明文。 token_hash、user_id、tenant_id、app_code、expires_at、revoked_at

IAM服务

表名 用途 关键字段
iam_tenant SaaS租户主表,是商户业务数据隔离的根边界,保存企业基本资料、审核结果和启停状态。 tenant_code、tenant_type、status、unified_social_credit_code
iam_tenant_review 保存企业注册或资料变更的审核队列、审核人、意见和结果。 tenant_id、review_type、status、reviewer_id、reviewed_at
iam_tenant_address 保存企业注册地址、办公地址等租户级地址资料。 tenant_id、address_type、is_default
iam_tenant_qualification 保存企业证照、文件地址、有效期和资质审核状态。 tenant_id、qualification_type、document_url、valid_to、status
iam_user IAM用户资料,连接认证账号与业务身份;不保存登录密码。 auth_user_id、user_type、display_name、status
iam_membership 表示某用户在某企业租户中的成员身份,是分配商户端角色的主体。一个用户可加入多个租户。 tenant_id、user_id、member_type、status
iam_role 按 tenant_id + app_code 隔离角色,支持商户端 MERCHANT 与后台端 PLATFORM 两套角色体系。 tenant_id、app_code、role_code、role_type、status
iam_membership_role 成员与角色的多对多关系,描述成员在当前租户和应用端拥有的角色。 membership_id、role_id、tenant_id
iam_permission 统一权限资源树;permission_type 支持 MENU、PAGE、BUTTON、API,实现权限控制到按钮并将前端权限与后端API权限关联。 tenant_id、app_code、permission_type、parent_id、permission_code、route_path、http_method
iam_role_permission 角色与菜单、页面、按钮、API权限的多对多授权关系。 role_id、permission_id、tenant_id
iam_data_scope 在功能权限之外定义角色可查看/操作的数据范围。 role_id、tenant_id、scope_type、scope_expression

订单服务

表名 用途 关键字段
ord_order 头程订单聚合根,保存客户、仓库名称与地址、收货时间等下单快照,以及只读履约快递信息和当前状态。 tenant_id、order_no、customer_id、customer_name、receiving_warehouse_address、receiving_time、express_company、express_tracking_no、status、version
ord_order_party 固化下单时的发货人和收货人信息,避免外部主数据变化影响历史订单。 tenant_id、order_id、party_type
ord_order_cargo 保存订单货物行、包装件数、重量、体积、申报价值和危险品属性。 tenant_id、order_id、item_no、gross_weight_kg、volume_cbm
ord_order_internal_note 保存平台运营或履约人员的内部协作备注,不作为客户公开备注。 tenant_id、order_id、content、created_by
ord_order_status_history 以不可变记录保存订单每次状态迁移、业务动作、原因和操作人。 tenant_id、order_id、from_status、to_status、action、occurred_at
ord_outbox_event 事务 Outbox 可靠消息表。订单服务在订单状态变更的同一本地事务中写入待发布领域事件,后台发布器再投递 RocketMQ,从而避免“数据库提交成功但消息发送失败”。它不是普通操作日志,也不是消费者幂等表。 aggregate_type、aggregate_id、event_type、payload_json、publish_status、retry_count、next_retry_at、published_at

头程履约服务

表名 用途 关键字段
fl_fulfillment_task 接收订单领域事件后形成独立头程履约任务,保存订单快照并管理指派、执行和完成状态。 tenant_id、order_id、order_snapshot_json、status、assignee_id、version
fl_assignment_history 不可变记录头程任务每次负责人指派/改派、原因和操作人。 tenant_id、task_id、previous_assignee_id、assignee_id、operator_id
fl_consumed_event 消费者幂等去重表。记录已成功处理的领域事件ID,防止 RocketMQ 重复投递造成重复创建履约任务;它不是消息发布表。 event_id、event_type、consumed_at

仓库服务

表名 用途 关键字段
wh_warehouse 租户维度仓库聚合根,保存仓库编码、名称、类型、国家、时区、联系人和状态。 tenant_id、warehouse_code、warehouse_type、country_code、status
wh_warehouse_address 保存仓库运营、退货等不同用途的地址和可选经纬度。 tenant_id、warehouse_id、address_type
wh_service_capability 声明仓库可提供的收货、仓储、拣包、退货等服务能力及截单时间。 tenant_id、warehouse_id、capability_code、enabled、cutoff_time
wh_partner 仓储域内的租户往来单位配置,供订单选择客户、联系人和地址;商户候选查询强制过滤停用数据。 tenant_id、partner_code、partner_name、partner_type、contact_name、contact_phone、address_line、status

文件中心服务

表名 用途 关键字段
file_object 保存文件元数据、对象存储定位信息、校验值和生命周期状态;文件二进制存放在对象存储中。 tenant_id、original_name、storage_provider、object_key、content_type、size_bytes、sha256、status
file_download_token 保存临时下载授权及其有效期、使用次数和吊销状态,用于生成受控下载链接。 tenant_id、file_id、token_hash、expires_at、max_downloads、download_count、revoked_at
file_download_log 记录文件下载申请与执行结果,供安全追踪和下载审计使用。 tenant_id、file_id、user_id、request_id、client_ip、result、failure_reason、downloaded_at

打印服务

表名 用途 关键字段
print_template 保存租户级打印模板、模板类型、版本、内容和启停状态。 tenant_id、template_code、template_type、content、version_no、status
print_job 保存打印任务、业务来源、模板快照、打印参数、生成文件标识和当前状态。 tenant_id、job_no、template_id、business_type、business_id、payload_json、output_file_id、status
print_job_history 追加记录打印任务的状态迁移、执行结果、失败原因和操作主体。 tenant_id、print_job_id、from_status、to_status、message、operator_id、occurred_at

跨区事件桥服务

表名 用途 关键字段
bridge_outbox 保存事件桥待发送事件及发布状态,为后续扫描、重试、死信和人工补投保留持久化边界。当前仅有基础表结构,真实扫描调度和跨区发送尚未实现。 event_id、idempotency_key、event_type、event_version、source_region、target_region、payload_hash、payload_json、status、retry_count、next_retry_at、lease_until
bridge_inbox 保存事件桥已接收的事件信封和摘要,用 event_id 和 idempotency_key 唯一约束实现幂等;相同事件且相同摘要返回重复,相同事件但摘要不同拒绝覆盖。 event_id、idempotency_key、event_type、event_version、source_region、target_region、payload_hash、payload_json、status、received_at、processed_at
bridge_delivery_attempt 追加记录每一次投递尝试、目标区域、结果、响应码和错误信息,为重试审计与故障定位提供依据。当前真实投递器尚未实现。 event_id、source_region、target_region、attempt_no、status、response_code、error_message、started_at、finished_at

event-bridge-service 当前是可靠事件桥基础骨架,不代表跨区链路可用于生产。内部服务令牌、目标区域校验和 Inbox 幂等接收已实现并通过事件桥 8 项测试;mTLS、来源白名单、RocketMQ 发布消费、真实跨公网 HTTP 投递、Outbox 扫描调度和业务消费者仍待实现。

审计服务

表名 用途 关键字段
sys_audit_log 集中业务审计表。追加记录敏感操作的主体、租户、资源、请求链路、结果及脱敏后的前后快照,用于合规审计和问题追踪;它不同于 Outbox 和消费幂等表。 event_type、resource_type、resource_id、tenant_id、operator_tenant_id、user_id、success、before_data、after_data、occurred_at

三类事件/日志表的区别

表 写入方 核心目标 数据生命周期
ord_outbox_event 订单业务事务 保证业务数据与待发布领域事件最终一致 成功发布后保留一段时间,再归档或清理
fl_consumed_event 头程消息消费者 对重复投递进行幂等去重 至少覆盖消息可能重复投递的最长时间
bridge_outbox 事件桥生产端 保存等待投递、重试或死信的版本化跨区事件 成功投递并超过审计与补偿窗口后归档
bridge_inbox 事件桥接收端 按事件标识和摘要幂等接收,拒绝同标识不同内容 至少覆盖跨区重试与人工补投窗口
sys_audit_log 各服务审计组件/审计服务 记录谁在何时对什么资源做了什么以及结果 按合规要求长期留存,原则上只追加不修改

服务边界

  • order-service 拥有客户委托、参与方、货物、商业状态和权威订单号。
  • firstleg-service 拥有受理后的指派、订舱、集货、干线运输和清关节点。
  • warehouse-service 拥有仓库主数据和能力;后续入库、库存、库位和出库记录也归属该服务。
  • lastleg-service 后续负责派单、配送轨迹和签收凭证。
  • file-service 拥有文件元数据、下载授权和下载审计;对象二进制存放在对象存储中。
  • print-service 拥有打印模板和打印任务;生成文件只保存 file_id,不跨库读取文件表。
  • event-bridge-service 只负责跨区事件信封的接收幂等、投递记录和可靠传输边界,不拥有订单、头程或尾程业务状态,也不能直接推进业务聚合。
  • order_id、warehouse_id 等跨服务字段只是逻辑标识,不建立跨数据库外键。