# 规则版本治理方案

## 1. 背景

当前“任务规则中心”的规则资产只有一个 `current_version` 指针。  
它同时承担了三种含义：

1. 财务人员正在编辑的版本
2. 审核中的候选版本
3. 系统运行时真正生效的线上版本

这会直接带来三个问题：

- 财务人员一旦修改 Excel，最新内容就会立刻成为 `current_version`，容易被误解为已经正式生效
- 审核、上线、回滚都围绕同一个指针转，权限边界不清晰
- 如果误上线，虽然能切换历史版本，但缺少“线上版本”和“工作版本”分离后的安全缓冲

## 2. 设计目标

这次改造要解决的不是“多存几个历史版本”，而是建立一套可长期使用的规则治理机制：

1. 财务人员可以编辑规则，但编辑结果默认只是草稿
2. 只有高级管理人员审核通过后，规则才能成为正式线上版本
3. 系统运行时只能读取正式线上版本，不能读取草稿
4. 前台要能清楚区分：
   - 当前线上版本
   - 当前工作版本
   - 最近 5 个历史版本
5. 如果误操作上线，可以快速恢复，但恢复动作仍然要留下完整审计链

## 3. 核心模型

### 3.1 双指针版本模型

在规则资产上新增两个版本指针：

| 字段 | 含义 |
| --- | --- |
| `published_version` | 当前正式在线上生效的版本 |
| `working_version` | 当前最新的工作稿 / 待审稿 |

兼容策略：

- 现有 `current_version` 暂时保留，用于兼容历史代码
- 对规则资产来说，后续它只承担“当前工作版本”的兼容语义
- 运行时逻辑不再读取 `current_version`，而是优先读取 `published_version`

### 3.2 版本状态

不额外在版本表中硬存一套容易失真的状态，而是根据“版本指针 + 最新审核记录”动态推导：

| 条件 | 版本状态 |
| --- | --- |
| `version == published_version` | 已上线 |
| `version == working_version` 且无审核记录 | 草稿 |
| `version == working_version` 且最新审核为 `pending` | 待审核 |
| `version == working_version` 且最新审核为 `approved` | 已通过待上线 |
| `version == working_version` 且最新审核为 `rejected` | 已驳回 |
| 其他历史版本 | 历史版本 |

这样可以避免“版本状态”和“审核记录”两套数据互相打架。

## 4. 权限边界

| 角色 | 能力 |
| --- | --- |
| 财务人员 `finance` | 编辑工作稿、上传/导入 Excel、提交审核 |
| 高级管理人员 `manager` / `admin` | 审核通过、驳回、正式发布、恢复历史版本 |
| 其他普通员工 | 只读 |

### 4.1 财务人员

- 可以直接编辑当前 `working_version`
- 每次保存自动生成新版本，并把它设为新的 `working_version`
- 不能把草稿直接变成 `published_version`

### 4.2 高级管理人员

- 可以对 `working_version` 发起：
  - 审核通过
  - 驳回
  - 正式发布
- 只有 `approved` 的工作版本才能发布

## 5. 发布与回滚流程

### 5.1 正常发布

1. 财务人员编辑并保存
2. 系统生成新版本，例如 `v1.0.6`
3. `working_version = v1.0.6`
4. 财务人员提交审核
5. 高级管理人员审核通过
6. 高级管理人员点击“正式上线”
7. `published_version = v1.0.6`
8. 系统运行时切换到新版本

### 5.2 驳回

1. 财务人员提交审核
2. 高级管理人员驳回
3. 当前工作版本保留，但状态显示为“已驳回”
4. 财务人员继续编辑，形成新的工作版本

### 5.3 恢复历史版本

不直接把 `published_version` 指回旧版本，而是采用“复制恢复”的方式：

1. 管理员在最近 5 个版本中选择一个历史版本
2. 系统基于该历史版本内容生成一个新的恢复版本，例如 `v1.0.7`
3. 新版本写入 `working_version`
4. 审核通过后再正式发布

这么做的好处：

- 不会破坏历史链路
- 每一次恢复都有明确的责任人与时间
- 既能快速回滚，又保留审计闭环

## 6. 版本保留策略

### 6.1 前台展示

- 详情页固定展示最近 5 个版本
- 每个版本显示：
  - 版本号
  - 状态
  - 创建人
  - 创建时间
  - 变更说明

### 6.2 后台保存

后台不能机械地“只保留 5 个版本”，否则可能把关键线上版本挤掉。  
建议策略：

1. 始终保留当前 `published_version`
2. 始终保留当前 `working_version`
3. 额外保留最近 5 个历史版本

这样既满足前台简洁，也能避免误删关键版本。

## 7. 前端交互

### 7.1 规则详情页顶部

展示两个醒目的版本标签：

- 当前线上版本
- 当前工作版本

如果两者不同，需要明确提示：

> 当前存在尚未上线的工作稿，系统运行仍以线上版本为准。

### 7.2 编辑区

- 财务人员看到“可编辑工作稿”
- 普通用户只读
- 管理员可编辑，但主要职责仍是审核与发布

### 7.3 版本区

最近 5 个版本中每条都显示状态：

- 已上线
- 草稿
- 待审核
- 已通过待上线
- 已驳回
- 历史版本

可执行操作：

- 查看
- 基于该版本恢复
- 对当前工作版本提交审核 / 审核 / 发布

## 8. 后端改造清单

1. `agent_assets`
   - 新增 `published_version`
   - 新增 `working_version`
2. 兼容旧数据
   - 历史规则资产初始化时：
     - `published_version = current_version`
     - `working_version = current_version`
3. 版本保存
   - 保存新版本后：
     - 只更新 `working_version`
     - `current_version` 同步为 `working_version` 以兼容旧逻辑
4. 审核
   - 审核只针对 `working_version`
5. 发布
   - 只允许把已审核通过的 `working_version` 推到 `published_version`
6. 运行时
   - 只读取 `published_version`
7. 回滚
   - 新增“基于历史版本恢复为新工作稿”的接口

## 9. 前端改造清单

1. 资产详情模型增加：
   - `publishedVersion`
   - `workingVersion`
   - 每个历史版本的派生状态
2. 规则详情页展示：
   - 当前线上版本
   - 当前工作版本
   - 最近 5 个版本
3. 操作权限拆分：
   - finance：编辑、上传、提交审核
   - manager/admin：审核、上线、恢复
4. OnlyOffice 编辑逻辑：
   - 默认编辑工作版本
   - 历史版本只读
5. 正式上线按钮：
   - 只有工作版本已审核通过时可用

## 10. 本次实现边界

本轮优先完成以下能力：

1. 规则版本双指针
2. 财务角色可编辑工作稿
3. 正式上线只切换 `published_version`
4. 运行时只读取 `published_version`
5. 最近 5 个版本展示
6. 基于历史版本快速恢复为新工作稿

后续如需要，再继续补：

- 版本差异对比
- 审核意见流转面板
- 发布说明 / 审批单号
- 定时生效

