差旅的行程管理部分,我们主要有两个业务单据:
- 差旅申请单(travel_order):出差的"意图"——去哪、什么时候、为什么,要走审批、要长期留存、要做冲突检测。
- 差旅审批单(approval_record):差旅单提交后产生的审批流程实例,记录审批状态流转(待审批→通过/拒绝/撤销)和一份提交时的审批表单快照。
差旅申请单和差旅审批单之间的关系是1对多的,但是大部分情况下都是1对1,除非某个审批被拒绝,然后重新发起新的审批。
先看 travel_order(差旅申请单):
CREATE TABLE IF NOT EXISTS `travel_order` (
`order_id` VARCHAR(64) NOT NULL COMMENT '差旅单ID', -- 应用生成的主键(非自增)
`user_id` VARCHAR(64) NOT NULL COMMENT '申请人ID',
`destination` VARCHAR(256) DEFAULT NULL COMMENT '目的地',
`departure_city` VARCHAR(128) DEFAULT NULL COMMENT '出发城市',
`departure_date` VARCHAR(32) DEFAULT NULL COMMENT '出发日期', -- 注意:日期存字符串,不是 DATE
`return_date` VARCHAR(32) DEFAULT NULL COMMENT '返回日期',
`purpose` VARCHAR(512) DEFAULT NULL COMMENT '出差事由',
`status` VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '状态: DRAFT/SUBMITTED/APPROVED/REJECTED/COMPLETED/CANCELLED',
`approval_id` VARCHAR(64) DEFAULT NULL COMMENT '关联审批单ID',
`created_at` DATETIME DEFAULT NULL,
`updated_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`order_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_user_status` (`user_id`, `status`) -- 支撑"查我的某状态差旅单"
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '差旅申请单';
TravelOrderStatus的状态机:DRAFT(草稿) → SUBMITTED(审批中) → APPROVED(已通过) / REJECTED(已拒绝) → COMPLETED(已完成) / CANCELLED(已取消)。 approval_record(差旅审批记录),它是差旅单提交审批后产生的流程实例:
CREATE TABLE IF NOT EXISTS `approval_record` (
`process_instance_id` VARCHAR(64) NOT NULL COMMENT '审批流程实例ID', -- 应用生成 pi_+时间戳,非自增
`user_id` VARCHAR(64) NOT NULL COMMENT '申请人ID',
`title` VARCHAR(256) DEFAULT NULL COMMENT '审批标题',
`status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '状态: PENDING/APPROVED/REJECTED/CANCELLED',
`approval_form` TEXT DEFAULT NULL COMMENT '审批表单JSON', -- 注意:是 TEXT,不是 JSON 列
`remark` VARCHAR(512) DEFAULT NULL COMMENT '备注(审批意见)',
`submit_time` DATETIME DEFAULT NULL COMMENT '提交时间',
`update_time` DATETIME DEFAULT NULL COMMENT '最后更新时间',
`order_id` VARCHAR(64) DEFAULT NULL COMMENT '关联差旅单ID', -- 反指 travel_order.order_id
PRIMARY KEY (`process_instance_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_order_submit` (`order_id`, `submit_time`) -- 支撑"取某差旅单最近一次审批"
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '差旅审批记录';
ApprovalRecordStatus共 4 态:PENDING(待审批) → APPROVED(已通过) / REJECTED(已拒绝) / CANCELLED(已撤销)。