﻿# PRD - 报价管理系统后台 V1.2.3

**版本**：V1.2.3
**创建日期**：2026-06-04
**产品负责人**：耿功发
**状态**：草稿

---

### 1. 概述

#### 1.1 背景
后台用户管理已区分 `管理员` 与 `超级管理员`，但当前 `V1.2.3` 需要把新建用户时的角色选择范围和可修改性进一步写清。同时，后台报价设置需要支持按 `月 / 周 / 日 / 实时` 四种汇率模式计算，并支持在后台修改报价项的 `工时`、`固定成本`、`系数`，明确报价创建、审核流转与重新编辑时的统一计价口径，作为本版本的明确交付口径。

#### 1.2 目标
- 明确管理员新建用户时，角色选择只能选择 `报价人员`，且不可修改。
- 明确超级管理员新建用户时，角色选择可以选择 `超级管理员`、`管理员`、`报价人员`。
- 明确后台报价设置支持按 `月 / 周 / 日 / 实时` 四种汇率模式计算，并补齐创建报价、待提交审核、待审核及重新编辑场景下的汇率使用规则。
- 明确后台价格逻辑从 `工时 × 300 × 20` 调整为 `工时 × 固定成本 × 系数 × 汇率`，且后台支持修改 `工时 / 固定成本 / 系数 / 汇率模式`。

#### 1.3 关联文档
- MRD：待补充
- 用户故事集：[UC-003-quotation-management-system-V1.2.md](/Users/summer/Documents/AI/Yitou/quote-estimator/documents/use-cases/UC-003-quotation-management-system-V1.2.md)
- 功能用例集：[PRD-003B-quotation-backoffice-V1.2.md](/Users/summer/Documents/AI/Yitou/quote-estimator/documents/prd/PRD-003B-quotation-backoffice-V1.2.md)

### 2. 功能需求矩阵

| 功能ID | 功能名称 | 关联用例 | 优先级 | 状态 |
|--------|---------|---------|--------|------|
| F001 | 管理员与超级管理员新建用户角色选择控制 | UC-003 | Must | 待开发 |
| F002 | 后台报价设置支持多汇率模式计算 | UC-003 | Must | 待开发 |
| F003 | 后台报价项基础价格与汇率计算逻辑调整 | UC-003 | Must | 待开发 |

### 3. 功能详细说明

#### F001: 管理员与超级管理员新建用户角色选择控制

**描述**：后台新建用户时，系统需根据当前登录人的角色限制 `角色` 字段的可选范围，并明确该字段是否允许修改。

**交互流程**：
1. 管理员或超级管理员进入后台 `用户管理` 页面。
2. 用户点击 `新建用户`，系统打开新建用户弹窗。
3. 若当前登录人为 `管理员`，系统在 `角色` 字段中仅允许选择 `报价人员`，且该字段不可修改。
4. 若当前登录人为 `超级管理员`，系统在 `角色` 字段中允许选择 `超级管理员`、`管理员`、`报价人员`。
5. 用户完成其余字段填写后进入正常保存流程。

**界面原型**：待补充

#### F002: 后台报价设置支持多汇率模式计算

**描述**：后台报价设置需支持按 `月 / 周 / 日 / 实时` 四种汇率模式执行计算规则。系统根据当前生效模式决定报价创建、审核流转与重新编辑时使用哪一条汇率；报价进入 `待提交审核`、`待审核` 后沿用创建时汇率快照；若用户在 `待提交审核` 或 `审核不通过` 状态下重新编辑报价，则按当前生效模式重新获取汇率并实时计算。

**交互流程**：
1. 后台提供汇率模式配置，支持 `按月`、`按周`、`按日`、`实时` 四种模式。
2. 若汇率模式为 `按月`，则取当月第一次有效收盘汇率作为当月统一汇率；若当月尚未形成首次有效收盘汇率，则沿用上个月汇率。
3. 若汇率模式为 `按周`，则取当周第一次有效收盘汇率作为当周统一汇率；若当周尚未形成首次有效收盘汇率，则沿用上周汇率。
4. 若汇率模式为 `按日`，则取当日最新已生效汇率作为当日统一汇率；若当日暂无新汇率，则沿用上一日汇率。
5. 若汇率模式为 `实时`，则系统在每次进入报价计算或重新编辑时获取当前最新可用汇率。
6. 用户创建报价单时，系统按当前生效汇率模式对应的汇率计算报价。
7. 报价首次保存后进入 `待提交审核`，该状态下继续沿用创建报价时的汇率快照。
8. 报价提交审核进入 `待审核` 后，继续沿用创建报价时的汇率快照，不因后续汇率变化而自动变更。
9. 若用户重新编辑报价，且场景为 `待提交审核` 状态下编辑或 `审核不通过` 状态下编辑，则系统在进入编辑时立即按当前生效汇率模式重新获取汇率，并按该汇率实时计算报价。
10. 用户进入本次重新编辑后，本次编辑会话内看到的报价金额均基于进入编辑时获取的汇率实时计算。
11. 用户完成本次重新编辑并保存后，系统沿用进入本次编辑时已获取的汇率作为该报价更新后的汇率快照，进入后续状态流转。

