feat(web): 新增车辆氢费明细台账页面及需求文档
包含氢费录入、保存对账、筛选导入导出、异常标黄与需求明细弹窗等功能原型。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
394
web端/台账数据/车辆氢费明细-需求内容.js
Normal file
394
web端/台账数据/车辆氢费明细-需求内容.js
Normal file
@@ -0,0 +1,394 @@
|
||||
// 车辆氢费明细 PRD 正文(与 车辆氢费明细-需求文档.md 同步)
|
||||
var H2_LEDGER_REQUIREMENT_DOC = `# 车辆氢费明细 — 产品需求说明(PRD)
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 文档版本 | v2.0(业务版) |
|
||||
| 产品模块 | 台账数据 → 车辆氢费明细 |
|
||||
| 文档类型 | 产品需求说明 |
|
||||
| 适用读者 | 产品、业务、运营、测试、项目 |
|
||||
| 修订说明 | 从业务与使用场景出发描述需求,不展开技术实现细节 |
|
||||
|
||||
---
|
||||
|
||||
## 一、为什么做这件事
|
||||
|
||||
### 1.1 业务痛点
|
||||
|
||||
- 车辆加氢费用分散在业务同事手工记录中,缺少统一台账,难以按客户、站点、时间核对。
|
||||
- 录入后需区分「是否已正式提交」「是否已完成对账」,避免未核实数据进入对账与结算环节。
|
||||
- 加氢量偏大、单价与公司在该站该时段的标准价不一致等情况,需要**提前暴露**,减少后续财务纠纷。
|
||||
|
||||
### 1.2 产品价值
|
||||
|
||||
| 价值点 | 说明 |
|
||||
|--------|------|
|
||||
| 统一台账 | 一条记录对应一次加氢业务,关联车辆、客户、站点与金额 |
|
||||
| 流程可控 | 待保存 → 未对账 → 已对账,责任边界清晰 |
|
||||
| 效率提升 | 支持批量导入、批量改价、复制同类记录 |
|
||||
| 风险可见 | 异常数据标黄,可一键只看有问题记录 |
|
||||
| 可追溯 | 关键修改留痕,便于主管复核与客诉查证 |
|
||||
|
||||
### 1.3 本期目标
|
||||
|
||||
建设 Web 端「车辆氢费明细」页面,支撑业务人员**查询、录入、保存、对账、导入导出**全流程;财务相关字段(开票、付款等)由系统按客户等信息自动带出,减少手工填写错误。
|
||||
|
||||
### 1.4 本期不做
|
||||
|
||||
- 多级审批流、与 ERP 自动过账(可后续迭代)。
|
||||
- 按组织架构的复杂数据权限(本期按「业务员 / 主管」两类角色描述,上线后对接权限中心)。
|
||||
- 导入文件格式的完整兼容方案以业务验收为准(需支持模板化批量录入)。
|
||||
|
||||
---
|
||||
|
||||
## 二、谁在用、用来干什么
|
||||
|
||||
### 2.1 用户角色
|
||||
|
||||
| 角色 | 典型诉求 |
|
||||
|------|----------|
|
||||
| **业务员** | 日常录入加氢记录;批量导入历史数据;保存后推进对账;导出给财务或客户核对 |
|
||||
| **主管** | 复核异常数据;必要时修正或删除**已对账**记录;查看变更记录 |
|
||||
|
||||
### 2.2 核心使用场景(用户故事)
|
||||
|
||||
1. **单笔补录**
|
||||
业务员得知某车在某站加氢后,在页面新增一行,填写时间、站点、车牌、加氢量与单价,保存后进入「未对账」列表等待勾选完成对账。
|
||||
|
||||
2. **批量导入历史**
|
||||
业务员下载模板,在 Excel 中整理多笔记录后上传,系统生成多条状态为「未对账」数据。
|
||||
|
||||
3. **日常对账**
|
||||
业务员按客户或时间筛选「未对账」记录,勾选确认无误后点击「完成对账」,数据变为「已对账」,本人不可再随意修改。
|
||||
|
||||
4. **异常排查**
|
||||
业务员勾选「仅显示异常数据」,优先处理加氢量过大(>60kg)或单价与标准不一致的记录,修正后再保存或对账。
|
||||
|
||||
5. **主管纠错**
|
||||
已对账数据发现错误,主管进入编辑后修改;业务员侧编辑/删除按钮不可用,需联系主管处理。
|
||||
|
||||
6. **导出报送**
|
||||
业务员按筛选条件导出「未对账 + 已对账」正式数据(不含尚未保存的草稿),自选列字段生成表格文件。
|
||||
|
||||
---
|
||||
|
||||
## 三、业务主流程
|
||||
|
||||
### 3.1 端到端流程(推荐操作顺序)
|
||||
|
||||
\`\`\`mermaid
|
||||
flowchart LR
|
||||
A[录入/复制] --> B[待保存]
|
||||
B --> C[点击保存]
|
||||
C[保存/导入] --> D[未对账]
|
||||
D --> E[勾选并完成对账]
|
||||
E --> F[已对账]
|
||||
\`\`\`
|
||||
|
||||
**说明:**
|
||||
|
||||
- **待保存**:草稿态,可反复修改;尚未进入对账池。
|
||||
- **未对账**:已保存的正式数据,可「编辑」「删除」勾选「完成对账」。
|
||||
- **已对账**:对账完成,业务员不可改删;主管可特殊处理「编辑」「删除」。
|
||||
|
||||
### 3.2 「保存」与「完成对账」的区别
|
||||
|
||||
| 操作 | 业务含义 | 对象 | 结果 |
|
||||
|------|----------|------|------|
|
||||
| **保存** | 将草稿确认为可参与对账的正式记录 | 当前页所有「待保存」记录 | 全部变为「未对账」 |
|
||||
| **完成对账** | 确认与客户/内部核对无误,结案 | 用户勾选的「未对账」记录 | 变为「已对账」 |
|
||||
|
||||
**保存前校验:** 必填项未填完整时,在对应格子标红提示,**不弹出成功提示**,也不变更状态。
|
||||
|
||||
**完成对账前确认:** 系统提示「完成对账后只能联系主管修改」,用户确认后执行。
|
||||
|
||||
---
|
||||
|
||||
## 四、页面功能说明(业务视角)
|
||||
|
||||
### 4.1 页面组成
|
||||
|
||||
用户进入「台账数据 → 车辆氢费明细」后,自上而下为:
|
||||
|
||||
1. **查询条件区** — 按时间、订单、车辆、客户等筛选
|
||||
2. **数据列表区** — 展示氢费明细、合计、操作按钮
|
||||
3. **弹窗** — 批量导入、批量导出、变更日志
|
||||
|
||||
列表下方提供 **「新增一行」**,用于手工补录。
|
||||
|
||||
### 4.2 查询条件
|
||||
|
||||
**交互原则:** 修改条件后不会立刻刷新列表,需点击 **「查询」** 才生效;**「重置」** 清空条件并恢复全量展示。
|
||||
|
||||
**默认展示:** 第一行条件(加氢时间、订单编号、查询按钮);点击 **「展开」** 可看到更多条件。
|
||||
|
||||
| 查询项 | 业务说明 |
|
||||
|--------|----------|
|
||||
| 加氢时间 | 起止日期范围 |
|
||||
| 订单编号 | 支持模糊搜索 |
|
||||
| 车牌号 | 从公司车辆库选择 |
|
||||
| 客户名称 | 从客户库选择 |
|
||||
| 加氢站名称 | 从加氢站库选择 |
|
||||
| 业务员 | 按客户归属业务员筛选 |
|
||||
| 结算状态 | 客户承担 / 我司承担 |
|
||||
| 付款状态 | 未付款 / 已付款 / 部分付款 |
|
||||
| 开票公司 | 从开票主体选择 |
|
||||
|
||||
查询成功给予简短成功提示。
|
||||
|
||||
**与列表的关系:**
|
||||
|
||||
- 列表默认展示符合查询条件的记录。
|
||||
- **例外:** 本人刚新增、尚未保存的记录,即使暂时不符合筛选条件,也会显示在列表中,避免「点了新增却找不到行」。
|
||||
- **「仅显示异常数据」** 开启时,只展示有风险提示的记录;本人待保存的新增行仍会显示,以免录入中断。
|
||||
|
||||
### 4.3 列表展示规则
|
||||
|
||||
**分区展示(便于扫读):**
|
||||
|
||||
| 区域顺序(上→下) | 记录状态 | 排序习惯 |
|
||||
|-------------------|----------|----------|
|
||||
| 第一区 | 已对账 | 加氢时间新的在前 |
|
||||
| 第二区 | 未对账 | 加氢时间新的在前 |
|
||||
| 第三区 | 待保存 | 先录入的在前,新加的靠下 |
|
||||
|
||||
不同区域之间有明显分隔,已对账区背景略灰、待保存区背景略黄,降低误操作概率。
|
||||
|
||||
**底部合计:** 对当前列表可见记录,合计 **加氢量、成本总价、加氢总价**(随筛选与「仅看异常」变化)。
|
||||
|
||||
**列表勾选:** 仅 **未对账** 记录可勾选,用于批量「完成对账」。
|
||||
|
||||
### 4.4 工具栏操作
|
||||
|
||||
从左到右、从业务使用频率排列:
|
||||
|
||||
| 按钮 | 业务作用 |
|
||||
|------|----------|
|
||||
| 仅显示异常数据 | 开关,快速聚焦有风险提示的记录 |
|
||||
| 批量导入 | 按模板上传多条待保存记录 |
|
||||
| 批量导出 | 按当前查询条件导出正式数据 |
|
||||
| 保存 | 将全部待保存记录提交为未对账 |
|
||||
| 完成对账 | 将勾选的未对账记录结案为已对账 |
|
||||
|
||||
---
|
||||
|
||||
## 五、单条记录:填什么、怎么算
|
||||
|
||||
### 5.1 用户可见字段说明
|
||||
|
||||
| 信息项 | 用户是否填写 | 业务说明 |
|
||||
|--------|--------------|----------|
|
||||
| 状态 | 否 | 展示「未对账」「已对账」;待保存不显示标签 |
|
||||
| 订单编号 | 否 | 系统按规则自动生成,不可改 |
|
||||
| 加氢时间 | 是* | 精确到秒,必填 |
|
||||
| 加氢日期 | 否 | 由加氢时间自动得出 |
|
||||
| 加氢站名称 | 是* | 必选 |
|
||||
| 车牌号 | 是* | 必选,须为公司登记车辆 |
|
||||
| 行驶里程 | 否 | 选填,用于业务留痕 |
|
||||
| 加氢量(kg) | 是* | 必填,用于算总价 |
|
||||
| 成本单价 | 是* | 必填,向站点的采购成本价 |
|
||||
| 成本总价 | 否 | 加氢量 × 成本单价,自动计算 |
|
||||
| 客户名称 | 是* | 必选,决定业务员与财务带出信息 |
|
||||
| 加氢单价 | 是* | 必填,对客户的销售单价 |
|
||||
| 加氢总价 | 否 | 加氢量 × 加氢单价,自动计算 |
|
||||
| 业务员 | 否 | 选客户后自动带出 |
|
||||
| 结算状态 | 是* | 客户承担 / 我司承担 |
|
||||
| 开票日期 | 否 | 系统按客户等业务规则带出 |
|
||||
| 对账日期 | 否 | 系统带出 |
|
||||
| 付款状态 | 否 | 系统带出 |
|
||||
| 开票公司 | 否 | 系统带出 |
|
||||
| 备注 | 否 | 自由文本 |
|
||||
|
||||
\\* 保存时校验,缺失则标红提示。
|
||||
|
||||
### 5.2 订单编号规则(业务口径)
|
||||
|
||||
便于业务与财务对齐、按站按日追溯:
|
||||
|
||||
- 编号以 **JQ** 开头,后接 **加氢站编码**、**加氢日期(6 位)**、**当日流水号(5 位)**。
|
||||
- 同一加氢站、同一天内,按加氢时间先后依次编号,每日从 1 号起。
|
||||
- 用户无需手填,保存或数据重算时由系统生成。
|
||||
|
||||
### 5.3 金额计算
|
||||
|
||||
- **成本总价** = 加氢量 × 成本单价(保留两位小数)
|
||||
- **加氢总价** = 加氢量 × 加氢单价(保留两位小数)
|
||||
|
||||
任一项未填齐时,对应总价为空,填齐后自动更新。
|
||||
|
||||
---
|
||||
|
||||
## 六、谁能改、谁能删
|
||||
|
||||
### 6.1 按状态的权限(业务员 vs 主管)
|
||||
|
||||
| 数据状态 | 业务员 | 主管 |
|
||||
|----------|--------|------|
|
||||
| 待保存(本人录入) | 可直接改表格;可复制、删除 | 同业务员(本期不单独区分待保存) |
|
||||
| 待保存(他人录入) | 不可见或不可改(按账号权限,上线后明确) | — |
|
||||
| 未对账 | 需点「编辑」后才能改;可复制、删除;可勾选完成对账 | 同业务员 |
|
||||
| 已对账 | 不可编辑、不可删除(按钮灰显+提示联系主管) | 可点「编辑」修改;可删除 |
|
||||
|
||||
### 6.2 行内操作说明
|
||||
|
||||
| 操作 | 适用情况 | 业务说明 |
|
||||
|------|----------|----------|
|
||||
| 编辑 | 未对账、已对账(主管) | 进入编辑模式后方可改单元格;待保存无需点编辑 |
|
||||
| 复制 | 未对账、本人待保存 | 可一次复制 1~100 条相似记录,生成新的待保存行 |
|
||||
| 删除 | 未对账、本人待保存;已对账仅主管 | 二次确认后删除 |
|
||||
| 更多 → 变更日志 | 未对账、已对账 | 查看该条历史修改记录 |
|
||||
|
||||
---
|
||||
|
||||
## 七、异常数据(标黄)— 业务规则
|
||||
|
||||
### 7.1 什么是「异常」
|
||||
|
||||
系统在列表中用**黄色背景**提示以下三类情况(不影响保存,但需业务留意):
|
||||
|
||||
| 异常类型 | 判定逻辑(业务语言) | 用户看到的提示 |
|
||||
|----------|----------------------|----------------|
|
||||
| 加氢量偏大 | 单次加氢量超过 60 kg | 加氢量疑似有误 |
|
||||
| 成本单价异常 | 所填成本单价与「该站该时段公司标准成本价」不一致 | 成本单价与系统该时间段不一致 |
|
||||
| 加氢单价异常 | 所填加氢单价与「该站该时段公司标准对客户价」不一致 | 加氢单价与系统该时间段不一致 |
|
||||
|
||||
标准价随 **加氢站 + 加氢时间** 匹配;若公司未配置该站该时段价格,则不提示单价类异常。
|
||||
|
||||
### 7.2 「仅显示异常数据」
|
||||
|
||||
- 默认关闭,展示符合查询条件的全部记录(含待保存例外规则)。
|
||||
- 开启后只显示至少有一项异常提示的记录,方便集中核对。
|
||||
- **导出不受此开关影响**(见下文)。
|
||||
|
||||
---
|
||||
|
||||
## 八、批量能力
|
||||
|
||||
### 8.1 表头批量改价 / 改结算
|
||||
|
||||
- 在 **成本单价**、**加氢单价** 列表头可批量填入统一单价,作用于当前可编辑的所有记录(待保存 + 未对账)。
|
||||
- 在 **结算状态** 列表头可批量改为「客户承担」或「我司承担」。
|
||||
- **已对账** 记录不参与批量修改。
|
||||
|
||||
### 8.2 批量导入
|
||||
|
||||
**适用:** 历史数据、线下表格整理后的批量录入。
|
||||
|
||||
**流程:**
|
||||
|
||||
1. 点击「批量导入」→ 下载标准模板
|
||||
2. 按模板填写(无需填开票日期、对账日期、付款状态、开票公司)
|
||||
3. 上传文件 → 系统生成多条 **待保存** 记录
|
||||
4. 业务核对列表 → 点击 **保存** 进入未对账
|
||||
|
||||
**模板包含列:** 加氢时间、加氢站名称、车牌号、行驶里程、加氢量、成本单价、客户名称、加氢单价、结算状态、备注。
|
||||
|
||||
**导入后状态:** 均为待保存,与手工新增一致,须保存后才参与对账与导出。
|
||||
|
||||
### 8.3 批量导出
|
||||
|
||||
**适用:** 向财务、客户或内部汇报正式台账。
|
||||
|
||||
**规则:**
|
||||
|
||||
- 导出范围 = **当前查询条件下** 的 **未对账 + 已对账** 数据。
|
||||
- **不包含待保存**(草稿不对外报送)。
|
||||
- **不受**「仅显示异常数据」开关限制。
|
||||
- 弹窗文案:「请选择导出的列」;支持全选/取消全选;默认勾选全部可导出列。
|
||||
- 无符合条件数据时提示:暂无未对账或已对账数据可导出。
|
||||
|
||||
**可导出列(业务名称):** 序号、状态、订单编号、加氢时间、加氢日期、加氢站名称、车牌号、行驶里程、加氢量、成本单价、成本总价、客户名称、加氢单价、加氢总价、业务员、结算状态、开票日期、对账日期、付款状态、开票公司、备注。
|
||||
|
||||
---
|
||||
|
||||
## 九、变更日志
|
||||
|
||||
### 9.1 记录什么
|
||||
|
||||
满足审计与纠纷查证,以下变化需留痕:
|
||||
|
||||
- 保存(待保存 → 未对账)
|
||||
- 完成对账(未对账 → 已对账)
|
||||
- 各业务字段修改(前后值不同)
|
||||
- 新增、复制、批量导入产生记录
|
||||
|
||||
### 9.2 怎么查看
|
||||
|
||||
在操作列点击 **「更多」→ 变更日志**,弹窗展示:
|
||||
|
||||
- 修改时间、修改人、修改字段、修改前(红)、修改后(绿)
|
||||
- 按时间倒序排列
|
||||
|
||||
---
|
||||
|
||||
## 十、业务规则汇总(验收必读)
|
||||
|
||||
### 10.1 保存
|
||||
|
||||
- 一次保存处理页面上**全部**待保存记录。
|
||||
- 必填:加氢时间、加氢站、车牌(须为登记车辆)、客户、加氢量、成本单价、加氢单价、结算状态。
|
||||
- 校验失败:仅格子标红,无「保存成功」类提示。
|
||||
|
||||
### 10.2 完成对账
|
||||
|
||||
- 必须先勾选未对账记录。
|
||||
- 仅未对账可勾选。
|
||||
- 确认文案强调:完成后需主管才能改。
|
||||
|
||||
### 10.3 筛选与列表
|
||||
|
||||
- 查询点击后生效;重置恢复。
|
||||
- 筛选后合计与所见列表一致。
|
||||
- 本人待保存新增行在筛选后仍可见。
|
||||
|
||||
### 10.4 导出
|
||||
|
||||
- 仅未对账、已对账;遵循查询条件;可自选列。
|
||||
|
||||
### 10.5 复制
|
||||
|
||||
- 单次最多 100 条;生成待保存记录。
|
||||
|
||||
---
|
||||
|
||||
## 十一、业务验收场景(UAT 建议)
|
||||
|
||||
| 编号 | 场景 | 预期结果 |
|
||||
|------|------|----------|
|
||||
| U1 | 新增一行并填齐必填项后保存 | 变为未对账,出现订单编号 |
|
||||
| U2 | 必填项缺一项点保存 | 对应格标红,状态仍为待保存 |
|
||||
| U3 | 勾选多条未对账并完成对账 | 变为已对账,业务员不可改删 |
|
||||
| U4 | 业务员打开已对账记录 | 编辑/删除不可用,有主管联系提示 |
|
||||
| U5 | 加氢量填 65kg | 单元格标黄,提示加氢量疑似有误 |
|
||||
| U6 | 单价填与标准价不一致 | 标黄并提示与系统该时段不一致 |
|
||||
| U7 | 开启「仅显示异常数据」 | 仅异常记录可见,本人新加待保存仍可见 |
|
||||
| U8 | 设置筛选后导出 | 仅导出未对账+已对账且符合筛选的数据 |
|
||||
| U9 | 导入模板 5 条后保存 | 5 条均变未对账 |
|
||||
| U10 | 未对账记录点编辑后改客户 | 业务员、开票信息等随客户更新,变更日志有记录 |
|
||||
|
||||
---
|
||||
|
||||
## 十二、名词与枚举(业务词典)
|
||||
|
||||
| 名词 | 含义 |
|
||||
|------|------|
|
||||
| 待保存 | 草稿,未进入对账流程 |
|
||||
| 未对账 | 已保存,等待业务确认并完成对账 |
|
||||
| 已对账 | 对账完成,业务员不可随意改动 |
|
||||
| 客户承担 | 氢费由客户结算 |
|
||||
| 我司承担 | 氢费由公司承担 |
|
||||
| 未付款 / 已付款 / 部分付款 | 系统带出的付款进度,业务只读 |
|
||||
| 标准价 | 公司维护的、按加氢站与生效时段确定的参考单价 |
|
||||
|
||||
---
|
||||
|
||||
## 十三、版本与协作说明
|
||||
|
||||
- 本文档描述的是 **车辆氢费明细** 页面当前已对齐的产品行为,供评审、培训与 UAT 使用。
|
||||
- 研发实现细节、接口定义、字段编码见单独的技术设计文档(如有)。
|
||||
- 需求变更请更新本文档版本号,并在评审纪要中注明影响章节。
|
||||
|
||||
---
|
||||
|
||||
**文档结束**
|
||||
`;
|
||||
392
web端/台账数据/车辆氢费明细-需求文档.md
Normal file
392
web端/台账数据/车辆氢费明细-需求文档.md
Normal file
@@ -0,0 +1,392 @@
|
||||
# 车辆氢费明细 — 产品需求说明(PRD)
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 文档版本 | v2.0(业务版) |
|
||||
| 产品模块 | 台账数据 → 车辆氢费明细 |
|
||||
| 文档类型 | 产品需求说明 |
|
||||
| 适用读者 | 产品、业务、运营、测试、项目 |
|
||||
| 修订说明 | 从业务与使用场景出发描述需求,不展开技术实现细节 |
|
||||
|
||||
---
|
||||
|
||||
## 一、为什么做这件事
|
||||
|
||||
### 1.1 业务痛点
|
||||
|
||||
- 车辆加氢费用分散在业务同事手工记录中,缺少统一台账,难以按客户、站点、时间核对。
|
||||
- 录入后需区分「是否已正式提交」「是否已完成对账」,避免未核实数据进入对账与结算环节。
|
||||
- 加氢量偏大、单价与公司在该站该时段的标准价不一致等情况,需要**提前暴露**,减少后续财务纠纷。
|
||||
|
||||
### 1.2 产品价值
|
||||
|
||||
| 价值点 | 说明 |
|
||||
|--------|------|
|
||||
| 统一台账 | 一条记录对应一次加氢业务,关联车辆、客户、站点与金额 |
|
||||
| 流程可控 | 待保存 → 未对账 → 已对账,责任边界清晰 |
|
||||
| 效率提升 | 支持批量导入、批量改价、复制同类记录 |
|
||||
| 风险可见 | 异常数据标黄,可一键只看有问题记录 |
|
||||
| 可追溯 | 关键修改留痕,便于主管复核与客诉查证 |
|
||||
|
||||
### 1.3 本期目标
|
||||
|
||||
建设 Web 端「车辆氢费明细」页面,支撑业务人员**查询、录入、保存、对账、导入导出**全流程;财务相关字段(开票、付款等)由系统按客户等信息自动带出,减少手工填写错误。
|
||||
|
||||
### 1.4 本期不做
|
||||
|
||||
- 多级审批流、与 ERP 自动过账(可后续迭代)。
|
||||
- 按组织架构的复杂数据权限(本期按「业务员 / 主管」两类角色描述,上线后对接权限中心)。
|
||||
- 导入文件格式的完整兼容方案以业务验收为准(需支持模板化批量录入)。
|
||||
|
||||
---
|
||||
|
||||
## 二、谁在用、用来干什么
|
||||
|
||||
### 2.1 用户角色
|
||||
|
||||
| 角色 | 典型诉求 |
|
||||
|------|----------|
|
||||
| **业务员** | 日常录入加氢记录;批量导入历史数据;保存后推进对账;导出给财务或客户核对 |
|
||||
| **主管** | 复核异常数据;必要时修正或删除**已对账**记录;查看变更记录 |
|
||||
|
||||
### 2.2 核心使用场景(用户故事)
|
||||
|
||||
1. **单笔补录**
|
||||
业务员得知某车在某站加氢后,在页面新增一行,填写时间、站点、车牌、加氢量与单价,保存后进入「未对账」列表等待勾选完成对账。
|
||||
|
||||
2. **批量导入历史**
|
||||
业务员下载模板,在 Excel 中整理多笔记录后上传,系统生成多条状态为「未对账」数据。
|
||||
|
||||
3. **日常对账**
|
||||
业务员按客户或时间筛选「未对账」记录,勾选确认无误后点击「完成对账」,数据变为「已对账」,本人不可再随意修改。
|
||||
|
||||
4. **异常排查**
|
||||
业务员勾选「仅显示异常数据」,优先处理加氢量过大(>60kg)或单价与标准不一致的记录,修正后再保存或对账。
|
||||
|
||||
5. **主管纠错**
|
||||
已对账数据发现错误,主管进入编辑后修改;业务员侧编辑/删除按钮不可用,需联系主管处理。
|
||||
|
||||
6. **导出报送**
|
||||
业务员按筛选条件导出「未对账 + 已对账」正式数据(不含尚未保存的草稿),自选列字段生成表格文件。
|
||||
|
||||
---
|
||||
|
||||
## 三、业务主流程
|
||||
|
||||
### 3.1 端到端流程(推荐操作顺序)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[录入/复制] --> B[待保存]
|
||||
B --> C[点击保存]
|
||||
C[保存/导入] --> D[未对账]
|
||||
D --> E[勾选并完成对账]
|
||||
E --> F[已对账]
|
||||
```
|
||||
|
||||
**说明:**
|
||||
|
||||
- **待保存**:草稿态,可反复修改;尚未进入对账池。
|
||||
- **未对账**:已保存的正式数据,可「编辑」「删除」勾选「完成对账」。
|
||||
- **已对账**:对账完成,业务员不可改删;主管可特殊处理「编辑」「删除」。
|
||||
|
||||
### 3.2 「保存」与「完成对账」的区别
|
||||
|
||||
| 操作 | 业务含义 | 对象 | 结果 |
|
||||
|------|----------|------|------|
|
||||
| **保存** | 将草稿确认为可参与对账的正式记录 | 当前页所有「待保存」记录 | 全部变为「未对账」 |
|
||||
| **完成对账** | 确认与客户/内部核对无误,结案 | 用户勾选的「未对账」记录 | 变为「已对账」 |
|
||||
|
||||
**保存前校验:** 必填项未填完整时,在对应格子标红提示,**不弹出成功提示**,也不变更状态。
|
||||
|
||||
**完成对账前确认:** 系统提示「完成对账后只能联系主管修改」,用户确认后执行。
|
||||
|
||||
---
|
||||
|
||||
## 四、页面功能说明(业务视角)
|
||||
|
||||
### 4.1 页面组成
|
||||
|
||||
用户进入「台账数据 → 车辆氢费明细」后,自上而下为:
|
||||
|
||||
1. **查询条件区** — 按时间、订单、车辆、客户等筛选
|
||||
2. **数据列表区** — 展示氢费明细、合计、操作按钮
|
||||
3. **弹窗** — 批量导入、批量导出、变更日志
|
||||
|
||||
列表下方提供 **「新增一行」**,用于手工补录。
|
||||
|
||||
### 4.2 查询条件
|
||||
|
||||
**交互原则:** 修改条件后不会立刻刷新列表,需点击 **「查询」** 才生效;**「重置」** 清空条件并恢复全量展示。
|
||||
|
||||
**默认展示:** 第一行条件(加氢时间、订单编号、查询按钮);点击 **「展开」** 可看到更多条件。
|
||||
|
||||
| 查询项 | 业务说明 |
|
||||
|--------|----------|
|
||||
| 加氢时间 | 起止日期范围 |
|
||||
| 订单编号 | 支持模糊搜索 |
|
||||
| 车牌号 | 从公司车辆库选择 |
|
||||
| 客户名称 | 从客户库选择 |
|
||||
| 加氢站名称 | 从加氢站库选择 |
|
||||
| 业务员 | 按客户归属业务员筛选 |
|
||||
| 结算状态 | 客户承担 / 我司承担 |
|
||||
| 付款状态 | 未付款 / 已付款 / 部分付款 |
|
||||
| 开票公司 | 从开票主体选择 |
|
||||
|
||||
查询成功给予简短成功提示。
|
||||
|
||||
**与列表的关系:**
|
||||
|
||||
- 列表默认展示符合查询条件的记录。
|
||||
- **例外:** 本人刚新增、尚未保存的记录,即使暂时不符合筛选条件,也会显示在列表中,避免「点了新增却找不到行」。
|
||||
- **「仅显示异常数据」** 开启时,只展示有风险提示的记录;本人待保存的新增行仍会显示,以免录入中断。
|
||||
|
||||
### 4.3 列表展示规则
|
||||
|
||||
**分区展示(便于扫读):**
|
||||
|
||||
| 区域顺序(上→下) | 记录状态 | 排序习惯 |
|
||||
|-------------------|----------|----------|
|
||||
| 第一区 | 已对账 | 加氢时间新的在前 |
|
||||
| 第二区 | 未对账 | 加氢时间新的在前 |
|
||||
| 第三区 | 待保存 | 先录入的在前,新加的靠下 |
|
||||
|
||||
不同区域之间有明显分隔,已对账区背景略灰、待保存区背景略黄,降低误操作概率。
|
||||
|
||||
**底部合计:** 对当前列表可见记录,合计 **加氢量、成本总价、加氢总价**(随筛选与「仅看异常」变化)。
|
||||
|
||||
**列表勾选:** 仅 **未对账** 记录可勾选,用于批量「完成对账」。
|
||||
|
||||
### 4.4 工具栏操作
|
||||
|
||||
从左到右、从业务使用频率排列:
|
||||
|
||||
| 按钮 | 业务作用 |
|
||||
|------|----------|
|
||||
| 仅显示异常数据 | 开关,快速聚焦有风险提示的记录 |
|
||||
| 批量导入 | 按模板上传多条待保存记录 |
|
||||
| 批量导出 | 按当前查询条件导出正式数据 |
|
||||
| 保存 | 将全部待保存记录提交为未对账 |
|
||||
| 完成对账 | 将勾选的未对账记录结案为已对账 |
|
||||
|
||||
---
|
||||
|
||||
## 五、单条记录:填什么、怎么算
|
||||
|
||||
### 5.1 用户可见字段说明
|
||||
|
||||
| 信息项 | 用户是否填写 | 业务说明 |
|
||||
|--------|--------------|----------|
|
||||
| 状态 | 否 | 展示「未对账」「已对账」;待保存不显示标签 |
|
||||
| 订单编号 | 否 | 系统按规则自动生成,不可改 |
|
||||
| 加氢时间 | 是* | 精确到秒,必填 |
|
||||
| 加氢日期 | 否 | 由加氢时间自动得出 |
|
||||
| 加氢站名称 | 是* | 必选 |
|
||||
| 车牌号 | 是* | 必选,须为公司登记车辆 |
|
||||
| 行驶里程 | 否 | 选填,用于业务留痕 |
|
||||
| 加氢量(kg) | 是* | 必填,用于算总价 |
|
||||
| 成本单价 | 是* | 必填,向站点的采购成本价 |
|
||||
| 成本总价 | 否 | 加氢量 × 成本单价,自动计算 |
|
||||
| 客户名称 | 是* | 必选,决定业务员与财务带出信息 |
|
||||
| 加氢单价 | 是* | 必填,对客户的销售单价 |
|
||||
| 加氢总价 | 否 | 加氢量 × 加氢单价,自动计算 |
|
||||
| 业务员 | 否 | 选客户后自动带出 |
|
||||
| 结算状态 | 是* | 客户承担 / 我司承担 |
|
||||
| 开票日期 | 否 | 系统按客户等业务规则带出 |
|
||||
| 对账日期 | 否 | 系统带出 |
|
||||
| 付款状态 | 否 | 系统带出 |
|
||||
| 开票公司 | 否 | 系统带出 |
|
||||
| 备注 | 否 | 自由文本 |
|
||||
|
||||
\* 保存时校验,缺失则标红提示。
|
||||
|
||||
### 5.2 订单编号规则(业务口径)
|
||||
|
||||
便于业务与财务对齐、按站按日追溯:
|
||||
|
||||
- 编号以 **JQ** 开头,后接 **加氢站编码**、**加氢日期(6 位)**、**当日流水号(5 位)**。
|
||||
- 同一加氢站、同一天内,按加氢时间先后依次编号,每日从 1 号起。
|
||||
- 用户无需手填,保存或数据重算时由系统生成。
|
||||
|
||||
### 5.3 金额计算
|
||||
|
||||
- **成本总价** = 加氢量 × 成本单价(保留两位小数)
|
||||
- **加氢总价** = 加氢量 × 加氢单价(保留两位小数)
|
||||
|
||||
任一项未填齐时,对应总价为空,填齐后自动更新。
|
||||
|
||||
---
|
||||
|
||||
## 六、谁能改、谁能删
|
||||
|
||||
### 6.1 按状态的权限(业务员 vs 主管)
|
||||
|
||||
| 数据状态 | 业务员 | 主管 |
|
||||
|----------|--------|------|
|
||||
| 待保存(本人录入) | 可直接改表格;可复制、删除 | 同业务员(本期不单独区分待保存) |
|
||||
| 待保存(他人录入) | 不可见或不可改(按账号权限,上线后明确) | — |
|
||||
| 未对账 | 需点「编辑」后才能改;可复制、删除;可勾选完成对账 | 同业务员 |
|
||||
| 已对账 | 不可编辑、不可删除(按钮灰显+提示联系主管) | 可点「编辑」修改;可删除 |
|
||||
|
||||
### 6.2 行内操作说明
|
||||
|
||||
| 操作 | 适用情况 | 业务说明 |
|
||||
|------|----------|----------|
|
||||
| 编辑 | 未对账、已对账(主管) | 进入编辑模式后方可改单元格;待保存无需点编辑 |
|
||||
| 复制 | 未对账、本人待保存 | 可一次复制 1~100 条相似记录,生成新的待保存行 |
|
||||
| 删除 | 未对账、本人待保存;已对账仅主管 | 二次确认后删除 |
|
||||
| 更多 → 变更日志 | 未对账、已对账 | 查看该条历史修改记录 |
|
||||
|
||||
---
|
||||
|
||||
## 七、异常数据(标黄)— 业务规则
|
||||
|
||||
### 7.1 什么是「异常」
|
||||
|
||||
系统在列表中用**黄色背景**提示以下三类情况(不影响保存,但需业务留意):
|
||||
|
||||
| 异常类型 | 判定逻辑(业务语言) | 用户看到的提示 |
|
||||
|----------|----------------------|----------------|
|
||||
| 加氢量偏大 | 单次加氢量超过 60 kg | 加氢量疑似有误 |
|
||||
| 成本单价异常 | 所填成本单价与「该站该时段公司标准成本价」不一致 | 成本单价与系统该时间段不一致 |
|
||||
| 加氢单价异常 | 所填加氢单价与「该站该时段公司标准对客户价」不一致 | 加氢单价与系统该时间段不一致 |
|
||||
|
||||
标准价随 **加氢站 + 加氢时间** 匹配;若公司未配置该站该时段价格,则不提示单价类异常。
|
||||
|
||||
### 7.2 「仅显示异常数据」
|
||||
|
||||
- 默认关闭,展示符合查询条件的全部记录(含待保存例外规则)。
|
||||
- 开启后只显示至少有一项异常提示的记录,方便集中核对。
|
||||
- **导出不受此开关影响**(见下文)。
|
||||
|
||||
---
|
||||
|
||||
## 八、批量能力
|
||||
|
||||
### 8.1 表头批量改价 / 改结算
|
||||
|
||||
- 在 **成本单价**、**加氢单价** 列表头可批量填入统一单价,作用于当前可编辑的所有记录(待保存 + 未对账)。
|
||||
- 在 **结算状态** 列表头可批量改为「客户承担」或「我司承担」。
|
||||
- **已对账** 记录不参与批量修改。
|
||||
|
||||
### 8.2 批量导入
|
||||
|
||||
**适用:** 历史数据、线下表格整理后的批量录入。
|
||||
|
||||
**流程:**
|
||||
|
||||
1. 点击「批量导入」→ 下载标准模板
|
||||
2. 按模板填写(无需填开票日期、对账日期、付款状态、开票公司)
|
||||
3. 上传文件 → 系统生成多条 **待保存** 记录
|
||||
4. 业务核对列表 → 点击 **保存** 进入未对账
|
||||
|
||||
**模板包含列:** 加氢时间、加氢站名称、车牌号、行驶里程、加氢量、成本单价、客户名称、加氢单价、结算状态、备注。
|
||||
|
||||
**导入后状态:** 均为待保存,与手工新增一致,须保存后才参与对账与导出。
|
||||
|
||||
### 8.3 批量导出
|
||||
|
||||
**适用:** 向财务、客户或内部汇报正式台账。
|
||||
|
||||
**规则:**
|
||||
|
||||
- 导出范围 = **当前查询条件下** 的 **未对账 + 已对账** 数据。
|
||||
- **不包含待保存**(草稿不对外报送)。
|
||||
- **不受**「仅显示异常数据」开关限制。
|
||||
- 弹窗文案:「请选择导出的列」;支持全选/取消全选;默认勾选全部可导出列。
|
||||
- 无符合条件数据时提示:暂无未对账或已对账数据可导出。
|
||||
|
||||
**可导出列(业务名称):** 序号、状态、订单编号、加氢时间、加氢日期、加氢站名称、车牌号、行驶里程、加氢量、成本单价、成本总价、客户名称、加氢单价、加氢总价、业务员、结算状态、开票日期、对账日期、付款状态、开票公司、备注。
|
||||
|
||||
---
|
||||
|
||||
## 九、变更日志
|
||||
|
||||
### 9.1 记录什么
|
||||
|
||||
满足审计与纠纷查证,以下变化需留痕:
|
||||
|
||||
- 保存(待保存 → 未对账)
|
||||
- 完成对账(未对账 → 已对账)
|
||||
- 各业务字段修改(前后值不同)
|
||||
- 新增、复制、批量导入产生记录
|
||||
|
||||
### 9.2 怎么查看
|
||||
|
||||
在操作列点击 **「更多」→ 变更日志**,弹窗展示:
|
||||
|
||||
- 修改时间、修改人、修改字段、修改前(红)、修改后(绿)
|
||||
- 按时间倒序排列
|
||||
|
||||
---
|
||||
|
||||
## 十、业务规则汇总(验收必读)
|
||||
|
||||
### 10.1 保存
|
||||
|
||||
- 一次保存处理页面上**全部**待保存记录。
|
||||
- 必填:加氢时间、加氢站、车牌(须为登记车辆)、客户、加氢量、成本单价、加氢单价、结算状态。
|
||||
- 校验失败:仅格子标红,无「保存成功」类提示。
|
||||
|
||||
### 10.2 完成对账
|
||||
|
||||
- 必须先勾选未对账记录。
|
||||
- 仅未对账可勾选。
|
||||
- 确认文案强调:完成后需主管才能改。
|
||||
|
||||
### 10.3 筛选与列表
|
||||
|
||||
- 查询点击后生效;重置恢复。
|
||||
- 筛选后合计与所见列表一致。
|
||||
- 本人待保存新增行在筛选后仍可见。
|
||||
|
||||
### 10.4 导出
|
||||
|
||||
- 仅未对账、已对账;遵循查询条件;可自选列。
|
||||
|
||||
### 10.5 复制
|
||||
|
||||
- 单次最多 100 条;生成待保存记录。
|
||||
|
||||
---
|
||||
|
||||
## 十一、业务验收场景(UAT 建议)
|
||||
|
||||
| 编号 | 场景 | 预期结果 |
|
||||
|------|------|----------|
|
||||
| U1 | 新增一行并填齐必填项后保存 | 变为未对账,出现订单编号 |
|
||||
| U2 | 必填项缺一项点保存 | 对应格标红,状态仍为待保存 |
|
||||
| U3 | 勾选多条未对账并完成对账 | 变为已对账,业务员不可改删 |
|
||||
| U4 | 业务员打开已对账记录 | 编辑/删除不可用,有主管联系提示 |
|
||||
| U5 | 加氢量填 65kg | 单元格标黄,提示加氢量疑似有误 |
|
||||
| U6 | 单价填与标准价不一致 | 标黄并提示与系统该时段不一致 |
|
||||
| U7 | 开启「仅显示异常数据」 | 仅异常记录可见,本人新加待保存仍可见 |
|
||||
| U8 | 设置筛选后导出 | 仅导出未对账+已对账且符合筛选的数据 |
|
||||
| U9 | 导入模板 5 条后保存 | 5 条均变未对账 |
|
||||
| U10 | 未对账记录点编辑后改客户 | 业务员、开票信息等随客户更新,变更日志有记录 |
|
||||
|
||||
---
|
||||
|
||||
## 十二、名词与枚举(业务词典)
|
||||
|
||||
| 名词 | 含义 |
|
||||
|------|------|
|
||||
| 待保存 | 草稿,未进入对账流程 |
|
||||
| 未对账 | 已保存,等待业务确认并完成对账 |
|
||||
| 已对账 | 对账完成,业务员不可随意改动 |
|
||||
| 客户承担 | 氢费由客户结算 |
|
||||
| 我司承担 | 氢费由公司承担 |
|
||||
| 未付款 / 已付款 / 部分付款 | 系统带出的付款进度,业务只读 |
|
||||
| 标准价 | 公司维护的、按加氢站与生效时段确定的参考单价 |
|
||||
|
||||
---
|
||||
|
||||
## 十三、版本与协作说明
|
||||
|
||||
- 本文档描述的是 **车辆氢费明细** 页面当前已对齐的产品行为,供评审、培训与 UAT 使用。
|
||||
- 研发实现细节、接口定义、字段编码见单独的技术设计文档(如有)。
|
||||
- 需求变更请更新本文档版本号,并在评审纪要中注明影响章节。
|
||||
|
||||
---
|
||||
|
||||
**文档结束**
|
||||
336
web端/台账数据/车辆氢费明细-需求渲染.js
Normal file
336
web端/台账数据/车辆氢费明细-需求渲染.js
Normal file
@@ -0,0 +1,336 @@
|
||||
/** 将 PRD Markdown 排版为 React 节点(车辆氢费明细) */
|
||||
function parsePrdInlineText(text) {
|
||||
var parts = String(text || '').split(/(\*\*[^*]+\*\*)/g);
|
||||
var nodes = [];
|
||||
var i;
|
||||
for (i = 0; i < parts.length; i++) {
|
||||
var p = parts[i];
|
||||
if (!p) continue;
|
||||
if (p.indexOf('**') === 0 && p.lastIndexOf('**') === p.length - 2) {
|
||||
nodes.push(
|
||||
React.createElement('strong', { key: i }, p.slice(2, -2))
|
||||
);
|
||||
} else {
|
||||
nodes.push(p);
|
||||
}
|
||||
}
|
||||
return nodes.length === 1 ? nodes[0] : nodes;
|
||||
}
|
||||
|
||||
function isPrdTableRow(line) {
|
||||
return /^\|.+\|$/.test(String(line || '').trim());
|
||||
}
|
||||
|
||||
function isPrdTableSep(line) {
|
||||
return /^\|[\s\-:|]+\|$/.test(String(line || '').trim());
|
||||
}
|
||||
|
||||
function renderPrdTableRow(line, rowKey, isHeader) {
|
||||
var cells = String(line)
|
||||
.trim()
|
||||
.replace(/^\|/, '')
|
||||
.replace(/\|$/, '')
|
||||
.split('|')
|
||||
.map(function (c) {
|
||||
return c.trim();
|
||||
});
|
||||
return React.createElement(
|
||||
'tr',
|
||||
{ key: rowKey },
|
||||
cells.map(function (cell, ci) {
|
||||
var Tag = isHeader ? 'th' : 'td';
|
||||
return React.createElement(
|
||||
Tag,
|
||||
{
|
||||
key: ci,
|
||||
style: {
|
||||
border: '1px solid #e5e7eb',
|
||||
padding: '8px 10px',
|
||||
textAlign: 'left',
|
||||
verticalAlign: 'top',
|
||||
fontWeight: isHeader ? 600 : 400,
|
||||
background: isHeader ? '#f8fafc' : '#fff',
|
||||
fontSize: 13,
|
||||
lineHeight: 1.5
|
||||
}
|
||||
},
|
||||
parsePrdInlineText(cell)
|
||||
);
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function renderPrdMarkdown(markdown) {
|
||||
var lines = String(markdown || '').split(/\r?\n/);
|
||||
var nodes = [];
|
||||
var i = 0;
|
||||
var inCode = false;
|
||||
var codeBuf = [];
|
||||
|
||||
while (i < lines.length) {
|
||||
var line = lines[i];
|
||||
var trimmed = String(line || '').trim();
|
||||
|
||||
if (trimmed.indexOf('```') === 0) {
|
||||
if (inCode) {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'pre',
|
||||
{
|
||||
key: 'code-' + i,
|
||||
style: {
|
||||
margin: '12px 0',
|
||||
padding: '12px 14px',
|
||||
background: '#f6f8fa',
|
||||
border: '1px solid #e5e7eb',
|
||||
borderRadius: 8,
|
||||
fontSize: 12,
|
||||
lineHeight: 1.6,
|
||||
overflow: 'auto',
|
||||
color: '#334155',
|
||||
whiteSpace: 'pre-wrap'
|
||||
}
|
||||
},
|
||||
codeBuf.join('\n')
|
||||
)
|
||||
);
|
||||
codeBuf = [];
|
||||
inCode = false;
|
||||
} else {
|
||||
inCode = true;
|
||||
}
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (inCode) {
|
||||
codeBuf.push(line);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trimmed === '---') {
|
||||
nodes.push(
|
||||
React.createElement('hr', {
|
||||
key: 'hr-' + i,
|
||||
style: { border: 'none', borderTop: '1px solid #e8ecf0', margin: '20px 0' }
|
||||
})
|
||||
);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isPrdTableRow(trimmed)) {
|
||||
var tableLines = [];
|
||||
while (i < lines.length && isPrdTableRow(String(lines[i]).trim())) {
|
||||
tableLines.push(String(lines[i]).trim());
|
||||
i += 1;
|
||||
}
|
||||
var bodyRows = [];
|
||||
var ti;
|
||||
for (ti = 0; ti < tableLines.length; ti++) {
|
||||
if (isPrdTableSep(tableLines[ti])) continue;
|
||||
bodyRows.push(
|
||||
renderPrdTableRow(tableLines[ti], 'tr-' + i + '-' + ti, ti === 0)
|
||||
);
|
||||
}
|
||||
if (bodyRows.length) {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'div',
|
||||
{
|
||||
key: 'tbl-' + i,
|
||||
style: { overflowX: 'auto', margin: '12px 0 16px' }
|
||||
},
|
||||
React.createElement(
|
||||
'table',
|
||||
{
|
||||
style: {
|
||||
width: '100%',
|
||||
borderCollapse: 'collapse',
|
||||
fontSize: 13
|
||||
}
|
||||
},
|
||||
React.createElement('tbody', null, bodyRows)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!trimmed) {
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trimmed.indexOf('# ') === 0) {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'h1',
|
||||
{
|
||||
key: 'h1-' + i,
|
||||
style: {
|
||||
fontSize: 20,
|
||||
fontWeight: 700,
|
||||
color: '#0f172a',
|
||||
margin: '0 0 16px',
|
||||
lineHeight: 1.35
|
||||
}
|
||||
},
|
||||
parsePrdInlineText(trimmed.slice(2).trim())
|
||||
)
|
||||
);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trimmed.indexOf('## ') === 0) {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'h2',
|
||||
{
|
||||
key: 'h2-' + i,
|
||||
style: {
|
||||
fontSize: 16,
|
||||
fontWeight: 700,
|
||||
color: '#1e293b',
|
||||
margin: '24px 0 12px',
|
||||
paddingBottom: 6,
|
||||
borderBottom: '2px solid #e0f2fe',
|
||||
lineHeight: 1.4
|
||||
}
|
||||
},
|
||||
parsePrdInlineText(trimmed.slice(3).trim())
|
||||
)
|
||||
);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trimmed.indexOf('### ') === 0) {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'h3',
|
||||
{
|
||||
key: 'h3-' + i,
|
||||
style: {
|
||||
fontSize: 14,
|
||||
fontWeight: 600,
|
||||
color: '#334155',
|
||||
margin: '16px 0 8px',
|
||||
lineHeight: 1.45
|
||||
}
|
||||
},
|
||||
parsePrdInlineText(trimmed.slice(4).trim())
|
||||
)
|
||||
);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trimmed === '**文档结束**') {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'div',
|
||||
{
|
||||
key: 'end-' + i,
|
||||
style: {
|
||||
marginTop: 24,
|
||||
paddingTop: 16,
|
||||
borderTop: '1px dashed #e2e8f0',
|
||||
color: '#94a3b8',
|
||||
fontSize: 13,
|
||||
textAlign: 'center'
|
||||
}
|
||||
},
|
||||
'— 文档结束 —'
|
||||
)
|
||||
);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (/^\d+\.\s/.test(trimmed)) {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'div',
|
||||
{
|
||||
key: 'ol-' + i,
|
||||
style: {
|
||||
fontSize: 13,
|
||||
color: '#475569',
|
||||
lineHeight: 1.75,
|
||||
margin: '6px 0 6px 4px',
|
||||
paddingLeft: 4
|
||||
}
|
||||
},
|
||||
parsePrdInlineText(trimmed)
|
||||
)
|
||||
);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trimmed.indexOf('- ') === 0) {
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'div',
|
||||
{
|
||||
key: 'ul-' + i,
|
||||
style: {
|
||||
display: 'flex',
|
||||
gap: 8,
|
||||
fontSize: 13,
|
||||
color: '#475569',
|
||||
lineHeight: 1.75,
|
||||
margin: '4px 0 4px 2px'
|
||||
}
|
||||
},
|
||||
React.createElement('span', { style: { color: '#1677ff', flexShrink: 0 } }, '•'),
|
||||
React.createElement('span', { style: { flex: 1 } }, parsePrdInlineText(trimmed.slice(2).trim()))
|
||||
)
|
||||
);
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
nodes.push(
|
||||
React.createElement(
|
||||
'p',
|
||||
{
|
||||
key: 'p-' + i,
|
||||
style: {
|
||||
fontSize: 13,
|
||||
color: '#475569',
|
||||
lineHeight: 1.75,
|
||||
margin: '6px 0'
|
||||
}
|
||||
},
|
||||
parsePrdInlineText(trimmed)
|
||||
)
|
||||
);
|
||||
i += 1;
|
||||
}
|
||||
|
||||
return nodes;
|
||||
}
|
||||
|
||||
function renderH2RequirementDocPanel() {
|
||||
var md =
|
||||
typeof H2_LEDGER_REQUIREMENT_DOC !== 'undefined' && H2_LEDGER_REQUIREMENT_DOC
|
||||
? H2_LEDGER_REQUIREMENT_DOC
|
||||
: '';
|
||||
if (!md) {
|
||||
return React.createElement(
|
||||
'div',
|
||||
{ style: { padding: 24, color: '#64748b', textAlign: 'center' } },
|
||||
'需求文档未加载,请确认已引入同目录文件:车辆氢费明细-需求内容.js'
|
||||
);
|
||||
}
|
||||
return React.createElement(
|
||||
'div',
|
||||
{ className: 'h2-req-doc-panel', style: { padding: '4px 4px 16px' } },
|
||||
renderPrdMarkdown(md)
|
||||
);
|
||||
}
|
||||
4401
web端/台账数据/车辆氢费明细.jsx
Normal file
4401
web端/台账数据/车辆氢费明细.jsx
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user