**汇率规则说明**：
- 汇率模式支持：`按月 / 按周 / 按日 / 实时`。
- `按月`：取当月第一次有效收盘汇率；若未生成则沿用上个月汇率。
- `按周`：取当周第一次有效收盘汇率；若未生成则沿用上周汇率。
- `按日`：取当日最新已生效汇率；若当日暂无新汇率则沿用上一日汇率。
- `实时`：每次进入报价计算或重新编辑时，取当前最新可用汇率。
- `创建报价单` 按当前生效汇率模式对应的汇率计算。
- `待提交审核`、`待审核` 状态均按照创建报价时的汇率计算。
- 用户重新编辑报价时：
  - `待提交审核` 状态下编辑：进入编辑时立即按当前生效汇率模式重新获取汇率，并按该汇率实时计算报价。
  - `审核不通过` 状态下编辑：进入编辑时立即按当前生效汇率模式重新获取汇率，并按该汇率实时计算报价。
- 汇率快照独立于报价配置版本快照管理；报价配置版本可继续按既有规则锁定，但汇率按本功能规则处理。

**界面原型**：待补充

#### F003: 后台报价项基础价格与汇率计算逻辑调整

**描述**：后台价格逻辑从原 `工时 × 300 × 20` 的直接计算口径，调整为 `工时 × 固定成本 × 系数 × 汇率`。后台需支持按报价项修改 `工时`、`固定成本`、`系数`，并支持选择汇率模式。原有日元价格需先按旧固定利率 `20` 还原成人民币基准价，再换算出各报价项系数，后续报价运行时按新公式计算。

**交互流程**：
1. 后台维护报价配置时，系统按报价项维度展示并允许修改 `工时`、`固定成本`、`系数`。
2. 后台维护汇率设置时，系统允许选择当前生效的 `汇率模式`。
3. 历史报价项若沿用旧口径，则系统先将原日元价格按旧固定利率 `20` 还原成人民币基准价：`旧人民币基准价 = 旧日元价格 ÷ 20`。
4. 系统再按 `系数 = 旧人民币基准价 ÷（工时 × 固定成本）` 计算该报价项系数，并作为新口径初始值。
5. 若初始化迁移阶段采用默认固定成本，则默认值可先设为 `100`，迁移完成后仍允许后台继续修改。
6. 用户创建报价或重新编辑报价时，系统先读取各报价项当前保存的 `工时`、`固定成本`、`系数`。
7. 系统再读取当前生效汇率模式对应的计算汇率。
8. 系统按 `工时 × 固定成本 × 系数 × 汇率` 计算各报价项金额，并参与后续模块汇总、整单汇总和导出。
9. 若用户在 `待提交审核` 或 `审核不通过` 状态下重新编辑报价，则在进入编辑时立即获取当前生效模式对应汇率，并基于该汇率实时重算各报价项金额。

**计算规则说明**：
- 原价格计算逻辑：`工时 × 300 × 20`。
- 新价格计算逻辑：`工时 × 固定成本 × 系数 × 汇率`。
- 旧价格还原公式：`旧人民币基准价 = 旧日元价格 ÷ 20`。
- 系数迁移公式：`系数 = （旧日元价格 ÷ 20）÷（工时 × 固定成本）`。
- 初始化迁移时若无单独成本口径，可先采用 `固定成本 = 100` 作为默认值；迁移后后台支持继续修改。
- 后台支持修改项：`工时`、`固定成本`、`系数`、`汇率模式`。
- 各报价项既有数量、区间、参数选择等业务规则继续保留，汇率仅按本版新规则参与金额换算。

**迁移示例**：
- 示例报价项：`阳台外立面数`
- 原工时：`1.5 小时`
- 原价格：`1.5 × 300 × 20 = 9000 日元`
- 还原人民币基准价：`9000 ÷ 20 = 450`
- 固定成本：`100`
- 系数计算：`450 ÷（1.5 × 100）= 3`
- 新公式：`1.5 × 100 × 3 × 汇率`
- 当汇率为 `20` 时，新价格结果为：`1.5 × 100 × 3 × 20 = 9000 日元`

**界面原型**：待补充

### 4. 非功能需求

| 维度 | 指标 | 要求 |
|------|------|------|
| 安全 | 角色限制可靠性 | 前端展示与后端提交校验都必须遵循相同角色限制 |
| 可用性 | 表单可理解性 | 管理员场景下需明确让用户看见 `角色` 字段不可修改，而不是隐藏规则 |
| 权限 | 角色边界清晰性 | 新建用户可选角色范围必须与当前登录人权限一致 |
| 可用性 | 汇率口径稳定性 | 同一报价在 `待提交审核`、`待审核` 状态下不得因后续汇率变化自动漂移 |
| 时效性 | 汇率模式切换可控性 | 汇率模式切换后仅影响新建报价和新一轮重新编辑，不得回刷历史汇率快照 |
| 一致性 | 金额计算口径 | 后台配置、前台试算、审核查看和导出必须使用同一套 `工时 × 固定成本 × 系数 × 汇率` 规则 |

### 5. 国际化配置表

| Key | 中文 | 英文 | 备注 |
|-----|------|------|------|
| user.role.super_admin | 超级管理员 | Super Admin | 角色选项 |
| user.role.admin | 管理员 | Admin | 角色选项 |
| user.role.quote_person | 报价人员 | Quotation Staff | 角色选项 |
| user.create.role_locked | 角色不可修改 | Role cannot be changed | 管理员场景说明文案 |
| quote.fx.mode | 汇率模式 | Exchange Rate Mode | `按月 / 按周 / 按日 / 实时` |
| quote.fx.period_rate | 周期汇率 | Period Exchange Rate | 月 / 周 / 日模式统一汇率 |
| quote.fx.latest_rate | 最新汇率 | Latest Exchange Rate | 实时模式使用 |
| quote.fx.updated_at | 汇率更新时间 | Exchange rate update time | 取当前模式对应更新时间 |
| quote.price.fixed_cost | 固定成本 | Fixed Cost | 后台按报价项可修改 |
| quote.price.coefficient | 系数 | Coefficient | 各报价项利润 / 难度系数 |
| quote.price.calc_rate | 计算汇率 | Calculation Exchange Rate | 报价运行时乘算使用 |

### 6. 基础数据

系统运行所需的初始数据（枚举值、配置项等）：

| 数据类型 | 内容 | 维护方式 |
|---------|------|---------|
| 登录角色枚举 | `超级管理员`、`管理员` | 系统初始化 |
| 可创建角色映射 | 管理员 -> `报价人员`；超级管理员 -> `超级管理员 / 管理员 / 报价人员` | 系统初始化 |
| 汇率模式 | `按月 / 按周 / 按日 / 实时` | 后台报价设置维护 |
| 汇率周期取值规则 | `按月` 取当月第一次有效收盘；`按周` 取当周第一次有效收盘；`按日` 取当日最新已生效；`实时` 取当前最新可用汇率 | 系统初始化 |
| 汇率快照规则 | 创建报价固化；`待提交审核 / 待审核` 沿用；重新编辑进入时立即按当前生效模式刷新并用于本次编辑 | 系统初始化 |
| 报价项工时 | 后台按报价项可修改 | 后台报价配置维护 |
| 报价项固定成本 | 后台按报价项可修改；迁移默认值可先设为 `100` | 后台报价配置维护 |
| 报价项系数 | 按 `（旧日元价格 ÷ 20）÷（工时 × 固定成本）` 迁移或单独维护 | 后台报价配置维护 |
| 报价运行时公式 | `工时 × 固定成本 × 系数 × 汇率` | 系统初始化 |

### 7. 验收标准

| AC 编号 | 功能 | Given | When | Then |
|---------|------|-------|------|------|
| AC-001 | F001 | 当前登录人为 `管理员` | 用户打开 `新建用户` 弹窗 | `角色` 字段只能选择 `报价人员` |
| AC-002 | F001 | 当前登录人为 `管理员` | 用户查看 `角色` 字段 | `角色` 字段不可修改 |
| AC-003 | F001 | 当前登录人为 `超级管理员` | 用户打开 `新建用户` 弹窗 | `角色` 字段可选 `超级管理员`、`管理员`、`报价人员` |
| AC-004 | F001 | 当前登录人为 `管理员` 或 `超级管理员` | 用户完成新建用户保存 | 系统按当前登录人角色限制校验并进入正常保存流程 |
| AC-005 | F002 | 当前生效汇率模式为 `按月`，且系统获得当月第一次有效收盘数据 | 系统更新汇率 | 系统仅更新一次该月统一汇率 |
| AC-006 | F002 | 当前生效汇率模式为 `按周`，且系统获得当周第一次有效收盘数据 | 系统更新汇率 | 系统仅更新一次该周统一汇率 |
| AC-007 | F002 | 当前生效汇率模式为 `按日`，且当日已有最新已生效汇率 | 用户创建报价单 | 系统按当日统一汇率计算 |
| AC-008 | F002 | 当前生效汇率模式为 `实时` | 用户创建报价单 | 系统按当前最新可用汇率计算 |
| AC-009 | F002 | `按月` 或 `按周` 模式下，当前周期首日为节假日或休市，暂无有效数据 | 系统获取当前周期汇率 | 系统取当前周期首个开盘交易日对应的首次有效收盘汇率作为当前周期统一汇率 |
| AC-010 | F002 | `按月 / 按周 / 按日` 模式下，当前周期尚未形成有效汇率 | 用户创建报价单 | 系统按上一个已生效周期汇率计算 |
| AC-011 | F002 | 报价状态为 `待提交审核` 或 `待审核`，且后续出现新汇率或模式切换 | 用户查看该报价或继续流转审核 | 系统继续沿用创建报价时的汇率，不自动改算 |
| AC-012 | F002 | 报价状态为 `待提交审核` 或 `审核不通过` | 用户进入重新编辑该报价 | 系统在进入编辑时立即按当前生效汇率模式重新获取汇率，并按该汇率实时计算报价 |
| AC-013 | F002 | 用户已进入本次重新编辑，且系统已获取当前生效模式对应汇率 | 用户完成保存 | 系统沿用进入本次编辑时已获取的汇率作为该报价更新后的汇率快照并进入后续状态流转 |
| AC-014 | F003 | 后台维护报价项价格配置 | 用户查看或编辑报价项价格 | 系统展示并保存该报价项的 `工时`、`固定成本`、`系数` |
| AC-015 | F003 | 后台维护汇率设置 | 用户切换当前汇率模式 | 系统保存并生效所选 `按月 / 按周 / 按日 / 实时` 模式 |
| AC-016 | F003 | 某报价项存在旧价格、工时、固定成本数据 | 系统执行迁移换算 | 系统按 `（旧日元价格 ÷ 20）÷（工时 × 固定成本）` 正确生成系数 |
| AC-017 | F003 | 系统已读取报价项 `工时`、`固定成本`、`系数` 与当前已生效计算汇率 | 用户创建报价、查看报价结果或导出报价 | 系统按 `工时 × 固定成本 × 系数 × 汇率` 计算并展示金额 |
| AC-018 | F003 | 示例报价项 `阳台外立面数` 的工时为 `1.5`，固定成本为 `100`，旧价格为 `9000` 日元，汇率为 `20` | 系统执行迁移与计算 | 系数结果为 `3`，新公式计算结果仍为 `9000` 日元 |
| AC-019 | F003 | 原有数量、区间或参数规则已生效 | 系统执行金额计算 | 系统保留原有业务计价条件，仅将金额公式切换为 `工时 × 固定成本 × 系数 × 汇率` |

### 8. 发布计划

| 里程碑 | 日期 | 内容 |
|--------|------|------|
| PRD 评审 | 待排期 | 确认管理员与超级管理员新建用户角色范围 |
| 规则评审 | 待排期 | 确认 `按月 / 按周 / 按日 / 实时` 四种汇率模式口径、周期取值和重新编辑汇率口径 |
| 规则评审 | 待排期 | 确认旧价格还原规则、后台可修改的 `工时 / 固定成本 / 系数 / 汇率模式`、系数迁移公式与新报价公式 |
| 开发联调 | 待排期 | 完成后台用户管理表单角色限制实现 |
| 开发联调 | 待排期 | 完成汇率更新、基础价格换算、报价计算和状态流转联调 |
| 正式发布 | 待排期 | 纳入后台 `V1.2.3` 发布 |

### 9. 风险与依赖

| 风险/依赖 | 类型 | 影响 | 应对 |
|-----------|------|------|------|
| 前后端角色限制不一致 | 风险 | 高 | 前端展示限制与后端提交校验同步落地 |
| 后续角色体系继续扩展 | 依赖 | 中 | 角色映射集中维护，避免在多个页面逻辑中重复写死 |
| 汇率模式定义不清或数据源切换不一致 | 风险 | 高 | 明确四种模式的取值规则、更新时间和回退规则，并统一前后台实现 |
| 重新编辑汇率规则与既有报价配置快照规则混淆 | 风险 | 中 | 在实现和测试中明确区分“配置快照”与“汇率快照”两套口径 |
| 工时、固定成本、系数口径与前台试算公式未同步 | 风险 | 高 | 统一以 `工时 × 固定成本 × 系数 × 汇率` 作为前后台唯一公式并联调验收 |
