diff --git a/src/common/h2DispenserBrandStore.js b/src/common/h2DispenserBrandStore.js new file mode 100644 index 0000000..8277bf2 --- /dev/null +++ b/src/common/h2DispenserBrandStore.js @@ -0,0 +1,150 @@ +/** + * 加氢机品牌 / 型号维护(原型本地 Store) + * 供「站点信息」维护、「加氢订单 H5」OCR 读取品牌型号线索。 + */ +(function initH2DispenserBrandStore(global) { + var STORAGE_KEY = 'oneos.h2.dispenserBrands.v1'; + + var SEED = [ + { id: 'db-1', brand: '海德利森', model: 'H2-D50', remark: '嘉兴站常用', updatedAt: '2026-07-10 09:00:00' }, + { id: 'db-2', brand: '海德利森', model: 'H2-D80', remark: '', updatedAt: '2026-07-10 09:00:00' }, + { id: 'db-3', brand: '舜华新能源', model: 'SH-H35', remark: '面板 OCR 模板 A', updatedAt: '2026-07-12 14:20:00' }, + { id: 'db-4', brand: '厚普股份', model: 'HP-H70', remark: '', updatedAt: '2026-07-14 11:05:00' }, + ]; + + function clone(list) { + return (list || []).map(function (row) { + return Object.assign({}, row); + }); + } + + function readRaw() { + try { + var raw = global.localStorage && global.localStorage.getItem(STORAGE_KEY); + if (!raw) return clone(SEED); + var parsed = JSON.parse(raw); + if (!Array.isArray(parsed) || !parsed.length) return clone(SEED); + return parsed.map(function (row) { + return { + id: String(row.id || ''), + brand: String(row.brand || '').trim(), + model: String(row.model || '').trim(), + remark: String(row.remark || '').trim(), + updatedAt: String(row.updatedAt || ''), + }; + }).filter(function (row) { + return row.id && row.brand && row.model; + }); + } catch (e) { + return clone(SEED); + } + } + + function writeRaw(list) { + try { + if (global.localStorage) { + global.localStorage.setItem(STORAGE_KEY, JSON.stringify(list)); + } + } catch (e) { + /* ignore quota */ + } + } + + function nowText() { + var d = new Date(); + var pad = function (n) { + return n < 10 ? '0' + n : String(n); + }; + return ( + d.getFullYear() + + '-' + + pad(d.getMonth() + 1) + + '-' + + pad(d.getDate()) + + ' ' + + pad(d.getHours()) + + ':' + + pad(d.getMinutes()) + + ':' + + pad(d.getSeconds()) + ); + } + + function listBrands() { + return clone(readRaw()).sort(function (a, b) { + var brandCmp = a.brand.localeCompare(b.brand, 'zh'); + if (brandCmp !== 0) return brandCmp; + return a.model.localeCompare(b.model, 'zh'); + }); + } + + function upsertBrand(payload) { + var brand = String(payload.brand || '').trim(); + var model = String(payload.model || '').trim(); + var remark = String(payload.remark || '').trim(); + if (!brand || !model) { + return { ok: false, message: '品牌与型号均为必填' }; + } + var list = readRaw(); + var id = String(payload.id || '').trim(); + var dup = list.some(function (row) { + return ( + row.brand === brand && + row.model === model && + row.id !== id + ); + }); + if (dup) { + return { ok: false, message: '已存在相同品牌与型号' }; + } + if (id) { + var found = false; + list = list.map(function (row) { + if (row.id !== id) return row; + found = true; + return { + id: row.id, + brand: brand, + model: model, + remark: remark, + updatedAt: nowText(), + }; + }); + if (!found) { + return { ok: false, message: '记录不存在' }; + } + } else { + list.push({ + id: 'db-' + Date.now() + '-' + Math.floor(Math.random() * 1000), + brand: brand, + model: model, + remark: remark, + updatedAt: nowText(), + }); + } + writeRaw(list); + return { ok: true, list: clone(list) }; + } + + function removeBrand(id) { + var next = readRaw().filter(function (row) { + return row.id !== id; + }); + writeRaw(next); + return { ok: true, list: clone(next) }; + } + + function brandModelLabels() { + return listBrands().map(function (row) { + return row.brand + ' · ' + row.model; + }); + } + + global.H2DispenserBrandStore = { + list: listBrands, + upsert: upsertBrand, + remove: removeBrand, + labels: brandModelLabels, + SEED: clone(SEED), + }; +})(typeof window !== 'undefined' ? window : globalThis); diff --git a/src/prototypes/oneos-h5-h2-order/.spec/feature-create.md b/src/prototypes/oneos-h5-h2-order/.spec/feature-create.md index 9cb6850..f2c704c 100644 --- a/src/prototypes/oneos-h5-h2-order/.spec/feature-create.md +++ b/src/prototypes/oneos-h5-h2-order/.spec/feature-create.md @@ -17,16 +17,17 @@ | 字段 | 规则 | |------|------| -| 拍摄区 | 提示「请拍摄车牌」;相册/相机;OCR 模拟回填车牌 | +| 拍摄区 | 提示「请拍摄车牌」;相册/相机;选图后自动叠加**时间、地点**水印;OCR 模拟回填车牌 | | 车牌号 * | 占位「请拍摄或输入车牌号」;点击弹出车牌键盘 | | 车辆标签 | 有车牌后:系统车辆列表命中→「羚牛车辆」,否则→「非羚牛车辆」 | -| 里程(km) | 选填 | +| 里程(km) | 选填;支持**从车机获取**(原型 Mock);识别车牌后可自动回填 | ### 3. 加氢机面板 | 字段 | 规则 | |------|------| -| 拍摄区 | 提示「请拍摄清晰的加氢机照片」;OCR 模拟回填单价、量、总额 | +| 拍摄区 | 提示「请拍摄清晰的加氢机照片」;选图后叠加**时间、地点**水印;OCR 模拟回填单价、量、总额 | +| OCR 参考 | 展示站点信息维护的加氢机品牌/型号线索(见站点信息「加氢机品牌管理」) | | 氢气单价 * | 可改;变更后重算总额 | | 加氢量 * | 可改;变更后重算总额 | | 加氢总额(元) | 只读;= 单价 × 加氢量(两位小数);界面不展示公式文案 | @@ -42,5 +43,7 @@ 1. 时间默认正确且可选到分 2. 车牌键盘可用;标签随车牌变化 -3. 改单价或量后总额自动更新且不可手改 -4. 空表单可直接返回;有内容返回需确认 +3. 车牌/面板照片右下角可见时间与地点水印 +4. 可从车机获取里程(有车牌时) +5. 改单价或量后总额自动更新且不可手改 +6. 空表单可直接返回;有内容返回需确认 diff --git a/src/prototypes/oneos-h5-h2-order/.spec/feature-detail.md b/src/prototypes/oneos-h5-h2-order/.spec/feature-detail.md index 87ab82b..70a42a5 100644 --- a/src/prototypes/oneos-h5-h2-order/.spec/feature-detail.md +++ b/src/prototypes/oneos-h5-h2-order/.spec/feature-detail.md @@ -8,6 +8,7 @@ - 顶部:车牌、加氢时间、核对标签、对账标签 - 指标条:加氢总额、加氢量 +- **识别原图**:车牌照片、加氢机面板照片(均为拍摄时叠加时间/地点水印后的原图;种子数据无实拍时用演示水印图) - 明细行:站点、车牌、里程、单价、核对/对账状态与时间 ## 锁定规则 @@ -22,7 +23,7 @@ ## 编辑 -进入与「新增」同一套表单,预填当前值;提交走更新逻辑(仍校验重复键)。 +进入与「新增」同一套表单,预填当前值(含已存水印照片);提交走更新逻辑(仍校验重复键)。 ## 删除 @@ -33,3 +34,4 @@ 1. 未核对未对账:底部有删除/编辑 2. 已核对或已对账:无操作栏,有锁定说明 3. 详情含对账信息;列表卡片不含对账 +4. 详情展示车牌与面板带水印原图(新上报提交后为实拍;种子行为演示图) diff --git a/src/prototypes/oneos-h5-h2-order/.spec/requirements-prd.md b/src/prototypes/oneos-h5-h2-order/.spec/requirements-prd.md index 44e4c29..658707c 100644 --- a/src/prototypes/oneos-h5-h2-order/.spec/requirements-prd.md +++ b/src/prototypes/oneos-h5-h2-order/.spec/requirements-prd.md @@ -2,7 +2,7 @@ | 项 | 内容 | |---|---| -| 文档版本 | v1.3 | +| 文档版本 | v1.5 | | 模块名称 | 加氢站管理 → 加氢订单 | | 所属系统 | ONE-OS(加氢站手机浏览器) | | 交互原型 | `/prototypes/oneos-h5-h2-order` | @@ -51,6 +51,9 @@ 5. 能源部完成核对后同步「已核对」;站点对账单提交后同步「已对账」+ 对账时间 6. 同站同车牌同加氢时间重复保存被拦截 7. Web「加氢记录」与 H5「加氢订单」手工台账逻辑一致(同 Store) +8. 车牌/面板拍摄预览含水印(时间、地点=本站名称);里程可从车机获取(Mock) +9. 面板 OCR 可展示站点信息维护的加氢机品牌型号线索 +10. 详情页展示车牌与面板带水印原图 --- diff --git a/src/prototypes/oneos-h5-h2-order/annotation-source.json b/src/prototypes/oneos-h5-h2-order/annotation-source.json index 123658c..19dab06 100644 --- a/src/prototypes/oneos-h5-h2-order/annotation-source.json +++ b/src/prototypes/oneos-h5-h2-order/annotation-source.json @@ -5,13 +5,13 @@ "version": 2, "prototypeName": "oneos-h5-h2-order", "pageId": "list", - "updatedAt": 1784260628220, + "updatedAt": 1784280448632, "nodes": [ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-hero", @@ -31,8 +31,8 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-summary", @@ -52,8 +52,8 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-card", @@ -73,8 +73,8 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-fab", @@ -94,8 +94,8 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-time", @@ -115,8 +115,8 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-station", @@ -136,8 +136,8 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-plate", @@ -157,12 +157,54 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, + "hasMarkdown": true, + "annotationText": "", + "id": "h5-mileage", + "index": 8, + "title": "里程", + "pageId": "create", + "color": "#0E8A7B", + "locator": { + "selectors": [ + "[data-annotation-id='h5-mileage']", + "#h5-mileage" + ], + "fingerprint": "field|h5-mileage", + "path": [] + } + }, + { + "images": [], + "controls": [], + "createdAt": 1784280448632, + "updatedAt": 1784280448632, + "hasMarkdown": true, + "annotationText": "", + "id": "h5-dispenser-brands", + "index": 9, + "title": "加氢机品牌参考", + "pageId": "create", + "color": "#7C3AED", + "locator": { + "selectors": [ + "[data-annotation-id='h5-dispenser-brands']", + ".h5-brand-hint" + ], + "fingerprint": "hint|dispenser-brands", + "path": [] + } + }, + { + "images": [], + "controls": [], + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-price", - "index": 8, + "index": 10, "title": "氢气单价", "pageId": "create", "color": "#7AB929", @@ -178,12 +220,12 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-kg", - "index": 9, + "index": 11, "title": "加氢量", "pageId": "create", "color": "#7AB929", @@ -199,12 +241,12 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-total-label", - "index": 10, + "index": 12, "title": "加氢总额", "pageId": "create", "color": "#0E8A7B", @@ -220,12 +262,12 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-detail", - "index": 11, + "index": 13, "title": "记录详情", "pageId": "detail", "color": "#FF7D00", @@ -241,12 +283,33 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, + "hasMarkdown": true, + "annotationText": "", + "id": "h5-detail-photos", + "index": 14, + "title": "识别原图", + "pageId": "detail", + "color": "#0E8A7B", + "locator": { + "selectors": [ + "[data-annotation-id='h5-detail-photos']", + ".h5-detail-photos" + ], + "fingerprint": "detail|photos", + "path": [] + } + }, + { + "images": [], + "controls": [], + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-manual", - "index": 12, + "index": 15, "title": "手工台账", "pageId": "manual", "color": "#7AB929", @@ -262,12 +325,12 @@ { "images": [], "controls": [], - "createdAt": 1784260628220, - "updatedAt": 1784260628220, + "createdAt": 1784280448632, + "updatedAt": 1784280448632, "hasMarkdown": true, "annotationText": "", "id": "h5-manual-calendar", - "index": 13, + "index": 16, "title": "台账日历", "pageId": "manual", "color": "#0E8A7B", @@ -290,10 +353,13 @@ "h5-time": "## 加氢时间(必填)\n\n默认=点击「新增」时的当前时间;点击后底部弹层选择日期 + 时 + 分。", "h5-station": "## 加氢站名称\n\n只读。默认显示当前登录账号对应加氢站名称,不可切换。", "h5-plate": "# 车牌「羚牛车辆 / 非羚牛车辆」标签\n\n原型本地判定,未接真实车辆管理 API。\n\n## 判定顺序\n\n| 优先级 | 条件 | 结果 |\n|--------|------|------|\n| 1 | 车牌为空 | 不展示标签 |\n| 2 | 规范化后车牌 ∈ 本地系统车辆集合 | **羚牛车辆** |\n| 3 | 有车牌但不在集合中 | **非羚牛车辆** |\n\n## 前置条件\n\n- 识别(OCR)或键盘输入得到车牌后才展示。\n- 比较前去掉尾缀 `F`,统一大写。\n\n## 数据源\n\n- `utils/fleet-plates.ts` 内本地种子车牌集合(含加氢 Bridge 演示车牌与部分车辆管理样例)。\n- 正式环境应改为查询车辆管理 / 系统车辆列表接口。\n\n## 用户可见结果\n\n- 绿色标签「羚牛车辆」或橙色标签「非羚牛车辆」。\n- 不拦截提交(仅提示归属)。\n\n## 代码路径\n\n- `getVehicleTag` / `isLingniuVehicle` → `CreateWizard` 车牌行右侧标签。\n", + "h5-mileage": "## 里程(km)\n\n选填。支持「从车机获取」(原型 Mock);识别车牌后可自动回填。正式环境对接车机 / T-Box。\n\n详见 [新增加氢记录](feature-create)。", + "h5-dispenser-brands": "## 加氢机品牌参考\n\n展示站点信息「加氢机品牌管理」维护的品牌·型号,供面板 OCR 模型判断参考。数据源:`h2DispenserBrandStore`。", "h5-price": "## 氢气单价(必填)\n\n可 OCR 识别后校正;变更后自动重算加氢总额(单价×加氢量)。", "h5-kg": "## 加氢量(必填)\n\n可 OCR 识别后校正;变更后自动重算加氢总额。", "h5-total-label": "## 加氢总额(元)\n\n只读展示;由单价×加氢量自动计算(两位小数)。界面标签不展示公式文案。", - "h5-detail": "# 功能:详情、编辑与删除\n\n## 目标\n\n查看单笔加氢记录完整字段;在「未核对且未对账」时可编辑或删除。\n\n## 详情展示\n\n- 顶部:车牌、加氢时间、核对标签、对账标签 \n- 指标条:加氢总额、加氢量 \n- 明细行:站点、车牌、里程、单价、核对/对账状态与时间 \n\n## 锁定规则\n\n| 条件 | 结果 |\n|------|------|\n| 已对账 | 不可编辑/删除;提示已纳入站点对账单 |\n| 已核对(未对账) | 不可编辑/删除;提示能源部已核对 |\n| 未核对且未对账 | 可编辑、可删除 |\n\n判定函数:`isOrderLocked`(核对或对账任一成立即锁)。\n\n## 编辑\n\n进入与「新增」同一套表单,预填当前值;提交走更新逻辑(仍校验重复键)。\n\n## 删除\n\n二次确认后从 Bridge 移除该行。\n\n## 验收\n\n1. 未核对未对账:底部有删除/编辑 \n2. 已核对或已对账:无操作栏,有锁定说明 \n3. 详情含对账信息;列表卡片不含对账 \n", + "h5-detail": "# 功能:详情、编辑与删除\n\n## 目标\n\n查看单笔加氢记录完整字段;在「未核对且未对账」时可编辑或删除。\n\n## 详情展示\n\n- 顶部:车牌、加氢时间、核对标签、对账标签 \n- 指标条:加氢总额、加氢量 \n- **识别原图**:车牌照片、加氢机面板照片(均为拍摄时叠加时间/地点水印后的原图;种子数据无实拍时用演示水印图) \n- 明细行:站点、车牌、里程、单价、核对/对账状态与时间 \n\n## 锁定规则\n\n| 条件 | 结果 |\n|------|------|\n| 已对账 | 不可编辑/删除;提示已纳入站点对账单 |\n| 已核对(未对账) | 不可编辑/删除;提示能源部已核对 |\n| 未核对且未对账 | 可编辑、可删除 |\n\n判定函数:`isOrderLocked`(核对或对账任一成立即锁)。\n\n## 编辑\n\n进入与「新增」同一套表单,预填当前值(含已存水印照片);提交走更新逻辑(仍校验重复键)。\n\n## 删除\n\n二次确认后从 Bridge 移除该行。\n\n## 验收\n\n1. 未核对未对账:底部有删除/编辑 \n2. 已核对或已对账:无操作栏,有锁定说明 \n3. 详情含对账信息;列表卡片不含对账 \n4. 详情展示车牌与面板带水印原图(新上报提交后为实拍;种子行为演示图) \n", + "h5-detail-photos": "## 识别原图(含水印)\n\n详情展示车牌识别、加氢机面板的原始照片;照片在拍摄/选图时已叠加时间与地点水印并随记录保存。种子数据无实拍时用演示水印图。\n\n详见 [详情编辑删除](feature-detail)。", "h5-manual": "# 功能:手工台账上传\n\n## 目标\n\n站端每日上传纸质**手工台账照片**,作为系统电子加氢记录的核对依据。多日未操作时,可通过日历查看缺口并补传过往日期。\n\n## 产品口径\n\n| 项 | 规则 |\n|---|---|\n| 入口 | H5:底部 Tab「手工台账」;Web:顶栏「手工台账」 |\n| 上传形态 | 仅图片(拍照/相册),可多张 |\n| 维度 | **加氢站 + 自然日(本地日历日)** 一份 |\n| 日历 | 月历自本站**首笔加氢记录日**起算:绿=已传、橙=未传;首笔之前无需补传;禁选未来日 |\n| 补传 | 允许为过往未传日期补传;已传日期仅可**追加**新图 |\n| 归档 | **确认上传后的图片进入已归档状态,不可删除**;未确认的草稿图仍可删除 |\n| 拦截 | **未上传今日手工台账 → 禁止新增加氢记录**(编辑已有记录不拦;补传历史不替代今日校验) |\n| 数据 | 共享 `H2VehicleLedgerBridge` 内存 Store(未接真实 API) |\n\n## 判定顺序(新增拦截)\n\n| 优先级 | 条件 | 结果 |\n|--------|------|------|\n| 1 | 操作=编辑已有记录 | 不校验手工台账 |\n| 2 | 操作=新增,且目标站今日已有 ≥1 张台账图 | 允许进入新增 |\n| 3 | 操作=新增,今日未上传 | 提示并跳转手工台账 Tab |\n\n## 日历与补传\n\n| 规则 | 说明 |\n|------|------|\n| 数据源 | `listManualLedgersByStation`;当日有 ≥1 张图视为已上传 |\n| 业务起点 | 取本站 Bridge 加氢记录中最早 `hydrogenTime` 自然日;无记录则历史日均不要求补传 |\n| 未传计数 | 本月内 `max(月初, 首笔日)`~min(月末, 今日) 中未上传的天数 |\n| 点选 | 仅 `dateKey ≤ 今日`;选中后右侧/下方展示该日草稿图与上传按钮 |\n| 归档不可删 | Store 已有图强制保留;`upsertManualLedger` 仅追加新图,忽略删除已有图的请求 |\n| 与拦截关系 | 仅 **今日** 影响「禁止新增」;历史补传解决核对缺口,不放宽今日门禁 |\n\n## 用户可见\n\n- 今日未上传:橙/黄提示条 + Tab 红点 \n- 日历:自首笔加氢日起绿/橙标记;首笔之前无橙点(无需补传);本月未传天数摘要 \n- 选中日:上传区标题为该日期;已归档图显示「已归档」无删除;仅未确认草稿可删;已有台账时主按钮为「确认补传」\n\n## 代码路径\n\n- Bridge:`src/common/h2VehicleLedgerBridge.js`(`hasManualLedgerForDate` / `upsertManualLedger` / `listManualLedgersByStation`) \n- H5:`oneos-h5-h2-order` · `ManualLedgerPanel` + `utils/manual-ledger.ts`(`buildManualMonthCells` / `getFirstHydrogenDateKey`) \n- Web:`oneos-web-h2-station/pages/02-加氢记录.jsx`(手工台账 Tab 月历) \n\n## 验收\n\n1. 今日未上传时,H5/Web 点「新增」均被拦截并引导上传 \n2. 上传至少一张图并确认后,可新增电子记录 \n3. 日历自首笔加氢日起区分已传/未传;首笔之前不标未传、不计入补传;可点选范围内未传日补传 \n4. 补传历史日后,该日日历变为已传;今日仍未传时新增仍被拦截 \n5. 确认上传后的图显示已归档且不可删除;仅可追加补传 \n6. H5 与 Web 共用同一 Store,一端上传另一端可见(同会话) \n", "h5-manual-calendar": "## 台账日历\n\n自本站首笔加氢记录日起:绿=已上传,橙=未上传;首笔之前无需补传。禁选未来日。点选范围内未传日可补传。仅「今日」是否上传影响新增加氢记录。\n\n详见 [手工台账上传](feature-manual-ledger)。" }, @@ -310,7 +376,7 @@ "type": "markdown", "id": "h5-doc-prd", "title": "PRD 全文", - "markdown": "# 加氢订单(H5)— 产品需求文档(PRD)\n\n| 项 | 内容 |\n|---|---|\n| 文档版本 | v1.3 |\n| 模块名称 | 加氢站管理 → 加氢订单 |\n| 所属系统 | ONE-OS(加氢站手机浏览器) |\n| 交互原型 | `/prototypes/oneos-h5-h2-order` |\n| 设计基底 | 小羚羚 `xll-miniapp/DESIGN.md` |\n| 关联模块 | [站点信息](/prototypes/oneos-web-h2-station-site)、[加氢记录 Web](/prototypes/oneos-web-h2-station)、[车辆氢费明细](/prototypes/vehicle-h2-fee-ledger) |\n\n---\n\n## 1. 背景与目标\n\n采购创建加氢站并绑定供应商、开放系统账号后,加氢站人员通过手机浏览器登录 OneOS,在「加氢订单」模块上报加氢记录。Web「加氢记录」为同一业务的 PC 入口(共享 Bridge 数据;PC 另有导出与预约加氢)。\n\n每日须上传**手工台账**照片,作为电子记录的核对依据;未上传当日手工台账时不可新增加氢记录。手工台账页提供月历,标出已传/未传日期,支持补传过往缺口。\n\n### 1.1 目标用户\n\n加氢站操作人员(户外 / 站场手机使用)。\n\n### 1.2 功能清单\n\n| # | 功能 | 说明文档 |\n|---|---|---|\n| 1 | 本站列表与 KPI | [feature-list.md](./feature-list.md) |\n| 2 | 新增加氢记录 | [feature-create.md](./feature-create.md) |\n| 3 | 详情 / 编辑 / 删除 | [feature-detail.md](./feature-detail.md) |\n| 4 | **手工台账上传** | [feature-manual-ledger.md](./feature-manual-ledger.md) |\n| 5 | 羚牛车辆标签 | [fleet-plate-tag.md](./fleet-plate-tag.md) |\n| 6 | 核对与对账联动 | [reconcile-linkage.md](./reconcile-linkage.md) |\n\n### 1.3 列表字段\n\n加氢时间、车牌号、氢气单价、加氢量、加氢总额、核对状态;已核对时展示核对时间。里程在新增/详情展示(选填),列表不展示。列表不展示对账状态。\n\n### 1.4 不做\n\n真登录、真 OCR SDK、PLC、原生 App、后端联调。\n\n---\n\n## 2. 验收项\n\n1. 菜单位于 OneOS → 加氢站管理 → 加氢订单 \n2. 默认已登录本站;列表仅本站(无切站) \n3. 底栏 Tab:加氢订单 / 手工台账;月历可区分已传/未传并补传过往日;未上传今日手工台账不可新增;上传后可新增;时间默认点击新增时刻(到分) \n4. 已核对或已对账不可编辑/删除;未核对未对账可 \n5. 能源部完成核对后同步「已核对」;站点对账单提交后同步「已对账」+ 对账时间 \n6. 同站同车牌同加氢时间重复保存被拦截 \n7. Web「加氢记录」与 H5「加氢订单」手工台账逻辑一致(同 Store) \n\n---\n\n## 3. 复杂逻辑摘要\n\n| 主题 | 摘要 | 全文 |\n|---|---|---|\n| 对账 / 核对 | 核对≠对账;触发方不同 | [reconcile-linkage.md](./reconcile-linkage.md)、[车辆氢费 verify-reconcile](../vehicle-h2-fee-ledger/.spec/verify-reconcile.md) |\n| 重复键 | 与 Web 共用 Bridge | [Web 数据模型](../oneos-web-h2-station/.spec/record-data-model.md) |\n| 羚牛车辆标签 | 本地系统车辆集合判定 | [fleet-plate-tag.md](./fleet-plate-tag.md) |\n| 总额 | 单价×加氢量自动算,界面不展示公式 | [feature-create.md](./feature-create.md) |\n| 手工台账 | 按站+自然日上传图片;月历标已传/未传可补传;未上传今日禁新增 | [feature-manual-ledger.md](./feature-manual-ledger.md) |\n\n---\n\n## 4. 页面与标注对照\n\n| 页面 pageId | 主要能力 |\n|---|---|\n| `list` | 站点头、KPI、订单卡片、底栏新增 |\n| `create` | 时间选择、站名、车牌键盘、面板 OCR、金额字段 |\n| `detail` | 详情字段、锁定说明、编辑/删除 |\n\n标注数据:`annotation-source.json`(由 `scripts/build-annotation-source.mjs` 从本目录 Markdown 生成)。\n", + "markdown": "# 加氢订单(H5)— 产品需求文档(PRD)\n\n| 项 | 内容 |\n|---|---|\n| 文档版本 | v1.5 |\n| 模块名称 | 加氢站管理 → 加氢订单 |\n| 所属系统 | ONE-OS(加氢站手机浏览器) |\n| 交互原型 | `/prototypes/oneos-h5-h2-order` |\n| 设计基底 | 小羚羚 `xll-miniapp/DESIGN.md` |\n| 关联模块 | [站点信息](/prototypes/oneos-web-h2-station-site)、[加氢记录 Web](/prototypes/oneos-web-h2-station)、[车辆氢费明细](/prototypes/vehicle-h2-fee-ledger) |\n\n---\n\n## 1. 背景与目标\n\n采购创建加氢站并绑定供应商、开放系统账号后,加氢站人员通过手机浏览器登录 OneOS,在「加氢订单」模块上报加氢记录。Web「加氢记录」为同一业务的 PC 入口(共享 Bridge 数据;PC 另有导出与预约加氢)。\n\n每日须上传**手工台账**照片,作为电子记录的核对依据;未上传当日手工台账时不可新增加氢记录。手工台账页提供月历,标出已传/未传日期,支持补传过往缺口。\n\n### 1.1 目标用户\n\n加氢站操作人员(户外 / 站场手机使用)。\n\n### 1.2 功能清单\n\n| # | 功能 | 说明文档 |\n|---|---|---|\n| 1 | 本站列表与 KPI | [feature-list.md](./feature-list.md) |\n| 2 | 新增加氢记录 | [feature-create.md](./feature-create.md) |\n| 3 | 详情 / 编辑 / 删除 | [feature-detail.md](./feature-detail.md) |\n| 4 | **手工台账上传** | [feature-manual-ledger.md](./feature-manual-ledger.md) |\n| 5 | 羚牛车辆标签 | [fleet-plate-tag.md](./fleet-plate-tag.md) |\n| 6 | 核对与对账联动 | [reconcile-linkage.md](./reconcile-linkage.md) |\n\n### 1.3 列表字段\n\n加氢时间、车牌号、氢气单价、加氢量、加氢总额、核对状态;已核对时展示核对时间。里程在新增/详情展示(选填),列表不展示。列表不展示对账状态。\n\n### 1.4 不做\n\n真登录、真 OCR SDK、PLC、原生 App、后端联调。\n\n---\n\n## 2. 验收项\n\n1. 菜单位于 OneOS → 加氢站管理 → 加氢订单 \n2. 默认已登录本站;列表仅本站(无切站) \n3. 底栏 Tab:加氢订单 / 手工台账;月历可区分已传/未传并补传过往日;未上传今日手工台账不可新增;上传后可新增;时间默认点击新增时刻(到分) \n4. 已核对或已对账不可编辑/删除;未核对未对账可 \n5. 能源部完成核对后同步「已核对」;站点对账单提交后同步「已对账」+ 对账时间 \n6. 同站同车牌同加氢时间重复保存被拦截 \n7. Web「加氢记录」与 H5「加氢订单」手工台账逻辑一致(同 Store) \n8. 车牌/面板拍摄预览含水印(时间、地点=本站名称);里程可从车机获取(Mock) \n9. 面板 OCR 可展示站点信息维护的加氢机品牌型号线索 \n10. 详情页展示车牌与面板带水印原图 \n\n---\n\n## 3. 复杂逻辑摘要\n\n| 主题 | 摘要 | 全文 |\n|---|---|---|\n| 对账 / 核对 | 核对≠对账;触发方不同 | [reconcile-linkage.md](./reconcile-linkage.md)、[车辆氢费 verify-reconcile](../vehicle-h2-fee-ledger/.spec/verify-reconcile.md) |\n| 重复键 | 与 Web 共用 Bridge | [Web 数据模型](../oneos-web-h2-station/.spec/record-data-model.md) |\n| 羚牛车辆标签 | 本地系统车辆集合判定 | [fleet-plate-tag.md](./fleet-plate-tag.md) |\n| 总额 | 单价×加氢量自动算,界面不展示公式 | [feature-create.md](./feature-create.md) |\n| 手工台账 | 按站+自然日上传图片;月历标已传/未传可补传;未上传今日禁新增 | [feature-manual-ledger.md](./feature-manual-ledger.md) |\n\n---\n\n## 4. 页面与标注对照\n\n| 页面 pageId | 主要能力 |\n|---|---|\n| `list` | 站点头、KPI、订单卡片、底栏新增 |\n| `create` | 时间选择、站名、车牌键盘、面板 OCR、金额字段 |\n| `detail` | 详情字段、锁定说明、编辑/删除 |\n\n标注数据:`annotation-source.json`(由 `scripts/build-annotation-source.mjs` 从本目录 Markdown 生成)。\n", "markdownPath": ".spec/requirements-prd.md" }, { @@ -330,7 +396,7 @@ "type": "markdown", "id": "h5-doc-create", "title": "新增加氢记录", - "markdown": "# 功能:新增加氢记录\n\n## 目标\n\n站端通过手机浏览器上报一笔加氢记录:拍照识别 + 可校正,提交写入共享氢费 Store。\n\n## 表单分区\n\n### 1. 基础信息\n\n| 字段 | 规则 |\n|------|------|\n| 加氢时间 * | 默认=点击「新增」时的当前时间;点击底部弹层选日期+时+分 |\n| 加氢站名称 | 只读,登录本站名称 |\n\n### 2. 车牌识别\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄车牌」;相册/相机;OCR 模拟回填车牌 |\n| 车牌号 * | 占位「请拍摄或输入车牌号」;点击弹出车牌键盘 |\n| 车辆标签 | 有车牌后:系统车辆列表命中→「羚牛车辆」,否则→「非羚牛车辆」 |\n| 里程(km) | 选填 |\n\n### 3. 加氢机面板\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄清晰的加氢机照片」;OCR 模拟回填单价、量、总额 |\n| 氢气单价 * | 可改;变更后重算总额 |\n| 加氢量 * | 可改;变更后重算总额 |\n| 加氢总额(元) | 只读;= 单价 × 加氢量(两位小数);界面不展示公式文案 |\n\n## 提交与拦截\n\n- 必填齐全方可提交 \n- 同站 + 同车牌 + 同加氢时间 → 拦截重复 \n- 有填写内容点返回 → 二次确认防丢失 \n- 已核对或已对账记录不可从此入口编辑(列表进详情后按钮隐藏) \n\n## 验收\n\n1. 时间默认正确且可选到分 \n2. 车牌键盘可用;标签随车牌变化 \n3. 改单价或量后总额自动更新且不可手改 \n4. 空表单可直接返回;有内容返回需确认 \n", + "markdown": "# 功能:新增加氢记录\n\n## 目标\n\n站端通过手机浏览器上报一笔加氢记录:拍照识别 + 可校正,提交写入共享氢费 Store。\n\n## 表单分区\n\n### 1. 基础信息\n\n| 字段 | 规则 |\n|------|------|\n| 加氢时间 * | 默认=点击「新增」时的当前时间;点击底部弹层选日期+时+分 |\n| 加氢站名称 | 只读,登录本站名称 |\n\n### 2. 车牌识别\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄车牌」;相册/相机;选图后自动叠加**时间、地点**水印;OCR 模拟回填车牌 |\n| 车牌号 * | 占位「请拍摄或输入车牌号」;点击弹出车牌键盘 |\n| 车辆标签 | 有车牌后:系统车辆列表命中→「羚牛车辆」,否则→「非羚牛车辆」 |\n| 里程(km) | 选填;支持**从车机获取**(原型 Mock);识别车牌后可自动回填 |\n\n### 3. 加氢机面板\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄清晰的加氢机照片」;选图后叠加**时间、地点**水印;OCR 模拟回填单价、量、总额 |\n| OCR 参考 | 展示站点信息维护的加氢机品牌/型号线索(见站点信息「加氢机品牌管理」) |\n| 氢气单价 * | 可改;变更后重算总额 |\n| 加氢量 * | 可改;变更后重算总额 |\n| 加氢总额(元) | 只读;= 单价 × 加氢量(两位小数);界面不展示公式文案 |\n\n## 提交与拦截\n\n- 必填齐全方可提交 \n- 同站 + 同车牌 + 同加氢时间 → 拦截重复 \n- 有填写内容点返回 → 二次确认防丢失 \n- 已核对或已对账记录不可从此入口编辑(列表进详情后按钮隐藏) \n\n## 验收\n\n1. 时间默认正确且可选到分 \n2. 车牌键盘可用;标签随车牌变化 \n3. 车牌/面板照片右下角可见时间与地点水印 \n4. 可从车机获取里程(有车牌时) \n5. 改单价或量后总额自动更新且不可手改 \n6. 空表单可直接返回;有内容返回需确认 \n", "markdownPath": ".spec/feature-create.md" }, { @@ -344,7 +410,7 @@ "type": "markdown", "id": "h5-doc-detail", "title": "详情编辑删除", - "markdown": "# 功能:详情、编辑与删除\n\n## 目标\n\n查看单笔加氢记录完整字段;在「未核对且未对账」时可编辑或删除。\n\n## 详情展示\n\n- 顶部:车牌、加氢时间、核对标签、对账标签 \n- 指标条:加氢总额、加氢量 \n- 明细行:站点、车牌、里程、单价、核对/对账状态与时间 \n\n## 锁定规则\n\n| 条件 | 结果 |\n|------|------|\n| 已对账 | 不可编辑/删除;提示已纳入站点对账单 |\n| 已核对(未对账) | 不可编辑/删除;提示能源部已核对 |\n| 未核对且未对账 | 可编辑、可删除 |\n\n判定函数:`isOrderLocked`(核对或对账任一成立即锁)。\n\n## 编辑\n\n进入与「新增」同一套表单,预填当前值;提交走更新逻辑(仍校验重复键)。\n\n## 删除\n\n二次确认后从 Bridge 移除该行。\n\n## 验收\n\n1. 未核对未对账:底部有删除/编辑 \n2. 已核对或已对账:无操作栏,有锁定说明 \n3. 详情含对账信息;列表卡片不含对账 \n", + "markdown": "# 功能:详情、编辑与删除\n\n## 目标\n\n查看单笔加氢记录完整字段;在「未核对且未对账」时可编辑或删除。\n\n## 详情展示\n\n- 顶部:车牌、加氢时间、核对标签、对账标签 \n- 指标条:加氢总额、加氢量 \n- **识别原图**:车牌照片、加氢机面板照片(均为拍摄时叠加时间/地点水印后的原图;种子数据无实拍时用演示水印图) \n- 明细行:站点、车牌、里程、单价、核对/对账状态与时间 \n\n## 锁定规则\n\n| 条件 | 结果 |\n|------|------|\n| 已对账 | 不可编辑/删除;提示已纳入站点对账单 |\n| 已核对(未对账) | 不可编辑/删除;提示能源部已核对 |\n| 未核对且未对账 | 可编辑、可删除 |\n\n判定函数:`isOrderLocked`(核对或对账任一成立即锁)。\n\n## 编辑\n\n进入与「新增」同一套表单,预填当前值(含已存水印照片);提交走更新逻辑(仍校验重复键)。\n\n## 删除\n\n二次确认后从 Bridge 移除该行。\n\n## 验收\n\n1. 未核对未对账:底部有删除/编辑 \n2. 已核对或已对账:无操作栏,有锁定说明 \n3. 详情含对账信息;列表卡片不含对账 \n4. 详情展示车牌与面板带水印原图(新上报提交后为实拍;种子行为演示图) \n", "markdownPath": ".spec/feature-detail.md" }, { @@ -411,7 +477,7 @@ "type": "markdown", "id": "h5-page-create-md", "title": "新增页要点", - "markdown": "# 功能:新增加氢记录\n\n## 目标\n\n站端通过手机浏览器上报一笔加氢记录:拍照识别 + 可校正,提交写入共享氢费 Store。\n\n## 表单分区\n\n### 1. 基础信息\n\n| 字段 | 规则 |\n|------|------|\n| 加氢时间 * | 默认=点击「新增」时的当前时间;点击底部弹层选日期+时+分 |\n| 加氢站名称 | 只读,登录本站名称 |\n\n### 2. 车牌识别\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄车牌」;相册/相机;OCR 模拟回填车牌 |\n| 车牌号 * | 占位「请拍摄或输入车牌号」;点击弹出车牌键盘 |\n| 车辆标签 | 有车牌后:系统车辆列表命中→「羚牛车辆」,否则→「非羚牛车辆」 |\n| 里程(km) | 选填 |\n\n### 3. 加氢机面板\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄清晰的加氢机照片」;OCR 模拟回填单价、量、总额 |\n| 氢气单价 * | 可改;变更后重算总额 |\n| 加氢量 * | 可改;变更后重算总额 |\n| 加氢总额(元) | 只读;= 单价 × 加氢量(两位小数);界面不展示公式文案 |\n\n## 提交与拦截\n\n- 必填齐全方可提交 \n- 同站 + 同车牌 + 同加氢时间 → 拦截重复 \n- 有填写内容点返回 → 二次确认防丢失 \n- 已核对或已对账记录不可从此入口编辑(列表进详情后按钮隐藏) \n\n## 验收\n\n1. 时间默认正确且可选到分 \n2. 车牌键盘可用;标签随车牌变化 \n3. 改单价或量后总额自动更新且不可手改 \n4. 空表单可直接返回;有内容返回需确认 \n" + "markdown": "# 功能:新增加氢记录\n\n## 目标\n\n站端通过手机浏览器上报一笔加氢记录:拍照识别 + 可校正,提交写入共享氢费 Store。\n\n## 表单分区\n\n### 1. 基础信息\n\n| 字段 | 规则 |\n|------|------|\n| 加氢时间 * | 默认=点击「新增」时的当前时间;点击底部弹层选日期+时+分 |\n| 加氢站名称 | 只读,登录本站名称 |\n\n### 2. 车牌识别\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄车牌」;相册/相机;选图后自动叠加**时间、地点**水印;OCR 模拟回填车牌 |\n| 车牌号 * | 占位「请拍摄或输入车牌号」;点击弹出车牌键盘 |\n| 车辆标签 | 有车牌后:系统车辆列表命中→「羚牛车辆」,否则→「非羚牛车辆」 |\n| 里程(km) | 选填;支持**从车机获取**(原型 Mock);识别车牌后可自动回填 |\n\n### 3. 加氢机面板\n\n| 字段 | 规则 |\n|------|------|\n| 拍摄区 | 提示「请拍摄清晰的加氢机照片」;选图后叠加**时间、地点**水印;OCR 模拟回填单价、量、总额 |\n| OCR 参考 | 展示站点信息维护的加氢机品牌/型号线索(见站点信息「加氢机品牌管理」) |\n| 氢气单价 * | 可改;变更后重算总额 |\n| 加氢量 * | 可改;变更后重算总额 |\n| 加氢总额(元) | 只读;= 单价 × 加氢量(两位小数);界面不展示公式文案 |\n\n## 提交与拦截\n\n- 必填齐全方可提交 \n- 同站 + 同车牌 + 同加氢时间 → 拦截重复 \n- 有填写内容点返回 → 二次确认防丢失 \n- 已核对或已对账记录不可从此入口编辑(列表进详情后按钮隐藏) \n\n## 验收\n\n1. 时间默认正确且可选到分 \n2. 车牌键盘可用;标签随车牌变化 \n3. 车牌/面板照片右下角可见时间与地点水印 \n4. 可从车机获取里程(有车牌时) \n5. 改单价或量后总额自动更新且不可手改 \n6. 空表单可直接返回;有内容返回需确认 \n" } ] }, @@ -434,7 +500,7 @@ "type": "markdown", "id": "h5-page-detail-md", "title": "详情页要点", - "markdown": "# 功能:详情、编辑与删除\n\n## 目标\n\n查看单笔加氢记录完整字段;在「未核对且未对账」时可编辑或删除。\n\n## 详情展示\n\n- 顶部:车牌、加氢时间、核对标签、对账标签 \n- 指标条:加氢总额、加氢量 \n- 明细行:站点、车牌、里程、单价、核对/对账状态与时间 \n\n## 锁定规则\n\n| 条件 | 结果 |\n|------|------|\n| 已对账 | 不可编辑/删除;提示已纳入站点对账单 |\n| 已核对(未对账) | 不可编辑/删除;提示能源部已核对 |\n| 未核对且未对账 | 可编辑、可删除 |\n\n判定函数:`isOrderLocked`(核对或对账任一成立即锁)。\n\n## 编辑\n\n进入与「新增」同一套表单,预填当前值;提交走更新逻辑(仍校验重复键)。\n\n## 删除\n\n二次确认后从 Bridge 移除该行。\n\n## 验收\n\n1. 未核对未对账:底部有删除/编辑 \n2. 已核对或已对账:无操作栏,有锁定说明 \n3. 详情含对账信息;列表卡片不含对账 \n" + "markdown": "# 功能:详情、编辑与删除\n\n## 目标\n\n查看单笔加氢记录完整字段;在「未核对且未对账」时可编辑或删除。\n\n## 详情展示\n\n- 顶部:车牌、加氢时间、核对标签、对账标签 \n- 指标条:加氢总额、加氢量 \n- **识别原图**:车牌照片、加氢机面板照片(均为拍摄时叠加时间/地点水印后的原图;种子数据无实拍时用演示水印图) \n- 明细行:站点、车牌、里程、单价、核对/对账状态与时间 \n\n## 锁定规则\n\n| 条件 | 结果 |\n|------|------|\n| 已对账 | 不可编辑/删除;提示已纳入站点对账单 |\n| 已核对(未对账) | 不可编辑/删除;提示能源部已核对 |\n| 未核对且未对账 | 可编辑、可删除 |\n\n判定函数:`isOrderLocked`(核对或对账任一成立即锁)。\n\n## 编辑\n\n进入与「新增」同一套表单,预填当前值(含已存水印照片);提交走更新逻辑(仍校验重复键)。\n\n## 删除\n\n二次确认后从 Bridge 移除该行。\n\n## 验收\n\n1. 未核对未对账:底部有删除/编辑 \n2. 已核对或已对账:无操作栏,有锁定说明 \n3. 详情含对账信息;列表卡片不含对账 \n4. 详情展示车牌与面板带水印原图(新上报提交后为实拍;种子行为演示图) \n" } ] } diff --git a/src/prototypes/oneos-h5-h2-order/components/CreateWizard.tsx b/src/prototypes/oneos-h5-h2-order/components/CreateWizard.tsx index d787d20..2597bd8 100644 --- a/src/prototypes/oneos-h5-h2-order/components/CreateWizard.tsx +++ b/src/prototypes/oneos-h5-h2-order/components/CreateWizard.tsx @@ -2,6 +2,8 @@ import React, { useMemo, useRef, useState } from 'react'; import type { CreateDraft } from '../types'; import { getVehicleTag } from '../utils/fleet-plates'; import { delay, mockPanelOcr, mockPlateOcr, readFileAsDataUrl } from '../utils/ocr-mock'; +import { applyPhotoWatermark, formatWatermarkTime } from '../utils/photo-watermark'; +import { fetchMileageFromVehicle } from '../utils/vehicle-mileage'; import { DateTimePickerSheet } from './DateTimePickerSheet'; import { IconCamera, @@ -14,6 +16,17 @@ import { import { PhoneShell } from './PhoneShell'; import { PlateKeyboardSheet } from './PlateKeyboardSheet'; +function listDispenserBrandHints(): string[] { + const store = (window as unknown as { H2DispenserBrandStore?: { labels?: () => string[] } }) + .H2DispenserBrandStore; + if (!store || typeof store.labels !== 'function') return []; + try { + return store.labels().slice(0, 4); + } catch { + return []; + } +} + type Props = { mode: 'create' | 'edit'; draft: CreateDraft; @@ -88,10 +101,13 @@ export function CreateWizard({ const panelInputRef = useRef(null); const [recognizing, setRecognizing] = useState<'plate' | 'panel' | null>(null); const [submitting, setSubmitting] = useState(false); + const [fetchingMileage, setFetchingMileage] = useState(false); + const [mileageHint, setMileageHint] = useState(''); const [timeOpen, setTimeOpen] = useState(false); const [plateOpen, setPlateOpen] = useState(false); const vehicleTag = useMemo(() => getVehicleTag(draft.plateNo), [draft.plateNo]); + const brandHints = listDispenserBrandHints(); function patchDraft(patch: Partial) { const nextPrice = patch.unitPrice !== undefined ? patch.unitPrice : draft.unitPrice; @@ -102,14 +118,42 @@ export function CreateWizard({ onChangeDraft(patch); } + async function watermarkPreview(rawUrl: string): Promise { + return applyPhotoWatermark(rawUrl, { + timeText: formatWatermarkTime(), + locationText: stationName || '加氢站', + }); + } + + async function pullMileageFromVehicle(plateNo: string, autoFill: boolean) { + setFetchingMileage(true); + try { + const result = await fetchMileageFromVehicle(plateNo); + setMileageHint(result.message); + if (result.ok && (autoFill || !draft.mileageKm.trim())) { + onChangeDraft({ mileageKm: result.mileageKm }); + } + return result; + } finally { + setFetchingMileage(false); + } + } + async function handlePlateFile(file: File | null) { if (!file) return; setRecognizing('plate'); try { - const url = await readFileAsDataUrl(file); + const rawUrl = await readFileAsDataUrl(file); + const url = await watermarkPreview(rawUrl); await delay(900); const ocr = mockPlateOcr(); - onChangeDraft({ platePreviewUrl: url, plateNo: ocr.plateNo }); + const mileage = await fetchMileageFromVehicle(ocr.plateNo); + setMileageHint(mileage.message); + onChangeDraft({ + platePreviewUrl: url, + plateNo: ocr.plateNo, + ...(mileage.ok ? { mileageKm: mileage.mileageKm } : {}), + }); if (typeof navigator !== 'undefined' && navigator.vibrate) navigator.vibrate(10); } finally { setRecognizing(null); @@ -120,7 +164,8 @@ export function CreateWizard({ if (!file) return; setRecognizing('panel'); try { - const url = await readFileAsDataUrl(file); + const rawUrl = await readFileAsDataUrl(file); + const url = await watermarkPreview(rawUrl); await delay(900); const ocr = mockPanelOcr(); onChangeDraft({ @@ -290,16 +335,38 @@ export function CreateWizard({ ) : null} -
+
- onChangeDraft({ mileageKm: e.target.value })} - placeholder="请输入里程" - autoComplete="off" - /> +
+ { + setMileageHint(''); + onChangeDraft({ mileageKm: e.target.value }); + }} + placeholder="可从车机获取或手工填写" + autoComplete="off" + /> + +
+ {mileageHint ? ( +

+ {mileageHint} +

+ ) : ( +

识别车牌后可自动取数;也可点「从车机获取」(原型 Mock)。

+ )}
@@ -313,6 +380,12 @@ export function CreateWizard({

请拍摄清晰的加氢机照片

+ {brandHints.length ? ( +

+ OCR 参考品牌型号(站点信息维护):{brandHints.join('、')} + {brandHints.length >= 4 ? '…' : ''} +

+ ) : null}
{ + let cancelled = false; + setPlateSrc(order.platePhotoUrl || ''); + setPanelSrc(order.panelPhotoUrl || ''); + + async function ensureDemoPhotos() { + if (!order.platePhotoUrl) { + const url = await buildDemoWatermarkedPhoto({ + kind: 'plate', + plateNo: order.plateNo, + stationName: order.stationName, + hydrogenTime: order.hydrogenTime, + }); + if (!cancelled && url) setPlateSrc(url); + } + if (!order.panelPhotoUrl) { + const url = await buildDemoWatermarkedPhoto({ + kind: 'panel', + plateNo: order.plateNo, + stationName: order.stationName, + hydrogenTime: order.hydrogenTime, + }); + if (!cancelled && url) setPanelSrc(url); + } + } + + if (!order.platePhotoUrl || !order.panelPhotoUrl) { + void ensureDemoPhotos(); + } + + return () => { + cancelled = true; + }; + }, [ + order.id, + order.platePhotoUrl, + order.panelPhotoUrl, + order.plateNo, + order.stationName, + order.hydrogenTime, + ]); return (
+
+
+
车牌识别原图(含水印)
+ {plateSrc ? ( + 车牌识别原图(含水印) + ) : ( +
暂无车牌照片
+ )} + {!order.platePhotoUrl && plateSrc ? ( +

种子演示图;新上报提交后展示实拍水印照

+ ) : null} +
+
+
加氢机面板原图(含水印)
+ {panelSrc ? ( + 加氢机面板原图(含水印) + ) : ( +
暂无面板照片
+ )} + {!order.panelPhotoUrl && panelSrc ? ( +

种子演示图;新上报提交后展示实拍水印照

+ ) : null} +
+
加氢站名称 {order.stationName} diff --git a/src/prototypes/oneos-h5-h2-order/index.tsx b/src/prototypes/oneos-h5-h2-order/index.tsx index 8b1ba45..782d9a9 100644 --- a/src/prototypes/oneos-h5-h2-order/index.tsx +++ b/src/prototypes/oneos-h5-h2-order/index.tsx @@ -3,6 +3,7 @@ * 加氢站手机浏览器 H5:本站加氢记录列表、OCR 新增、与站点对账单联动 */ import '../../common/h2VehicleLedgerBridge.js'; +import '../../common/h2DispenserBrandStore.js'; import './styles/index.css'; import React, { useEffect, useMemo, useState } from 'react'; @@ -118,6 +119,8 @@ export default function OneosH5H2Order() { unitPrice: String(order.unitPrice), hydrogenKg: String(order.hydrogenKg), totalAmount: String(order.totalAmount), + platePreviewUrl: order.platePhotoUrl || '', + panelPreviewUrl: order.panelPhotoUrl || '', }); setView({ name: 'create', @@ -175,6 +178,8 @@ export default function OneosH5H2Order() { unitPrice, hydrogenKg, totalAmount, + platePhotoUrl: draft.platePreviewUrl || '', + panelPhotoUrl: draft.panelPreviewUrl || '', }); if (!saved) { showToast('保存失败,请刷新后重试'); diff --git a/src/prototypes/oneos-h5-h2-order/scripts/build-annotation-source.mjs b/src/prototypes/oneos-h5-h2-order/scripts/build-annotation-source.mjs index 4c88eac..d4b50ab 100644 --- a/src/prototypes/oneos-h5-h2-order/scripts/build-annotation-source.mjs +++ b/src/prototypes/oneos-h5-h2-order/scripts/build-annotation-source.mjs @@ -130,8 +130,32 @@ const source = { }, }), node({ - id: 'h5-price', + id: 'h5-mileage', index: 8, + title: '里程', + pageId: 'create', + color: '#0E8A7B', + locator: { + selectors: ["[data-annotation-id='h5-mileage']", '#h5-mileage'], + fingerprint: 'field|h5-mileage', + path: [], + }, + }), + node({ + id: 'h5-dispenser-brands', + index: 9, + title: '加氢机品牌参考', + pageId: 'create', + color: '#7C3AED', + locator: { + selectors: ["[data-annotation-id='h5-dispenser-brands']", '.h5-brand-hint'], + fingerprint: 'hint|dispenser-brands', + path: [], + }, + }), + node({ + id: 'h5-price', + index: 10, title: '氢气单价', pageId: 'create', color: '#7AB929', @@ -143,7 +167,7 @@ const source = { }), node({ id: 'h5-kg', - index: 9, + index: 11, title: '加氢量', pageId: 'create', color: '#7AB929', @@ -155,7 +179,7 @@ const source = { }), node({ id: 'h5-total-label', - index: 10, + index: 12, title: '加氢总额', pageId: 'create', color: '#0E8A7B', @@ -167,7 +191,7 @@ const source = { }), node({ id: 'h5-detail', - index: 11, + index: 13, title: '记录详情', pageId: 'detail', color: '#FF7D00', @@ -177,9 +201,21 @@ const source = { path: [], }, }), + node({ + id: 'h5-detail-photos', + index: 14, + title: '识别原图', + pageId: 'detail', + color: '#0E8A7B', + locator: { + selectors: ["[data-annotation-id='h5-detail-photos']", '.h5-detail-photos'], + fingerprint: 'detail|photos', + path: [], + }, + }), node({ id: 'h5-manual', - index: 12, + index: 15, title: '手工台账', pageId: 'manual', color: '#7AB929', @@ -191,7 +227,7 @@ const source = { }), node({ id: 'h5-manual-calendar', - index: 13, + index: 16, title: '台账日历', pageId: 'manual', color: '#0E8A7B', @@ -216,6 +252,10 @@ const source = { 'h5-station': '## 加氢站名称\n\n只读。默认显示当前登录账号对应加氢站名称,不可切换。', 'h5-plate': mdFleet, + 'h5-mileage': + '## 里程(km)\n\n选填。支持「从车机获取」(原型 Mock);识别车牌后可自动回填。正式环境对接车机 / T-Box。\n\n详见 [新增加氢记录](feature-create)。', + 'h5-dispenser-brands': + '## 加氢机品牌参考\n\n展示站点信息「加氢机品牌管理」维护的品牌·型号,供面板 OCR 模型判断参考。数据源:`h2DispenserBrandStore`。', 'h5-price': '## 氢气单价(必填)\n\n可 OCR 识别后校正;变更后自动重算加氢总额(单价×加氢量)。', 'h5-kg': @@ -223,6 +263,8 @@ const source = { 'h5-total-label': '## 加氢总额(元)\n\n只读展示;由单价×加氢量自动计算(两位小数)。界面标签不展示公式文案。', 'h5-detail': mdDetail, + 'h5-detail-photos': + '## 识别原图(含水印)\n\n详情展示车牌识别、加氢机面板的原始照片;照片在拍摄/选图时已叠加时间与地点水印并随记录保存。种子数据无实拍时用演示水印图。\n\n详见 [详情编辑删除](feature-detail)。', 'h5-manual': mdManual, 'h5-manual-calendar': '## 台账日历\n\n自本站首笔加氢记录日起:绿=已上传,橙=未上传;首笔之前无需补传。禁选未来日。点选范围内未传日可补传。仅「今日」是否上传影响新增加氢记录。\n\n详见 [手工台账上传](feature-manual-ledger)。', diff --git a/src/prototypes/oneos-h5-h2-order/styles/index.css b/src/prototypes/oneos-h5-h2-order/styles/index.css index b208c39..80bbfe3 100644 --- a/src/prototypes/oneos-h5-h2-order/styles/index.css +++ b/src/prototypes/oneos-h5-h2-order/styles/index.css @@ -1019,6 +1019,59 @@ cursor: pointer; } +.h5-mileage-row { + display: flex; + align-items: stretch; + gap: 8px; +} + +.h5-mileage-row input { + flex: 1; + min-width: 0; +} + +.h5-mileage-fetch { + flex: 0 0 auto; + min-width: 108px; + height: auto; + min-height: 44px; + padding: 0 12px; + border-radius: 10px; + border: 1px solid rgba(122, 185, 41, 0.45); + background: #fff; + color: var(--xll-green-deep); + font-size: 13px; + font-weight: 700; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + cursor: pointer; +} + +.h5-mileage-fetch:disabled { + opacity: 0.55; + cursor: not-allowed; +} + +.h5-field-hint { + margin: 6px 0 0; + font-size: 12px; + line-height: 1.45; + color: var(--color-text-sec); +} + +.h5-brand-hint { + margin: 0 0 10px; + padding: 8px 10px; + border-radius: 10px; + background: #f0fdf4; + border: 1px solid #bbf7d0; + color: #166534; + font-size: 12px; + line-height: 1.45; +} + .h5-field { margin-bottom: 12px; } @@ -1330,6 +1383,54 @@ margin-left: 2px; } +.h5-detail-photos { + display: flex; + flex-direction: column; + gap: 12px; + margin: 4px 0 14px; +} + +.h5-detail-photo { + display: flex; + flex-direction: column; + gap: 6px; +} + +.h5-detail-photo__label { + font-size: 12px; + font-weight: 700; + color: var(--color-text-sec); +} + +.h5-detail-photo img { + width: 100%; + aspect-ratio: 16 / 9; + object-fit: cover; + border-radius: 12px; + border: 1px solid #e2e8f0; + background: #0f172a; +} + +.h5-detail-photo__empty { + display: flex; + align-items: center; + justify-content: center; + min-height: 120px; + border-radius: 12px; + border: 1px dashed #cbd5e1; + background: #f8fafc; + color: #94a3b8; + font-size: 13px; + font-weight: 600; +} + +.h5-detail-photo__hint { + margin: 0; + font-size: 11px; + line-height: 1.4; + color: #94a3b8; +} + .h5-loading { display: flex; align-items: center; diff --git a/src/prototypes/oneos-h5-h2-order/types.ts b/src/prototypes/oneos-h5-h2-order/types.ts index 4194327..989cab5 100644 --- a/src/prototypes/oneos-h5-h2-order/types.ts +++ b/src/prototypes/oneos-h5-h2-order/types.ts @@ -21,6 +21,10 @@ export type H5OrderRecord = { verifiedAt: string; reconcileStatus: ReconcileStatus; reconcileTime: string; + /** 车牌识别原图(含水印),无则为空 */ + platePhotoUrl: string; + /** 加氢机面板原图(含水印),无则为空 */ + panelPhotoUrl: string; }; export type CreateDraft = { diff --git a/src/prototypes/oneos-h5-h2-order/utils/demo-photo.ts b/src/prototypes/oneos-h5-h2-order/utils/demo-photo.ts new file mode 100644 index 0000000..7017b7d --- /dev/null +++ b/src/prototypes/oneos-h5-h2-order/utils/demo-photo.ts @@ -0,0 +1,48 @@ +/** 种子记录无实拍时,生成带水印的演示占位图(原型用) */ + +import { applyPhotoWatermark, formatWatermarkTime } from './photo-watermark'; + +function makeBaseCanvas(label: string, tone: 'plate' | 'panel'): string { + const canvas = document.createElement('canvas'); + canvas.width = 720; + canvas.height = 405; + const ctx = canvas.getContext('2d'); + if (!ctx) return ''; + const gradient = ctx.createLinearGradient(0, 0, 720, 405); + if (tone === 'plate') { + gradient.addColorStop(0, '#1e293b'); + gradient.addColorStop(1, '#334155'); + } else { + gradient.addColorStop(0, '#064e3b'); + gradient.addColorStop(1, '#0f766e'); + } + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 720, 405); + ctx.fillStyle = 'rgba(255,255,255,0.92)'; + ctx.font = '700 36px ui-sans-serif, system-ui, "PingFang SC", sans-serif'; + ctx.textAlign = 'center'; + ctx.fillText(label, 360, 190); + ctx.font = '500 18px ui-sans-serif, system-ui, "PingFang SC", sans-serif'; + ctx.fillStyle = 'rgba(255,255,255,0.72)'; + ctx.fillText('演示原图(含水印)', 360, 232); + return canvas.toDataURL('image/jpeg', 0.88); +} + +export async function buildDemoWatermarkedPhoto(options: { + kind: 'plate' | 'panel'; + plateNo: string; + stationName: string; + hydrogenTime: string; +}): Promise { + const label = + options.kind === 'plate' + ? `车牌 ${String(options.plateNo || '').replace(/F$/u, '') || '—'}` + : '加氢机面板'; + const base = makeBaseCanvas(label, options.kind); + if (!base) return ''; + const timeText = String(options.hydrogenTime || formatWatermarkTime()).slice(0, 19); + return applyPhotoWatermark(base, { + timeText, + locationText: options.stationName || '加氢站', + }); +} diff --git a/src/prototypes/oneos-h5-h2-order/utils/orders.ts b/src/prototypes/oneos-h5-h2-order/utils/orders.ts index fe3e2e5..60856c5 100644 --- a/src/prototypes/oneos-h5-h2-order/utils/orders.ts +++ b/src/prototypes/oneos-h5-h2-order/utils/orders.ts @@ -79,6 +79,8 @@ export function mapRowToOrder(row: Record): H5OrderRecord { verifiedAt, reconcileStatus, reconcileTime: reconcileStatus === 'reconciled' ? reconcileTime : '', + platePhotoUrl: asString(row.platePhotoUrl), + panelPhotoUrl: asString(row.panelPhotoUrl), }; } @@ -127,6 +129,8 @@ export function upsertStationOrder(input: { unitPrice: number; hydrogenKg: number; totalAmount: number; + platePhotoUrl?: string; + panelPhotoUrl?: string; }): H5OrderRecord | null { const bridge = typeof window !== 'undefined' ? window.H2VehicleLedgerBridge : undefined; if (!bridge?.upsertRow) return null; @@ -152,6 +156,8 @@ export function upsertStationOrder(input: { customerAmount: input.totalAmount, settlementStatus: 'customer', mileageKm, + platePhotoUrl: String(input.platePhotoUrl || ''), + panelPhotoUrl: String(input.panelPhotoUrl || ''), creatorName: '站端账号', reconcileStatus: 'pending', verifyStatus: 'unverified', diff --git a/src/prototypes/oneos-h5-h2-order/utils/photo-watermark.ts b/src/prototypes/oneos-h5-h2-order/utils/photo-watermark.ts new file mode 100644 index 0000000..fabe8e4 --- /dev/null +++ b/src/prototypes/oneos-h5-h2-order/utils/photo-watermark.ts @@ -0,0 +1,68 @@ +/** 拍摄预览加水印:时间 + 地点(原型本地 canvas,未接真相机 SDK) */ + +function pad2(n: number): string { + return n < 10 ? `0${n}` : String(n); +} + +export function formatWatermarkTime(date = new Date()): string { + return ( + `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())} ` + + `${pad2(date.getHours())}:${pad2(date.getMinutes())}:${pad2(date.getSeconds())}` + ); +} + +/** + * 在图片右下角绘制半透明水印条:第一行时间,第二行地点。 + */ +export function applyPhotoWatermark( + dataUrl: string, + options: { timeText: string; locationText: string }, +): Promise { + return new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => { + try { + const canvas = document.createElement('canvas'); + const w = img.naturalWidth || img.width || 1; + const h = img.naturalHeight || img.height || 1; + canvas.width = w; + canvas.height = h; + const ctx = canvas.getContext('2d'); + if (!ctx) { + resolve(dataUrl); + return; + } + ctx.drawImage(img, 0, 0, w, h); + + const fontSize = Math.max(14, Math.round(Math.min(w, h) * 0.032)); + const lineGap = Math.round(fontSize * 1.35); + const padX = Math.round(fontSize * 0.7); + const padY = Math.round(fontSize * 0.55); + const lines = [ + `时间 ${options.timeText}`, + `地点 ${options.locationText || '位置未知'}`, + ]; + ctx.font = `600 ${fontSize}px ui-sans-serif, system-ui, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif`; + const textWidth = Math.max(...lines.map((line) => ctx.measureText(line).width)); + const boxW = textWidth + padX * 2; + const boxH = lineGap * lines.length + padY * 2; + const boxX = Math.max(8, w - boxW - Math.round(fontSize * 0.6)); + const boxY = Math.max(8, h - boxH - Math.round(fontSize * 0.6)); + + ctx.fillStyle = 'rgba(15, 23, 42, 0.58)'; + ctx.fillRect(boxX, boxY, boxW, boxH); + ctx.fillStyle = '#ffffff'; + ctx.textBaseline = 'top'; + lines.forEach((line, index) => { + ctx.fillText(line, boxX + padX, boxY + padY + index * lineGap); + }); + + resolve(canvas.toDataURL('image/jpeg', 0.92)); + } catch (error) { + reject(error); + } + }; + img.onerror = () => reject(new Error('水印图片加载失败')); + img.src = dataUrl; + }); +} diff --git a/src/prototypes/oneos-h5-h2-order/utils/vehicle-mileage.ts b/src/prototypes/oneos-h5-h2-order/utils/vehicle-mileage.ts new file mode 100644 index 0000000..26cf96e --- /dev/null +++ b/src/prototypes/oneos-h5-h2-order/utils/vehicle-mileage.ts @@ -0,0 +1,61 @@ +/** + * 车机里程(原型 Mock) + * 正式环境应改为车机 / T-Box / 车辆管理接口;此处按车牌返回演示里程。 + */ + +const MILEAGE_BY_PLATE: Record = { + 浙A88H201: 128560, + 浙A12345: 132000, + 浙B23456: 98640, + 沪ADB9161: 75420, + 苏E33333: 110280, + 浙A99880: 87210, +}; + +function normalizePlate(plateNo: string): string { + return String(plateNo || '') + .trim() + .toUpperCase() + .replace(/F$/u, ''); +} + +export type VehicleMileageResult = { + ok: boolean; + mileageKm: string; + source: 'vehicle' | 'fallback'; + message: string; +}; + +/** 模拟从车机拉取当前里程;无命中时给可演示的回退值 */ +export async function fetchMileageFromVehicle(plateNo: string): Promise { + await new Promise((resolve) => { + window.setTimeout(resolve, 450); + }); + const key = normalizePlate(plateNo); + if (!key) { + return { + ok: false, + mileageKm: '', + source: 'fallback', + message: '请先填写或识别车牌号后再取里程', + }; + } + if (MILEAGE_BY_PLATE[key] != null) { + return { + ok: true, + mileageKm: String(MILEAGE_BY_PLATE[key]), + source: 'vehicle', + message: '已从车机获取当前里程', + }; + } + // 非种子车牌:用稳定伪值,便于演示「可取数」 + let hash = 0; + for (let i = 0; i < key.length; i += 1) hash = (hash * 31 + key.charCodeAt(i)) % 100000; + const mileage = 60000 + hash; + return { + ok: true, + mileageKm: String(mileage), + source: 'fallback', + message: '车机未直连,已按演示规则回填里程', + }; +} diff --git a/src/prototypes/oneos-prototype-nav/prototype-registry.json b/src/prototypes/oneos-prototype-nav/prototype-registry.json index 421a55b..9867483 100644 --- a/src/prototypes/oneos-prototype-nav/prototype-registry.json +++ b/src/prototypes/oneos-prototype-nav/prototype-registry.json @@ -1,13 +1,13 @@ { "version": 1, - "updatedAt": "2026-07-17T05:30:12.068Z", + "updatedAt": "2026-07-17T09:43:57.245Z", "prototypes": { "oneos-web-workbench": { "title": "工作台", "version": "v1.4", "revision": 4, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "3d7954b2ad60057932b8a0b25e645a83ef0ff1b5fe3db37d1a25382810e29126", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "112a83b91f6de93378a2c19185461be8d0c78efddb45c290ddc826e64b637775", "trackedFiles": [ "index.tsx", "pages/01-工作台.jsx" @@ -15,14 +15,11 @@ "changelog": [ { "version": "v1.4", - "date": "2026-07-12", - "time": "22:45", - "summary": "工作台:提车应收款快捷入口改跳独立原型", - "details": [ - "快捷入口指向 /prototypes/vehicle-pickup-receivable", - "protoNav 支持直接 location 跳转原型 URL" - ], - "commit": "131b963", + "date": "2026-07-09", + "time": "17:52", + "summary": "多业务台账/财务/工作台页面迭代与标注目录同步。", + "details": [], + "commit": "6ccbbef", "files": [] }, { @@ -60,10 +57,10 @@ }, "vehicle-management": { "title": "车辆资产", - "version": "v1.29", - "revision": 29, - "lastUpdated": "2026-07-17T03:51:01.923Z", - "contentHash": "025a6adcdbd2f263d63e9df026fd6a299fe450a33fdf25b31687c62a2eab8647", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-16T01:00:00.000Z", + "contentHash": "f4b82857b0014e3e0754f4553d8078337fee88c6ee446865845534535ad051cf", "trackedFiles": [ ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -149,484 +146,39 @@ "utils/violationRecords.ts" ], "changelog": [ - { - "version": "v1.29", - "date": "2026-07-17", - "time": "11:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.28", - "date": "2026-07-14", - "time": "21:06", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.27", - "date": "2026-07-13", - "time": "15:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.26", - "date": "2026-07-13", - "time": "13:19", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.25", - "date": "2026-07-13", - "time": "13:19", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.24", - "date": "2026-07-13", - "time": "13:18", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.23", - "date": "2026-07-13", - "time": "13:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.22", - "date": "2026-07-13", - "time": "13:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.21", - "date": "2026-07-13", - "time": "13:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.20", - "date": "2026-07-13", - "time": "13:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.19", - "date": "2026-07-13", - "time": "13:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.18", - "date": "2026-07-13", - "time": "13:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.17", - "date": "2026-07-13", - "time": "13:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.16", - "date": "2026-07-13", - "time": "13:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.15", - "date": "2026-07-13", - "time": "13:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.14", - "date": "2026-07-13", - "time": "13:16", - "summary": "更新 onLeaseFleet.ts", - "files": [ - "utils/onLeaseFleet.ts" - ] - }, - { - "version": "v1.13", - "date": "2026-07-13", - "time": "13:14", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.12", - "date": "2026-07-13", - "time": "13:14", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.11", - "date": "2026-07-13", - "time": "12:32", - "summary": "证照/保险状态改为筛选,移除异常KPI与测试用例下载", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.10", - "date": "2026-07-13", - "time": "12:32", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.9", - "date": "2026-07-13", - "time": "12:32", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.8", - "date": "2026-07-13", - "time": "12:32", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, - { - "version": "v1.7", - "date": "2026-07-13", - "time": "12:32", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd-detail.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" - ] - }, { "version": "v1.6", - "date": "2026-07-13", - "time": "12:32", - "summary": "更新需求说明与标注", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:FilterPanel.tsx、KpiCards.tsx、OnLeaseFleetSection.tsx、VehicleTable.tsx 等", + "details": [ + "样式与布局:style.css", + "需求说明与 PRD:requirements-prd-detail.md、requirements-prd-list.md", + "演示数据与配置:vehicles.json" + ], + "commit": "47c223a", "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", ".spec/requirements-prd-detail.md", ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/DateRangeCalendarPanel.tsx", - "components/DateRangeFilterField.tsx", - "components/DetailAccidentRecordsTab.tsx", - "components/DetailAnnualReviewRecordsTab.tsx", - "components/DetailBasicInfoTab.tsx", - "components/DetailExpireField.tsx", - "components/DetailFaultRecordsTab.tsx" + "components/FilterPanel.tsx", + "components/KpiCards.tsx", + "components/OnLeaseFleetSection.tsx", + "components/VehicleTable.tsx", + "data/vehicles.json", + "index.tsx", + "style.css", + "types.ts", + "utils/filters.ts", + "utils/leaseRecords.ts" ] }, { "version": "v1.5", "date": "2026-07-12", - "time": "22:45", - "summary": "车辆管理:在租车队 KPI 迁入、车型分布弹窗与列表样式优化", + "time": "22:44", + "summary": "页面逻辑与交互:DetailAccidentRecordsTab.tsx、DetailAnnualReviewRecordsTab.tsx、DetailFaultRecordsTab.tsx、DetailInsuranceRecordsTab.tsx 等", "details": [ - "在租车队 KPI 从租赁合同列表迁入;按品牌型号统计在租数量", - "车型分布弹窗:品牌筛选、车型卡片、占比进度条、车辆明细", - "详情 Tab 与列表筛选/导入/KPI 操作区统一;表格样式优化" + "样式与布局:style.css" ], "commit": "131b963", "files": [ @@ -738,10 +290,10 @@ }, "customer-management": { "title": "客户管理", - "version": "v1.7", - "revision": 7, - "lastUpdated": "2026-07-13T01:31:55.559Z", - "contentHash": "bf7d8ecd03b4105b0c4acd47dcabb09e9437617fda46399f882ba742cde05189", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-13T01:31:00.000Z", + "contentHash": "619a8d374419d4c5a016ebb150e919f8c7e523009413e9a89b81d449f42d8b05", "trackedFiles": [ ".spec/prototype-review.md", ".spec/requirements-prd-create.md", @@ -773,66 +325,23 @@ "utils/riskTagStore.ts" ], "changelog": [ - { - "version": "v1.7", - "date": "2026-07-13", - "time": "09:31", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-review.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/BatchRiskTagModal.tsx", - "components/CustomerTable.tsx", - "components/FilterPanel.tsx", - "components/LabelTags.tsx", - "components/MultiSelectField.tsx", - "components/RiskKpiCards.tsx", - "components/RiskLabelTags.tsx", - "components/RiskTagDrawer.tsx" - ] - }, { "version": "v1.6", "date": "2026-07-13", "time": "09:31", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-review.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/BatchRiskTagModal.tsx", - "components/CustomerTable.tsx", - "components/FilterPanel.tsx", - "components/LabelTags.tsx", - "components/MultiSelectField.tsx", - "components/RiskKpiCards.tsx", - "components/RiskLabelTags.tsx", - "components/RiskTagDrawer.tsx" - ] + "summary": "merge: 合并远程客户管理与供应商管理迭代", + "details": [ + "保留风险标签复核逻辑与统一操作按钮规范。" + ], + "commit": "9b6244e", + "files": [] }, { "version": "v1.5", - "date": "2026-07-13", - "time": "09:31", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-review.md", - "components/RiskKpiCards.tsx", - "utils/riskKpi.ts" - ] - }, - { - "version": "v1.4", "date": "2026-07-12", - "time": "22:45", - "summary": "客户管理:OperationActions 统一操作列,移除面包屑", - "details": [ - "列表操作:详情 / 编辑 / 管理标签 / 删除", - "风险标签、批量打标等业务逻辑不变" - ], + "time": "22:44", + "summary": "页面逻辑与交互:BatchRiskTagModal.tsx、CustomerTable.tsx、FilterPanel.tsx、RiskTagDrawer.tsx 等", + "details": [], "commit": "131b963", "files": [ "components/BatchRiskTagModal.tsx", @@ -844,7 +353,7 @@ ] }, { - "version": "v1.3", + "version": "v1.4", "date": "2026-07-08", "time": "11:44", "summary": "页面逻辑与交互:FilterPanel.tsx、MultiSelectField.tsx、index.tsx", @@ -856,6 +365,33 @@ "index.tsx" ] }, + { + "version": "v1.3", + "date": "2026-07-02", + "time": "13:50", + "summary": "feat(customer-management): 迭代风险标签复核机制与列表 KPI", + "details": [ + "页面逻辑与交互:BatchRiskTagModal.tsx、CustomerTable.tsx、RiskKpiCards.tsx、RiskLabelTags.tsx 等", + "样式与布局:index.css", + "需求说明与 PRD:prototype-review.md、requirements-prd-create.md、requirements-prd-list.md", + "演示数据与配置:risk-tag-operation-logs.json" + ], + "commit": "ae597d8", + "files": [ + ".spec/prototype-review.md", + ".spec/requirements-prd-create.md", + ".spec/requirements-prd-list.md", + "components/BatchRiskTagModal.tsx", + "components/CustomerTable.tsx", + "components/RiskKpiCards.tsx", + "components/RiskLabelTags.tsx", + "components/RiskTagDrawer.tsx", + "components/RiskTagForm.tsx", + "data/risk-tag-operation-logs.json", + "index.tsx", + "pages/CreatePage.tsx" + ] + }, { "version": "v1.2", "date": "2026-07-01", @@ -916,8 +452,8 @@ "title": "供应商管理", "version": "v1.5", "revision": 5, - "lastUpdated": "2026-07-13T01:31:56.619Z", - "contentHash": "94e568a299b24aa7e59d17185bd2bc95e4dafb447fb521bf3ca937046a849486", + "lastUpdated": "2026-07-13T01:31:00.000Z", + "contentHash": "94261729b5316c2fbed8b4d554ca9acd38b708e89ef71d5341c2fb9465d309ea", "trackedFiles": [ ".spec/prototype-review.md", "components/BankAccountConfirmModal.tsx", @@ -949,50 +485,19 @@ "version": "v1.5", "date": "2026-07-13", "time": "09:31", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-review.md", - "components/BankAccountConfirmModal.tsx", - "components/ChangeLogDrawer.tsx", - "components/CoopStatusBadge.tsx", - "components/DeleteConfirmModal.tsx", - "components/FilterPanel.tsx", - "components/KpiCards.tsx", - "components/LeaveConfirmModal.tsx", - "components/RoleSwitcher.tsx", - "components/SupplierTable.tsx", - "data/suppliers.json", - "index.tsx" - ] + "summary": "merge: 合并远程客户管理与供应商管理迭代", + "details": [ + "保留风险标签复核逻辑与统一操作按钮规范。" + ], + "commit": "9b6244e", + "files": [] }, { "version": "v1.4", - "date": "2026-07-13", - "time": "09:31", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-review.md", - "components/BankAccountConfirmModal.tsx", - "components/ChangeLogDrawer.tsx", - "components/DeleteConfirmModal.tsx", - "components/LeaveConfirmModal.tsx", - "components/RoleSwitcher.tsx", - "utils/createForm.ts", - "utils/permissions.ts", - "utils/phone.ts", - "utils/region.ts", - "utils/supplierFields.ts", - "utils/validation.ts" - ] - }, - { - "version": "v1.3", "date": "2026-07-12", - "time": "22:45", - "summary": "供应商管理:工具栏与操作区图标标准化", - "details": [ - "新增供应商按钮图标统一;删除收入 OperationActions" - ], + "time": "22:44", + "summary": "页面逻辑与交互:FilterPanel.tsx、SupplierTable.tsx、index.tsx、CreatePage.tsx", + "details": [], "commit": "131b963", "files": [ "components/FilterPanel.tsx", @@ -1002,7 +507,7 @@ ] }, { - "version": "v1.2", + "version": "v1.3", "date": "2026-07-08", "time": "11:44", "summary": "页面逻辑与交互:index.tsx", @@ -1015,6 +520,33 @@ "styles/index.css" ] }, + { + "version": "v1.2", + "date": "2026-07-03", + "time": "16:17", + "summary": "feat(supplier-management): 同步供应商管理最新原型迭代", + "details": [ + "页面逻辑与交互:BankAccountConfirmModal.tsx、ChangeLogDrawer.tsx、DeleteConfirmModal.tsx、KpiCards.tsx 等", + "样式与布局:index.css", + "需求说明与 PRD:prototype-review.md", + "演示数据与配置:suppliers.json" + ], + "commit": "d458d63", + "files": [ + ".spec/prototype-review.md", + "components/BankAccountConfirmModal.tsx", + "components/ChangeLogDrawer.tsx", + "components/DeleteConfirmModal.tsx", + "components/KpiCards.tsx", + "components/LeaveConfirmModal.tsx", + "components/RoleSwitcher.tsx", + "data/suppliers.json", + "index.tsx", + "pages/CreatePage.tsx", + "styles/index.css", + "types.ts" + ] + }, { "version": "v1.1", "date": "2026-07-01", @@ -1045,10 +577,10 @@ }, "lease-contract-management": { "title": "租赁合同", - "version": "v1.13", - "revision": 13, - "lastUpdated": "2026-07-17T03:51:03.325Z", - "contentHash": "aff8ad3ebcdd07fa07ba8f3c20aa4a445236d539eaaae8afcc5bac6b839a3984", + "version": "v1.9", + "revision": 9, + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "9893fd2bd34c29a9bf60a11d16061cbf71015bd27f918ecdc282477bb47a243a", "trackedFiles": [ ".spec/prototype-comments.json", ".spec/requirements-annotation-context.md", @@ -1082,97 +614,14 @@ "styles/lease-contract.css" ], "changelog": [ - { - "version": "v1.13", - "date": "2026-07-17", - "time": "11:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-annotation-context.md", - ".spec/requirements-flow-operations.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - "contract-word-preview.js", - "index.tsx", - "lease-business-org-data.js", - "lease-contract-approval-rules.js", - "lease-contract-edit-bridge.js", - "lease-contract-flow-bridge.js", - "lease-contract-form-validation.js" - ] - }, - { - "version": "v1.12", - "date": "2026-07-14", - "time": "21:06", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-annotation-context.md", - ".spec/requirements-flow-operations.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - "contract-word-preview.js", - "index.tsx", - "lease-business-org-data.js", - "lease-contract-approval-rules.js", - "lease-contract-edit-bridge.js", - "lease-contract-flow-bridge.js", - "lease-contract-form-validation.js" - ] - }, - { - "version": "v1.11", - "date": "2026-07-13", - "time": "15:17", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-annotation-context.md", - ".spec/requirements-flow-operations.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - "contract-word-preview.js", - "index.tsx", - "lease-business-org-data.js", - "lease-contract-approval-rules.js", - "lease-contract-edit-bridge.js", - "lease-contract-flow-bridge.js", - "lease-contract-form-validation.js" - ] - }, - { - "version": "v1.10", - "date": "2026-07-13", - "time": "11:30", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-annotation-context.md", - ".spec/requirements-flow-operations.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - "contract-word-preview.js", - "index.tsx", - "lease-business-org-data.js", - "lease-contract-approval-rules.js", - "lease-contract-edit-bridge.js", - "lease-contract-flow-bridge.js", - "lease-contract-form-validation.js" - ] - }, { "version": "v1.9", "date": "2026-07-12", - "time": "22:45", - "summary": "租赁合同增强:KPI/状态收敛、查看页、签署方式与提车应收联动", + "time": "22:44", + "summary": "页面逻辑与交互:LeaseContractCreate.jsx、LeaseContractEditorForm.jsx、LeaseContractFleetSummary.jsx、LeaseContractManagement.jsx 等", "details": [ - "列表 KPI:全部/草稿/进行中/审批中/已终止;合同状态收敛;在租车队 KPI 迁至车辆管理", - "筛选:合同模板类型 + 标准合同名称二级联动;统一流程入口(新增/续签/转正式/增车等)", - "新增只读查看页;线上电子签章 / 线下人工上传;主动终止与交付安排变更(Cascader/TBD)", - "附加费用拆分已有/新增服务项;红线条款 + 新增条款检测;先付后用/先用后付", - "提交审批与交付计划变更同步提车应收 bridge" + "样式与布局:lease-contract-create.css、lease-contract.css", + "需求说明与 PRD:requirements-annotation-context.md、requirements-flow-operations.md、requirements-prd-list.md" ], "commit": "131b963", "files": [ @@ -1377,9 +826,9 @@ }, "insurance-procurement": { "title": "保险采购", - "version": "v1.15", - "revision": 15, - "lastUpdated": "2026-07-17T03:53:40.990Z", + "version": "v1.5", + "revision": 5, + "lastUpdated": "2026-07-16T01:00:00.000Z", "contentHash": "009327e1188652e0d99a6e4044acbcbba333c203978af4654fc71327bf62e6e4", "trackedFiles": [ ".spec/prototype-comments.json", @@ -1388,134 +837,16 @@ "styles/index.css" ], "changelog": [ - { - "version": "v1.15", - "date": "2026-07-17", - "time": "11:53", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.14", - "date": "2026-07-14", - "time": "21:07", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.13", - "date": "2026-07-14", - "time": "21:05", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.12", - "date": "2026-07-14", - "time": "21:04", - "summary": "更多筛选与全局筛选展开规则对齐(重排/角标/动画)", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.11", - "date": "2026-07-14", - "time": "21:04", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.10", - "date": "2026-07-14", - "time": "21:04", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.9", - "date": "2026-07-14", - "time": "21:04", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.8", - "date": "2026-07-14", - "time": "21:04", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.7", - "date": "2026-07-14", - "time": "21:02", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.6", - "date": "2026-07-14", - "time": "21:02", - "summary": "台账操作列「管理」与证照管理等页统一收入更多下拉", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "InsuranceProcurement.jsx", - "styles/index.css" - ] - }, { "version": "v1.5", - "date": "2026-07-14", - "time": "21:02", - "summary": "更新页面样式", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:InsuranceProcurement.jsx", + "details": [ + "样式与布局:index.css" + ], + "commit": "47c223a", "files": [ - ".spec/prototype-comments.json", - "index.tsx", "InsuranceProcurement.jsx", "styles/index.css" ] @@ -1523,12 +854,9 @@ { "version": "v1.4", "date": "2026-07-12", - "time": "22:45", - "summary": "保险采购:OperationActions 统一操作列", - "details": [ - "保单列表:编辑 / 预览 / 下载 / 更多", - "标注壳切换" - ], + "time": "22:44", + "summary": "页面逻辑与交互:InsuranceProcurement.jsx、index.tsx", + "details": [], "commit": "131b963", "files": [ "InsuranceProcurement.jsx", @@ -1578,10 +906,10 @@ }, "contract-template-management": { "title": "合同模板管理", - "version": "v1.14", - "revision": 14, - "lastUpdated": "2026-07-14T14:36:41.509Z", - "contentHash": "964711acb510d03306d03f267ebdc6c5ec3b323414132ef88aec7a13638be920", + "version": "v1.10", + "revision": 10, + "lastUpdated": "2026-07-13T01:31:00.000Z", + "contentHash": "926fd8b5d887e6dc2381c34771f95caecf1d4869bd618797972b8c27483e57ee", "trackedFiles": [ ".spec/acp/conversations.json", ".spec/prototype-comments.json", @@ -1610,114 +938,25 @@ "VehicleBrandModelPicker.jsx" ], "changelog": [ - { - "version": "v1.14", - "date": "2026-07-14", - "time": "22:36", - "summary": "更新需求说明与标注", - "files": [ - ".spec/acp/conversations.json", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/ui-review.md", - "contract-template-catalog.js", - "contract-template-docx-fidelity.js", - "contract-template-section-filter.js", - "contract-template-section-headings.js", - "contract-template-section-html.js", - "contract-template-seed.js", - "contract-template-store.js", - "contract-template-types.js" - ] - }, - { - "version": "v1.13", - "date": "2026-07-14", - "time": "20:59", - "summary": "更新需求说明与标注", - "files": [ - ".spec/acp/conversations.json", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/ui-review.md", - "contract-template-catalog.js", - "contract-template-docx-fidelity.js", - "contract-template-section-filter.js", - "contract-template-section-headings.js", - "contract-template-section-html.js", - "contract-template-seed.js", - "contract-template-store.js", - "contract-template-types.js" - ] - }, - { - "version": "v1.12", - "date": "2026-07-14", - "time": "20:59", - "summary": "更新需求说明与标注", - "files": [ - ".spec/acp/conversations.json", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/ui-review.md", - "contract-template-catalog.js", - "contract-template-docx-fidelity.js", - "contract-template-section-filter.js", - "contract-template-section-headings.js", - "contract-template-section-html.js", - "contract-template-seed.js", - "contract-template-store.js", - "contract-template-types.js" - ] - }, - { - "version": "v1.11", - "date": "2026-07-13", - "time": "00:26", - "summary": "更新需求说明与标注", - "files": [ - ".spec/acp/conversations.json", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/ui-review.md", - "contract-template-catalog.js", - "contract-template-docx-fidelity.js", - "contract-template-section-filter.js", - "contract-template-section-headings.js", - "contract-template-section-html.js", - "contract-template-seed.js", - "contract-template-store.js", - "contract-template-types.js" - ] - }, { "version": "v1.10", "date": "2026-07-13", - "time": "00:26", - "summary": "更新需求说明与标注", + "time": "09:31", + "summary": "页面逻辑与交互:contract-template-docx-fidelity.js、contract-template-word-import.js", + "details": [], + "commit": "962e835", "files": [ - ".spec/acp/conversations.json", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/ui-review.md", - "contract-template-catalog.js", "contract-template-docx-fidelity.js", - "contract-template-section-filter.js", - "contract-template-section-headings.js", - "contract-template-section-html.js", - "contract-template-seed.js", - "contract-template-store.js", - "contract-template-types.js" + "contract-template-word-import.js" ] }, { "version": "v1.9", "date": "2026-07-12", - "time": "22:45", - "summary": "合同模板:启用/停用、先付后用/先用后付变量与操作区重构", + "time": "22:44", + "summary": "页面逻辑与交互:ContractTemplate.jsx、contract-template-catalog.js、contract-template-vars.js、index.tsx", "details": [ - "行操作:编辑 + 更多(启用/停用、版本日志、删除);启用中不可编辑/删除", - "模板变量新增 paymentMethod;付款周期与氢费结算文案更新" + "样式与布局:contract-template.css" ], "commit": "131b963", "files": [ @@ -1867,11 +1106,12 @@ }, "oneos-web-h2-station-site": { "title": "站点信息", - "version": "v1.21", - "revision": 21, - "lastUpdated": "2026-07-17T05:30:12.067Z", - "contentHash": "cc22425e22c30fa28e7d3c7d1473b7d76f8a85167c60837b1fccde7a36998e64", + "version": "v1.27", + "revision": 27, + "lastUpdated": "2026-07-17T09:43:57.245Z", + "contentHash": "8c53fc1d73b2a4b0310916569e6248b04e44b8ec3902a4f32c86e5a969a422fd", "trackedFiles": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -1880,16 +1120,18 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ], "changelog": [ { - "version": "v1.21", + "version": "v1.27", "date": "2026-07-17", - "time": "13:30", + "time": "17:43", "summary": "更新需求说明与标注", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -1898,6 +1140,127 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "version": "v1.26", + "date": "2026-07-17", + "time": "17:41", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "version": "v1.25", + "date": "2026-07-17", + "time": "17:41", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "version": "v1.24", + "date": "2026-07-17", + "time": "17:41", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "version": "v1.23", + "date": "2026-07-17", + "time": "17:40", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "version": "v1.22", + "date": "2026-07-17", + "time": "17:40", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "version": "v1.21", + "date": "2026-07-17", + "time": "17:39", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] @@ -1905,9 +1268,10 @@ { "version": "v1.20", "date": "2026-07-17", - "time": "13:30", + "time": "17:39", "summary": "更新需求说明与标注", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -1916,6 +1280,7 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] @@ -1923,9 +1288,10 @@ { "version": "v1.19", "date": "2026-07-17", - "time": "13:21", + "time": "17:38", "summary": "更新需求说明与标注", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -1934,6 +1300,7 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] @@ -1941,9 +1308,10 @@ { "version": "v1.18", "date": "2026-07-17", - "time": "11:52", + "time": "17:37", "summary": "更新需求说明与标注", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -1952,6 +1320,7 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] @@ -1959,9 +1328,10 @@ { "version": "v1.17", "date": "2026-07-17", - "time": "11:52", - "summary": "更新需求说明与标注", + "time": "17:37", + "summary": "对账单仅纳入已核对氢费明细", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -1970,6 +1340,7 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] @@ -1977,9 +1348,10 @@ { "version": "v1.16", "date": "2026-07-17", - "time": "11:51", + "time": "17:37", "summary": "更新需求说明与标注", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -1988,6 +1360,7 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] @@ -1995,7 +1368,7 @@ { "version": "v1.15", "date": "2026-07-17", - "time": "11:51", + "time": "17:20", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2013,7 +1386,7 @@ { "version": "v1.14", "date": "2026-07-17", - "time": "11:51", + "time": "17:20", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2031,7 +1404,7 @@ { "version": "v1.13", "date": "2026-07-17", - "time": "11:51", + "time": "17:19", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2049,7 +1422,7 @@ { "version": "v1.12", "date": "2026-07-17", - "time": "11:51", + "time": "16:27", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2067,7 +1440,7 @@ { "version": "v1.11", "date": "2026-07-17", - "time": "11:51", + "time": "16:27", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2085,7 +1458,7 @@ { "version": "v1.10", "date": "2026-07-17", - "time": "11:50", + "time": "16:26", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2103,7 +1476,7 @@ { "version": "v1.9", "date": "2026-07-17", - "time": "11:50", + "time": "16:26", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2121,7 +1494,7 @@ { "version": "v1.8", "date": "2026-07-17", - "time": "11:50", + "time": "16:26", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -2138,10 +1511,11 @@ }, { "version": "v1.7", - "date": "2026-07-16", - "time": "19:50", + "date": "2026-07-17", + "time": "16:25", "summary": "更新需求说明与标注", "files": [ + ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", ".spec/requirements-prd-kpi-balance-alert.md", @@ -2155,38 +1529,44 @@ }, { "version": "v1.6", - "date": "2026-07-16", - "time": "10:19", - "summary": "站点信息页迁入本包 pages/", + "date": "2026-07-17", + "time": "16:10", + "summary": "手工台账与预约列表", + "details": [ + "导入主键与实收规则", + "并同步站点信息拆分与导航。", + "页面逻辑与交互:index.tsx", + "需求说明与 PRD:period-end-balance.md、prototype-review.md、requirements-prd-kpi-balance-alert.md、requirements-prd-list.md、requirements-prd.md" + ], + "commit": "305199c", "files": [ - ".spec/prototype-comments.json", + ".spec/period-end-balance.md", ".spec/prototype-review.md", ".spec/requirements-prd-kpi-balance-alert.md", ".spec/requirements-prd-list.md", - ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", - ".spec/requirements.md", - "index.tsx", - "pages/03-站点信息.jsx" + "index.tsx" ] }, { "version": "v1.5", "date": "2026-07-16", - "time": "10:18", - "summary": "更新页面逻辑与交互", + "time": "09:00", + "summary": "需求说明与 PRD:requirements-prd-list.md、requirements-prd.md、requirements.md", + "details": [], + "commit": "47c223a", "files": [ - "pages/03-站点信息.jsx" + ".spec/requirements-prd-list.md", + ".spec/requirements-prd.md", + ".spec/requirements.md" ] }, { "version": "v1.4", "date": "2026-07-12", - "time": "22:45", - "summary": "站点信息:标注目录清理", - "details": [ - "移除内嵌原型导航节点;标注壳切换" - ], + "time": "22:44", + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "131b963", "files": [ "index.tsx" @@ -2241,10 +1621,10 @@ }, "business-dept-ledger": { "title": "项目盈亏情况", - "version": "v1.64", - "revision": 64, - "lastUpdated": "2026-07-13T09:20:38.901Z", - "contentHash": "d526cd00ed1c7ee138cc0b32d5059e1af070aba38a7955b965c290a65801d453", + "version": "v1.4", + "revision": 4, + "lastUpdated": "2026-07-16T01:00:00.000Z", + "contentHash": "1ce9dec54d87077121a3bffb40114f1e504af1bfd9277a493e50ad1cd47a273f", "trackedFiles": [ ".spec/prototype-comments.json", "data/excel-2026-seed.json", @@ -2253,363 +1633,52 @@ ], "changelog": [ { - "version": "v1.64", - "date": "2026-07-13", - "time": "17:20", - "summary": "更新页面样式", + "version": "v1.4", + "date": "2026-07-16", + "time": "09:00", + "summary": "样式与布局:index.css", + "details": [], + "commit": "47c223a", + "files": [ + "styles/index.css" + ] + }, + { + "version": "v1.3", + "date": "2026-07-12", + "time": "22:44", + "summary": "样式与布局:index.css", + "details": [], + "commit": "131b963", + "files": [ + "styles/index.css" + ] + }, + { + "version": "v1.2", + "date": "2026-07-09", + "time": "17:52", + "summary": "页面逻辑与交互:index.tsx", + "details": [ + "样式与布局:index.css", + "演示数据与配置:excel-2026-seed.json" + ], + "commit": "6ccbbef", "files": [ - ".spec/prototype-comments.json", "data/excel-2026-seed.json", "index.tsx", "styles/index.css" ] }, { - "version": "v1.63", - "date": "2026-07-13", - "time": "17:20", - "summary": "更新页面样式", + "version": "v1.1", + "date": "2026-07-06", + "time": "17:18", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "d0d7458", "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.62", - "date": "2026-07-13", - "time": "17:20", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.61", - "date": "2026-07-13", - "time": "17:20", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.60", - "date": "2026-07-13", - "time": "16:44", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.59", - "date": "2026-07-13", - "time": "16:44", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.58", - "date": "2026-07-13", - "time": "15:50", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.57", - "date": "2026-07-13", - "time": "15:18", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.56", - "date": "2026-07-13", - "time": "15:18", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.55", - "date": "2026-07-13", - "time": "15:18", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.54", - "date": "2026-07-13", - "time": "13:46", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.53", - "date": "2026-07-13", - "time": "13:37", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.52", - "date": "2026-07-13", - "time": "13:37", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.51", - "date": "2026-07-13", - "time": "13:16", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.50", - "date": "2026-07-13", - "time": "13:16", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.49", - "date": "2026-07-13", - "time": "13:16", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.48", - "date": "2026-07-13", - "time": "13:15", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.47", - "date": "2026-07-13", - "time": "13:15", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.46", - "date": "2026-07-13", - "time": "13:12", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.45", - "date": "2026-07-13", - "time": "13:11", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.44", - "date": "2026-07-13", - "time": "13:09", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.43", - "date": "2026-07-13", - "time": "13:08", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.42", - "date": "2026-07-13", - "time": "13:08", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.41", - "date": "2026-07-13", - "time": "13:08", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.40", - "date": "2026-07-13", - "time": "13:08", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.39", - "date": "2026-07-13", - "time": "13:07", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.38", - "date": "2026-07-13", - "time": "13:07", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.37", - "date": "2026-07-13", - "time": "13:04", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.36", - "date": "2026-07-13", - "time": "12:57", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.35", - "date": "2026-07-13", - "time": "12:57", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data/excel-2026-seed.json", - "index.tsx", - "styles/index.css" + "index.tsx" ] } ] @@ -2618,8 +1687,8 @@ "title": "租赁业务台账", "version": "v1.6", "revision": 6, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "773015ea35fa4f62c2b330e5bb7dcb099f5fac660a61c8831ea03bf00edc8d2f", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "ab4c832a35d0908a485c165230822f87c822558c012c6ec838ace2b58e7c86a3", "trackedFiles": [ ".spec/prototype-comments.json", ".spec/requirements-prd.md", @@ -2656,13 +1725,9 @@ { "version": "v1.6", "date": "2026-07-12", - "time": "22:45", - "summary": "租赁业务台账:操作区统一为 OperationActions,标注壳切换", - "details": [ - "行操作:编辑 / 操作记录 / 保存(编辑态)", - "关联收款、事故/维保/收据链接弹窗保留", - "接入 PrototypeAnnotationHost,移除内嵌原型导航目录" - ], + "time": "22:44", + "summary": "页面逻辑与交互:AccidentLinkModal.tsx、ConfirmMarkModal.tsx、DeleteConfirmModal.tsx、FilterPanel.tsx 等", + "details": [], "commit": "131b963", "files": [ "components/AccidentLinkModal.tsx", @@ -2792,9 +1857,9 @@ }, "lease-business-detail": { "title": "租赁业务明细", - "version": "v1.42", - "revision": 42, - "lastUpdated": "2026-07-17T05:24:50.292Z", + "version": "v1.5", + "revision": 5, + "lastUpdated": "2026-07-17T08:10:00.000Z", "contentHash": "5dea68ab4a234edc3f7e76ac58eb2e2e8baaafe0150ff622a35ef1bae14e49ce", "trackedFiles": [ ".spec/field-checks.md", @@ -2838,609 +1903,123 @@ ], "changelog": [ { - "version": "v1.42", + "version": "v1.5", "date": "2026-07-17", - "time": "13:24", - "summary": "更新需求说明与标注", - "files": [ - ".spec/field-checks.md", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx" - ] - }, - { - "version": "v1.41", - "date": "2026-07-13", - "time": "16:46", - "summary": "更新需求说明与标注", - "files": [ - ".spec/field-checks.md", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx" - ] - }, - { - "version": "v1.40", - "date": "2026-07-13", - "time": "15:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.39", - "date": "2026-07-13", - "time": "15:47", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.38", - "date": "2026-07-13", - "time": "15:47", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.37", - "date": "2026-07-13", - "time": "15:47", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.36", - "date": "2026-07-13", - "time": "15:47", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.35", - "date": "2026-07-13", - "time": "15:47", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.34", - "date": "2026-07-13", - "time": "15:47", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.33", - "date": "2026-07-13", - "time": "15:47", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.32", - "date": "2026-07-13", - "time": "15:46", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.31", - "date": "2026-07-13", - "time": "15:46", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.30", - "date": "2026-07-13", - "time": "15:46", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.29", - "date": "2026-07-13", - "time": "15:46", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.28", - "date": "2026-07-13", - "time": "10:27", - "summary": "租赁业务明细:48列宽表、状态筛选、对账锁定、导入去重与实收校验", + "time": "16:10", + "summary": "页面逻辑与交互:DetailEditModal.tsx、DetailImportModal.tsx、batch-io.ts、import-merge.ts 等", "details": [ - "筛选含收款状态(已结清/部分收款/未收款);48列宽表,左冻结状态+月份+车牌", - "7项KPI + 表尾23项金额汇总;行内编辑/删除/变更日志/完成对账,主管可取消对账", - "批量导入36列手工字段,重复键支持跳过/覆盖/报错;实收≤应收校验;导出含状态共48列", - "公式列自动重算;氢费钻取;字段与车辆/客户/合同交叉校验", - "盈亏月度汇总不在本页,改由业务部台账承接" + "需求说明与 PRD:import-rules.md、prototype-review.md、requirements-prd.md" ], + "commit": "305199c", "files": [ - ".spec/prototype-comments.json", + ".spec/import-rules.md", + ".spec/prototype-review.md", + ".spec/requirements-prd.md", + "components/DetailEditModal.tsx", + "components/DetailImportModal.tsx", + "utils/batch-io.ts", + "utils/import-merge.ts", + "utils/row-key.ts", + "utils/validate-detail.ts" + ] + }, + { + "version": "v1.4", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:columnHeaderTips.ts、DetailEditModal.tsx、DetailImportModal.tsx、DetailMainTabs.tsx 等", + "details": [ + "样式与布局:index.css", + "需求说明与 PRD:field-checks.md、prototype-review.md、requirements-prd.md", + "演示数据与配置:change-log-seed.json" + ], + "commit": "47c223a", + "files": [ + ".spec/field-checks.md", ".spec/prototype-review.md", ".spec/requirements-prd.md", "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", "components/DetailEditModal.tsx", "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", "components/DetailMainTabs.tsx", "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" + "components/FilterPanel.tsx", + "components/MonthlyPlTab.tsx", + "components/tableColumns.ts", + "data/change-log-seed.json" ] }, { - "version": "v1.27", + "version": "v1.3", "date": "2026-07-13", - "time": "10:27", - "summary": "更新需求说明与标注", + "time": "09:31", + "summary": "需求说明与 PRD:requirements-prd.md", + "details": [], + "commit": "962e835", + "files": [ + ".spec/requirements-prd.md" + ] + }, + { + "version": "v1.2", + "date": "2026-07-12", + "time": "22:44", + "summary": "页面逻辑与交互:columnHeaderTips.ts、DetailChangeLogModal.tsx、DetailDeleteConfirmModal.tsx、DetailEditModal.tsx 等", + "details": [ + "样式与布局:index.css", + "需求说明与 PRD:requirements-prd.md", + "演示数据与配置:change-log-seed.json、hydrogen-refuel-records.json" + ], + "commit": "131b963", "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", ".spec/requirements-prd.md", "columnHeaderTips.ts", "components/DetailChangeLogModal.tsx", "components/DetailDeleteConfirmModal.tsx", "components/DetailEditModal.tsx", "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.26", - "date": "2026-07-13", - "time": "10:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.25", - "date": "2026-07-13", - "time": "10:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.24", - "date": "2026-07-13", - "time": "10:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.23", - "date": "2026-07-13", - "time": "10:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.22", - "date": "2026-07-13", - "time": "10:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.21", - "date": "2026-07-13", - "time": "10:10", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.20", - "date": "2026-07-13", - "time": "10:08", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.19", - "date": "2026-07-13", - "time": "10:08", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx" - ] - }, - { - "version": "v1.18", - "date": "2026-07-13", - "time": "10:08", - "summary": "更新页面逻辑与交互", - "files": [ - "components/DetailMainTabs.tsx" - ] - }, - { - "version": "v1.17", - "date": "2026-07-13", - "time": "09:39", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", "components/DetailTable.tsx", "components/FieldCheckIcon.tsx", - "components/FilterPanel.tsx" + "components/FilterPanel.tsx", + "components/TableHeaderTip.tsx", + "components/tableColumns.ts", + "data/change-log-seed.json" ] }, { - "version": "v1.16", - "date": "2026-07-13", - "time": "09:39", - "summary": "更新需求说明与标注", + "version": "v1.1", + "date": "2026-07-09", + "time": "17:52", + "summary": "页面逻辑与交互:DetailImportModal.tsx、DetailKpiRow.tsx、DetailTable.tsx、FilterPanel.tsx 等", + "details": [ + "样式与布局:index.css", + "需求说明与 PRD:prototype-review.md", + "演示数据与配置:rows.json" + ], + "commit": "6ccbbef", "files": [ - ".spec/prototype-comments.json", ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", "components/DetailImportModal.tsx", "components/DetailKpiRow.tsx", "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx", - "components/FilterPanel.tsx" - ] - }, - { - "version": "v1.15", - "date": "2026-07-13", - "time": "09:39", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx", - "components/FilterPanel.tsx" - ] - }, - { - "version": "v1.14", - "date": "2026-07-13", - "time": "09:39", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx", - "components/FilterPanel.tsx" - ] - }, - { - "version": "v1.13", - "date": "2026-07-13", - "time": "09:39", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx", - "components/FilterPanel.tsx" + "components/FilterPanel.tsx", + "components/tableColumns.ts", + "data/rows.json", + "index.tsx", + "styles/index.css", + "types.ts", + "utils/batch-io.ts", + "utils/calc-detail.ts" ] } ] }, "self-operated-business-ledger": { "title": "物流业务明细", - "version": "v1.12", - "revision": 12, - "lastUpdated": "2026-07-13T03:10:40.931Z", - "contentHash": "45fe3d96f91d3df20ec4773c1a014df5934dcaf196e31a57ceede1b169ae06f0", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-16T01:00:00.000Z", + "contentHash": "f6a4e1450eaa01e07f5c52ee449b6b7f6c535f74f5e2d981f1691563939a4bba", "trackedFiles": [ ".spec/prototype-comments.json", ".spec/requirements-prd.md", @@ -3461,134 +2040,34 @@ "utils/vehicle-ref.ts" ], "changelog": [ - { - "version": "v1.12", - "date": "2026-07-13", - "time": "11:10", - "summary": "同步物流业务明细至原型导航", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-prd.md", - "components/CalcFormulaTip.tsx", - "components/FilterPanel.tsx", - "components/LedgerKpiRow.tsx", - "components/PlateMultiSelectField.tsx", - "components/SelfImportModal.tsx", - "components/SelfLedgerTable.tsx", - "components/tableColumns.ts", - "data/rows.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.11", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-prd.md", - "components/CalcFormulaTip.tsx", - "components/FilterPanel.tsx", - "components/LedgerKpiRow.tsx", - "components/PlateMultiSelectField.tsx", - "components/SelfImportModal.tsx", - "components/SelfLedgerTable.tsx", - "components/tableColumns.ts", - "data/rows.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.10", - "date": "2026-07-13", - "time": "11:04", - "summary": "车牌筛选支持输入框模糊搜索", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-prd.md", - "components/CalcFormulaTip.tsx", - "components/FilterPanel.tsx", - "components/LedgerKpiRow.tsx", - "components/PlateMultiSelectField.tsx", - "components/SelfImportModal.tsx", - "components/SelfLedgerTable.tsx", - "components/tableColumns.ts", - "data/rows.json", - "index.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.9", - "date": "2026-07-13", - "time": "11:03", - "summary": "更新页面逻辑与交互", - "files": [ - "components/PlateMultiSelectField.tsx" - ] - }, - { - "version": "v1.8", - "date": "2026-07-13", - "time": "10:58", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-prd.md", - "components/CalcFormulaTip.tsx", - "components/FilterPanel.tsx", - "components/LedgerKpiRow.tsx", - "components/SelfImportModal.tsx", - "components/SelfLedgerTable.tsx", - "components/tableColumns.ts", - "data/rows.json", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.7", - "date": "2026-07-13", - "time": "10:58", - "summary": "更新页面逻辑与交互", - "files": [ - "components/CalcFormulaTip.tsx" - ] - }, { "version": "v1.6", - "date": "2026-07-13", - "time": "10:37", - "summary": "更新需求说明与标注", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:CalcFormulaTip.tsx、FilterPanel.tsx、PlateMultiSelectField.tsx、SelfLedgerTable.tsx 等", + "details": [ + "样式与布局:index.css", + "需求说明与 PRD:requirements-prd.md" + ], + "commit": "47c223a", "files": [ - ".spec/prototype-comments.json", ".spec/requirements-prd.md", + "components/CalcFormulaTip.tsx", "components/FilterPanel.tsx", - "components/LedgerKpiRow.tsx", - "components/SelfImportModal.tsx", + "components/PlateMultiSelectField.tsx", "components/SelfLedgerTable.tsx", - "components/tableColumns.ts", - "data/rows.json", - "index.tsx", "styles/index.css", - "types.ts", - "utils/batch-io.ts" + "utils/ledger.ts" ] }, { "version": "v1.5", "date": "2026-07-12", - "time": "22:45", - "summary": "物流业务明细:更名、列对齐 Excel、批量导入与自动计算", + "time": "22:44", + "summary": "页面逻辑与交互:FilterPanel.tsx、LedgerKpiRow.tsx、SelfImportModal.tsx、SelfLedgerTable.tsx 等", "details": [ - "模块更名:物流业务台账 → 物流业务明细", - "列对齐 Excel 1.2:薪资、电费、日社保/挂车/停车/轮胎、线路计价等;系统车型列", - "新增批量导入:模板下载、错误日志、导入后自动计算金额/总成本/盈亏", - "移除行勾选与批量删除" + "样式与布局:index.css", + "演示数据与配置:rows.json" ], "commit": "131b963", "files": [ @@ -3677,10 +2156,10 @@ }, "vehicle-h2-fee-ledger": { "title": "车辆氢费明细", - "version": "v1.8", - "revision": 8, - "lastUpdated": "2026-07-16T11:53:44.219Z", - "contentHash": "8d4a6e6bb2b8e4a84c2dfb0a01ea0ff7db6ab80deea6dfcda367251b0ab72dde", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-17T08:10:00.000Z", + "contentHash": "1a18653f7e28ef0c9dda965948c05aef6b908f9f23ffd5797921b410016c4469", "trackedFiles": [ ".spec/PRD.md", ".spec/prototype-comments.json", @@ -3690,56 +2169,27 @@ "index.tsx" ], "changelog": [ - { - "version": "v1.8", - "date": "2026-07-16", - "time": "19:53", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - ".spec/verify-reconcile.md", - "globals.ts", - "H2LedgerPage.jsx", - "index.tsx" - ] - }, - { - "version": "v1.7", - "date": "2026-07-16", - "time": "18:57", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - ".spec/verify-reconcile.md", - "globals.ts", - "H2LedgerPage.jsx", - "index.tsx" - ] - }, { "version": "v1.6", - "date": "2026-07-16", - "time": "18:57", - "summary": "更新需求说明与标注", + "date": "2026-07-17", + "time": "16:10", + "summary": "页面逻辑与交互:H2LedgerPage.jsx", + "details": [ + "需求说明与 PRD:PRD.md、verify-reconcile.md" + ], + "commit": "305199c", "files": [ ".spec/PRD.md", - ".spec/prototype-comments.json", ".spec/verify-reconcile.md", - "globals.ts", - "H2LedgerPage.jsx", - "index.tsx" + "H2LedgerPage.jsx" ] }, { "version": "v1.5", "date": "2026-07-12", - "time": "22:45", - "summary": "车辆氢费明细:标注壳与操作区统一", - "details": [ - "OperationActions;标注目录规范化" - ], + "time": "22:44", + "summary": "页面逻辑与交互:H2LedgerPage.jsx、index.tsx", + "details": [], "commit": "131b963", "files": [ "H2LedgerPage.jsx", @@ -3803,10 +2253,10 @@ }, "vehicle-maintenance-ledger": { "title": "维修保养台账", - "version": "v1.4", - "revision": 4, - "lastUpdated": "2026-07-14T13:06:43.601Z", - "contentHash": "44dea7b170a02030f3ad73f063a046c0592815a2cd2adb405391fd50fcd2cd25", + "version": "v1.2", + "revision": 2, + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "47e529bd55e41108198a630ab148a354ddd72e92f732cf62183243936f833197", "trackedFiles": [ ".spec/prototype-comments.json", ".spec/requirements-prd.md", @@ -3816,42 +2266,12 @@ "styles/index.css" ], "changelog": [ - { - "version": "v1.4", - "date": "2026-07-14", - "time": "21:06", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-prd.md", - "globals.ts", - "index.tsx", - "MaintenanceLedgerPage.jsx", - "styles/index.css" - ] - }, - { - "version": "v1.3", - "date": "2026-07-13", - "time": "11:09", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/requirements-prd.md", - "globals.ts", - "index.tsx", - "MaintenanceLedgerPage.jsx", - "styles/index.css" - ] - }, { "version": "v1.2", "date": "2026-07-12", - "time": "22:45", - "summary": "车辆维修明细:标注壳与操作区统一", - "details": [ - "OperationActions;标注目录规范化" - ], + "time": "22:44", + "summary": "页面逻辑与交互:MaintenanceLedgerPage.jsx、index.tsx", + "details": [], "commit": "131b963", "files": [ "MaintenanceLedgerPage.jsx", @@ -3882,8 +2302,8 @@ "title": "收款记录", "version": "v1.3", "revision": 3, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "fb2974cbf5518761021be442e2e9bd949eb32fc947dd2ddd8572a153af452150", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "c6edcdbf2d5a6fd861d2a17324d57822a1a7faf75237f75a9ae3d126826f9e09", "trackedFiles": [ ".spec/prototype-comments.json", "components/AddPaymentModal.tsx", @@ -3904,12 +2324,9 @@ { "version": "v1.3", "date": "2026-07-12", - "time": "22:45", - "summary": "收款记录:OperationActions 与关联账单操作", - "details": [ - "操作列标准化;表格新增「关联账单」", - "标注壳切换" - ], + "time": "22:44", + "summary": "页面逻辑与交互:FilterPanel.tsx、PaymentKpiDetailFilterBar.tsx、PaymentKpiDetailModal.tsx、PaymentRecordsTable.tsx 等", + "details": [], "commit": "131b963", "files": [ "components/FilterPanel.tsx", @@ -3977,7 +2394,7 @@ "version": "v1.3", "revision": 3, "lastUpdated": "2026-07-12T14:44:00.000Z", - "contentHash": "76326ecfbf6eb1d0c27018862e6ae071efb56d674ad6e763146b5b2a0d09c86a", + "contentHash": "d9ae6105c792609ffad4275d2730ff6361837ebd654af3a64f6f34473482f073", "trackedFiles": [ ".spec/prototype-comments.json", "index.tsx", @@ -4081,10 +2498,10 @@ }, "oneos-prototype-nav": { "title": "oneos-prototype-nav", - "version": "v1.6", - "revision": 6, - "lastUpdated": "2026-07-16T01:04:20.841Z", - "contentHash": "93cb00f068ce0fb8e6b47f82419f13fc51c0bb2cd2a660b9d4f7bac3357f75b3", + "version": "v1.7", + "revision": 7, + "lastUpdated": "2026-07-17T08:12:20.228Z", + "contentHash": "a303e48dcd21ad8e2124de72c0d8dcc7e86abdaca76605af69d33606f6d70363", "trackedFiles": [ ".spec/prototype-comments.json", "index.tsx", @@ -4095,10 +2512,10 @@ ], "changelog": [ { - "version": "v1.6", - "date": "2026-07-16", - "time": "09:04", - "summary": "合并远程审批中心:保留加氢订单/记录与数量统计,同步导航注册表", + "version": "v1.7", + "date": "2026-07-17", + "time": "16:12", + "summary": "同步全量页面更新日志与导航注册表", "files": [ ".spec/prototype-comments.json", "index.tsx", @@ -4108,48 +2525,50 @@ "xll-nav-source.json" ] }, + { + "version": "v1.6", + "date": "2026-07-17", + "time": "16:10", + "summary": "演示数据与配置:xll-nav-menu.json", + "details": [], + "commit": "305199c", + "files": [ + "xll-nav-menu.json" + ] + }, { "version": "v1.5", - "date": "2026-07-15", - "time": "05:21", - "summary": "同步加氢站管理导航与加氢记录/订单变更", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:nav-data.ts", + "details": [ + "演示数据与配置:xll-nav-menu.json" + ], + "commit": "47c223a", "files": [ - ".spec/prototype-comments.json", - "index.tsx", "nav-data.ts", - "style.css", - "xll-nav-menu.json", - "xll-nav-source.json" + "xll-nav-menu.json" ] }, { "version": "v1.4", - "date": "2026-07-15", - "time": "05:20", - "summary": "同步加氢站管理:站点信息/加氢订单/加氢记录导航与变更", + "date": "2026-07-13", + "time": "09:31", + "summary": "页面逻辑与交互:nav-data.ts", + "details": [], + "commit": "962e835", "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "nav-data.ts", - "style.css", - "xll-nav-menu.json", - "xll-nav-source.json" + "nav-data.ts" ] }, { "version": "v1.3", "date": "2026-07-12", - "time": "22:45", - "summary": "统一标注壳与操作规范,租赁明细/合同/提车应收款增强,新增任务工单,同步合包页面", + "time": "22:44", + "summary": "页面逻辑与交互:index.tsx、nav-data.ts", "details": [ - "【平台】全项目接入 PrototypeAnnotationHost,PRD 迁入右侧标注目录;列表统一 OperationActions 与工具栏图标规范", - "【租赁业务明细】收款状态列、47 列宽表、氢费钻取、字段校验、变更记录、导入导出与主管解锁", - "【租赁合同】KPI/状态收敛、查看页、线上/线下签署、交付变更、附加费用与提车应收联动", - "【提车应收款】独立原型上线;finance 合包仅保留租赁账单;工作台快捷入口改跳独立原型", - "【任务工单】新增业管发起端:合同/独立双入口、六类任务类型与督办催办", - "【合包】business/ops/finance/ledger-data/lease-contract/h2-station 等移除面包屑并标准化操作区", - "【下线】移除 login/requirements/vehicle-asset 合包;侧栏新增任务工单与提车应收款", - "【发布】导航页固定发布至 /oneos-prototype-nav/index.html" + "样式与布局:style.css", + "演示数据与配置:xll-nav-menu.json" ], "commit": "131b963", "files": [ @@ -4163,10 +2582,8 @@ "version": "v1.2", "date": "2026-07-09", "time": "18:34", - "summary": "VoltAgent 视觉改版", + "summary": "页面逻辑与交互:index.tsx、nav-data.ts", "details": [ - "密码门禁与侧栏按业务线切换", - "页面逻辑与交互:index.tsx、nav-data.ts", "样式与布局:style.css" ], "commit": "824512a", @@ -4180,9 +2597,8 @@ "version": "v1.1", "date": "2026-07-09", "time": "17:52", - "summary": "原型导航与版本追踪上线", + "summary": "页面逻辑与交互:index.tsx、nav-data.ts", "details": [ - "页面逻辑与交互:index.tsx、nav-data.ts", "样式与布局:style.css", "演示数据与配置:xll-nav-menu.json、xll-nav-source.json" ], @@ -4199,10 +2615,10 @@ }, "oneos-web-data-analysis": { "title": "数据分析", - "version": "v1.185", - "revision": 185, - "lastUpdated": "2026-07-13T09:30:32.095Z", - "contentHash": "c67425e5802cbe88798eac9bd9dc343135eef97d999ac0b71d845e66c43835d2", + "version": "v1.4", + "revision": 4, + "lastUpdated": "2026-07-16T01:00:00.000Z", + "contentHash": "ee05562606217fd0e130906981d8d3cd1f672054aa9f887236ddfd8ed8e52c0e", "trackedFiles": [ "index.tsx", "pages/01-客户服务部业务统计报表.jsx", @@ -4217,553 +2633,59 @@ ], "changelog": [ { - "version": "v1.185", - "date": "2026-07-13", - "time": "17:30", - "summary": "更新页面逻辑与交互", + "version": "v1.4", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "47c223a", "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" + "index.tsx" ] }, { - "version": "v1.184", - "date": "2026-07-13", - "time": "17:26", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.183", - "date": "2026-07-13", - "time": "17:20", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.182", - "date": "2026-07-13", - "time": "17:19", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.181", - "date": "2026-07-13", - "time": "17:19", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.180", - "date": "2026-07-13", - "time": "17:19", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.179", - "date": "2026-07-13", - "time": "17:19", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.178", - "date": "2026-07-13", - "time": "17:19", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.177", - "date": "2026-07-13", - "time": "17:19", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.176", - "date": "2026-07-13", - "time": "17:19", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.175", - "date": "2026-07-13", + "version": "v1.3", + "date": "2026-07-06", "time": "17:18", - "summary": "更新页面逻辑与交互", + "summary": "侧栏调整:工作台移至 OneOS 根目录,台账与数据分析分组更新", + "details": [ + "页面逻辑与交互:index.tsx" + ], + "commit": "d0d7458", "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" + "index.tsx" ] }, { - "version": "v1.174", - "date": "2026-07-13", - "time": "17:18", - "summary": "更新页面逻辑与交互", + "version": "v1.2", + "date": "2026-06-30", + "time": "16:54", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "0982837", "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" + "index.tsx" ] }, { - "version": "v1.173", - "date": "2026-07-13", - "time": "16:45", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.172", - "date": "2026-07-13", - "time": "16:45", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.171", - "date": "2026-07-13", - "time": "16:45", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.170", - "date": "2026-07-13", - "time": "16:45", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.169", - "date": "2026-07-13", - "time": "16:43", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.168", - "date": "2026-07-13", - "time": "16:40", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.167", - "date": "2026-07-13", - "time": "16:40", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.166", - "date": "2026-07-13", - "time": "16:40", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.165", - "date": "2026-07-13", - "time": "16:40", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.164", - "date": "2026-07-13", - "time": "16:39", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.163", - "date": "2026-07-13", - "time": "16:38", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.162", - "date": "2026-07-13", - "time": "16:38", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.161", - "date": "2026-07-13", - "time": "16:38", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.160", - "date": "2026-07-13", - "time": "16:38", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.159", - "date": "2026-07-13", - "time": "16:38", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.158", - "date": "2026-07-13", - "time": "16:37", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.157", - "date": "2026-07-13", + "version": "v1.1", + "date": "2026-06-30", "time": "16:36", - "summary": "更新页面逻辑与交互", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "d71ebc5", "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" - ] - }, - { - "version": "v1.156", - "date": "2026-07-13", - "time": "16:36", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-客户服务部业务统计报表.jsx", - "pages/02-物流业务台账.jsx", - "pages/03-物流业务月度统计.jsx", - "pages/04-业务部汇总台账.jsx", - "pages/05-业务部台账.jsx", - "pages/06-业务部业绩明细.jsx", - "pages/07-业务台账.jsx", - "pages/08-租赁车辆收入明细.jsx", - "pages/09-租赁客户氢费台账.jsx" + "index.tsx" ] } ] }, "task-work-order": { - "title": "task work order", + "title": "任务工单", "version": "v1.1", "revision": 1, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "15f17a2d566dbe11036326fbc3727d43f23bdf8a67e3400e68052f1f0eda57e0", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "7b34b266e3151485808e273b234681849a72c96501f10ac97693ab2540cc4205", "trackedFiles": [ ".spec/2026-07-10-requirements.md", "components/task-work-order-kpi.jsx", @@ -4776,12 +2698,15 @@ { "version": "v1.1", "date": "2026-07-12", - "time": "22:45", - "summary": "任务工单新原型:业管发起端(合同/独立双入口)", + "time": "22:44", + "summary": "统一标注壳与操作规范", "details": [ - "任务类型:里程履约、维保履约、政策兑现、付款/交付节点、条款跟进、通用临时", - "列表 KPI:全部/我发布的/我督办的 + 状态视角;详情含进度、反馈、催办", - "执行人不可见合同原文与金额(第一版仅业管端)" + "租赁明细/合同/提车应收款增强", + "新增任务工单", + "同步导航与合包页面。", + "页面逻辑与交互:TaskWorkOrderPage.jsx、task-work-order-kpi.jsx、task-work-order-seed.js、index.tsx", + "样式与布局:index.css", + "需求说明与 PRD:2026-07-10-requirements.md" ], "commit": "131b963", "files": [ @@ -4797,10 +2722,10 @@ }, "vehicle-pickup-receivable": { "title": "提车应收款", - "version": "v1.167", - "revision": 167, - "lastUpdated": "2026-07-12T17:21:58.954Z", - "contentHash": "266723009574aadd9d2ee8dd0fc7a6bb36f086bd146a17fbf4c61b1746e7353f", + "version": "v1.2", + "revision": 2, + "lastUpdated": "2026-07-13T01:31:00.000Z", + "contentHash": "1413543498eb688eea8219e4fd02da93f7857dcba1e7d4fdf755f5c15d248520", "trackedFiles": [ ".spec/PRD.md", ".spec/prototype-comments.json", @@ -4816,583 +2741,60 @@ ], "changelog": [ { - "version": "v1.167", + "version": "v1.2", "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", + "time": "09:31", + "summary": "提车应收款收款/合同页增强", + "details": [ + "租赁明细标注同步", + "导航注册表更新", + "页面逻辑与交互:VehiclePickupReceivableApp.jsx、VehiclePickupReceivableCollectPage.jsx、VehiclePickupReceivableContractView.jsx、VehiclePickupReceivableList.jsx 等", + "样式与布局:index.css" + ], + "commit": "962e835", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", "VehiclePickupReceivableApp.jsx", "VehiclePickupReceivableCollectPage.jsx", "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "VehiclePickupReceivableList.jsx", + "data/pickup-receivable-list-data.js", + "pickup-receivable-bridge.js", + "styles/index.css" ] }, { - "version": "v1.166", - "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", + "version": "v1.1", + "date": "2026-07-12", + "time": "22:44", + "summary": "统一标注壳与操作规范", + "details": [ + "租赁明细/合同/提车应收款增强", + "新增任务工单", + "同步导航与合包页面。", + "页面逻辑与交互:VehiclePickupReceivableApp.jsx、VehiclePickupReceivableList.jsx、pickup-receivable-list-data.js、index.tsx 等", + "样式与布局:index.css", + "需求说明与 PRD:PRD.md" + ], + "commit": "131b963", "files": [ ".spec/PRD.md", - ".spec/prototype-comments.json", + "VehiclePickupReceivableApp.jsx", + "VehiclePickupReceivableList.jsx", "data/pickup-receivable-list-data.js", "index.tsx", "pickup-receivable-bridge.js", "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.165", - "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.164", - "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.163", - "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.162", - "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.161", - "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.160", - "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.159", - "date": "2026-07-13", - "time": "01:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.158", - "date": "2026-07-13", - "time": "01:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.157", - "date": "2026-07-13", - "time": "01:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.156", - "date": "2026-07-13", - "time": "01:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.155", - "date": "2026-07-13", - "time": "01:16", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.154", - "date": "2026-07-13", - "time": "01:04", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.153", - "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.152", - "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.151", - "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.150", - "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.149", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.148", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.147", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.146", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.145", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.144", - "date": "2026-07-13", - "time": "00:50", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.143", - "date": "2026-07-13", - "time": "00:50", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.142", - "date": "2026-07-13", - "time": "00:49", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.141", - "date": "2026-07-13", - "time": "00:49", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.140", - "date": "2026-07-13", - "time": "00:49", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.139", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "version": "v1.138", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "styles/index.css" ] } ] }, "oneos-web-finance": { - "title": "oneos web finance", + "title": "财务管理(合包)", "version": "v1.4", "revision": 4, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "fbfde8aca3da5329961b52f23fb2f304ce1c83c7d01c9801390201f7c22e8466", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "cec2aff84fd721db4c1035728399ce40001999ce5075ad7e59765ddea2f6bea5", "trackedFiles": [ "index.tsx", "pages/01-还车应结款-查看.jsx", @@ -5410,12 +2812,9 @@ { "version": "v1.4", "date": "2026-07-12", - "time": "22:45", - "summary": "财务管理合包:提车应收款剥离,仅保留租赁账单", - "details": [ - "提车应收款 6 页移除;合包默认页改为租赁账单", - "提车流程由 vehicle-pickup-receivable 独立原型承接" - ], + "time": "22:44", + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "131b963", "files": [ "index.tsx" @@ -5447,10 +2846,8 @@ "version": "v1.1", "date": "2026-06-30", "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "d71ebc5", "files": [ "index.tsx" @@ -5460,9 +2857,9 @@ }, "lease-business-line-overview": { "title": "业务条线说明", - "version": "v1.6", - "revision": 6, - "lastUpdated": "2026-07-14T15:09:53.434Z", + "version": "v1.4", + "revision": 4, + "lastUpdated": "2026-07-16T01:00:00.000Z", "contentHash": "a7fb7ee64b406ab87e38a2f8c1a66ef327fd488038cadb51400528bc692284ef", "trackedFiles": [ ".spec/prototype-comments.json", @@ -5473,56 +2870,23 @@ "style.css" ], "changelog": [ - { - "version": "v1.6", - "date": "2026-07-14", - "time": "23:09", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data-foundations.ts", - "hooks.ts", - "index.tsx", - "lines.ts", - "style.css" - ] - }, - { - "version": "v1.5", - "date": "2026-07-14", - "time": "22:38", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "data-foundations.ts", - "hooks.ts", - "index.tsx", - "lines.ts", - "style.css" - ] - }, { "version": "v1.4", - "date": "2026-07-13", - "time": "10:46", - "summary": "更新页面样式", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:lines.ts", + "details": [], + "commit": "47c223a", "files": [ - ".spec/prototype-comments.json", - "data-foundations.ts", - "hooks.ts", - "index.tsx", - "lines.ts", - "style.css" + "lines.ts" ] }, { "version": "v1.3", "date": "2026-07-12", - "time": "22:45", - "summary": "业务条线说明:标注目录微调", - "details": [ - "条线数据更新;移除内嵌导航节点" - ], + "time": "22:44", + "summary": "页面逻辑与交互:lines.ts", + "details": [], "commit": "131b963", "files": [ "lines.ts" @@ -5543,8 +2907,9 @@ "version": "v1.1", "date": "2026-07-06", "time": "17:18", - "summary": "页面逻辑与交互:data-foundations.ts、hooks.ts、index.tsx、lines.ts", + "summary": "新增业务部台账、收款记录、业务条线说明及 ledger-shared / vm-shared 公共壳层", "details": [ + "页面逻辑与交互:data-foundations.ts、hooks.ts、index.tsx、lines.ts", "样式与布局:style.css" ], "commit": "d0d7458", @@ -5559,11 +2924,11 @@ ] }, "oneos-web-contract-template": { - "title": "oneos web contract template", + "title": "合同模板管理", "version": "v1.3", "revision": 3, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "a3330ed07315a1fb54c5bc063eee96b8e4fe9e9a692654ebbfc7e1be1f6c9aab", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "803f283222fa5653a5004d48fc4b7a1788478221e3cd52e96ba404c0fb66ee83", "trackedFiles": [ "index.tsx", "pages/01-合同模板管理.jsx" @@ -5572,11 +2937,9 @@ { "version": "v1.3", "date": "2026-07-12", - "time": "22:45", - "summary": "合同模板合包:操作区与独立原型对齐", - "details": [ - "模板管理页 OperationActions 统一" - ], + "time": "22:44", + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "131b963", "files": [ "index.tsx" @@ -5597,10 +2960,8 @@ "version": "v1.1", "date": "2026-06-30", "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "d71ebc5", "files": [ "index.tsx" @@ -5610,10 +2971,10 @@ }, "oneos-web-h2-station": { "title": "加氢记录", - "version": "v1.106", - "revision": 106, - "lastUpdated": "2026-07-17T05:02:12.013Z", - "contentHash": "13609131a9ba3bf1ccb593460e1ff683a8848c242c8d82ccdb7151e54f09bf20", + "version": "v1.12", + "revision": 12, + "lastUpdated": "2026-07-17T08:24:48.851Z", + "contentHash": "26a6df6de3c13221ec1014aff2cf65284171a4642e9afd96dd51e9bb8eac4670", "trackedFiles": [ ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -5627,9 +2988,9 @@ ], "changelog": [ { - "version": "v1.106", + "version": "v1.12", "date": "2026-07-17", - "time": "13:02", + "time": "16:24", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -5644,9 +3005,9 @@ ] }, { - "version": "v1.105", + "version": "v1.11", "date": "2026-07-17", - "time": "13:01", + "time": "16:24", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -5661,9 +3022,9 @@ ] }, { - "version": "v1.104", + "version": "v1.10", "date": "2026-07-17", - "time": "13:01", + "time": "16:24", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -5678,9 +3039,9 @@ ] }, { - "version": "v1.103", + "version": "v1.9", "date": "2026-07-17", - "time": "13:01", + "time": "16:24", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -5695,9 +3056,9 @@ ] }, { - "version": "v1.102", + "version": "v1.8", "date": "2026-07-17", - "time": "13:01", + "time": "16:23", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -5712,426 +3073,107 @@ ] }, { - "version": "v1.101", + "version": "v1.7", "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", + "time": "16:10", + "summary": "页面逻辑与交互:index.tsx", + "details": [ + "需求说明与 PRD:prototype-review.md、record-data-model.md、requirements-prd.md、ui-review.md" + ], + "commit": "305199c", "files": [ - ".spec/prototype-comments.json", ".spec/prototype-review.md", ".spec/record-data-model.md", ".spec/requirements-prd.md", ".spec/ui-review.md", "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", + "pages/README.md" + ] + }, + { + "version": "v1.6", + "date": "2026-07-16", + "time": "09:00", + "summary": "加氢记录/订单同源对账", + "details": [ + "租赁明细校验与月度损益", + "车辆与台账增强", + "页面逻辑与交互:index.tsx", + "需求说明与 PRD:record-data-model.md、requirements-prd.md" + ], + "commit": "47c223a", + "files": [ + ".spec/record-data-model.md", + ".spec/requirements-prd.md", + "index.tsx" + ] + }, + { + "version": "v1.5", + "date": "2026-07-12", + "time": "22:44", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "131b963", + "files": [ + "index.tsx" + ] + }, + { + "version": "v1.4", + "date": "2026-07-08", + "time": "11:44", + "summary": "样式与布局:h2-station-vm-filter.css", + "details": [], + "commit": "6d14c58", + "files": [ "styles/h2-station-vm-filter.css" ] }, { - "version": "v1.100", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", + "version": "v1.3", + "date": "2026-07-02", + "time": "03:35", + "summary": "页面逻辑与交互:index.tsx", + "details": [ + "样式与布局:h2-station-vm-filter.css" + ], + "commit": "f5e3126", "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", "styles/h2-station-vm-filter.css" ] }, { - "version": "v1.99", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", + "version": "v1.2", + "date": "2026-06-30", + "time": "16:54", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "0982837", "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" + "index.tsx" ] }, { - "version": "v1.98", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", + "version": "v1.1", + "date": "2026-06-30", + "time": "16:36", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "d71ebc5", "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.97", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.96", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.95", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.94", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.93", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.92", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.91", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.90", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.89", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.88", - "date": "2026-07-17", - "time": "12:52", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.87", - "date": "2026-07-17", - "time": "12:52", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.86", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.85", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.84", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.83", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.82", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.81", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.80", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.79", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.78", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.77", - "date": "2026-07-17", - "time": "10:32", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" + "index.tsx" ] } ] }, "oneos-web-procurement": { - "title": "oneos web procurement", + "title": "采购管理", "version": "v1.3", "revision": 3, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "f66bafe345eda150da4047f5ef28064454d87dccdd68b01a62d58f95bc656960", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "de6458042cdb2d87f28d5ce249fca712009d2dba4e5be5bbba08559f07bc9d00", "trackedFiles": [ "index.tsx", "pages/01-三方退租车管理.jsx", @@ -6141,11 +3183,9 @@ { "version": "v1.3", "date": "2026-07-12", - "time": "22:45", - "summary": "采购管理合包:三方退租车页操作区标准化", - "details": [ - "退租申请与管理页 OperationActions" - ], + "time": "22:44", + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "131b963", "files": [ "index.tsx" @@ -6166,10 +3206,8 @@ "version": "v1.1", "date": "2026-06-30", "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "d71ebc5", "files": [ "index.tsx" @@ -6178,11 +3216,11 @@ ] }, "oneos-web-ops": { - "title": "oneos web ops", + "title": "运维管理", "version": "v1.2", "revision": 2, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "a58a00246936f10fd91012d54ac6b7031fcb04a1d8f432ab301ffd6fbc8b9e74", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "7f3478394aa4902e8d27903e9647e339c4da9d3326e9ff275ac096e3d18bcbe6", "trackedFiles": [ "index.tsx", "pages/01-备件库存.jsx", @@ -6238,13 +3276,11 @@ "changelog": [ { "version": "v1.2", - "date": "2026-07-12", - "time": "22:45", - "summary": "运维管理合包:45 页操作列与工具栏按钮标准化", - "details": [ - "备件/调拨/交还车/故障/异动/证件/型号参数等页 OperationActions 与 data-vm-icon 图标" - ], - "commit": "131b963", + "date": "2026-06-30", + "time": "16:54", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "0982837", "files": [ "index.tsx" ] @@ -6253,10 +3289,8 @@ "version": "v1.1", "date": "2026-06-30", "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "d71ebc5", "files": [ "index.tsx" @@ -6265,11 +3299,11 @@ ] }, "oneos-web-lease-contract": { - "title": "oneos web lease contract", - "version": "v1.2", - "revision": 2, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "330315de025466bd4d99fab62d28f381c1f26dc1f2cb695e998c64ec49748cea", + "title": "车辆租赁合同", + "version": "v1.3", + "revision": 3, + "lastUpdated": "2026-07-12T14:52:00.000Z", + "contentHash": "bc9e3b24d64b414542a9f45a6099db9b6e41d4a8348b6c3dc2c39b6907f44180", "trackedFiles": [ "index.tsx", "pages/01-车辆租赁合同-变更为三方合同.jsx", @@ -6283,15 +3317,21 @@ ], "changelog": [ { - "version": "v1.2", + "version": "v1.3", "date": "2026-07-12", - "time": "22:45", - "summary": "租赁合同合包:8 子页同步签署/流程字段与 OperationActions", - "details": [ - "新增、续签、转正式、三方变更、附加费用等子页操作区标准化", - "修复移除面包屑后的 JSX 括号语法" - ], - "commit": "131b963", + "time": "22:52", + "summary": "修复租赁合同合包页面语法错误并补全对象存储发布依赖。", + "details": [], + "commit": "9a4a4a4", + "files": [] + }, + { + "version": "v1.2", + "date": "2026-06-30", + "time": "16:54", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "0982837", "files": [ "index.tsx" ] @@ -6300,10 +3340,8 @@ "version": "v1.1", "date": "2026-06-30", "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "d71ebc5", "files": [ "index.tsx" @@ -6313,9 +3351,9 @@ }, "oneos-web-business": { "title": "业务管理", - "version": "v1.3", - "revision": 3, - "lastUpdated": "2026-07-17T03:51:02.350Z", + "version": "v1.2", + "revision": 2, + "lastUpdated": "2026-07-12T14:44:00.000Z", "contentHash": "e92802237c9714f6c476d9e69a912494c2d6a574e29e129e36e8969d65ac82aa", "trackedFiles": [ "index.tsx", @@ -6339,35 +3377,13 @@ "pages/18-ETC管理.jsx" ], "changelog": [ - { - "version": "v1.3", - "date": "2026-07-17", - "time": "11:51", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx", - "pages/01-保险采购.jsx", - "pages/02-编辑交车任务.jsx", - "pages/03-查看交车任务.jsx", - "pages/04-车辆成本维护.jsx", - "pages/05-供应商管理-编辑.jsx", - "pages/06-供应商管理-查看.jsx", - "pages/07-供应商管理-新增.jsx", - "pages/08-供应商管理.jsx", - "pages/09-交车任务.jsx", - "pages/10-客户管理-编辑.jsx", - "pages/11-客户管理-查看.jsx" - ] - }, { "version": "v1.2", - "date": "2026-07-12", - "time": "22:45", - "summary": "业务管理合包:18 页移除面包屑,OperationActions 统一", - "details": [ - "保险采购、交车任务、客户/供应商、租赁账单、ETC 管理等页操作区标准化" - ], - "commit": "131b963", + "date": "2026-06-30", + "time": "16:54", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "0982837", "files": [ "index.tsx" ] @@ -6376,10 +3392,8 @@ "version": "v1.1", "date": "2026-06-30", "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "d71ebc5", "files": [ "index.tsx" @@ -6388,11 +3402,11 @@ ] }, "oneos-web-ledger-data": { - "title": "oneos web ledger data", + "title": "台账数据", "version": "v1.3", "revision": 3, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "68be711a6da9e583a1ac610fac01a778716c02028a62b1fcf4a164cc22a33172", + "lastUpdated": "2026-07-12T14:44:00.000Z", + "contentHash": "71c1849f4a65dcbc499c8c878715b5be510165faae2c60fd955024b1dada2a0c", "trackedFiles": [ "index.tsx", "pages/01-保险分摊明细.jsx", @@ -6404,13 +3418,11 @@ "changelog": [ { "version": "v1.3", - "date": "2026-07-12", - "time": "22:45", - "summary": "台账数据合包:5 页操作区标准化", - "details": [ - "保险分摊、氢费、维修明细、氢费采购端汇总、租赁业务台账等页 OperationActions" - ], - "commit": "131b963", + "date": "2026-07-08", + "time": "11:44", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "6d14c58", "files": [ "index.tsx" ] @@ -6430,10 +3442,8 @@ "version": "v1.1", "date": "2026-06-30", "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], + "summary": "页面逻辑与交互:index.tsx", + "details": [], "commit": "d71ebc5", "files": [ "index.tsx" @@ -6443,33 +3453,26 @@ }, "ledger-shared": { "title": "ledger-shared", - "version": "v1.6", - "revision": 6, - "lastUpdated": "2026-07-13T07:51:11.555Z", + "version": "v1.5", + "revision": 5, + "lastUpdated": "2026-07-16T01:00:00.000Z", "contentHash": "b054a507022e66542500e71a659ba63e7f0011658bf8ed3ff3f8912eb8f036c5", "trackedFiles": [ "DESIGN.md", "styles/ledger-page.css" ], "changelog": [ - { - "version": "v1.6", - "date": "2026-07-13", - "time": "15:51", - "summary": "更新页面样式", - "files": [ - "DESIGN.md", - "styles/ledger-page.css" - ] - }, { "version": "v1.5", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新页面样式", + "date": "2026-07-16", + "time": "09:00", + "summary": "迭代 ONE-OS 多原型:加氢记录/订单同源对账、租赁明细校验与月度损益、车辆与台账增强;新增客户回款与加氢站统计;补齐业务逻辑与对象存储发布规范,同步原型导航。", + "details": [ + "变更 1 个文件" + ], + "commit": "47c223a", "files": [ - "DESIGN.md", - "styles/ledger-page.css" + "DESIGN.md" ] }, { @@ -6530,7 +3533,7 @@ "title": "vm-shared", "version": "v1.5", "revision": 5, - "lastUpdated": "2026-07-16T02:18:41.766Z", + "lastUpdated": "2026-07-17T08:10:00.000Z", "contentHash": "e818f6907d33452be1fe92f1f6162751af374856aa0fe464a06353c6e831752b", "trackedFiles": [ "DESIGN.md" @@ -6538,9 +3541,13 @@ "changelog": [ { "version": "v1.5", - "date": "2026-07-16", - "time": "10:18", - "summary": "更新 DESIGN.md", + "date": "2026-07-17", + "time": "16:10", + "summary": "迭代加氢站 H5/Web:手工台账与预约列表、导入主键与实收规则,并同步站点信息拆分与导航。", + "details": [ + "变更 1 个文件" + ], + "commit": "305199c", "files": [ "DESIGN.md" ] @@ -6598,11 +3605,11 @@ ] }, "oneos-web-h2-station-stats": { - "title": "oneos web h2 station stats", - "version": "v1.32", - "revision": 32, - "lastUpdated": "2026-07-13T03:24:27.242Z", - "contentHash": "cb4ec2580553d6e06d231f5a30544bf913dffd8fc4d45b80f925272f404a6f2c", + "title": "加氢站数量统计", + "version": "v1.1", + "revision": 1, + "lastUpdated": "2026-07-16T01:00:00.000Z", + "contentHash": "c8997b472fe2f6fd6ad60208b7af42a30ed8d511a778a4b66f1057a39a81c8d5", "trackedFiles": [ ".spec/requirements-prd.md", "components/FilterPanel.tsx", @@ -6620,10 +3627,16 @@ ], "changelog": [ { - "version": "v1.32", - "date": "2026-07-13", - "time": "11:24", - "summary": "更新需求说明与标注", + "version": "v1.1", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:FilterPanel.tsx、StationDetailTable.tsx、StatsCharts.tsx、StatsKpiRow.tsx 等", + "details": [ + "样式与布局:index.css", + "需求说明与 PRD:requirements-prd.md", + "演示数据与配置:stations.json" + ], + "commit": "47c223a", "files": [ ".spec/requirements-prd.md", "components/FilterPanel.tsx", @@ -6638,497 +3651,39 @@ "utils/export.ts", "utils/stats.ts" ] - }, - { - "version": "v1.31", - "date": "2026-07-13", - "time": "11:24", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.30", - "date": "2026-07-13", - "time": "11:24", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.29", - "date": "2026-07-13", - "time": "11:24", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.28", - "date": "2026-07-13", - "time": "11:23", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.27", - "date": "2026-07-13", - "time": "11:23", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.26", - "date": "2026-07-13", - "time": "11:13", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.25", - "date": "2026-07-13", - "time": "11:13", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.24", - "date": "2026-07-13", - "time": "11:13", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.23", - "date": "2026-07-13", - "time": "11:13", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.22", - "date": "2026-07-13", - "time": "11:13", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.21", - "date": "2026-07-13", - "time": "11:13", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.20", - "date": "2026-07-13", - "time": "11:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.19", - "date": "2026-07-13", - "time": "11:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.18", - "date": "2026-07-13", - "time": "11:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.17", - "date": "2026-07-13", - "time": "11:12", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "components/SummaryInsight.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts" - ] - }, - { - "version": "v1.16", - "date": "2026-07-13", - "time": "11:12", - "summary": "更新页面逻辑与交互", - "files": [ - "components/SummaryInsight.tsx" - ] - }, - { - "version": "v1.15", - "date": "2026-07-13", - "time": "11:09", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts", - "utils/week.ts" - ] - }, - { - "version": "v1.14", - "date": "2026-07-13", - "time": "11:09", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts", - "utils/week.ts" - ] - }, - { - "version": "v1.13", - "date": "2026-07-13", - "time": "11:08", - "summary": "加氢站数量统计原型首版:KPI、图表、双明细表、PDF/CSV 导出", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts", - "utils/week.ts" - ] - }, - { - "version": "v1.12", - "date": "2026-07-13", - "time": "11:08", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md", - "components/FilterPanel.tsx", - "components/StationDetailTable.tsx", - "components/StatsCharts.tsx", - "components/StatsKpiRow.tsx", - "data/stations.json", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/export.ts", - "utils/stats.ts", - "utils/week.ts" - ] - }, - { - "version": "v1.11", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新需求说明与标注", - "files": [ - ".spec/requirements-prd.md" - ] - }, - { - "version": "v1.10", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新页面逻辑与交互", - "files": [ - "index.tsx" - ] - }, - { - "version": "v1.9", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新页面样式", - "files": [ - "styles/index.css" - ] - }, - { - "version": "v1.8", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新页面逻辑与交互", - "files": [ - "components/StationDetailTable.tsx" - ] - }, - { - "version": "v1.7", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新页面逻辑与交互", - "files": [ - "components/StatsCharts.tsx" - ] - }, - { - "version": "v1.6", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新页面逻辑与交互", - "files": [ - "components/StatsKpiRow.tsx" - ] - }, - { - "version": "v1.5", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新页面逻辑与交互", - "files": [ - "components/FilterPanel.tsx" - ] - }, - { - "version": "v1.4", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新 export.ts", - "files": [ - "utils/export.ts" - ] - }, - { - "version": "v1.3", - "date": "2026-07-13", - "time": "11:07", - "summary": "更新 stats.ts", - "files": [ - "utils/stats.ts" - ] } ] }, "customer-payment-collection": { "title": "客户回款情况", - "version": "v1.0", - "revision": 0, - "lastUpdated": "2026-07-13T07:44:54.700Z", - "contentHash": "1de145df07e4dc693b8935d3753243d87eddeae58d739685fea68f9c5f7fd32d", + "version": "v1.1", + "revision": 1, + "lastUpdated": "2026-07-16T01:00:00.000Z", + "contentHash": "00443b22a2f97d9e5162764025ec4246c3a1220f6f397c2df181da81aedb5437", "trackedFiles": [ "index.tsx", "pages/客户回款情况.jsx" ], - "changelog": [] + "changelog": [ + { + "version": "v1.1", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "47c223a", + "files": [ + "index.tsx" + ] + } + ] }, "oneos-h5-h2-order": { "title": "加氢订单", - "version": "v1.106", - "revision": 106, - "lastUpdated": "2026-07-17T03:57:09.269Z", - "contentHash": "c960fdbeeedc96c0fbd32f30a0346033552615522a12e4a9be07f5d2843bbc25", + "version": "v1.18", + "revision": 18, + "lastUpdated": "2026-07-17T09:27:10.428Z", + "contentHash": "52cde05edabca23007e9e1c5f3e17c7c61e342c688bc2dee4581b31df76c1411", "trackedFiles": [ ".spec/2026-07-14-implementation-plan.md", ".spec/2026-07-14-requirements-design.md", @@ -7151,17 +3706,20 @@ "index.tsx", "styles/index.css", "types.ts", + "utils/demo-photo.ts", "utils/fleet-plates.ts", "utils/format.ts", "utils/manual-ledger.ts", "utils/ocr-mock.ts", - "utils/orders.ts" + "utils/orders.ts", + "utils/photo-watermark.ts", + "utils/vehicle-mileage.ts" ], "changelog": [ { - "version": "v1.106", + "version": "v1.18", "date": "2026-07-17", - "time": "11:57", + "time": "17:27", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7179,9 +3737,9 @@ ] }, { - "version": "v1.105", + "version": "v1.17", "date": "2026-07-17", - "time": "11:57", + "time": "17:27", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7199,9 +3757,9 @@ ] }, { - "version": "v1.104", + "version": "v1.16", "date": "2026-07-17", - "time": "11:56", + "time": "17:26", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7219,9 +3777,9 @@ ] }, { - "version": "v1.103", + "version": "v1.15", "date": "2026-07-17", - "time": "11:56", + "time": "17:26", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7239,9 +3797,18 @@ ] }, { - "version": "v1.102", + "version": "v1.14", "date": "2026-07-17", - "time": "11:56", + "time": "17:26", + "summary": "更新 demo-photo.ts", + "files": [ + "utils/demo-photo.ts" + ] + }, + { + "version": "v1.13", + "date": "2026-07-17", + "time": "17:26", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7259,9 +3826,9 @@ ] }, { - "version": "v1.101", + "version": "v1.12", "date": "2026-07-17", - "time": "11:56", + "time": "17:25", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7279,9 +3846,9 @@ ] }, { - "version": "v1.100", + "version": "v1.11", "date": "2026-07-17", - "time": "11:56", + "time": "17:23", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7299,9 +3866,9 @@ ] }, { - "version": "v1.99", + "version": "v1.10", "date": "2026-07-17", - "time": "11:56", + "time": "17:23", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7319,9 +3886,9 @@ ] }, { - "version": "v1.98", + "version": "v1.9", "date": "2026-07-17", - "time": "10:42", + "time": "17:21", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7339,9 +3906,9 @@ ] }, { - "version": "v1.97", + "version": "v1.8", "date": "2026-07-17", - "time": "10:42", + "time": "17:19", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7359,9 +3926,9 @@ ] }, { - "version": "v1.96", + "version": "v1.7", "date": "2026-07-17", - "time": "10:37", + "time": "17:19", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7379,9 +3946,9 @@ ] }, { - "version": "v1.95", + "version": "v1.6", "date": "2026-07-17", - "time": "10:37", + "time": "17:19", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7399,9 +3966,9 @@ ] }, { - "version": "v1.94", + "version": "v1.5", "date": "2026-07-17", - "time": "10:32", + "time": "17:19", "summary": "更新需求说明与标注", "files": [ ".spec/2026-07-14-implementation-plan.md", @@ -7419,571 +3986,96 @@ ] }, { - "version": "v1.93", + "version": "v1.4", "date": "2026-07-17", - "time": "10:32", - "summary": "更新需求说明与标注", + "time": "17:18", + "summary": "更新 vehicle-mileage.ts", + "files": [ + "utils/vehicle-mileage.ts" + ] + }, + { + "version": "v1.3", + "date": "2026-07-17", + "time": "17:18", + "summary": "更新 photo-watermark.ts", + "files": [ + "utils/photo-watermark.ts" + ] + }, + { + "version": "v1.2", + "date": "2026-07-17", + "time": "16:10", + "summary": "页面逻辑与交互:CreateWizard.tsx、DateTimePickerSheet.tsx、ManualLedgerPanel.tsx、OrderCard.tsx 等", + "details": [ + "样式与布局:index.css", + "需求说明与 PRD:feature-create.md、feature-detail.md、feature-list.md、feature-manual-ledger.md、fleet-plate-tag.md、reconcile-linkage.md、requirements-prd.md" + ], + "commit": "305199c", "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", ".spec/feature-create.md", ".spec/feature-detail.md", ".spec/feature-list.md", ".spec/feature-manual-ledger.md", ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "version": "v1.92", - "date": "2026-07-17", - "time": "10:31", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "version": "v1.91", - "date": "2026-07-17", - "time": "10:30", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "version": "v1.90", - "date": "2026-07-17", - "time": "10:28", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "version": "v1.89", - "date": "2026-07-17", - "time": "10:28", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "version": "v1.88", - "date": "2026-07-17", - "time": "10:22", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", ".spec/reconcile-linkage.md", ".spec/requirements-prd.md", "components/CreateWizard.tsx", "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.87", - "date": "2026-07-17", - "time": "10:22", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.86", - "date": "2026-07-17", - "time": "10:22", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.85", - "date": "2026-07-17", - "time": "10:22", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.84", - "date": "2026-07-17", - "time": "10:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.83", - "date": "2026-07-17", - "time": "10:21", - "summary": "更新页面逻辑与交互", - "files": [ "components/ManualLedgerPanel.tsx", - "utils/manual-ledger.ts" + "components/OrderCard.tsx", + "components/OrderDetail.tsx" ] }, { - "version": "v1.82", - "date": "2026-07-17", - "time": "10:10", - "summary": "更新需求说明与标注", + "version": "v1.1", + "date": "2026-07-16", + "time": "09:00", + "summary": "页面逻辑与交互:CreateWizard.tsx、Icons.tsx、OrderCard.tsx、OrderDetail.tsx 等", + "details": [ + "样式与布局:index.css", + "需求说明与 PRD:2026-07-14-implementation-plan.md、2026-07-14-requirements-design.md、reconcile-linkage.md、requirements-prd.md" + ], + "commit": "47c223a", "files": [ ".spec/2026-07-14-implementation-plan.md", ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", ".spec/reconcile-linkage.md", ".spec/requirements-prd.md", "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.81", - "date": "2026-07-17", - "time": "10:10", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.80", - "date": "2026-07-17", - "time": "10:10", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx" - ] - }, - { - "version": "v1.79", - "date": "2026-07-17", - "time": "10:09", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", "components/Icons.tsx", "components/OrderCard.tsx", "components/OrderDetail.tsx", - "components/PhoneShell.tsx" - ] - }, - { - "version": "v1.78", - "date": "2026-07-17", - "time": "10:04", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx" - ] - }, - { - "version": "v1.77", - "date": "2026-07-17", - "time": "10:03", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx" + "components/PhoneShell.tsx", + "index.tsx", + "styles/index.css", + "types.ts" ] } ] }, "oneos-web-approval": { - "title": "oneos-web-approval", - "version": "v1.17", - "revision": 17, - "lastUpdated": "2026-07-16T01:04:28.186Z", + "title": "oneos web approval", + "version": "v1.1", + "revision": 1, + "lastUpdated": "2026-07-15T00:58:00.000Z", "contentHash": "d54f9542ce8e8bf62137245386bf33016140cbbe6e78243322c6a23130ae83fa", "trackedFiles": [ "index.tsx" ], "changelog": [ - { - "version": "v1.17", - "date": "2026-07-16", - "time": "09:04", - "summary": "同步审批中心注册", - "files": [ - "index.tsx" - ] - }, - { - "version": "v1.16", - "date": "2026-07-14", - "time": "14:17", - "summary": "更新页面逻辑与交互", - "files": [ - ".spec/prototype-comments.json", - "index.tsx" - ] - }, - { - "version": "v1.15", - "date": "2026-07-14", - "time": "14:09", - "summary": "更新页面逻辑与交互", - "files": [ - "ApprovalApp.tsx" - ] - }, - { - "version": "v1.14", - "date": "2026-07-14", - "time": "14:03", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.13", - "date": "2026-07-14", - "time": "14:03", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.12", - "date": "2026-07-14", - "time": "13:59", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.11", - "date": "2026-07-14", - "time": "13:55", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.10", - "date": "2026-07-14", - "time": "13:54", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.9", - "date": "2026-07-14", - "time": "13:19", - "summary": "更新页面样式", - "files": [ - ".spec/prototype-comments.json", - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.8", - "date": "2026-07-14", - "time": "10:58", - "summary": "更新页面样式", - "files": [ - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.7", - "date": "2026-07-14", - "time": "10:56", - "summary": "更新页面样式", - "files": [ - "components/ApprovalCard.tsx", - "components/ApprovalCardList.tsx", - "components/ApprovalDetailPlaceholder.tsx", - "config/approvalTypeConfig.ts", - "data/mockApprovalCases.ts", - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "version": "v1.6", - "date": "2026-07-14", - "time": "10:56", - "summary": "更新页面样式", - "files": [ - "index.tsx", - "pages/ApprovalCenterPage.tsx", - "styles/index.css" - ] - }, - { - "version": "v1.5", - "date": "2026-07-14", - "time": "10:56", - "summary": "更新页面逻辑与交互", - "files": [ - "components/ApprovalDetailPlaceholder.tsx" - ] - }, - { - "version": "v1.4", - "date": "2026-07-14", - "time": "10:56", - "summary": "更新页面逻辑与交互", - "files": [ - "components/ApprovalCardList.tsx" - ] - }, - { - "version": "v1.3", - "date": "2026-07-14", - "time": "10:56", - "summary": "更新页面逻辑与交互", - "files": [ - "components/ApprovalCard.tsx" - ] - }, - { - "version": "v1.2", - "date": "2026-07-14", - "time": "10:55", - "summary": "更新 mockApprovalCases.ts", - "files": [ - "data/mockApprovalCases.ts" - ] - }, { "version": "v1.1", - "date": "2026-07-14", - "time": "10:55", - "summary": "更新 approvalTypeConfig.ts", + "date": "2026-07-15", + "time": "08:58", + "summary": "feat: add approval center module with split layout and nav registration", + "details": [ + "页面逻辑与交互:index.tsx" + ], + "commit": "6971529", "files": [ - "config/approvalTypeConfig.ts" + "index.tsx" ] } ] @@ -7992,7 +4084,7 @@ "title": "我发起的", "version": "v1.1", "revision": 1, - "lastUpdated": "2026-07-16T01:04:29.438Z", + "lastUpdated": "2026-07-15T00:58:00.000Z", "contentHash": "3fba821920f13c7fff1e25a0da4c8a905a733197fae9f50ceca853525580f9f7", "trackedFiles": [ "index.tsx" @@ -8000,9 +4092,11 @@ "changelog": [ { "version": "v1.1", - "date": "2026-07-16", - "time": "09:04", - "summary": "同步我发起的注册", + "date": "2026-07-15", + "time": "08:58", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "6971529", "files": [ "index.tsx" ] @@ -8013,7 +4107,7 @@ "title": "我的抄送", "version": "v1.1", "revision": 1, - "lastUpdated": "2026-07-16T01:04:29.814Z", + "lastUpdated": "2026-07-15T00:58:00.000Z", "contentHash": "4d0ea26865ca537c9227a99441ff1e552c7f0d1df05ae1c995287123a72b1090", "trackedFiles": [ "index.tsx" @@ -8021,9 +4115,11 @@ "changelog": [ { "version": "v1.1", - "date": "2026-07-16", - "time": "09:04", - "summary": "同步我的抄送注册", + "date": "2026-07-15", + "time": "08:58", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "6971529", "files": [ "index.tsx" ] @@ -8032,36 +4128,96 @@ }, "oneos-web-approval-todo": { "title": "我的待办", - "version": "v1.0", - "revision": 0, - "lastUpdated": "2026-07-16T01:04:28.611Z", + "version": "v1.1", + "revision": 1, + "lastUpdated": "2026-07-15T00:58:00.000Z", "contentHash": "5766a14e5522689fbc89ca50891095a00672ea52c596ad00f0f9151c9ce1f3ba", "trackedFiles": [ "index.tsx" ], - "changelog": [] + "changelog": [ + { + "version": "v1.1", + "date": "2026-07-15", + "time": "08:58", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "6971529", + "files": [ + "index.tsx" + ] + } + ] }, "oneos-web-approval-done": { "title": "我的已办", - "version": "v1.0", - "revision": 0, - "lastUpdated": "2026-07-16T01:04:29.023Z", + "version": "v1.1", + "revision": 1, + "lastUpdated": "2026-07-15T00:58:00.000Z", "contentHash": "a1e94700ad17be8996ba2bed95a12a975a7ead4fd640326d5742d74d06f9782a", "trackedFiles": [ "index.tsx" ], - "changelog": [] + "changelog": [ + { + "version": "v1.1", + "date": "2026-07-15", + "time": "08:58", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "6971529", + "files": [ + "index.tsx" + ] + } + ] + }, + "oneos-web-help-center": { + "title": "帮助中心", + "version": "v1.2", + "revision": 2, + "lastUpdated": "2026-06-30T08:54:00.000Z", + "contentHash": "d0ce28b3fa6781237ad7e26dc4daf45ac4382c49d49ce14b6701a5457f55c291", + "trackedFiles": [ + "index.tsx", + "pages/01-功能说明书.jsx" + ], + "changelog": [ + { + "version": "v1.2", + "date": "2026-06-30", + "time": "16:54", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "0982837", + "files": [ + "index.tsx" + ] + }, + { + "version": "v1.1", + "date": "2026-06-30", + "time": "16:36", + "summary": "页面逻辑与交互:index.tsx", + "details": [], + "commit": "d71ebc5", + "files": [ + "index.tsx" + ] + } + ] } }, "recentUpdates": [ { "prototypeId": "oneos-web-h2-station-site", "title": "站点信息", - "version": "v1.21", + "version": "v1.27", "date": "2026-07-17", - "time": "13:30", + "time": "17:43", "summary": "更新需求说明与标注", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -8070,6 +4226,139 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.26", + "date": "2026-07-17", + "time": "17:41", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.25", + "date": "2026-07-17", + "time": "17:41", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.24", + "date": "2026-07-17", + "time": "17:41", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.23", + "date": "2026-07-17", + "time": "17:40", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.22", + "date": "2026-07-17", + "time": "17:40", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.21", + "date": "2026-07-17", + "time": "17:39", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] @@ -8079,9 +4368,10 @@ "title": "站点信息", "version": "v1.20", "date": "2026-07-17", - "time": "13:30", + "time": "17:39", "summary": "更新需求说明与标注", "files": [ + ".spec/dispenser-brand.md", ".spec/period-end-balance.md", ".spec/prototype-comments.json", ".spec/prototype-review.md", @@ -8090,38 +4380,584 @@ ".spec/requirements-prd-statement.md", ".spec/requirements-prd.md", ".spec/requirements.md", + ".spec/statement-verified-filter.md", "index.tsx", "pages/03-站点信息.jsx" ] }, - { - "prototypeId": "lease-business-detail", - "title": "租赁业务明细", - "version": "v1.42", - "date": "2026-07-17", - "time": "13:24", - "summary": "更新需求说明与标注", - "files": [ - ".spec/field-checks.md", - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailMainTabs.tsx", - "components/DetailTable.tsx" - ] - }, { "prototypeId": "oneos-web-h2-station-site", "title": "站点信息", "version": "v1.19", "date": "2026-07-17", - "time": "13:21", + "time": "17:38", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.18", + "date": "2026-07-17", + "time": "17:37", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.17", + "date": "2026-07-17", + "time": "17:37", + "summary": "对账单仅纳入已核对氢费明细", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.16", + "date": "2026-07-17", + "time": "17:37", + "summary": "更新需求说明与标注", + "files": [ + ".spec/dispenser-brand.md", + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + ".spec/statement-verified-filter.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.18", + "date": "2026-07-17", + "time": "17:27", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.17", + "date": "2026-07-17", + "time": "17:27", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.16", + "date": "2026-07-17", + "time": "17:26", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.15", + "date": "2026-07-17", + "time": "17:26", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.14", + "date": "2026-07-17", + "time": "17:26", + "summary": "更新 demo-photo.ts", + "files": [ + "utils/demo-photo.ts" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.13", + "date": "2026-07-17", + "time": "17:26", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.12", + "date": "2026-07-17", + "time": "17:25", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.11", + "date": "2026-07-17", + "time": "17:23", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.10", + "date": "2026-07-17", + "time": "17:23", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.9", + "date": "2026-07-17", + "time": "17:21", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.15", + "date": "2026-07-17", + "time": "17:20", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.14", + "date": "2026-07-17", + "time": "17:20", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.13", + "date": "2026-07-17", + "time": "17:19", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.8", + "date": "2026-07-17", + "time": "17:19", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.7", + "date": "2026-07-17", + "time": "17:19", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.6", + "date": "2026-07-17", + "time": "17:19", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.5", + "date": "2026-07-17", + "time": "17:19", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-14-implementation-plan.md", + ".spec/2026-07-14-requirements-design.md", + ".spec/feature-create.md", + ".spec/feature-detail.md", + ".spec/feature-list.md", + ".spec/feature-manual-ledger.md", + ".spec/fleet-plate-tag.md", + ".spec/prototype-comments.json", + ".spec/reconcile-linkage.md", + ".spec/requirements-prd.md", + "components/CreateWizard.tsx", + "components/DateTimePickerSheet.tsx" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.4", + "date": "2026-07-17", + "time": "17:18", + "summary": "更新 vehicle-mileage.ts", + "files": [ + "utils/vehicle-mileage.ts" + ] + }, + { + "prototypeId": "oneos-h5-h2-order", + "title": "加氢订单", + "version": "v1.3", + "date": "2026-07-17", + "time": "17:18", + "summary": "更新 photo-watermark.ts", + "files": [ + "utils/photo-watermark.ts" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.12", + "date": "2026-07-17", + "time": "16:27", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.11", + "date": "2026-07-17", + "time": "16:27", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.10", + "date": "2026-07-17", + "time": "16:26", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.9", + "date": "2026-07-17", + "time": "16:26", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.8", + "date": "2026-07-17", + "time": "16:26", + "summary": "更新需求说明与标注", + "files": [ + ".spec/period-end-balance.md", + ".spec/prototype-comments.json", + ".spec/prototype-review.md", + ".spec/requirements-prd-kpi-balance-alert.md", + ".spec/requirements-prd-list.md", + ".spec/requirements-prd-statement.md", + ".spec/requirements-prd.md", + ".spec/requirements.md", + "index.tsx", + "pages/03-站点信息.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station-site", + "title": "站点信息", + "version": "v1.7", + "date": "2026-07-17", + "time": "16:25", "summary": "更新需求说明与标注", "files": [ ".spec/period-end-balance.md", @@ -8139,9 +4975,9 @@ { "prototypeId": "oneos-web-h2-station", "title": "加氢记录", - "version": "v1.106", + "version": "v1.12", "date": "2026-07-17", - "time": "13:02", + "time": "16:24", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -8158,9 +4994,9 @@ { "prototypeId": "oneos-web-h2-station", "title": "加氢记录", - "version": "v1.105", + "version": "v1.11", "date": "2026-07-17", - "time": "13:01", + "time": "16:24", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -8177,9 +5013,9 @@ { "prototypeId": "oneos-web-h2-station", "title": "加氢记录", - "version": "v1.104", + "version": "v1.10", "date": "2026-07-17", - "time": "13:01", + "time": "16:24", "summary": "更新需求说明与标注", "files": [ ".spec/prototype-comments.json", @@ -8192,643 +5028,6 @@ "pages/README.md", "styles/h2-station-vm-filter.css" ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.103", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.102", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.101", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.100", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.99", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.98", - "date": "2026-07-17", - "time": "13:01", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.97", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.96", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.95", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.94", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.93", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.92", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.91", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.90", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.89", - "date": "2026-07-17", - "time": "13:00", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - ".spec/ui-review.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.88", - "date": "2026-07-17", - "time": "12:52", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.87", - "date": "2026-07-17", - "time": "12:52", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.86", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.85", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.84", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.83", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.82", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.81", - "date": "2026-07-17", - "time": "12:51", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.106", - "date": "2026-07-17", - "time": "11:57", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.105", - "date": "2026-07-17", - "time": "11:57", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.80", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.79", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.78", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/02-加氢记录.jsx", - "pages/README.md", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.104", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.103", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.102", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.101", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.100", - "date": "2026-07-17", - "time": "11:56", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/feature-create.md", - ".spec/feature-detail.md", - ".spec/feature-list.md", - ".spec/feature-manual-ledger.md", - ".spec/fleet-plate-tag.md", - ".spec/prototype-comments.json", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/DateTimePickerSheet.tsx" - ] } ] } diff --git a/src/prototypes/oneos-prototype-nav/xll-nav-menu.json b/src/prototypes/oneos-prototype-nav/xll-nav-menu.json index e9ba024..dbdd3dd 100644 --- a/src/prototypes/oneos-prototype-nav/xll-nav-menu.json +++ b/src/prototypes/oneos-prototype-nav/xll-nav-menu.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-07-17T03:52:22.620Z", + "updatedAt": "2026-07-17T09:37:56.294Z", "title": "小羚羚", "sectionId": "folder-prototypes-xll-miniapp", "description": "氢能车辆运营移动端原型;菜单与小羚羚「小程序」项目目录同步。", diff --git a/src/prototypes/oneos-web-h2-station-site/.spec/dispenser-brand.md b/src/prototypes/oneos-web-h2-station-site/.spec/dispenser-brand.md new file mode 100644 index 0000000..70b817b --- /dev/null +++ b/src/prototypes/oneos-web-h2-station-site/.spec/dispenser-brand.md @@ -0,0 +1,33 @@ +# 加氢机品牌管理 + +| 项 | 内容 | +|---|---| +| 模块 | 加氢站管理 → 站点信息 | +| 入口 | 列表工具栏 → **加氢机品牌管理** | +| 关联 | H5「加氢订单」面板 OCR | +| 数据 | `src/common/h2DispenserBrandStore.js`(localStorage 演示,未接真实 API) | + +## 目标 + +维护加氢机**品牌 + 型号**清单,供站端拍照 OCR 时作为识别模型 / 模板判断参考(原型展示为 H5 面板区提示文案)。 + +## 字段 + +| 字段 | 规则 | +|---|---| +| 品牌 * | 必填,如「海德利森」 | +| 型号 * | 必填,如「H2-D50」;同品牌+型号不可重复 | +| 备注 | 选填,如 OCR 模板说明 | +| 更新时间 | 系统写入 | + +## 交互 + +1. 打开弹窗加载当前清单(含种子数据)。 +2. 填写品牌/型号/备注 → **新增** 或编辑后 **保存修改**。 +3. 行操作:编辑、删除(二次确认)。 + +## 验收 + +1. 站点信息工具栏可见「加氢机品牌管理」。 +2. 可增删改品牌型号,刷新后仍保留(同浏览器)。 +3. H5 新增页「加氢机面板识别」展示已维护品牌型号提示(若 Store 已加载)。 diff --git a/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-list.md b/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-list.md index c90d124..c349b51 100644 --- a/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-list.md +++ b/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-list.md @@ -17,7 +17,7 @@ 1. **筛选区** — 名称、签约、地区、营业状态 2. **KPI 分类** — 全部 / 签约·普通 / 预付余额预警 / 已欠费 / 无加氢 -3. **工具栏** — 全站余额提醒、批量导入、发起充值单、新建站点 +3. **工具栏** — 全站余额提醒、批量导入、加氢机品牌管理、发起充值单、新建站点 4. **站点列表** — 主数据 + 运营指标 + 操作列 5. **分页栏** — 每页 5/10/20/50 条 @@ -82,6 +82,7 @@ |---|---| | 全站余额提醒设置 | 配置全局预付余额预警阈值 | | 批量导入 | 下载模板 → 上传 CSV/Excel → 预览确认导入 | +| 加氢机品牌管理 | 维护品牌与型号,供 H5 面板 OCR 参考(见 `.spec/dispenser-brand.md`) | | 发起充值单 | 为站点发起预付充值流程(原型演示) | | 新建站点 | 进入同页内嵌新建视图 | diff --git a/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-statement.md b/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-statement.md index fc09e28..f44a25c 100644 --- a/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-statement.md +++ b/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-statement.md @@ -1,37 +1,51 @@ # 加氢站管理 · 站点信息 — 对账与结算 PRD -> 本模块与「车辆氢费明细」配合完成**站点侧氢费结算闭环**。 +> 本模块与「车辆氢费明细」配合完成**站点侧氢费结算闭环**。 +> **重要**:生成对账单时,账期筛选出的明细**必须来自车辆氢费明细中「已核对」的记录**;未核对明细不得进入对账单。完整判定见 [statement-verified-filter.md](./statement-verified-filter.md);台账双状态见车辆氢费明细 `.spec/verify-reconcile.md`。 --- ## 1. 数据来源 -对账单明细取自 **车辆氢费明细** 中同时满足以下条件的记录: +对账单明细取自 **车辆氢费明细**(共享 Store)中**同时满足**以下条件的记录: -1. 对账状态 = **已对账**(台账已完成「完成对账」) -2. **尚未**被本站点历史对账单结算过(未绑定 `statementRecordId`) -3. 加氢时间落在用户选择的 **[账单开始日期, 账单结束日期]** 内 -4. 加氢站名称与当前操作站点一致 +| 优先级 | 条件 | 说明 | +|---|---|---| +| 1 | 未绑定 `statementRecordId` | 尚未被历史对账单结算 | +| 2 | 核对状态 = **已核对**(`verifyStatus = verified`) | **硬约束**:未核对一律不纳入 | +| 3 | 对账状态 = **未对账**(`reconcileStatus = pending`) | 已对账由对账单提交产生,不再进入新账单 | +| 4 | 加氢站名称 = 当前操作站点 | 仅本站 | +| 5 | 加氢时间落在 **[账单开始日期, 账单结束日期]** | 用户所选账期(按日闭区间) | > 对账单明细**仅展示成本字段**(加氢量、成本单价、成本总价等),不展示加氢单价、加氢总价。 +### 1.1 为何必须「已核对」 + +能源部在车辆氢费明细点击「完成核对」后,明细才视为业务已确认。站点侧生成对账单是结算动作,只能拉取已确认数据;未核对记录即使时间落在账期内,也**静默排除**,不出现在对账单明细与统计中。 + +```text +未核对 ──✕──→ 不可进对账单 +已核对 + 未对账 ──✓──→ 可进对账单(提交后变为已对账) +已核对 + 已对账 ──✕──→ 不可再进下一张对账单 +``` + --- ## 2. 两阶段交互 #### 生成对账单 · 业务逻辑 -1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点的加氢记录(已对账且尚未结算)。 -2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成对账单后,车辆氢费明细中对应记录将自动标记为已对账且无法修改。 +1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点、且为**已核对且尚未结算(未对账)**的加氢记录。 +2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成并提交后,车辆氢费明细中对应记录将标记为**已对账**且无法修改。 3. 确认后进入结算阶段,填写**收票日期**、**收票金额**及**发票附件**(对账日期在提交时由系统自动回写)。 -4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为已对账/已结算状态,不可再修改。 +4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为**已对账**并绑定本对账单,不可再进入后续对账单。 **阶段一 · 选期生成** - 日期区下方展示:**上次对账单结束时间**(无历史则「暂无」) - 默认开始日期建议 = 上次结束日 + 1 天 -- 点击「生成对账单」时弹出**二次确认**:提示生成后车辆氢费明细对应记录将标记为已对账且无法修改;确认后进入阶段二,日期锁定不可改 -- 无符合条件记录时提示调整日期 +- 点击「生成对账单」时弹出**二次确认**;确认后进入阶段二,日期锁定不可改 +- 无符合条件记录时提示调整日期(含:账期内仅有未核对、或均已结算等情况) **阶段二 · 结算提交** @@ -39,7 +53,7 @@ | 指标 | 说明 | |---|---| -| 加氢次数 | 本账单包含的已对账记录笔数 | +| 加氢次数 | 本账单包含的**已核对**记录笔数 | | 加氢总量 | kg 合计 | | 成本总金额 | 成本总价合计 | @@ -65,12 +79,15 @@ | 车辆氢费明细字段 | 回写值 | |---|---| +| 对账状态 | **已对账**(`reconcileStatus = reconciled`) | | 对账日期 | 操作完成时间 | | 收票日期 | 操作完成日期 | | 加氢站付款状态 | 已付款 | 原型通过 `H2_STATION_STATEMENT_LEDGER_UPDATES` / `h2VehicleLedgerBridge` 模拟跨页回写。 +> 「完成核对」只改变核对状态,**不会**把记录写成已对账;已对账仅由本页对账单提交产生。 + --- ## 4. 查看对账记录 @@ -88,7 +105,8 @@ | 场景 | 处理 | |---|---| | 日期未填 / 开始晚于结束 | 阻止生成 | -| 区间内无已对账未结算记录 | 阻止生成,提示调整日期 | +| 区间内无「已核对且未对账未结算」记录 | 阻止生成,提示调整日期(或先完成核对) | +| 区间内存在未核对记录 | **不纳入**对账单;不单独弹窗枚举(静默排除) | | 点击「生成对账单」未确认 | 不进入结算阶段 | | 收票日期/金额/附件未填 | 阻止提交 | | 收票金额 ≤ 0 | 阻止提交 | @@ -98,8 +116,10 @@ ## 6. 研发要点 -1. **对账单幂等**:同一笔已对账记录只能进入一次成功提交的对账单 -2. **上次结束时间**:取该站点已成功提交对账单的最大 `endDate` -3. **余额计算**:`balanceAfter = prepaidBalance - sum(costTotal)` -4. **跨模块同步**:生产对接统一台账;原型使用 Bridge Store -5. **明细字段范围**:对账弹窗不展示客户侧加氢单价/总价 +1. **准入**:`verifyStatus === verified` 为硬条件;勿再用「已对账」作为生成筛选条件 +2. **对账单幂等**:同一笔明细只能进入一次成功提交的对账单(`statementRecordId` 约束) +3. **上次结束时间**:取该站点已成功提交对账单的最大 `endDate` +4. **余额计算**:`balanceAfter = prepaidBalance - sum(costTotal)` +5. **跨模块同步**:生产对接统一台账;原型使用 Bridge Store +6. **明细字段范围**:对账弹窗不展示客户侧加氢单价/总价 +7. **规格全文**:[statement-verified-filter.md](./statement-verified-filter.md) diff --git a/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd.md b/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd.md index cac2102..03f5b20 100644 --- a/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd.md +++ b/src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd.md @@ -138,13 +138,17 @@ ## 6. 对账与结算(重点) -> 详见 `.spec/requirements-prd-statement.md` +> 详见 [requirements-prd-statement.md](./requirements-prd-statement.md);纳入规则全文见 [statement-verified-filter.md](./statement-verified-filter.md) 与「车辆氢费明细」配合完成站点侧氢费结算闭环: -1. 拉取已对账且未结算的记录 -2. 两阶段:选期生成 → 填收票提交 -3. 提交后更新预付余额、写对账历史、回写台账(对账日期、收票日期、已付款) +| 步骤 | 说明 | +|---|---| +| 1. 拉取明细 | 按账期从车辆氢费明细取 **已核对** ∧ **未对账** ∧ 未结算 ∧ 本站 的记录;**未核对不纳入** | +| 2. 两阶段 | 选期生成 → 填收票提交 | +| 3. 提交回写 | 更新预付余额、写对账历史;台账变为 **已对账**(对账日期、收票日期、已付款) | + +> **核对 ≠ 对账**:核对由车辆氢费明细「完成核对」产生;对账仅由本页「提交对账单」回写。 --- @@ -170,9 +174,9 @@ ### 8.2 对账流程 -- [ ] 仅已对账未结算记录可进入对账单 +- [ ] 仅 **已核对** 且未对账、未结算的记录可进入对账单;未核对明细即使在账期内也不出现 - [ ] 两阶段交互与必填校验完整 -- [ ] 提交后回写车辆氢费明细可跨页验收 +- [ ] 提交后回写车辆氢费明细为 **已对账**,可跨页验收 ### 8.3 期末余额设置 diff --git a/src/prototypes/oneos-web-h2-station-site/.spec/statement-verified-filter.md b/src/prototypes/oneos-web-h2-station-site/.spec/statement-verified-filter.md new file mode 100644 index 0000000..5561fe7 --- /dev/null +++ b/src/prototypes/oneos-web-h2-station-site/.spec/statement-verified-filter.md @@ -0,0 +1,84 @@ +# 站点信息 · 生成对账单 — 明细纳入规则(已核对) + +| 项 | 说明 | +|---|---| +| 模块 | 加氢站管理 → 站点信息 → 生成对账单 | +| 交互原型 | `/prototypes/oneos-web-h2-station-site` | +| 对照台账 | [车辆氢费明细 · 核对 vs 对账](/prototypes/vehicle-h2-fee-ledger)(`.spec/verify-reconcile.md`) | +| 实现 | `h2GetAvailableStatementLedgerRows`(`pages/03-站点信息.jsx`) | +| 数据源 | `src/common/h2VehicleLedgerBridge.js` 共享 Store(原型本地种子,**未接真实 API**) | + +--- + +## 1. 业务目的 + +生成对账单时,按账单起止日期从**车辆氢费明细**筛选本站加氢记录。 +**只纳入已完成「核对」的明细**;**未核对**记录即使加氢时间落在账期内,也**不得**出现在对账单中。 + +> 这是跨模块硬约束:未核对数据尚未经能源部确认,不能进入站点结算。 + +--- + +## 2. 核对 vs 对账(不得混用) + +| 概念 | 字段 | 用户可见 | 谁触发 | 与对账单关系 | +|---|---|---|---|---| +| **核对** | `verifyStatus` = `verified` / `unverified` | 已核对 / 未核对 | 车辆氢费明细 · **完成核对** | **生成对账单的准入条件** | +| **对账** | `reconcileStatus` = `pending` / `reconciled` | 未对账 / 已对账 | 本页 · **提交对账单** 回写 | 提交后变为已对账;已对账不再进入下一张 | + +```text +加氢记录上报 → 未核对 + 未对账 + ↓ 车辆氢费明细「完成核对」 + 已核对 + 未对账 ←── 仅此状态可被「生成对账单」拉取 + ↓ 站点「提交对账单」 + 已核对 + 已对账(绑定 statementRecordId) +``` + +--- + +## 3. 判定顺序(须全部满足,命中否即排除) + +按下列优先级过滤;任一不满足则**不纳入**对账单: + +| 优先级 | 条件 | 说明 | +|---|---|---| +| 1 | 无 `statementRecordId` | 尚未被历史对账单结算绑定 | +| 2 | `verifyStatus === 'verified'`(已核对) | **核心**:未核对一律排除 | +| 3 | `reconcileStatus === 'pending'`(未对账) | 已对账不再进入新账单 | +| 4 | `stationName` = 当前操作站点 | 仅本站明细 | +| 5 | 加氢时间 ∈ **[账单开始日期, 账单结束日期]**(按日闭区间) | 用户所选账期 | + +**前置条件(不进入本筛选):** + +- 未保存草稿(台账 `reconcileStatus = draft`) +- 账单起止日期未填或开始晚于结束(交互层先拦截,不调用本筛选) + +--- + +## 4. 用户可见结果 + +| 场景 | 结果 | +|---|---| +| 账期内仅有未核对明细 | 无可用记录;提示调整日期或先去车辆氢费明细完成核对 | +| 账期内有已核对未对账明细 | 进入对账单明细表与统计(次数 / 加氢量 / 成本总金额) | +| 同账期内混有已核对与未核对 | **只展示已核对**;未核对静默排除,不计入统计 | +| 已核对但已对账 / 已绑定对账单 | 排除 | + +--- + +## 5. 与代码映射 + +| 规则 | 代码 | +|---|---| +| 筛选入口 | `h2GetAvailableStatementLedgerRows(store, stationName, startDate, endDate)` | +| 已核对 | `verifyStatus === 'verified'`(缺省按 `unverified`) | +| 未对账 | `reconcileStatus === 'pending'`(且 ≠ `reconciled`) | +| 账期 | `h2ParseDateTimeMs(hydrogenTime)` 落在起止日闭区间 | + +--- + +## 6. 验收要点 + +- [ ] 未核对明细不会出现在对账单明细表与统计中 +- [ ] 仅「已核对 ∧ 未对账 ∧ 未结算 ∧ 本站 ∧ 账期内」可生成 +- [ ] 文案与 PRD 使用「已核对 / 未核对」,不与「已对账 / 未对账」混称 diff --git a/src/prototypes/oneos-web-h2-station-site/annotation-source.json b/src/prototypes/oneos-web-h2-station-site/annotation-source.json index 95184a4..b0e4abd 100644 --- a/src/prototypes/oneos-web-h2-station-site/annotation-source.json +++ b/src/prototypes/oneos-web-h2-station-site/annotation-source.json @@ -5,7 +5,7 @@ "version": 2, "prototypeName": "oneos-web-h2-station-site", "pageId": "site-info", - "updatedAt": 1784265670222, + "updatedAt": 1784281075967, "nodes": [ { "id": "h2-site-filter", @@ -25,8 +25,8 @@ "hasMarkdown": true, "color": "#2563eb", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] }, { @@ -47,8 +47,8 @@ "hasMarkdown": true, "color": "#2563eb", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] }, { @@ -65,12 +65,12 @@ "path": [] }, "aiPrompt": "工具栏操作与对账单氢费联动。", - "annotationText": "全站余额提醒、批量导入、充值单、新建站点;对账回写车辆氢费明细。", + "annotationText": "全站余额提醒、批量导入、加氢机品牌管理、充值单、新建站点;对账回写车辆氢费明细。", "hasMarkdown": true, "color": "#d97706", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] }, { @@ -91,8 +91,8 @@ "hasMarkdown": true, "color": "#32a06e", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] }, { @@ -112,8 +112,8 @@ "hasMarkdown": true, "color": "#d97706", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] }, { @@ -133,8 +133,8 @@ "hasMarkdown": true, "color": "#7c3aed", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] }, { @@ -150,13 +150,13 @@ "fingerprint": "form|statement", "path": [] }, - "aiPrompt": "选期拉取氢费明细、二次确认与结算提交逻辑。", - "annotationText": "选日期拉取站点加氢记录;生成前二次确认;提交后明细锁定为已对账", + "aiPrompt": "选期仅拉取已核对未对账氢费明细、二次确认与结算提交。", + "annotationText": "账期内仅纳入车辆氢费明细「已核对」记录;未核对不进对账单;提交后标为已对账", "hasMarkdown": true, "color": "#7c3aed", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] }, { @@ -176,8 +176,8 @@ "hasMarkdown": true, "color": "#0891b2", "images": [], - "createdAt": 1784265670222, - "updatedAt": 1784265670222, + "createdAt": 1784281075967, + "updatedAt": 1784281075967, "controls": [] } ] @@ -185,11 +185,11 @@ "markdownMap": { "h2-site-filter": "## 2. 筛选区\n\n与租赁合同等模块一致的 **vm 筛选卡片** 布局:标题「筛选条件」+ 4 列栅格(标签在上、控件在下);底部分隔线 + 右对齐「重置」「查询」。\n\n| 字段 | 控件 | 说明 |\n|---|---|---|\n| 加氢站名称 | 输入框 | 模糊匹配,支持回车查询 |\n| 是否签约 | 下拉 | 签约站点 / 普通站点 |\n| 地区(省-市) | 级联 | 省、市两级,可只选省 |\n| 营业状态 | 下拉 | 营业中 / 暂停营业 / 停止营业 |\n\n**交互**:\n\n- **查询**:写入「已应用筛选」,列表与 KPI 统计联动,回到第 1 页\n- **重置**:清空筛选条件并刷新列表\n\n---", "h2-site-kpi": "## 3. KPI 统计卡片\n\n与租赁合同一致的 **vm-kpi-card**:左侧图标 + 标题 + 数值,右上角 `?` 悬停说明,选中态绿色描边。\n\n| 卡片 | 口径 |\n|---|---|\n| 全部加氢站 | 列表全部站点 |\n| 签约站点 | 已签约,点击快捷筛选 |\n| 普通站点 | 未签约,点击快捷筛选 |\n| 预付余额预警站点 | 已设提醒阈值,预付余额 ≥ 0 且低于阈值(不含已欠费);点击打开站点列表弹窗,可一键发起充值单 |\n| 已欠费站点 | 预付余额 < 0;点击打开站点列表弹窗,可一键发起充值单 |\n| 无加氢站点 | 加氢次数 = 0 |\n\n加氢次数来自「车辆氢费明细」共享 Store,按站点名称聚合。「无加氢」与签约 KPI 与筛选区互斥切换。\n\n> **预付余额预警 / 已欠费** 的完整点击交互见 [预付余额 KPI 交互说明](./requirements-prd-kpi-balance-alert.md)。\n\n### 3.1 预付余额预警 / 已欠费 — 点击交互(摘要)\n\n这两张 KPI 与「全部 / 无加氢」不同:**点击后不筛选主列表**,而是打开**站点列表弹窗**。\n\n| 步骤 | 用户操作 | 系统反馈 |\n|---|---|---|\n| 1 | 点击「预付余额预警站点」或「已欠费站点」 | 按口径汇总全量台账站点,打开居中弹窗;对应 KPI 卡片保持选中高亮 |\n| 2 | 查看弹窗内站点表 | 列与主列表一致(无操作列);展示站点数;预付余额负值标红「已欠费」 |\n| 3 | 点击「一键发起充值单」 | 关闭弹窗 → 打开「发起充值单」→ 为每个站点预填名称、当前余额、收款信息;付款金额由用户填写 |\n| 4 | 填写金额并提交 | 与工具栏「发起充值单」相同校验;成功后走付款流程(原型提示) |\n| — | 点击「关闭」 | 关闭弹窗,KPI 选中态取消 |\n\n**口径提醒**:预警 = 已设阈值且余额 ≥ 0 且低于阈值;欠费 = 余额 < 0。已欠费站点不计入预警。\n\n**阈值配置入口**:工具栏「全站余额提醒设置」、行内更多「余额提醒设置」。\n\n---", - "h2-site-statement": "## 4. 列表工具栏\n\n| 按钮 | 行为 |\n|---|---|\n| 全站余额提醒设置 | 配置全局预付余额预警阈值 |\n| 批量导入 | 下载模板 → 上传 CSV/Excel → 预览确认导入 |\n| 发起充值单 | 为站点发起预付充值流程(原型演示) |\n| 新建站点 | 进入同页内嵌新建视图 |\n\n---\n\n---\n\n## 6. 数据来源\n\n- 氢费/加氢明细:统一来自 `src/common/h2VehicleLedgerBridge.js`,与「车辆氢费明细」共享 Store\n- 先打开「车辆氢费明细」时台账全量同步;仅打开加氢站模块时使用 canonical seed\n- 对账单提交经 `H2_STATION_STATEMENT_LEDGER_UPDATES` 回写车辆氢费明细\n\n---", + "h2-site-statement": "## 4. 列表工具栏\n\n| 按钮 | 行为 |\n|---|---|\n| 全站余额提醒设置 | 配置全局预付余额预警阈值 |\n| 批量导入 | 下载模板 → 上传 CSV/Excel → 预览确认导入 |\n| 加氢机品牌管理 | 维护品牌与型号,供 H5 面板 OCR 参考(见 `.spec/dispenser-brand.md`) |\n| 发起充值单 | 为站点发起预付充值流程(原型演示) |\n| 新建站点 | 进入同页内嵌新建视图 |\n\n---\n\n---\n\n## 6. 数据来源\n\n- 氢费/加氢明细:统一来自 `src/common/h2VehicleLedgerBridge.js`,与「车辆氢费明细」共享 Store\n- 先打开「车辆氢费明细」时台账全量同步;仅打开加氢站模块时使用 canonical seed\n- 对账单提交经 `H2_STATION_STATEMENT_LEDGER_UPDATES` 回写车辆氢费明细\n\n---", "h2-site-table": "## 5. 列表字段说明\n\n| 字段 | 说明 |\n|---|---|\n| 加氢站名称 | 含签约标签;下一行展示省市区 + 详细地址 |\n| 合作时间 | 未签约可空 |\n| 营业状态 / 营业时间 | 列表只读;在「更多 → 营业状态」维护 |\n| 当前成本价格 | 元/kg;受价格配置生效时间驱动;多价时展示警示 |\n| 加氢次数 / 加氢量 | 加氢量可点击下钻;表头支持排序 |\n| 预付余额 | 可点击下钻流水;负值标红并显示「已欠费」 |\n| 联系方式 | 联系人 + 电话 |\n| 操作 | 查看 + 更多菜单 |\n\n**更多菜单**:编辑、删除、营业状态、价格配置、余额提醒、期末余额设置、生成对账单、查看对账记录等(按状态与权限显隐)。\n\n**分页**:默认 10 条,可选 5/10/20/50。\n\n---", "h2-site-price-cost-input": "### 5.2 价格配置\n\n配置成本价格(元/kg)与生效时间;到达生效时间后刷新列表「当前成本价格」;展示价格调整记录。\n\n**固定价格 · 适用客户规则:**\n\n- 默认对**全部客户**生效(作为站点默认价格规则)\n- **取价优先级**:第一权重为单站单客户价格配置(若该客户有专属配置则按单客户配置生效);第二权重为站点「全部客户」价格配置(无单客户配置时生效)\n\n#### 阶梯价格 · 生成逻辑\n\n1. 设置阶梯价格后,在对应**阶梯价格区间**内展示并应用该档**成本价**。\n2. 累计加氢量达到下一档阶梯时,自该次起按新档成本价计算;到达**阶梯量重置日期**后的新记录,按当前所处区间的**最新成本价**更新。\n3. **阶梯量重置日期**见价格配置表单内「阶梯量重置日期」;到达重置日后,累计加氢量**从零重新计数**,用于判断当前所处价格区间。\n4. **生效时间**自表单内「生效时间」起对新数据生效,**不追溯**此前已产生的数据;生效时间之前的历史记录,仍按当时已达的**最高阶梯价格**结算。", "h2-site-price-tiered": "#### 阶梯价格 · 生成逻辑\n\n1. 设置阶梯价格后,在对应**阶梯价格区间**内展示并应用该档**成本价**。\n2. 累计加氢量达到下一档阶梯时,自该次起按新档成本价计算;到达**阶梯量重置日期**后的新记录,按当前所处区间的**最新成本价**更新。\n3. **阶梯量重置日期**见价格配置表单内「阶梯量重置日期」;到达重置日后,累计加氢量**从零重新计数**,用于判断当前所处价格区间。\n4. **生效时间**自表单内「生效时间」起对新数据生效,**不追溯**此前已产生的数据;生效时间之前的历史记录,仍按当时已达的**最高阶梯价格**结算。", - "h2-site-statement-form": "#### 生成对账单 · 业务逻辑\n\n1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点的加氢记录(已对账且尚未结算)。\n2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成对账单后,车辆氢费明细中对应记录将自动标记为已对账且无法修改。\n3. 确认后进入结算阶段,填写**收票日期**、**收票金额**及**发票附件**(对账日期在提交时由系统自动回写)。\n4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为已对账/已结算状态,不可再修改。\n\n**阶段一 · 选期生成**\n\n- 日期区下方展示:**上次对账单结束时间**(无历史则「暂无」)\n- 默认开始日期建议 = 上次结束日 + 1 天\n- 点击「生成对账单」时弹出**二次确认**:提示生成后车辆氢费明细对应记录将标记为已对账且无法修改;确认后进入阶段二,日期锁定不可改\n- 无符合条件记录时提示调整日期\n\n**阶段二 · 结算提交**\n\n统计卡(明细表上方):\n\n| 指标 | 说明 |\n|---|---|\n| 加氢次数 | 本账单包含的已对账记录笔数 |\n| 加氢总量 | kg 合计 |\n| 成本总金额 | 成本总价合计 |\n\n明细表下方**必填**结算项:\n\n| 字段 | 规则 |\n|---|---|\n| 结算后加氢站预付款余额 | **只读**,= 当前预付余额 − 成本总金额;不足为负并标「已欠费」 |\n| 收票日期 | 必填 |\n| 收票金额 | 必填,默认填入成本总金额 |\n| 发票附件 | 必填,支持上传 |\n\n---", + "h2-site-statement-form": "## 1. 数据来源\n\n对账单明细取自 **车辆氢费明细**(共享 Store)中**同时满足**以下条件的记录:\n\n| 优先级 | 条件 | 说明 |\n|---|---|---|\n| 1 | 未绑定 `statementRecordId` | 尚未被历史对账单结算 |\n| 2 | 核对状态 = **已核对**(`verifyStatus = verified`) | **硬约束**:未核对一律不纳入 |\n| 3 | 对账状态 = **未对账**(`reconcileStatus = pending`) | 已对账由对账单提交产生,不再进入新账单 |\n| 4 | 加氢站名称 = 当前操作站点 | 仅本站 |\n| 5 | 加氢时间落在 **[账单开始日期, 账单结束日期]** | 用户所选账期(按日闭区间) |\n\n> 对账单明细**仅展示成本字段**(加氢量、成本单价、成本总价等),不展示加氢单价、加氢总价。\n\n### 1.1 为何必须「已核对」\n\n能源部在车辆氢费明细点击「完成核对」后,明细才视为业务已确认。站点侧生成对账单是结算动作,只能拉取已确认数据;未核对记录即使时间落在账期内,也**静默排除**,不出现在对账单明细与统计中。\n\n```text\n未核对 ──✕──→ 不可进对账单\n已核对 + 未对账 ──✓──→ 可进对账单(提交后变为已对账)\n已核对 + 已对账 ──✕──→ 不可再进下一张对账单\n```\n\n---\n\n---\n\n#### 生成对账单 · 业务逻辑\n\n1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点、且为**已核对且尚未结算(未对账)**的加氢记录。\n2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成并提交后,车辆氢费明细中对应记录将标记为**已对账**且无法修改。\n3. 确认后进入结算阶段,填写**收票日期**、**收票金额**及**发票附件**(对账日期在提交时由系统自动回写)。\n4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为**已对账**并绑定本对账单,不可再进入后续对账单。\n\n**阶段一 · 选期生成**\n\n- 日期区下方展示:**上次对账单结束时间**(无历史则「暂无」)\n- 默认开始日期建议 = 上次结束日 + 1 天\n- 点击「生成对账单」时弹出**二次确认**;确认后进入阶段二,日期锁定不可改\n- 无符合条件记录时提示调整日期(含:账期内仅有未核对、或均已结算等情况)\n\n**阶段二 · 结算提交**\n\n统计卡(明细表上方):\n\n| 指标 | 说明 |\n|---|---|\n| 加氢次数 | 本账单包含的**已核对**记录笔数 |\n| 加氢总量 | kg 合计 |\n| 成本总金额 | 成本总价合计 |\n\n明细表下方**必填**结算项:\n\n| 字段 | 规则 |\n|---|---|\n| 结算后加氢站预付款余额 | **只读**,= 当前预付余额 − 成本总金额;不足为负并标「已欠费」 |\n| 收票日期 | 必填 |\n| 收票金额 | 必填,默认填入成本总金额 |\n| 发票附件 | 必填,支持上传 |\n\n---", "h2-site-period-end-balance": "# 期末余额设置\n\n期末余额锚点、重算预付余额与变更记录。\n\n## 说明\n\n保存时按期末余额−支出+收入重算预付余额;变更记录只追加;期末时间不可晚于今天" }, "assetMap": {}, @@ -231,14 +231,14 @@ "type": "markdown", "id": "h2-site-doc-prd-full", "title": "PRD 完整文档", - "markdown": "# 加氢站管理 · 站点信息 — 产品需求文档(PRD)\n\n| 项 | 内容 |\n|---|---|\n| 文档版本 | v1.0 |\n| 模块名称 | 加氢站管理 → 站点信息 |\n| 所属系统 | ONE-OS Web 端 |\n| 目标读者 | 前端 / 后端 / 测试 / 业务产品对接人 |\n| 交互原型 | `/prototypes/oneos-web-h2-station-site` |\n| 关联原型 | [车辆氢费明细](/prototypes/vehicle-h2-fee-ledger)、[加氢记录](/prototypes/oneos-web-h2-station)、[加氢订单 H5](/prototypes/oneos-h5-h2-order) |\n| 文档状态 | 已对齐原型 |\n\n---\n\n## 1. 背景与目标\n\n### 1.1 业务背景\n\n加氢站是氢费成本结算的关键节点。运营侧需要维护站点主数据(签约、营业、成本价、预付余额),并在财务周期内按站点与加氢站完成对账、收票与付款闭环。\n\n### 1.2 本期目标\n\n- 站点台账的查询、新建、编辑、查看、删除与批量导入\n- 营业状态、成本价格、预付余额等运营配置\n- **按站点生成氢费对账单 → 填写收票信息 → 提交结算**,并与「车辆氢费明细」联动回写\n\n### 1.3 用户角色\n\n| 角色 | 典型诉求 |\n|---|---|\n| 加氢站运营 | 维护站点资料、营业与价格;查看加氢量与余额 |\n| 财务/结算 | 按周期生成对账单、登记收票、完成站点付款闭环 |\n| 管理员 | 批量导入站点、删除无效站点、配置系统账号 |\n\n### 1.4 非目标(本期不做)\n\n- 对账单审批流、ERP 自动过账\n- 发票 OCR 识别与验真\n- 加氢订单(独立 H5:`oneos-h5-h2-order`)、加氢记录(独立 Web:`oneos-web-h2-station`)本页不内嵌\n- 后端接口联调(原型使用 Mock + 共享 Store)\n\n---\n\n## 2. 信息架构\n\n```text\n站点信息\n├── 列表页\n│ ├── 筛选区(4 项)\n│ ├── KPI 卡片(6 张)\n│ ├── 工具栏\n│ └── 站点台账表 + 分页\n├── 新建 / 编辑(同页内嵌视图)\n│ ├── 基本信息\n│ ├── 系统账号绑定\n│ └── 供应商 / 付款信息\n└── 弹窗 / 抽屉\n ├── 查看详情\n ├── 营业状态 / 价格配置\n ├── 加氢量下钻 / 预付余额下钻\n ├── 预付余额预警 / 已欠费 KPI 站点列表 → 一键充值\n ├── 生成对账单(两阶段)\n └── 查看对账记录\n```\n\n---\n\n## 3. 列表与 KPI\n\n> 列表筛选与字段详见 `.spec/requirements-prd-list.md` \n> **预付余额预警 / 已欠费 KPI 点击交互**详见 `.spec/requirements-prd-kpi-balance-alert.md`\n\n- 筛选:名称、签约、地区、营业状态\n- KPI:全部 / 签约·普通 / **预付余额预警** / **已欠费** / 无加氢\n- 列表字段:名称地址、合作时间、营业、成本价、加氢次数/量、预付余额、联系方式、操作\n- 设计规范:与租赁合同管理一致的 vm 布局与 Inter 字体\n\n---\n\n## 4. 站点主数据\n\n### 4.1 新建站点\n\n同页内嵌视图:基本信息、系统账号绑定(可选)、供应商信息(新建或关联)。\n\n### 4.2 编辑 / 查看\n\n| 模式 | 交互 |\n|---|---|\n| 编辑 | 整页表单;系统账号仅 admin 可改 |\n| 查看 | 弹窗分块展示站点、账号、供应商、付款信息 |\n\n### 4.3 批量导入\n\n下载 CSV 模板 → 上传 → 解析预览 → 确认导入;站点名称不可重复。\n\n---\n\n## 5. 运营配置\n\n### 5.1 营业状态\n\n卡片式弹窗:营业状态、营业时间按钮组;非全天须配置时段;展示状态变更记录。\n\n### 5.2 价格配置\n\n配置成本价格(元/kg)与生效时间;到达生效时间后刷新列表「当前成本价格」;展示价格调整记录。\n\n**固定价格 · 适用客户规则:**\n\n- 默认对**全部客户**生效(作为站点默认价格规则)\n- **取价优先级**:第一权重为单站单客户价格配置(若该客户有专属配置则按单客户配置生效);第二权重为站点「全部客户」价格配置(无单客户配置时生效)\n\n#### 阶梯价格 · 生成逻辑\n\n1. 设置阶梯价格后,在对应**阶梯价格区间**内展示并应用该档**成本价**。\n2. 累计加氢量达到下一档阶梯时,自该次起按新档成本价计算;到达**阶梯量重置日期**后的新记录,按当前所处区间的**最新成本价**更新。\n3. **阶梯量重置日期**见价格配置表单内「阶梯量重置日期」;到达重置日后,累计加氢量**从零重新计数**,用于判断当前所处价格区间。\n4. **生效时间**自表单内「生效时间」起对新数据生效,**不追溯**此前已产生的数据;生效时间之前的历史记录,仍按当时已达的**最高阶梯价格**结算。\n\n### 5.3 期末余额设置\n\n> 完整规则见 [period-end-balance.md](./period-end-balance.md)\n\n与加氢站对账存在时间差时,登记**期末余额**与**期末时间**作为锚点:\n\n- **入口**:更多 → 期末余额设置\n- **计算**:`当前预付余额 = 期末余额 − 期末后支出 + 期末后收入`(仅保存时重算一次)\n- **约束**:期末时间不可晚于今天;变更记录只追加、不可删除\n- **下钻**:余额流水从期末锚点行起重新累加\n\n### 5.4 下钻分析\n\n- **加氢量下钻**:统计卡 + 明细表 + 导出,字段对齐车辆氢费明细\n- **预付余额下钻**:充值/加氢流水 + 趋势图 + 导出;若已配置期末余额,自期末时间锚点重算后续余额\n\n---\n\n## 6. 对账与结算(重点)\n\n> 详见 `.spec/requirements-prd-statement.md`\n\n与「车辆氢费明细」配合完成站点侧氢费结算闭环:\n\n1. 拉取已对账且未结算的记录\n2. 两阶段:选期生成 → 填收票提交\n3. 提交后更新预付余额、写对账历史、回写台账(对账日期、收票日期、已付款)\n\n---\n\n## 7. 数据与集成\n\n| 能力 | 实现 |\n|---|---|\n| 氢费明细 | `src/common/h2VehicleLedgerBridge.js` |\n| 对账回写 | `H2_STATION_STATEMENT_LEDGER_UPDATES` |\n| 页面实现 | `src/prototypes/oneos-web-h2-station-site/pages/03-站点信息.jsx` |\n| 独立入口 | `src/prototypes/oneos-web-h2-station-site/index.tsx` |\n\n---\n\n## 8. 验收标准\n\n### 8.1 列表页\n\n- [ ] 筛选与 KPI 六卡片联动正确\n- [ ] 高频/低频/无加氢口径与车辆氢费明细一致\n- [ ] 加氢量、预付余额下钻数据来自共享 Store\n- [ ] 布局与租赁合同 vm 规范一致\n\n### 8.2 对账流程\n\n- [ ] 仅已对账未结算记录可进入对账单\n- [ ] 两阶段交互与必填校验完整\n- [ ] 提交后回写车辆氢费明细可跨页验收\n\n### 8.3 期末余额设置\n\n- [ ] 更多菜单可打开期末余额设置;期末时间不可晚于今天\n- [ ] 保存后写回预付余额,变更记录只追加不可删\n- [ ] 余额下钻出现期末锚点且后续余额连续推算\n\n### 8.4 标注与文档\n\n- [ ] `@axhub/annotation` 已接入,关键区域有 `data-annotation-id`\n- [ ] 右侧工具栏目录可阅 PRD 全文与页面标注\n\n---\n\n## 9. 修订记录\n\n| 版本 | 日期 | 说明 |\n|---|---|---|\n| v1.0 | 2026-07-01 | 独立入口、vm 规范对齐、标注目录与 PRD 接入 |\n", + "markdown": "# 加氢站管理 · 站点信息 — 产品需求文档(PRD)\n\n| 项 | 内容 |\n|---|---|\n| 文档版本 | v1.0 |\n| 模块名称 | 加氢站管理 → 站点信息 |\n| 所属系统 | ONE-OS Web 端 |\n| 目标读者 | 前端 / 后端 / 测试 / 业务产品对接人 |\n| 交互原型 | `/prototypes/oneos-web-h2-station-site` |\n| 关联原型 | [车辆氢费明细](/prototypes/vehicle-h2-fee-ledger)、[加氢记录](/prototypes/oneos-web-h2-station)、[加氢订单 H5](/prototypes/oneos-h5-h2-order) |\n| 文档状态 | 已对齐原型 |\n\n---\n\n## 1. 背景与目标\n\n### 1.1 业务背景\n\n加氢站是氢费成本结算的关键节点。运营侧需要维护站点主数据(签约、营业、成本价、预付余额),并在财务周期内按站点与加氢站完成对账、收票与付款闭环。\n\n### 1.2 本期目标\n\n- 站点台账的查询、新建、编辑、查看、删除与批量导入\n- 营业状态、成本价格、预付余额等运营配置\n- **按站点生成氢费对账单 → 填写收票信息 → 提交结算**,并与「车辆氢费明细」联动回写\n\n### 1.3 用户角色\n\n| 角色 | 典型诉求 |\n|---|---|\n| 加氢站运营 | 维护站点资料、营业与价格;查看加氢量与余额 |\n| 财务/结算 | 按周期生成对账单、登记收票、完成站点付款闭环 |\n| 管理员 | 批量导入站点、删除无效站点、配置系统账号 |\n\n### 1.4 非目标(本期不做)\n\n- 对账单审批流、ERP 自动过账\n- 发票 OCR 识别与验真\n- 加氢订单(独立 H5:`oneos-h5-h2-order`)、加氢记录(独立 Web:`oneos-web-h2-station`)本页不内嵌\n- 后端接口联调(原型使用 Mock + 共享 Store)\n\n---\n\n## 2. 信息架构\n\n```text\n站点信息\n├── 列表页\n│ ├── 筛选区(4 项)\n│ ├── KPI 卡片(6 张)\n│ ├── 工具栏\n│ └── 站点台账表 + 分页\n├── 新建 / 编辑(同页内嵌视图)\n│ ├── 基本信息\n│ ├── 系统账号绑定\n│ └── 供应商 / 付款信息\n└── 弹窗 / 抽屉\n ├── 查看详情\n ├── 营业状态 / 价格配置\n ├── 加氢量下钻 / 预付余额下钻\n ├── 预付余额预警 / 已欠费 KPI 站点列表 → 一键充值\n ├── 生成对账单(两阶段)\n └── 查看对账记录\n```\n\n---\n\n## 3. 列表与 KPI\n\n> 列表筛选与字段详见 `.spec/requirements-prd-list.md` \n> **预付余额预警 / 已欠费 KPI 点击交互**详见 `.spec/requirements-prd-kpi-balance-alert.md`\n\n- 筛选:名称、签约、地区、营业状态\n- KPI:全部 / 签约·普通 / **预付余额预警** / **已欠费** / 无加氢\n- 列表字段:名称地址、合作时间、营业、成本价、加氢次数/量、预付余额、联系方式、操作\n- 设计规范:与租赁合同管理一致的 vm 布局与 Inter 字体\n\n---\n\n## 4. 站点主数据\n\n### 4.1 新建站点\n\n同页内嵌视图:基本信息、系统账号绑定(可选)、供应商信息(新建或关联)。\n\n### 4.2 编辑 / 查看\n\n| 模式 | 交互 |\n|---|---|\n| 编辑 | 整页表单;系统账号仅 admin 可改 |\n| 查看 | 弹窗分块展示站点、账号、供应商、付款信息 |\n\n### 4.3 批量导入\n\n下载 CSV 模板 → 上传 → 解析预览 → 确认导入;站点名称不可重复。\n\n---\n\n## 5. 运营配置\n\n### 5.1 营业状态\n\n卡片式弹窗:营业状态、营业时间按钮组;非全天须配置时段;展示状态变更记录。\n\n### 5.2 价格配置\n\n配置成本价格(元/kg)与生效时间;到达生效时间后刷新列表「当前成本价格」;展示价格调整记录。\n\n**固定价格 · 适用客户规则:**\n\n- 默认对**全部客户**生效(作为站点默认价格规则)\n- **取价优先级**:第一权重为单站单客户价格配置(若该客户有专属配置则按单客户配置生效);第二权重为站点「全部客户」价格配置(无单客户配置时生效)\n\n#### 阶梯价格 · 生成逻辑\n\n1. 设置阶梯价格后,在对应**阶梯价格区间**内展示并应用该档**成本价**。\n2. 累计加氢量达到下一档阶梯时,自该次起按新档成本价计算;到达**阶梯量重置日期**后的新记录,按当前所处区间的**最新成本价**更新。\n3. **阶梯量重置日期**见价格配置表单内「阶梯量重置日期」;到达重置日后,累计加氢量**从零重新计数**,用于判断当前所处价格区间。\n4. **生效时间**自表单内「生效时间」起对新数据生效,**不追溯**此前已产生的数据;生效时间之前的历史记录,仍按当时已达的**最高阶梯价格**结算。\n\n### 5.3 期末余额设置\n\n> 完整规则见 [period-end-balance.md](./period-end-balance.md)\n\n与加氢站对账存在时间差时,登记**期末余额**与**期末时间**作为锚点:\n\n- **入口**:更多 → 期末余额设置\n- **计算**:`当前预付余额 = 期末余额 − 期末后支出 + 期末后收入`(仅保存时重算一次)\n- **约束**:期末时间不可晚于今天;变更记录只追加、不可删除\n- **下钻**:余额流水从期末锚点行起重新累加\n\n### 5.4 下钻分析\n\n- **加氢量下钻**:统计卡 + 明细表 + 导出,字段对齐车辆氢费明细\n- **预付余额下钻**:充值/加氢流水 + 趋势图 + 导出;若已配置期末余额,自期末时间锚点重算后续余额\n\n---\n\n## 6. 对账与结算(重点)\n\n> 详见 [requirements-prd-statement.md](./requirements-prd-statement.md);纳入规则全文见 [statement-verified-filter.md](./statement-verified-filter.md)\n\n与「车辆氢费明细」配合完成站点侧氢费结算闭环:\n\n| 步骤 | 说明 |\n|---|---|\n| 1. 拉取明细 | 按账期从车辆氢费明细取 **已核对** ∧ **未对账** ∧ 未结算 ∧ 本站 的记录;**未核对不纳入** |\n| 2. 两阶段 | 选期生成 → 填收票提交 |\n| 3. 提交回写 | 更新预付余额、写对账历史;台账变为 **已对账**(对账日期、收票日期、已付款) |\n\n> **核对 ≠ 对账**:核对由车辆氢费明细「完成核对」产生;对账仅由本页「提交对账单」回写。\n\n---\n\n## 7. 数据与集成\n\n| 能力 | 实现 |\n|---|---|\n| 氢费明细 | `src/common/h2VehicleLedgerBridge.js` |\n| 对账回写 | `H2_STATION_STATEMENT_LEDGER_UPDATES` |\n| 页面实现 | `src/prototypes/oneos-web-h2-station-site/pages/03-站点信息.jsx` |\n| 独立入口 | `src/prototypes/oneos-web-h2-station-site/index.tsx` |\n\n---\n\n## 8. 验收标准\n\n### 8.1 列表页\n\n- [ ] 筛选与 KPI 六卡片联动正确\n- [ ] 高频/低频/无加氢口径与车辆氢费明细一致\n- [ ] 加氢量、预付余额下钻数据来自共享 Store\n- [ ] 布局与租赁合同 vm 规范一致\n\n### 8.2 对账流程\n\n- [ ] 仅 **已核对** 且未对账、未结算的记录可进入对账单;未核对明细即使在账期内也不出现\n- [ ] 两阶段交互与必填校验完整\n- [ ] 提交后回写车辆氢费明细为 **已对账**,可跨页验收\n\n### 8.3 期末余额设置\n\n- [ ] 更多菜单可打开期末余额设置;期末时间不可晚于今天\n- [ ] 保存后写回预付余额,变更记录只追加不可删\n- [ ] 余额下钻出现期末锚点且后续余额连续推算\n\n### 8.4 标注与文档\n\n- [ ] `@axhub/annotation` 已接入,关键区域有 `data-annotation-id`\n- [ ] 右侧工具栏目录可阅 PRD 全文与页面标注\n\n---\n\n## 9. 修订记录\n\n| 版本 | 日期 | 说明 |\n|---|---|---|\n| v1.0 | 2026-07-01 | 独立入口、vm 规范对齐、标注目录与 PRD 接入 |\n", "markdownPath": "src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd.md" }, { "type": "markdown", "id": "h2-site-doc-prd-list", "title": "列表页 PRD", - "markdown": "# 加氢站管理 · 站点信息 — 列表页 PRD\n\n| 项 | 说明 |\n|---|---|\n| 模块名称 | 加氢站管理 → 站点信息 |\n| 所属系统 | ONE-OS Web 端 |\n| 目标用户 | 加氢站运营、财务结算、平台管理员 |\n| 核心任务 | 查询站点台账、维护主数据、查看运营指标、发起对账与充值 |\n| 交互原型 | `/prototypes/oneos-web-h2-station-site` |\n| 设计规范 | 与租赁合同管理一致的 vm 布局(筛选 / KPI / 表格 / 分页) |\n\n---\n\n## 1. 页面结构\n\n用户进入「加氢站管理 → 站点信息」后,列表页自上而下为:\n\n1. **筛选区** — 名称、签约、地区、营业状态\n2. **KPI 分类** — 全部 / 签约·普通 / 预付余额预警 / 已欠费 / 无加氢\n3. **工具栏** — 全站余额提醒、批量导入、发起充值单、新建站点\n4. **站点列表** — 主数据 + 运营指标 + 操作列\n5. **分页栏** — 每页 5/10/20/50 条\n\n---\n\n## 2. 筛选区\n\n与租赁合同等模块一致的 **vm 筛选卡片** 布局:标题「筛选条件」+ 4 列栅格(标签在上、控件在下);底部分隔线 + 右对齐「重置」「查询」。\n\n| 字段 | 控件 | 说明 |\n|---|---|---|\n| 加氢站名称 | 输入框 | 模糊匹配,支持回车查询 |\n| 是否签约 | 下拉 | 签约站点 / 普通站点 |\n| 地区(省-市) | 级联 | 省、市两级,可只选省 |\n| 营业状态 | 下拉 | 营业中 / 暂停营业 / 停止营业 |\n\n**交互**:\n\n- **查询**:写入「已应用筛选」,列表与 KPI 统计联动,回到第 1 页\n- **重置**:清空筛选条件并刷新列表\n\n---\n\n## 3. KPI 统计卡片\n\n与租赁合同一致的 **vm-kpi-card**:左侧图标 + 标题 + 数值,右上角 `?` 悬停说明,选中态绿色描边。\n\n| 卡片 | 口径 |\n|---|---|\n| 全部加氢站 | 列表全部站点 |\n| 签约站点 | 已签约,点击快捷筛选 |\n| 普通站点 | 未签约,点击快捷筛选 |\n| 预付余额预警站点 | 已设提醒阈值,预付余额 ≥ 0 且低于阈值(不含已欠费);点击打开站点列表弹窗,可一键发起充值单 |\n| 已欠费站点 | 预付余额 < 0;点击打开站点列表弹窗,可一键发起充值单 |\n| 无加氢站点 | 加氢次数 = 0 |\n\n加氢次数来自「车辆氢费明细」共享 Store,按站点名称聚合。「无加氢」与签约 KPI 与筛选区互斥切换。\n\n> **预付余额预警 / 已欠费** 的完整点击交互见 [预付余额 KPI 交互说明](./requirements-prd-kpi-balance-alert.md)。\n\n### 3.1 预付余额预警 / 已欠费 — 点击交互(摘要)\n\n这两张 KPI 与「全部 / 无加氢」不同:**点击后不筛选主列表**,而是打开**站点列表弹窗**。\n\n| 步骤 | 用户操作 | 系统反馈 |\n|---|---|---|\n| 1 | 点击「预付余额预警站点」或「已欠费站点」 | 按口径汇总全量台账站点,打开居中弹窗;对应 KPI 卡片保持选中高亮 |\n| 2 | 查看弹窗内站点表 | 列与主列表一致(无操作列);展示站点数;预付余额负值标红「已欠费」 |\n| 3 | 点击「一键发起充值单」 | 关闭弹窗 → 打开「发起充值单」→ 为每个站点预填名称、当前余额、收款信息;付款金额由用户填写 |\n| 4 | 填写金额并提交 | 与工具栏「发起充值单」相同校验;成功后走付款流程(原型提示) |\n| — | 点击「关闭」 | 关闭弹窗,KPI 选中态取消 |\n\n**口径提醒**:预警 = 已设阈值且余额 ≥ 0 且低于阈值;欠费 = 余额 < 0。已欠费站点不计入预警。\n\n**阈值配置入口**:工具栏「全站余额提醒设置」、行内更多「余额提醒设置」。\n\n---\n\n## 4. 列表工具栏\n\n| 按钮 | 行为 |\n|---|---|\n| 全站余额提醒设置 | 配置全局预付余额预警阈值 |\n| 批量导入 | 下载模板 → 上传 CSV/Excel → 预览确认导入 |\n| 发起充值单 | 为站点发起预付充值流程(原型演示) |\n| 新建站点 | 进入同页内嵌新建视图 |\n\n---\n\n## 5. 列表字段说明\n\n| 字段 | 说明 |\n|---|---|\n| 加氢站名称 | 含签约标签;下一行展示省市区 + 详细地址 |\n| 合作时间 | 未签约可空 |\n| 营业状态 / 营业时间 | 列表只读;在「更多 → 营业状态」维护 |\n| 当前成本价格 | 元/kg;受价格配置生效时间驱动;多价时展示警示 |\n| 加氢次数 / 加氢量 | 加氢量可点击下钻;表头支持排序 |\n| 预付余额 | 可点击下钻流水;负值标红并显示「已欠费」 |\n| 联系方式 | 联系人 + 电话 |\n| 操作 | 查看 + 更多菜单 |\n\n**更多菜单**:编辑、删除、营业状态、价格配置、余额提醒、期末余额设置、生成对账单、查看对账记录等(按状态与权限显隐)。\n\n**分页**:默认 10 条,可选 5/10/20/50。\n\n---\n\n## 6. 数据来源\n\n- 氢费/加氢明细:统一来自 `src/common/h2VehicleLedgerBridge.js`,与「车辆氢费明细」共享 Store\n- 先打开「车辆氢费明细」时台账全量同步;仅打开加氢站模块时使用 canonical seed\n- 对账单提交经 `H2_STATION_STATEMENT_LEDGER_UPDATES` 回写车辆氢费明细\n\n---\n\n## 7. 双入口说明\n\n| 入口 | 路径 |\n|---|---|\n| 独立原型(本页) | OneOS → 加氢站管理 → 站点信息 |\n| 加氢订单 | OneOS → 加氢站管理 → 加氢订单(H5) |\n| 加氢记录 | OneOS → 加氢站管理 → 加氢记录(Web) |\n", + "markdown": "# 加氢站管理 · 站点信息 — 列表页 PRD\n\n| 项 | 说明 |\n|---|---|\n| 模块名称 | 加氢站管理 → 站点信息 |\n| 所属系统 | ONE-OS Web 端 |\n| 目标用户 | 加氢站运营、财务结算、平台管理员 |\n| 核心任务 | 查询站点台账、维护主数据、查看运营指标、发起对账与充值 |\n| 交互原型 | `/prototypes/oneos-web-h2-station-site` |\n| 设计规范 | 与租赁合同管理一致的 vm 布局(筛选 / KPI / 表格 / 分页) |\n\n---\n\n## 1. 页面结构\n\n用户进入「加氢站管理 → 站点信息」后,列表页自上而下为:\n\n1. **筛选区** — 名称、签约、地区、营业状态\n2. **KPI 分类** — 全部 / 签约·普通 / 预付余额预警 / 已欠费 / 无加氢\n3. **工具栏** — 全站余额提醒、批量导入、加氢机品牌管理、发起充值单、新建站点\n4. **站点列表** — 主数据 + 运营指标 + 操作列\n5. **分页栏** — 每页 5/10/20/50 条\n\n---\n\n## 2. 筛选区\n\n与租赁合同等模块一致的 **vm 筛选卡片** 布局:标题「筛选条件」+ 4 列栅格(标签在上、控件在下);底部分隔线 + 右对齐「重置」「查询」。\n\n| 字段 | 控件 | 说明 |\n|---|---|---|\n| 加氢站名称 | 输入框 | 模糊匹配,支持回车查询 |\n| 是否签约 | 下拉 | 签约站点 / 普通站点 |\n| 地区(省-市) | 级联 | 省、市两级,可只选省 |\n| 营业状态 | 下拉 | 营业中 / 暂停营业 / 停止营业 |\n\n**交互**:\n\n- **查询**:写入「已应用筛选」,列表与 KPI 统计联动,回到第 1 页\n- **重置**:清空筛选条件并刷新列表\n\n---\n\n## 3. KPI 统计卡片\n\n与租赁合同一致的 **vm-kpi-card**:左侧图标 + 标题 + 数值,右上角 `?` 悬停说明,选中态绿色描边。\n\n| 卡片 | 口径 |\n|---|---|\n| 全部加氢站 | 列表全部站点 |\n| 签约站点 | 已签约,点击快捷筛选 |\n| 普通站点 | 未签约,点击快捷筛选 |\n| 预付余额预警站点 | 已设提醒阈值,预付余额 ≥ 0 且低于阈值(不含已欠费);点击打开站点列表弹窗,可一键发起充值单 |\n| 已欠费站点 | 预付余额 < 0;点击打开站点列表弹窗,可一键发起充值单 |\n| 无加氢站点 | 加氢次数 = 0 |\n\n加氢次数来自「车辆氢费明细」共享 Store,按站点名称聚合。「无加氢」与签约 KPI 与筛选区互斥切换。\n\n> **预付余额预警 / 已欠费** 的完整点击交互见 [预付余额 KPI 交互说明](./requirements-prd-kpi-balance-alert.md)。\n\n### 3.1 预付余额预警 / 已欠费 — 点击交互(摘要)\n\n这两张 KPI 与「全部 / 无加氢」不同:**点击后不筛选主列表**,而是打开**站点列表弹窗**。\n\n| 步骤 | 用户操作 | 系统反馈 |\n|---|---|---|\n| 1 | 点击「预付余额预警站点」或「已欠费站点」 | 按口径汇总全量台账站点,打开居中弹窗;对应 KPI 卡片保持选中高亮 |\n| 2 | 查看弹窗内站点表 | 列与主列表一致(无操作列);展示站点数;预付余额负值标红「已欠费」 |\n| 3 | 点击「一键发起充值单」 | 关闭弹窗 → 打开「发起充值单」→ 为每个站点预填名称、当前余额、收款信息;付款金额由用户填写 |\n| 4 | 填写金额并提交 | 与工具栏「发起充值单」相同校验;成功后走付款流程(原型提示) |\n| — | 点击「关闭」 | 关闭弹窗,KPI 选中态取消 |\n\n**口径提醒**:预警 = 已设阈值且余额 ≥ 0 且低于阈值;欠费 = 余额 < 0。已欠费站点不计入预警。\n\n**阈值配置入口**:工具栏「全站余额提醒设置」、行内更多「余额提醒设置」。\n\n---\n\n## 4. 列表工具栏\n\n| 按钮 | 行为 |\n|---|---|\n| 全站余额提醒设置 | 配置全局预付余额预警阈值 |\n| 批量导入 | 下载模板 → 上传 CSV/Excel → 预览确认导入 |\n| 加氢机品牌管理 | 维护品牌与型号,供 H5 面板 OCR 参考(见 `.spec/dispenser-brand.md`) |\n| 发起充值单 | 为站点发起预付充值流程(原型演示) |\n| 新建站点 | 进入同页内嵌新建视图 |\n\n---\n\n## 5. 列表字段说明\n\n| 字段 | 说明 |\n|---|---|\n| 加氢站名称 | 含签约标签;下一行展示省市区 + 详细地址 |\n| 合作时间 | 未签约可空 |\n| 营业状态 / 营业时间 | 列表只读;在「更多 → 营业状态」维护 |\n| 当前成本价格 | 元/kg;受价格配置生效时间驱动;多价时展示警示 |\n| 加氢次数 / 加氢量 | 加氢量可点击下钻;表头支持排序 |\n| 预付余额 | 可点击下钻流水;负值标红并显示「已欠费」 |\n| 联系方式 | 联系人 + 电话 |\n| 操作 | 查看 + 更多菜单 |\n\n**更多菜单**:编辑、删除、营业状态、价格配置、余额提醒、期末余额设置、生成对账单、查看对账记录等(按状态与权限显隐)。\n\n**分页**:默认 10 条,可选 5/10/20/50。\n\n---\n\n## 6. 数据来源\n\n- 氢费/加氢明细:统一来自 `src/common/h2VehicleLedgerBridge.js`,与「车辆氢费明细」共享 Store\n- 先打开「车辆氢费明细」时台账全量同步;仅打开加氢站模块时使用 canonical seed\n- 对账单提交经 `H2_STATION_STATEMENT_LEDGER_UPDATES` 回写车辆氢费明细\n\n---\n\n## 7. 双入口说明\n\n| 入口 | 路径 |\n|---|---|\n| 独立原型(本页) | OneOS → 加氢站管理 → 站点信息 |\n| 加氢订单 | OneOS → 加氢站管理 → 加氢订单(H5) |\n| 加氢记录 | OneOS → 加氢站管理 → 加氢记录(Web) |\n", "markdownPath": "src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-list.md" }, { @@ -252,9 +252,16 @@ "type": "markdown", "id": "h2-site-doc-prd-statement", "title": "对账与结算 PRD", - "markdown": "# 加氢站管理 · 站点信息 — 对账与结算 PRD\n\n> 本模块与「车辆氢费明细」配合完成**站点侧氢费结算闭环**。\n\n---\n\n## 1. 数据来源\n\n对账单明细取自 **车辆氢费明细** 中同时满足以下条件的记录:\n\n1. 对账状态 = **已对账**(台账已完成「完成对账」)\n2. **尚未**被本站点历史对账单结算过(未绑定 `statementRecordId`)\n3. 加氢时间落在用户选择的 **[账单开始日期, 账单结束日期]** 内\n4. 加氢站名称与当前操作站点一致\n\n> 对账单明细**仅展示成本字段**(加氢量、成本单价、成本总价等),不展示加氢单价、加氢总价。\n\n---\n\n## 2. 两阶段交互\n\n#### 生成对账单 · 业务逻辑\n\n1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点的加氢记录(已对账且尚未结算)。\n2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成对账单后,车辆氢费明细中对应记录将自动标记为已对账且无法修改。\n3. 确认后进入结算阶段,填写**收票日期**、**收票金额**及**发票附件**(对账日期在提交时由系统自动回写)。\n4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为已对账/已结算状态,不可再修改。\n\n**阶段一 · 选期生成**\n\n- 日期区下方展示:**上次对账单结束时间**(无历史则「暂无」)\n- 默认开始日期建议 = 上次结束日 + 1 天\n- 点击「生成对账单」时弹出**二次确认**:提示生成后车辆氢费明细对应记录将标记为已对账且无法修改;确认后进入阶段二,日期锁定不可改\n- 无符合条件记录时提示调整日期\n\n**阶段二 · 结算提交**\n\n统计卡(明细表上方):\n\n| 指标 | 说明 |\n|---|---|\n| 加氢次数 | 本账单包含的已对账记录笔数 |\n| 加氢总量 | kg 合计 |\n| 成本总金额 | 成本总价合计 |\n\n明细表下方**必填**结算项:\n\n| 字段 | 规则 |\n|---|---|\n| 结算后加氢站预付款余额 | **只读**,= 当前预付余额 − 成本总金额;不足为负并标「已欠费」 |\n| 收票日期 | 必填 |\n| 收票金额 | 必填,默认填入成本总金额 |\n| 发票附件 | 必填,支持上传 |\n\n---\n\n## 3. 提交后的系统行为\n\n提交成功后需**原子性**完成:\n\n1. 写入对账历史(供「查看对账记录」查询)\n2. 扣减站点预付余额\n3. 标记台账记录已结算(绑定 `statementRecordId`)\n4. **回写车辆氢费明细**:\n\n| 车辆氢费明细字段 | 回写值 |\n|---|---|\n| 对账日期 | 操作完成时间 |\n| 收票日期 | 操作完成日期 |\n| 加氢站付款状态 | 已付款 |\n\n原型通过 `H2_STATION_STATEMENT_LEDGER_UPDATES` / `h2VehicleLedgerBridge` 模拟跨页回写。\n\n---\n\n## 4. 查看对账记录\n\n入口:列表操作列 → 更多 → **查看对账记录**\n\n历史列表:对账日期、对账人、账单区间、加氢次数、加氢金额、结算后余额、查看明细。\n\n查看明细:账单区间、统计三卡、收票信息、发票附件、成本明细表。\n\n---\n\n## 5. 校验与异常\n\n| 场景 | 处理 |\n|---|---|\n| 日期未填 / 开始晚于结束 | 阻止生成 |\n| 区间内无已对账未结算记录 | 阻止生成,提示调整日期 |\n| 点击「生成对账单」未确认 | 不进入结算阶段 |\n| 收票日期/金额/附件未填 | 阻止提交 |\n| 收票金额 ≤ 0 | 阻止提交 |\n| 预付余额结算后为负 | 允许提交,标「已欠费」 |\n\n---\n\n## 6. 研发要点\n\n1. **对账单幂等**:同一笔已对账记录只能进入一次成功提交的对账单\n2. **上次结束时间**:取该站点已成功提交对账单的最大 `endDate`\n3. **余额计算**:`balanceAfter = prepaidBalance - sum(costTotal)`\n4. **跨模块同步**:生产对接统一台账;原型使用 Bridge Store\n5. **明细字段范围**:对账弹窗不展示客户侧加氢单价/总价\n", + "markdown": "# 加氢站管理 · 站点信息 — 对账与结算 PRD\n\n> 本模块与「车辆氢费明细」配合完成**站点侧氢费结算闭环**。 \n> **重要**:生成对账单时,账期筛选出的明细**必须来自车辆氢费明细中「已核对」的记录**;未核对明细不得进入对账单。完整判定见 [statement-verified-filter.md](./statement-verified-filter.md);台账双状态见车辆氢费明细 `.spec/verify-reconcile.md`。\n\n---\n\n## 1. 数据来源\n\n对账单明细取自 **车辆氢费明细**(共享 Store)中**同时满足**以下条件的记录:\n\n| 优先级 | 条件 | 说明 |\n|---|---|---|\n| 1 | 未绑定 `statementRecordId` | 尚未被历史对账单结算 |\n| 2 | 核对状态 = **已核对**(`verifyStatus = verified`) | **硬约束**:未核对一律不纳入 |\n| 3 | 对账状态 = **未对账**(`reconcileStatus = pending`) | 已对账由对账单提交产生,不再进入新账单 |\n| 4 | 加氢站名称 = 当前操作站点 | 仅本站 |\n| 5 | 加氢时间落在 **[账单开始日期, 账单结束日期]** | 用户所选账期(按日闭区间) |\n\n> 对账单明细**仅展示成本字段**(加氢量、成本单价、成本总价等),不展示加氢单价、加氢总价。\n\n### 1.1 为何必须「已核对」\n\n能源部在车辆氢费明细点击「完成核对」后,明细才视为业务已确认。站点侧生成对账单是结算动作,只能拉取已确认数据;未核对记录即使时间落在账期内,也**静默排除**,不出现在对账单明细与统计中。\n\n```text\n未核对 ──✕──→ 不可进对账单\n已核对 + 未对账 ──✓──→ 可进对账单(提交后变为已对账)\n已核对 + 已对账 ──✕──→ 不可再进下一张对账单\n```\n\n---\n\n## 2. 两阶段交互\n\n#### 生成对账单 · 业务逻辑\n\n1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点、且为**已核对且尚未结算(未对账)**的加氢记录。\n2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成并提交后,车辆氢费明细中对应记录将标记为**已对账**且无法修改。\n3. 确认后进入结算阶段,填写**收票日期**、**收票金额**及**发票附件**(对账日期在提交时由系统自动回写)。\n4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为**已对账**并绑定本对账单,不可再进入后续对账单。\n\n**阶段一 · 选期生成**\n\n- 日期区下方展示:**上次对账单结束时间**(无历史则「暂无」)\n- 默认开始日期建议 = 上次结束日 + 1 天\n- 点击「生成对账单」时弹出**二次确认**;确认后进入阶段二,日期锁定不可改\n- 无符合条件记录时提示调整日期(含:账期内仅有未核对、或均已结算等情况)\n\n**阶段二 · 结算提交**\n\n统计卡(明细表上方):\n\n| 指标 | 说明 |\n|---|---|\n| 加氢次数 | 本账单包含的**已核对**记录笔数 |\n| 加氢总量 | kg 合计 |\n| 成本总金额 | 成本总价合计 |\n\n明细表下方**必填**结算项:\n\n| 字段 | 规则 |\n|---|---|\n| 结算后加氢站预付款余额 | **只读**,= 当前预付余额 − 成本总金额;不足为负并标「已欠费」 |\n| 收票日期 | 必填 |\n| 收票金额 | 必填,默认填入成本总金额 |\n| 发票附件 | 必填,支持上传 |\n\n---\n\n## 3. 提交后的系统行为\n\n提交成功后需**原子性**完成:\n\n1. 写入对账历史(供「查看对账记录」查询)\n2. 扣减站点预付余额\n3. 标记台账记录已结算(绑定 `statementRecordId`)\n4. **回写车辆氢费明细**:\n\n| 车辆氢费明细字段 | 回写值 |\n|---|---|\n| 对账状态 | **已对账**(`reconcileStatus = reconciled`) |\n| 对账日期 | 操作完成时间 |\n| 收票日期 | 操作完成日期 |\n| 加氢站付款状态 | 已付款 |\n\n原型通过 `H2_STATION_STATEMENT_LEDGER_UPDATES` / `h2VehicleLedgerBridge` 模拟跨页回写。\n\n> 「完成核对」只改变核对状态,**不会**把记录写成已对账;已对账仅由本页对账单提交产生。\n\n---\n\n## 4. 查看对账记录\n\n入口:列表操作列 → 更多 → **查看对账记录**\n\n历史列表:对账日期、对账人、账单区间、加氢次数、加氢金额、结算后余额、查看明细。\n\n查看明细:账单区间、统计三卡、收票信息、发票附件、成本明细表。\n\n---\n\n## 5. 校验与异常\n\n| 场景 | 处理 |\n|---|---|\n| 日期未填 / 开始晚于结束 | 阻止生成 |\n| 区间内无「已核对且未对账未结算」记录 | 阻止生成,提示调整日期(或先完成核对) |\n| 区间内存在未核对记录 | **不纳入**对账单;不单独弹窗枚举(静默排除) |\n| 点击「生成对账单」未确认 | 不进入结算阶段 |\n| 收票日期/金额/附件未填 | 阻止提交 |\n| 收票金额 ≤ 0 | 阻止提交 |\n| 预付余额结算后为负 | 允许提交,标「已欠费」 |\n\n---\n\n## 6. 研发要点\n\n1. **准入**:`verifyStatus === verified` 为硬条件;勿再用「已对账」作为生成筛选条件\n2. **对账单幂等**:同一笔明细只能进入一次成功提交的对账单(`statementRecordId` 约束)\n3. **上次结束时间**:取该站点已成功提交对账单的最大 `endDate`\n4. **余额计算**:`balanceAfter = prepaidBalance - sum(costTotal)`\n5. **跨模块同步**:生产对接统一台账;原型使用 Bridge Store\n6. **明细字段范围**:对账弹窗不展示客户侧加氢单价/总价\n7. **规格全文**:[statement-verified-filter.md](./statement-verified-filter.md)\n", "markdownPath": "src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-statement.md" }, + { + "type": "markdown", + "id": "h2-site-doc-statement-verified-filter", + "title": "对账单纳入规则(已核对)", + "markdown": "# 站点信息 · 生成对账单 — 明细纳入规则(已核对)\n\n| 项 | 说明 |\n|---|---|\n| 模块 | 加氢站管理 → 站点信息 → 生成对账单 |\n| 交互原型 | `/prototypes/oneos-web-h2-station-site` |\n| 对照台账 | [车辆氢费明细 · 核对 vs 对账](/prototypes/vehicle-h2-fee-ledger)(`.spec/verify-reconcile.md`) |\n| 实现 | `h2GetAvailableStatementLedgerRows`(`pages/03-站点信息.jsx`) |\n| 数据源 | `src/common/h2VehicleLedgerBridge.js` 共享 Store(原型本地种子,**未接真实 API**) |\n\n---\n\n## 1. 业务目的\n\n生成对账单时,按账单起止日期从**车辆氢费明细**筛选本站加氢记录。 \n**只纳入已完成「核对」的明细**;**未核对**记录即使加氢时间落在账期内,也**不得**出现在对账单中。\n\n> 这是跨模块硬约束:未核对数据尚未经能源部确认,不能进入站点结算。\n\n---\n\n## 2. 核对 vs 对账(不得混用)\n\n| 概念 | 字段 | 用户可见 | 谁触发 | 与对账单关系 |\n|---|---|---|---|---|\n| **核对** | `verifyStatus` = `verified` / `unverified` | 已核对 / 未核对 | 车辆氢费明细 · **完成核对** | **生成对账单的准入条件** |\n| **对账** | `reconcileStatus` = `pending` / `reconciled` | 未对账 / 已对账 | 本页 · **提交对账单** 回写 | 提交后变为已对账;已对账不再进入下一张 |\n\n```text\n加氢记录上报 → 未核对 + 未对账\n ↓ 车辆氢费明细「完成核对」\n 已核对 + 未对账 ←── 仅此状态可被「生成对账单」拉取\n ↓ 站点「提交对账单」\n 已核对 + 已对账(绑定 statementRecordId)\n```\n\n---\n\n## 3. 判定顺序(须全部满足,命中否即排除)\n\n按下列优先级过滤;任一不满足则**不纳入**对账单:\n\n| 优先级 | 条件 | 说明 |\n|---|---|---|\n| 1 | 无 `statementRecordId` | 尚未被历史对账单结算绑定 |\n| 2 | `verifyStatus === 'verified'`(已核对) | **核心**:未核对一律排除 |\n| 3 | `reconcileStatus === 'pending'`(未对账) | 已对账不再进入新账单 |\n| 4 | `stationName` = 当前操作站点 | 仅本站明细 |\n| 5 | 加氢时间 ∈ **[账单开始日期, 账单结束日期]**(按日闭区间) | 用户所选账期 |\n\n**前置条件(不进入本筛选):**\n\n- 未保存草稿(台账 `reconcileStatus = draft`)\n- 账单起止日期未填或开始晚于结束(交互层先拦截,不调用本筛选)\n\n---\n\n## 4. 用户可见结果\n\n| 场景 | 结果 |\n|---|---|\n| 账期内仅有未核对明细 | 无可用记录;提示调整日期或先去车辆氢费明细完成核对 |\n| 账期内有已核对未对账明细 | 进入对账单明细表与统计(次数 / 加氢量 / 成本总金额) |\n| 同账期内混有已核对与未核对 | **只展示已核对**;未核对静默排除,不计入统计 |\n| 已核对但已对账 / 已绑定对账单 | 排除 |\n\n---\n\n## 5. 与代码映射\n\n| 规则 | 代码 |\n|---|---|\n| 筛选入口 | `h2GetAvailableStatementLedgerRows(store, stationName, startDate, endDate)` |\n| 已核对 | `verifyStatus === 'verified'`(缺省按 `unverified`) |\n| 未对账 | `reconcileStatus === 'pending'`(且 ≠ `reconciled`) |\n| 账期 | `h2ParseDateTimeMs(hydrogenTime)` 落在起止日闭区间 |\n\n---\n\n## 6. 验收要点\n\n- [ ] 未核对明细不会出现在对账单明细表与统计中\n- [ ] 仅「已核对 ∧ 未对账 ∧ 未结算 ∧ 本站 ∧ 账期内」可生成\n- [ ] 文案与 PRD 使用「已核对 / 未核对」,不与「已对账 / 未对账」混称\n", + "markdownPath": "src/prototypes/oneos-web-h2-station-site/.spec/statement-verified-filter.md" + }, { "type": "markdown", "id": "h2-site-doc-prd-period-end", @@ -262,6 +269,13 @@ "markdown": "# 期末余额设置 · 需求说明\n\n| 项 | 内容 |\n|---|---|\n| 模块 | 加氢站管理 → 站点信息 |\n| 功能名称 | 期末余额设置 |\n| 交互原型 | `/prototypes/oneos-web-h2-station-site` |\n| 关联功能 | 预付余额列表展示、预付余额下钻、车辆氢费明细、生成对账单 |\n| 文档状态 | 已对齐原型 |\n\n---\n\n## 1. 需求背景\n\n运营与加氢站(如嘉兴站)对账后,账面「期末余额」与系统内车辆氢费明细之间常有**时间差**:对账时点之后,站点仍可能继续产生加氢支出或充值收入,导致列表「预付余额」无法直接等于对账结果。\n\n需要提供能力:在站点侧登记一次对账时的**期末余额**与**期末时间**,并以此为锚点推算当前可用余额。\n\n---\n\n## 2. 需求目标\n\n1. 支持按站点登记期末余额、期末时间。\n2. 保存时按统一公式重算「当前预付余额」并写回列表。\n3. 预付余额下钻流水以期末时间为锚点,重新展示余额滚动。\n4. 保留完整变更记录,便于追溯。\n\n---\n\n## 3. 用户与入口\n\n| 角色 | 诉求 |\n|---|---|\n| 财务 / 结算 | 对账后登记期末余额,得到可解释的当前预付余额 |\n| 加氢站运营 | 查看当前余额及下钻流水是否与期末锚点一致 |\n\n**入口**:站点信息列表 → 操作列 **更多(⋮)** → **期末余额设置** \n(菜单位置:余额提醒设置 与 生成对账单 之间)\n\n---\n\n## 4. 功能描述\n\n### 4.1 弹窗内容\n\n| 区域 | 内容 | 说明 |\n|---|---|---|\n| 站点摘要 | 站点名称、当前预付余额 | 只读 |\n| 表单 | 期末余额(元)*、期末时间 * | 必填 |\n| 操作 | 取消 / 保存 | 保存触发校验与重算 |\n| 变更记录 | 期末余额、生效时间、操作人、操作时间 | 只追加;支持分页 |\n\n### 4.2 主流程\n\n```text\n打开期末余额设置\n → 填写期末余额、期末时间\n → 点击保存\n → 校验通过\n → 追加变更记录\n → 按规则重算当前预付余额并写回列表\n → 提示保存成功\n```\n\n打开该站点「预付余额」下钻时,若已存在生效期末配置,流水按锚点规则重算展示(见 §6)。\n\n---\n\n## 5. 业务规则(核心)\n\n### 5.1 字段规则\n\n| 规则 ID | 规则 | 说明 |\n|---|---|---|\n| R1 | 期末余额必填 | 须为有效数字;**允许负数**(欠费场景) |\n| R2 | 期末时间必填 | 精确到分钟(`YYYY-MM-DD HH:mm`) |\n| R3 | 期末时间不可晚于当前时刻 | 日期不可选今天之后;保存时若时刻晚于现在,阻止保存 |\n| R4 | 以最近一次保存为生效锚点 | 站点仅保留一套「当前生效」的期末余额 / 期末时间;历史见变更记录 |\n\n### 5.2 当前预付余额计算公式\n\n**仅在点击「保存」时计算一次**(不监听之后新产生的流水自动刷新)。\n\n```text\n当前预付余额 = 期末余额 − 期末后支出合计 + 期末后收入合计\n```\n\n| 规则 ID | 规则 | 说明 |\n|---|---|---|\n| R5 | 支出范围 | 该站点、业务时间 **严格晚于** 期末时间 `T` 的车辆氢费明细,按**成本总价**合计 |\n| R6 | 收入范围 | 该站点、变更时间 **严格晚于** `T` 的充值类收入合计 |\n| R7 | 取整 | 结果保留 **2 位小数** 后写回「预付余额(元)」 |\n| R8 | 时间边界 | 等于期末时间 `T` 当刻的流水 **不计入** 期末后收支(只统计 `> T`) |\n\n### 5.3 变更记录规则\n\n| 规则 ID | 规则 | 说明 |\n|---|---|---|\n| R9 | 只追加 | 每次保存成功新增一条记录 |\n| R10 | 不可删除 | 界面不提供删除 / 清空 |\n| R11 | 不可编辑 | 历史行不可改 |\n| R12 | 记录字段 | 期末余额、生效时间(= 本次期末时间)、操作人、操作时间(保存时刻) |\n| R13 | 分页 | 变更记录支持分页(紧凑页码:5 / 10 / 20 / 50) |\n\n### 5.4 与其他功能的关系\n\n| 规则 ID | 规则 | 说明 |\n|---|---|---|\n| R14 | KPI / 余额提醒 | 仍读取「预付余额」;期末保存写回后,预警 / 欠费 KPI 随之变化 |\n| R15 | 生成对账单 | 对账单提交仍可扣减 / 写回预付余额;与期末重算冲突时,**以后发生的写操作为准** |\n| R16 | 未配置期末 | 未保存过期末余额时,预付余额逻辑保持原状(对账扣减、手工/其他入口) |\n\n---\n\n## 6. 预付余额下钻规则\n\n当站点已配置生效的期末余额、期末时间时:\n\n| 规则 ID | 规则 | 说明 |\n|---|---|---|\n| R17 | 插入锚点行 | 在流水中增加类型为「期末余额」的行:时间为期末时间,余额列 = 期末余额 |\n| R18 | 锚点前流水 | 时间 ≤ 期末时间的历史流水可继续展示 |\n| R19 | 锚点后流水 | 时间 > 期末时间的收入 / 支出,从期末余额起按时间顺序累加,重算每行余额 |\n| R20 | 下钻不写回 | 打开下钻只重算展示,**不再次写回**列表预付余额(列表值仍以最近一次保存结果为准) |\n\n**锚点后单行余额推算:**\n\n```text\n行余额 = 上一行余额 + 本行收入 − 本行支出\n(起点上一行余额 = 期末余额)\n```\n\n---\n\n## 7. 校验与异常\n\n| 场景 | 系统行为 |\n|---|---|\n| 期末余额为空 / 非数字 | 阻止保存,提示填写有效期末余额 |\n| 期末时间为空 | 阻止保存,提示选择期末时间 |\n| 期末时间晚于当前时刻 | 阻止保存,提示「期末时间不能晚于今天」 |\n| 期末后无收支流水 | 允许保存;当前预付余额 = 期末余额 |\n| 变更记录为空 | 展示「暂无变更记录」 |\n\n---\n\n## 8. 验收标准\n\n- [ ] 更多菜单可见「期末余额设置」\n- [ ] 必填与「期末时间不可晚于今天」校验生效\n- [ ] 保存后列表预付余额 = 公式计算结果\n- [ ] 变更记录追加成功,无删除入口,分页可用\n- [ ] 余额下钻出现「期末余额」锚点,其后余额连续正确\n- [ ] 未配置期末时,原有预付余额 / 下钻行为不受影响\n\n---\n\n## 9. 非目标(本期不做)\n\n- 变更记录编辑、删除、回滚到某一历史锚点\n- 保存后对新流水的自动实时重算\n- 多套期末锚点同时生效\n- 真实充值流水 API、审批流(原型可用 Mock)\n\n---\n\n## 10. 修订记录\n\n| 版本 | 日期 | 说明 |\n|---|---|---|\n| v1.0 | 2026-07-17 | 首版需求:口径、写回时机、不可删日志、时间上限、下钻锚点 |\n", "markdownPath": "src/prototypes/oneos-web-h2-station-site/.spec/period-end-balance.md" }, + { + "type": "markdown", + "id": "h2-site-doc-prd-dispenser-brand", + "title": "加氢机品牌管理", + "markdown": "# 加氢机品牌管理\n\n| 项 | 内容 |\n|---|---|\n| 模块 | 加氢站管理 → 站点信息 |\n| 入口 | 列表工具栏 → **加氢机品牌管理** |\n| 关联 | H5「加氢订单」面板 OCR |\n| 数据 | `src/common/h2DispenserBrandStore.js`(localStorage 演示,未接真实 API) |\n\n## 目标\n\n维护加氢机**品牌 + 型号**清单,供站端拍照 OCR 时作为识别模型 / 模板判断参考(原型展示为 H5 面板区提示文案)。\n\n## 字段\n\n| 字段 | 规则 |\n|---|---|\n| 品牌 * | 必填,如「海德利森」 |\n| 型号 * | 必填,如「H2-D50」;同品牌+型号不可重复 |\n| 备注 | 选填,如 OCR 模板说明 |\n| 更新时间 | 系统写入 |\n\n## 交互\n\n1. 打开弹窗加载当前清单(含种子数据)。\n2. 填写品牌/型号/备注 → **新增** 或编辑后 **保存修改**。\n3. 行操作:编辑、删除(二次确认)。\n\n## 验收\n\n1. 站点信息工具栏可见「加氢机品牌管理」。\n2. 可增删改品牌型号,刷新后仍保留(同浏览器)。\n3. H5 新增页「加氢机面板识别」展示已维护品牌型号提示(若 Store 已加载)。\n", + "markdownPath": "src/prototypes/oneos-web-h2-station-site/.spec/dispenser-brand.md" + }, { "type": "markdown", "id": "h2-site-doc-scope", @@ -273,7 +287,7 @@ "type": "markdown", "id": "h2-site-doc-acceptance", "title": "验收标准", - "markdown": "## 8. 验收标准\n\n### 8.1 列表页\n\n- [ ] 筛选与 KPI 六卡片联动正确\n- [ ] 高频/低频/无加氢口径与车辆氢费明细一致\n- [ ] 加氢量、预付余额下钻数据来自共享 Store\n- [ ] 布局与租赁合同 vm 规范一致\n\n### 8.2 对账流程\n\n- [ ] 仅已对账未结算记录可进入对账单\n- [ ] 两阶段交互与必填校验完整\n- [ ] 提交后回写车辆氢费明细可跨页验收\n\n### 8.3 期末余额设置\n\n- [ ] 更多菜单可打开期末余额设置;期末时间不可晚于今天\n- [ ] 保存后写回预付余额,变更记录只追加不可删\n- [ ] 余额下钻出现期末锚点且后续余额连续推算\n\n### 8.4 标注与文档\n\n- [ ] `@axhub/annotation` 已接入,关键区域有 `data-annotation-id`\n- [ ] 右侧工具栏目录可阅 PRD 全文与页面标注\n\n---" + "markdown": "## 8. 验收标准\n\n### 8.1 列表页\n\n- [ ] 筛选与 KPI 六卡片联动正确\n- [ ] 高频/低频/无加氢口径与车辆氢费明细一致\n- [ ] 加氢量、预付余额下钻数据来自共享 Store\n- [ ] 布局与租赁合同 vm 规范一致\n\n### 8.2 对账流程\n\n- [ ] 仅 **已核对** 且未对账、未结算的记录可进入对账单;未核对明细即使在账期内也不出现\n- [ ] 两阶段交互与必填校验完整\n- [ ] 提交后回写车辆氢费明细为 **已对账**,可跨页验收\n\n### 8.3 期末余额设置\n\n- [ ] 更多菜单可打开期末余额设置;期末时间不可晚于今天\n- [ ] 保存后写回预付余额,变更记录只追加不可删\n- [ ] 余额下钻出现期末锚点且后续余额连续推算\n\n### 8.4 标注与文档\n\n- [ ] `@axhub/annotation` 已接入,关键区域有 `data-annotation-id`\n- [ ] 右侧工具栏目录可阅 PRD 全文与页面标注\n\n---" } ] }, @@ -299,7 +313,7 @@ "type": "markdown", "id": "h2-site-doc-node-h2-site-statement", "title": "工具栏与对账", - "markdown": "## 4. 列表工具栏\n\n| 按钮 | 行为 |\n|---|---|\n| 全站余额提醒设置 | 配置全局预付余额预警阈值 |\n| 批量导入 | 下载模板 → 上传 CSV/Excel → 预览确认导入 |\n| 发起充值单 | 为站点发起预付充值流程(原型演示) |\n| 新建站点 | 进入同页内嵌新建视图 |\n\n---\n\n---\n\n## 6. 数据来源\n\n- 氢费/加氢明细:统一来自 `src/common/h2VehicleLedgerBridge.js`,与「车辆氢费明细」共享 Store\n- 先打开「车辆氢费明细」时台账全量同步;仅打开加氢站模块时使用 canonical seed\n- 对账单提交经 `H2_STATION_STATEMENT_LEDGER_UPDATES` 回写车辆氢费明细\n\n---" + "markdown": "## 4. 列表工具栏\n\n| 按钮 | 行为 |\n|---|---|\n| 全站余额提醒设置 | 配置全局预付余额预警阈值 |\n| 批量导入 | 下载模板 → 上传 CSV/Excel → 预览确认导入 |\n| 加氢机品牌管理 | 维护品牌与型号,供 H5 面板 OCR 参考(见 `.spec/dispenser-brand.md`) |\n| 发起充值单 | 为站点发起预付充值流程(原型演示) |\n| 新建站点 | 进入同页内嵌新建视图 |\n\n---\n\n---\n\n## 6. 数据来源\n\n- 氢费/加氢明细:统一来自 `src/common/h2VehicleLedgerBridge.js`,与「车辆氢费明细」共享 Store\n- 先打开「车辆氢费明细」时台账全量同步;仅打开加氢站模块时使用 canonical seed\n- 对账单提交经 `H2_STATION_STATEMENT_LEDGER_UPDATES` 回写车辆氢费明细\n\n---" }, { "type": "markdown", @@ -323,7 +337,7 @@ "type": "markdown", "id": "h2-site-doc-node-h2-site-statement-form", "title": "生成对账单", - "markdown": "#### 生成对账单 · 业务逻辑\n\n1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点的加氢记录(已对账且尚未结算)。\n2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成对账单后,车辆氢费明细中对应记录将自动标记为已对账且无法修改。\n3. 确认后进入结算阶段,填写**收票日期**、**收票金额**及**发票附件**(对账日期在提交时由系统自动回写)。\n4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为已对账/已结算状态,不可再修改。\n\n**阶段一 · 选期生成**\n\n- 日期区下方展示:**上次对账单结束时间**(无历史则「暂无」)\n- 默认开始日期建议 = 上次结束日 + 1 天\n- 点击「生成对账单」时弹出**二次确认**:提示生成后车辆氢费明细对应记录将标记为已对账且无法修改;确认后进入阶段二,日期锁定不可改\n- 无符合条件记录时提示调整日期\n\n**阶段二 · 结算提交**\n\n统计卡(明细表上方):\n\n| 指标 | 说明 |\n|---|---|\n| 加氢次数 | 本账单包含的已对账记录笔数 |\n| 加氢总量 | kg 合计 |\n| 成本总金额 | 成本总价合计 |\n\n明细表下方**必填**结算项:\n\n| 字段 | 规则 |\n|---|---|\n| 结算后加氢站预付款余额 | **只读**,= 当前预付余额 − 成本总金额;不足为负并标「已欠费」 |\n| 收票日期 | 必填 |\n| 收票金额 | 必填,默认填入成本总金额 |\n| 发票附件 | 必填,支持上传 |\n\n---" + "markdown": "## 1. 数据来源\n\n对账单明细取自 **车辆氢费明细**(共享 Store)中**同时满足**以下条件的记录:\n\n| 优先级 | 条件 | 说明 |\n|---|---|---|\n| 1 | 未绑定 `statementRecordId` | 尚未被历史对账单结算 |\n| 2 | 核对状态 = **已核对**(`verifyStatus = verified`) | **硬约束**:未核对一律不纳入 |\n| 3 | 对账状态 = **未对账**(`reconcileStatus = pending`) | 已对账由对账单提交产生,不再进入新账单 |\n| 4 | 加氢站名称 = 当前操作站点 | 仅本站 |\n| 5 | 加氢时间落在 **[账单开始日期, 账单结束日期]** | 用户所选账期(按日闭区间) |\n\n> 对账单明细**仅展示成本字段**(加氢量、成本单价、成本总价等),不展示加氢单价、加氢总价。\n\n### 1.1 为何必须「已核对」\n\n能源部在车辆氢费明细点击「完成核对」后,明细才视为业务已确认。站点侧生成对账单是结算动作,只能拉取已确认数据;未核对记录即使时间落在账期内,也**静默排除**,不出现在对账单明细与统计中。\n\n```text\n未核对 ──✕──→ 不可进对账单\n已核对 + 未对账 ──✓──→ 可进对账单(提交后变为已对账)\n已核对 + 已对账 ──✕──→ 不可再进下一张对账单\n```\n\n---\n\n---\n\n#### 生成对账单 · 业务逻辑\n\n1. 选择**账单开始日期**与**账单结束日期**后,从**车辆氢费明细**获取该时间段内、对应当前站点、且为**已核对且尚未结算(未对账)**的加氢记录。\n2. 点击「**生成对账单**」时弹出**二次确认**,提示:生成并提交后,车辆氢费明细中对应记录将标记为**已对账**且无法修改。\n3. 确认后进入结算阶段,填写**收票日期**、**收票金额**及**发票附件**(对账日期在提交时由系统自动回写)。\n4. 点击「**提交对账单**」后,本批明细在车辆氢费明细中锁定为**已对账**并绑定本对账单,不可再进入后续对账单。\n\n**阶段一 · 选期生成**\n\n- 日期区下方展示:**上次对账单结束时间**(无历史则「暂无」)\n- 默认开始日期建议 = 上次结束日 + 1 天\n- 点击「生成对账单」时弹出**二次确认**;确认后进入阶段二,日期锁定不可改\n- 无符合条件记录时提示调整日期(含:账期内仅有未核对、或均已结算等情况)\n\n**阶段二 · 结算提交**\n\n统计卡(明细表上方):\n\n| 指标 | 说明 |\n|---|---|\n| 加氢次数 | 本账单包含的**已核对**记录笔数 |\n| 加氢总量 | kg 合计 |\n| 成本总金额 | 成本总价合计 |\n\n明细表下方**必填**结算项:\n\n| 字段 | 规则 |\n|---|---|\n| 结算后加氢站预付款余额 | **只读**,= 当前预付余额 − 成本总金额;不足为负并标「已欠费」 |\n| 收票日期 | 必填 |\n| 收票金额 | 必填,默认填入成本总金额 |\n| 发票附件 | 必填,支持上传 |\n\n---" }, { "type": "markdown", diff --git a/src/prototypes/oneos-web-h2-station-site/index.tsx b/src/prototypes/oneos-web-h2-station-site/index.tsx index 26d6df3..ad47347 100644 --- a/src/prototypes/oneos-web-h2-station-site/index.tsx +++ b/src/prototypes/oneos-web-h2-station-site/index.tsx @@ -4,9 +4,13 @@ */ import '../../common/oneosWebLegacy/legacyGlobals'; import '../../common/h2VehicleLedgerBridge.js'; +import '../../common/h2DispenserBrandStore.js'; import React, { useEffect, useMemo } from 'react'; import * as antd from 'antd'; import { ConfigProvider } from 'antd'; +import dayjs from 'dayjs'; +import 'dayjs/locale/zh-cn'; +import zhCN from 'antd/locale/zh_CN'; import 'antd/dist/reset.css'; import '../vehicle-management/style.css'; import '../lease-contract-management/styles/lease-contract.css'; @@ -20,6 +24,19 @@ import { clearHostPrototypeRouteInfo } from '../../common/useHashPage'; import SiteInfoPage from './pages/03-站点信息.jsx'; import annotationSourceDocument from './annotation-source.json'; +declare global { + interface Window { + React: typeof React; + antd: typeof antd; + dayjs: typeof dayjs; + } +} + +dayjs.locale('zh-cn'); +window.React = React; +window.antd = antd; +window.dayjs = dayjs; + /** 与租赁合同管理 / vehicle-management 主题一致 */ const vmTheme = { token: { @@ -50,12 +67,16 @@ const vmTheme = { InputNumber: { handleVisible: true, }, + DatePicker: { + cellActiveWithRangeBg: 'rgba(50, 160, 110, 0.12)', + cellHoverWithRangeBg: 'rgba(50, 160, 110, 0.08)', + cellRangeBorderColor: '#32a06e', + activeBorderColor: '#32a06e', + hoverBorderColor: '#3fb87c', + }, }, }; -window.React = React; -window.antd = antd; - export default function OneosWebH2StationSite() { useEffect(() => { clearHostPrototypeRouteInfo(); @@ -74,7 +95,7 @@ export default function OneosWebH2StationSite() { ); return ( - + input { font-size: 13px !important; color: #0f172a !important; }', + '.h2-period-end-modal .ant-form-item-label > label { font-size: 13px; font-weight: 600; color: #334155; }', '.h2-statement-modal .h2-statement-invoice-upload .h2-contract-upload-actions { gap: 0; }', '.h2-statement-modal .h2-statement-invoice-upload .h2-statement-upload-btn.ant-btn { display: inline-flex !important; align-items: center; gap: 6px; height: 32px !important; padding: 0 14px !important; border-radius: 8px !important; font-size: 13px !important; font-weight: 600 !important; border: 1px solid #e2e8f0 !important; color: #475569 !important; background: #fff !important; box-shadow: none !important; }', '.h2-statement-modal .h2-statement-invoice-upload .h2-statement-upload-btn.ant-btn:hover { border-color: #10b981 !important; color: #059669 !important; background: #f0fdf4 !important; }', @@ -4120,7 +4125,7 @@ mindmap |------|----------|----------| | **平台管理员(admin)** | 新建、编辑、批量导入、删除、绑定系统账号 | 系统账号支持多选绑定 | | **加氢站运营账号** | 编辑本站资料、营业状态、价格配置 | 编辑时**不能改**供应商与系统账号 | -| **财务 / 结算人员** | 生成对账单、登记收票、查看对账记录 | 需先在台账完成「已对账」 | +| **财务 / 结算人员** | 生成对账单、登记收票、查看对账记录 | 需先在台账完成「已核对」 | --- @@ -4393,12 +4398,12 @@ flowchart LR 生成对账单前,台账中须已有满足以下**全部**条件的记录: -1. 对账状态 = **已对账**(业务员已在台账点击「完成对账」) -2. **尚未**被本站点历史对账单结算过 +1. 核对状态 = **已核对**(能源部已在车辆氢费明细点击「完成核对」) +2. 对账状态 = **未对账**,且**尚未**被本站点历史对账单结算过 3. 加氢时间在所选账单日期区间内 4. 加氢站名称与当前站点一致 -> 对账单只展示**成本侧**字段(加氢量、成本单价、成本总价),不展示客户加氢价。 +> **未核对**明细即使落在账期内也**不会**进入对账单。对账单只展示**成本侧**字段(加氢量、成本单价、成本总价),不展示客户加氢价。 ### 7.2 生成对账单 — 两阶段操作 @@ -4461,12 +4466,12 @@ sequenceDiagram participant 站点 as 站点信息 participant 台账 as 车辆氢费明细 - 业务->>台账: 完成对账 → 已对账 + 业务->>台账: 完成核对 → 已核对 财务->>站点: 更多 → 生成对账单 - 站点->>台账: 拉取已对账且未结算记录 + 站点->>台账: 拉取已核对且未对账未结算记录 财务->>站点: 填写收票信息并提交 站点->>站点: 更新预付余额 - 站点->>台账: 回写已付款 + 站点->>台账: 回写已付款(标记已对账) \`\`\` ### 7.3 查看对账记录 @@ -4703,12 +4708,12 @@ flowchart TB 对账单明细取自 **车辆氢费明细** 中同时满足以下条件的记录: -1. 对账状态 = **已对账**(业务侧已在台账完成「完成对账」) -2. **尚未**被本站点历史对账单结算过(未绑定 statementRecordId) +1. 核对状态 = **已核对**(能源部已在车辆氢费明细完成「完成核对」) +2. 对账状态 = **未对账**,且**尚未**被本站点历史对账单结算过(未绑定 statementRecordId) 3. 加氢时间落在用户选择的 **[账单开始日期, 账单结束日期]** 内 4. 加氢站名称与当前操作站点一致 -> 对账单明细**仅展示成本字段**(加氢量、成本单价、成本总价等),不展示加氢单价、加氢总价。 +> **未核对**明细不得进入对账单。明细**仅展示成本字段**(加氢量、成本单价、成本总价等),不展示加氢单价、加氢总价。 ### 6.2 两阶段交互 @@ -4731,7 +4736,8 @@ flowchart TD - 日期区下方展示:**上次对账单结束时间 YYYY-MM-DD**(无历史则「暂无」) - 默认开始日期建议 = 上次结束日 + 1 天 -- 点击「生成对账单」时弹出**二次确认**:提示生成后车辆氢费明细对应记录将标记为已对账且无法修改;确认后进入阶段二,日期锁定不可改 +- 点击「生成对账单」时弹出**二次确认**:提示提交后对应「已核对」记录将标记为已对账且无法修改;确认后进入阶段二,日期锁定不可改 +- 无符合条件记录时提示调整日期(或先完成核对) **阶段二 · 结算提交** @@ -4773,13 +4779,13 @@ sequenceDiagram participant 站点 as 站点信息 participant 财务 as 结算操作人 - 台账->>台账: 业务员「完成对账」→ 已对账 + 台账->>台账: 能源部「完成核对」→ 已核对 财务->>站点: 更多 → 生成对账单 - 站点->>台账: 拉取已对账且未结算记录 + 站点->>台账: 拉取已核对且未对账未结算记录 财务->>站点: 生成对账记录 + 填收票信息 财务->>站点: 提交对账单 站点->>站点: 更新预付余额 / 写对账历史 - 站点->>台账: 回写对账日期、收票日期、已付款 + 站点->>台账: 回写已对账、对账日期、收票日期、已付款 \`\`\` --- @@ -4816,7 +4822,7 @@ sequenceDiagram | 场景 | 处理 | |------|------| | 日期未填 / 开始晚于结束 | 阻止生成,提示用户 | -| 区间内无已对账未结算记录 | 阻止生成,提示调整日期 | +| 区间内无已核对未对账未结算记录 | 阻止生成,提示调整日期(或先完成核对) | | 收票日期/金额/附件未填 | 阻止提交 | | 收票金额 ≤ 0 | 阻止提交 | | 预付余额结算后为负 | 允许提交,列表与明细标「已欠费」 | @@ -6027,6 +6033,15 @@ const Component = function () { var createSubmitting = createSubmittingState[0]; var setCreateSubmitting = createSubmittingState[1]; + var brandListState = useState(function () { + return window.H2DispenserBrandStore ? window.H2DispenserBrandStore.list() : []; + }); + var brandList = brandListState[0]; + var setBrandList = brandListState[1]; + var brandModalState = useState({ open: false, editingId: '', brand: '', model: '', remark: '' }); + var brandModal = brandModalState[0]; + var setBrandModal = brandModalState[1]; + var editStationState = useState(h2CreateEmptyStationForm()); var editStation = editStationState[0]; var setEditStation = editStationState[1]; @@ -6795,12 +6810,12 @@ const Component = function () { } var rows = h2GetAvailableStatementLedgerRows(ledgerStore, statementModal.record.name, statementModal.startDate, statementModal.endDate); if (!rows.length) { - message.warning('所选日期范围内暂无「已对账」且未结算的加氢记录,请调整日期后重试'); + message.warning('所选日期范围内暂无「已核对」且未对账、未结算的加氢记录,请调整日期或先完成核对后重试'); return; } Modal.confirm({ title: '确认生成对账单?', - content: '生成对账单后,车辆氢费明细中对应记录将自动标记为已对账且无法修改,是否确认?', + content: '生成对账单后,车辆氢费明细中对应「已核对」记录将在提交时标记为已对账且无法修改,是否确认?', okText: '确认生成', cancelText: '取消', centered: true, @@ -8445,7 +8460,7 @@ const Component = function () { !isDraft ? React.createElement('div', { className: 'h2-statement-form-hint' }, '数据来源:', React.createElement('strong', null, '车辆氢费明细'), - ' 中标记为「已对账」且尚未结算的加氢记录;明细仅展示成本价与成本总价。' + ' 中标记为「已核对」且尚未对账结算的加氢记录;未核对记录不会进入对账单;明细仅展示成本价与成本总价。' ) : null ), isDraft ? React.createElement('div', { className: 'h2-statement-stats', role: 'group', 'aria-label': '对账统计' }, @@ -9786,6 +9801,17 @@ const Component = function () { onClick: function () { setImportModalOpen(true); }, 'aria-label': '批量导入加氢站点' }, '批量导入'), + React.createElement('button', { + 'data-vm-icon': 'settings', + type: 'button', + className: 'vm-btn vm-btn-ghost ldb-toolbar-btn', + 'data-annotation-id': 'h2-dispenser-brand', + onClick: function () { + setBrandList(window.H2DispenserBrandStore ? window.H2DispenserBrandStore.list() : []); + setBrandModal({ open: true, editingId: '', brand: '', model: '', remark: '' }); + }, + 'aria-label': '加氢机品牌管理' + }, '加氢机品牌管理'), React.createElement('button', { 'data-vm-icon': 'plus', type: 'button', @@ -10130,6 +10156,7 @@ const Component = function () { React.createElement(Modal, { title: '期末余额设置', + className: 'h2-period-end-modal', open: periodEndBalanceModal.open, onCancel: closePeriodEndBalanceModal, footer: React.createElement(Space, null, @@ -10150,30 +10177,41 @@ const Component = function () { var safePage = Math.min(logPage, logTotalPages); var pagedLogs = logs.slice((safePage - 1) * logPageSize, safePage * logPageSize); var periodEndTimeValue = h2ToDateTimeDayjs(periodEndBalanceModal.periodEndTime); - var periodEndPicker = dayjs && DatePicker - ? React.createElement(DatePicker, { - showTime: { format: 'HH:mm' }, - needConfirm: false, - style: { width: '100%', borderRadius: 8 }, - format: 'YYYY-MM-DD HH:mm', - placeholder: '请选择期末时间', - allowClear: true, - value: periodEndTimeValue, - disabledDate: function (current) { - if (!current || !dayjs) return false; - return current.isAfter(dayjs().endOf('day')); - }, - onChange: function (d) { - var text = d && d.isValid && d.isValid() ? d.format('YYYY-MM-DD HH:mm') : ''; - setPeriodEndBalanceModal(function (m) { return Object.assign({}, m, { periodEndTime: text }); }); - } - }) + var periodEndPicker = DatePicker + ? React.createElement('div', { 'data-annotation-id': 'h2-site-period-end-time' }, + React.createElement(DatePicker, { + className: 'h2-period-end-datetime-picker', + showTime: { format: 'HH:mm' }, + needConfirm: false, + style: { width: '100%' }, + format: 'YYYY-MM-DD HH:mm', + placeholder: '请选择期末时间', + allowClear: true, + value: periodEndTimeValue, + disabledDate: function (current) { + if (!current || !dayjs) return false; + return current.isAfter(dayjs().endOf('day')); + }, + onChange: function (d) { + var text = d && d.isValid && d.isValid() ? d.format('YYYY-MM-DD HH:mm') : ''; + setPeriodEndBalanceModal(function (m) { return Object.assign({}, m, { periodEndTime: text }); }); + } + }) + ) : React.createElement(Input, { - style: { width: '100%', borderRadius: 8 }, - placeholder: 'YYYY-MM-DD HH:mm', - value: periodEndBalanceModal.periodEndTime || '', + type: 'datetime-local', + 'data-annotation-id': 'h2-site-period-end-time', + className: 'h2-period-end-datetime-picker', + style: { width: '100%', borderRadius: 8, height: 32 }, + placeholder: '请选择期末时间', + value: periodEndBalanceModal.periodEndTime + ? String(periodEndBalanceModal.periodEndTime).replace(' ', 'T') + : '', onChange: function (e) { - setPeriodEndBalanceModal(function (m) { return Object.assign({}, m, { periodEndTime: e.target.value }); }); + var raw = e.target.value || ''; + setPeriodEndBalanceModal(function (m) { + return Object.assign({}, m, { periodEndTime: raw ? raw.replace('T', ' ') : '' }); + }); } }); return React.createElement('div', { @@ -10292,6 +10330,152 @@ const Component = function () { })() ), + React.createElement(Modal, { + title: '加氢机品牌管理', + open: brandModal.open, + onCancel: function () { + setBrandModal({ open: false, editingId: '', brand: '', model: '', remark: '' }); + }, + footer: null, + centered: true, + width: 720, + destroyOnClose: true + }, + React.createElement('div', { style: { display: 'flex', flexDirection: 'column', gap: 14 } }, + React.createElement('div', { + style: { + padding: '12px 14px', + borderRadius: 10, + background: '#f0fdf4', + border: '1px solid #bbf7d0', + fontSize: 13, + color: '#166534', + lineHeight: 1.55 + } + }, '维护加氢机品牌与型号,供 H5「加氢订单」面板 OCR 识别时作为模型判断参考。数据保存在本机演示 Store,未接真实 API。'), + React.createElement('div', { + style: { + display: 'grid', + gridTemplateColumns: '1fr 1fr 1.2fr auto', + gap: 10, + alignItems: 'end' + } + }, + React.createElement('div', null, + React.createElement('div', { style: { fontSize: 12, fontWeight: 600, color: '#64748b', marginBottom: 6 } }, '品牌 *'), + React.createElement(Input, { + placeholder: '如:海德利森', + value: brandModal.brand, + onChange: function (e) { + var v = e.target.value; + setBrandModal(function (m) { return Object.assign({}, m, { brand: v }); }); + } + }) + ), + React.createElement('div', null, + React.createElement('div', { style: { fontSize: 12, fontWeight: 600, color: '#64748b', marginBottom: 6 } }, '型号 *'), + React.createElement(Input, { + placeholder: '如:H2-D50', + value: brandModal.model, + onChange: function (e) { + var v = e.target.value; + setBrandModal(function (m) { return Object.assign({}, m, { model: v }); }); + } + }) + ), + React.createElement('div', null, + React.createElement('div', { style: { fontSize: 12, fontWeight: 600, color: '#64748b', marginBottom: 6 } }, '备注'), + React.createElement(Input, { + placeholder: '可选,如 OCR 模板说明', + value: brandModal.remark, + onChange: function (e) { + var v = e.target.value; + setBrandModal(function (m) { return Object.assign({}, m, { remark: v }); }); + } + }) + ), + React.createElement(Button, { + type: 'primary', + style: H2_PRIMARY_BTN_STYLE, + onClick: function () { + if (!window.H2DispenserBrandStore) { + message.error('品牌 Store 未加载'); + return; + } + var result = window.H2DispenserBrandStore.upsert({ + id: brandModal.editingId || undefined, + brand: brandModal.brand, + model: brandModal.model, + remark: brandModal.remark + }); + if (!result.ok) { + message.warning(result.message || '保存失败'); + return; + } + setBrandList(window.H2DispenserBrandStore.list()); + setBrandModal({ open: true, editingId: '', brand: '', model: '', remark: '' }); + message.success(brandModal.editingId ? '已更新品牌型号' : '已新增品牌型号'); + } + }, brandModal.editingId ? '保存修改' : '新增') + ), + React.createElement(Table, { + size: 'small', + rowKey: 'id', + pagination: false, + locale: { emptyText: '暂无品牌型号,请先新增' }, + dataSource: brandList, + columns: [ + { title: '品牌', dataIndex: 'brand', key: 'brand', width: 140 }, + { title: '型号', dataIndex: 'model', key: 'model', width: 140 }, + { title: '备注', dataIndex: 'remark', key: 'remark', ellipsis: true }, + { + title: '更新时间', + dataIndex: 'updatedAt', + key: 'updatedAt', + width: 160, + render: function (v) { + return React.createElement('span', { className: 'tabular-nums' }, v || '—'); + } + }, + { + title: '操作', + key: 'actions', + width: 148, + render: function (_, record) { + return React.createElement(OperationActions, { + edit: { + onClick: function () { + setBrandModal({ + open: true, + editingId: record.id, + brand: record.brand, + model: record.model, + remark: record.remark || '' + }); + } + }, + more: [ + { + key: 'delete', + label: '删除', + danger: true, + onClick: function () { + if (!window.confirm('确认删除「' + record.brand + ' · ' + record.model + '」?')) return; + if (!window.H2DispenserBrandStore) return; + window.H2DispenserBrandStore.remove(record.id); + setBrandList(window.H2DispenserBrandStore.list()); + message.success('已删除'); + } + } + ] + }); + } + } + ] + }) + ) + ), + React.createElement(Modal, { title: '全站余额提醒设置', open: globalBalanceAlertModal.open, diff --git a/src/prototypes/oneos-web-h2-station-site/scripts/build-annotation-source.mjs b/src/prototypes/oneos-web-h2-station-site/scripts/build-annotation-source.mjs index 36df46e..6b4785e 100644 --- a/src/prototypes/oneos-web-h2-station-site/scripts/build-annotation-source.mjs +++ b/src/prototypes/oneos-web-h2-station-site/scripts/build-annotation-source.mjs @@ -9,8 +9,10 @@ const specRoot = path.join(protoRoot, '.spec'); const fullPrd = fs.readFileSync(path.join(specRoot, 'requirements-prd.md'), 'utf8'); const listPrd = fs.readFileSync(path.join(specRoot, 'requirements-prd-list.md'), 'utf8'); const statementPrd = fs.readFileSync(path.join(specRoot, 'requirements-prd-statement.md'), 'utf8'); +const statementVerifiedFilterPrd = fs.readFileSync(path.join(specRoot, 'statement-verified-filter.md'), 'utf8'); const kpiBalanceAlertPrd = fs.readFileSync(path.join(specRoot, 'requirements-prd-kpi-balance-alert.md'), 'utf8'); const periodEndPrd = fs.readFileSync(path.join(specRoot, 'period-end-balance.md'), 'utf8'); +const dispenserBrandPrd = fs.readFileSync(path.join(specRoot, 'dispenser-brand.md'), 'utf8'); const scopeMd = fs.readFileSync(path.join(specRoot, 'requirements.md'), 'utf8'); const NODE_DEFS = [ @@ -44,7 +46,7 @@ const NODE_DEFS = [ pageId: 'site-info', color: '#d97706', aiPrompt: '工具栏操作与对账单氢费联动。', - annotationText: '全站余额提醒、批量导入、充值单、新建站点;对账回写车辆氢费明细。', + annotationText: '全站余额提醒、批量导入、加氢机品牌管理、充值单、新建站点;对账回写车辆氢费明细。', locator: { selectors: ['.h2-station-page .vm-table-toolbar', '[data-annotation-id="h2-site-toolbar"]'], fingerprint: 'toolbar|statement', @@ -91,8 +93,8 @@ const NODE_DEFS = [ title: '生成对账单', pageId: 'site-info', color: '#7c3aed', - aiPrompt: '选期拉取氢费明细、二次确认与结算提交逻辑。', - annotationText: '选日期拉取站点加氢记录;生成前二次确认;提交后明细锁定为已对账', + aiPrompt: '选期仅拉取已核对未对账氢费明细、二次确认与结算提交。', + annotationText: '账期内仅纳入车辆氢费明细「已核对」记录;未核对不进对账单;提交后标为已对账', locator: { selectors: ['[data-annotation-id="h2-site-statement-form"]', '.h2-statement-form-wrap'], fingerprint: 'form|statement', @@ -119,7 +121,11 @@ const NODE_PRD_MAP = { 'h2-site-table': { file: 'list', heading: '## 5. 列表字段说明' }, 'h2-site-price-cost-input': { file: 'full', heading: '### 5.2 价格配置' }, 'h2-site-price-tiered': { file: 'full', heading: '#### 阶梯价格 · 生成逻辑' }, - 'h2-site-statement-form': { file: 'statement', heading: '#### 生成对账单 · 业务逻辑' }, + 'h2-site-statement-form': { + file: 'statement', + heading: '## 1. 数据来源', + combine: ['## 1. 数据来源', '#### 生成对账单 · 业务逻辑'], + }, 'h2-site-period-end-balance': { file: 'periodEnd', heading: '## 1. 背景与目标', @@ -301,6 +307,13 @@ const source = { markdown: statementPrd, markdownPath: 'src/prototypes/oneos-web-h2-station-site/.spec/requirements-prd-statement.md', }, + { + type: 'markdown', + id: 'h2-site-doc-statement-verified-filter', + title: '对账单纳入规则(已核对)', + markdown: statementVerifiedFilterPrd, + markdownPath: 'src/prototypes/oneos-web-h2-station-site/.spec/statement-verified-filter.md', + }, { type: 'markdown', id: 'h2-site-doc-prd-period-end', @@ -308,6 +321,13 @@ const source = { markdown: periodEndPrd, markdownPath: 'src/prototypes/oneos-web-h2-station-site/.spec/period-end-balance.md', }, + { + type: 'markdown', + id: 'h2-site-doc-prd-dispenser-brand', + title: '加氢机品牌管理', + markdown: dispenserBrandPrd, + markdownPath: 'src/prototypes/oneos-web-h2-station-site/.spec/dispenser-brand.md', + }, { type: 'markdown', id: 'h2-site-doc-scope', diff --git a/src/prototypes/oneos-web-h2-station/annotation-source.json b/src/prototypes/oneos-web-h2-station/annotation-source.json index f7fc7a7..475a169 100644 --- a/src/prototypes/oneos-web-h2-station/annotation-source.json +++ b/src/prototypes/oneos-web-h2-station/annotation-source.json @@ -79,7 +79,7 @@ "fingerprint": "daily-stats|h2-record", "path": [] }, - "annotationText": "近30天(含今天,自今日前推):展示起止日期与加氢总量;每日卡片为 2×2:加氢数据条数 / 已对账条数 / 加氢量 / 加氢总额,随筛选结果实时汇总。", + "annotationText": "近30天(含今天,自今日前推):展示起止日期与加氢总量;每日卡片上方「数据条数」下分「总数 / 已核对 / 已对账」,下方为加氢量与加氢总额;随筛选结果实时汇总。", "hasMarkdown": false, "color": "#7C3AED", "images": [], diff --git a/src/prototypes/oneos-web-h2-station/pages/02-加氢记录.jsx b/src/prototypes/oneos-web-h2-station/pages/02-加氢记录.jsx index 1c32746..b7ac5c4 100644 --- a/src/prototypes/oneos-web-h2-station/pages/02-加氢记录.jsx +++ b/src/prototypes/oneos-web-h2-station/pages/02-加氢记录.jsx @@ -180,19 +180,26 @@ var HR_PAGE_STYLE = ONEOS_ANT_TABLE_GLOBAL_FIX.concat([ '.h2-station-page .hr-daily-stats-head__title { font-size: 15px; font-weight: 700; color: #0f172a; }', '.h2-station-page .hr-daily-stats-head__meta { font-size: 12px; color: #64748b; font-family: var(--vm-font-mono, ui-monospace, "JetBrains Mono", SFMono-Regular, Menlo, Consolas, monospace); font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; }', '.h2-station-page .hr-daily-stats-carousel { display: flex; align-items: stretch; gap: 8px; }', - '.h2-station-page .hr-daily-stats-nav-btn { flex: 0 0 36px; width: 36px !important; min-width: 36px !important; height: auto !important; min-height: 118px !important; padding: 0 !important; border-radius: 10px !important; font-size: 20px !important; font-weight: 700 !important; color: #475569 !important; border: 1px solid #e2e8f0 !important; background: #fff !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06); }', + '.h2-station-page .hr-daily-stats-nav-btn { flex: 0 0 36px; width: 36px !important; min-width: 36px !important; height: auto !important; min-height: 132px !important; padding: 0 !important; border-radius: 10px !important; font-size: 20px !important; font-weight: 700 !important; color: #475569 !important; border: 1px solid #e2e8f0 !important; background: #fff !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06); }', '.h2-station-page .hr-daily-stats-nav-btn:hover:not(:disabled) { color: #059669 !important; border-color: #10b981 !important; background: #f0fdf4 !important; }', '.h2-station-page .hr-daily-stats-nav-btn:disabled { opacity: 0.35; cursor: not-allowed; box-shadow: none; }', '.h2-station-page .hr-daily-stats-track { flex: 1; min-width: 0; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 8px; }', - '.h2-station-page .hr-daily-stat-card { display: flex; flex-direction: column; gap: 8px; min-height: 118px; padding: 12px 10px; border-radius: 12px; border: 1px solid #e2e8f0; background: #fff; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06); box-sizing: border-box; min-width: 0; }', + '.h2-station-page .hr-daily-stat-card { display: flex; flex-direction: column; gap: 8px; min-height: 132px; padding: 12px 10px; border-radius: 12px; border: 1px solid #e2e8f0; background: #fff; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06); box-sizing: border-box; min-width: 0; }', '.h2-station-page .hr-daily-stat-card--today { border-color: #86efac; background: linear-gradient(180deg, #fff 0%, #f0fdf4 100%); box-shadow: 0 2px 8px rgba(16, 185, 129, 0.12); }', '.h2-station-page .hr-daily-stat-card__date { font-size: 12px; font-weight: 700; color: #0f172a; font-family: var(--vm-font-mono, ui-monospace, "JetBrains Mono", SFMono-Regular, Menlo, Consolas, monospace); font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; padding-bottom: 8px; border-bottom: 1px solid #f1f5f9; display: flex; align-items: center; justify-content: space-between; gap: 4px; }', '.h2-station-page .hr-daily-stat-card__today-tag { font-size: 10px; font-weight: 700; color: #059669; background: #ecfdf5; padding: 1px 6px; border-radius: 999px; flex-shrink: 0; }', - '.h2-station-page .hr-daily-stat-card__metrics { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; }', + '.h2-station-page .hr-daily-stat-card__metrics { display: flex; flex-direction: column; gap: 8px; }', + '.h2-station-page .hr-daily-stat-card__count-block { display: flex; flex-direction: column; gap: 4px; min-width: 0; }', + '.h2-station-page .hr-daily-stat-card__count-title { color: #64748b; font-weight: 600; font-size: 11px; line-height: 1.3; }', + '.h2-station-page .hr-daily-stat-card__count-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }', + '.h2-station-page .hr-daily-stat-card__count-item { display: flex; flex-direction: column; gap: 2px; min-width: 0; }', + '.h2-station-page .hr-daily-stat-card__count-item-label { color: #94a3b8; font-weight: 600; font-size: 10px; line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }', + '.h2-station-page .hr-daily-stat-card__metrics-bottom { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 10px; }', '.h2-station-page .hr-daily-stat-card__metric { display: flex; flex-direction: column; gap: 2px; min-width: 0; }', '.h2-station-page .hr-daily-stat-card__label { color: #64748b; font-weight: 600; font-size: 11px; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }', '.h2-station-page .hr-daily-stat-card__value { font-weight: 800; font-family: var(--vm-font-mono, ui-monospace, "JetBrains Mono", SFMono-Regular, Menlo, Consolas, monospace); font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; font-size: 13px; line-height: 1.2; }', '.h2-station-page .hr-daily-stat-card__value--count { color: #2563eb; }', + '.h2-station-page .hr-daily-stat-card__value--verified { color: #7c3aed; }', '.h2-station-page .hr-daily-stat-card__value--reconciled { color: #0f766e; }', '.h2-station-page .hr-daily-stat-card__value--kg { color: #059669; }', '.h2-station-page .hr-daily-stat-card__value--amount { color: #d97706; }', @@ -305,10 +312,13 @@ function hrBuildRecentDailyWindow(list, dayjs, windowDays) { var day = hrExtractDateKey(r.hydrogenTime); if (!day) return; if (!statsMap[day]) { - statsMap[day] = { count: 0, reconciledCount: 0, totalKg: 0, totalAmount: 0 }; + statsMap[day] = { count: 0, verifiedCount: 0, reconciledCount: 0, totalKg: 0, totalAmount: 0 }; } statsMap[day].count += 1; - if (r.reconcileStatus === 'reconciled' || Boolean(r.reconcileTime)) { + if (hrIsVerified(r)) { + statsMap[day].verifiedCount += 1; + } + if (hrIsReconciled(r)) { statsMap[day].reconciledCount += 1; } var kg = parseFloat(r.hydrogenKg); @@ -339,6 +349,7 @@ function hrBuildRecentDailyWindow(list, dayjs, windowDays) { dateLabel: shortLabel, isToday: i === 0, count: stat ? stat.count : 0, + verifiedCount: stat ? stat.verifiedCount : 0, reconciledCount: stat ? stat.reconciledCount : 0, totalKg: stat ? Math.round(stat.totalKg * 100) / 100 : 0, totalAmount: stat ? Math.round(stat.totalAmount * 100) / 100 : 0 @@ -2781,8 +2792,10 @@ const Component = function () { className: 'hr-daily-stat-card' + (item.isToday ? ' hr-daily-stat-card--today' : ''), role: 'article', 'aria-label': item.date - + ' 加氢数据 ' + item.count + ' 条,已对账 ' + item.reconciledCount - + ' 条,加氢量 ' + hrFormatKg(item.totalKg) + ' kg,加氢总额 ' + + ' 数据条数 总数 ' + item.count + + ',已核对 ' + item.verifiedCount + + ',已对账 ' + item.reconciledCount + + ',加氢量 ' + hrFormatKg(item.totalKg) + ' kg,加氢总额 ' + hrFormatYuan(item.totalAmount) + ' 元' }, React.createElement('div', { className: 'hr-daily-stat-card__date' }, @@ -2790,21 +2803,32 @@ const Component = function () { item.isToday ? React.createElement('span', { className: 'hr-daily-stat-card__today-tag' }, '今天') : null ), React.createElement('div', { className: 'hr-daily-stat-card__metrics' }, - React.createElement('div', { className: 'hr-daily-stat-card__metric' }, - React.createElement('span', { className: 'hr-daily-stat-card__label' }, '加氢数据条数'), - React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--count tabular-nums' }, String(item.count)) + React.createElement('div', { className: 'hr-daily-stat-card__count-block' }, + React.createElement('span', { className: 'hr-daily-stat-card__count-title' }, '数据条数'), + React.createElement('div', { className: 'hr-daily-stat-card__count-row' }, + React.createElement('div', { className: 'hr-daily-stat-card__count-item' }, + React.createElement('span', { className: 'hr-daily-stat-card__count-item-label' }, '总数'), + React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--count tabular-nums' }, String(item.count)) + ), + React.createElement('div', { className: 'hr-daily-stat-card__count-item' }, + React.createElement('span', { className: 'hr-daily-stat-card__count-item-label' }, '已核对'), + React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--verified tabular-nums' }, String(item.verifiedCount)) + ), + React.createElement('div', { className: 'hr-daily-stat-card__count-item' }, + React.createElement('span', { className: 'hr-daily-stat-card__count-item-label' }, '已对账'), + React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--reconciled tabular-nums' }, String(item.reconciledCount)) + ) + ) ), - React.createElement('div', { className: 'hr-daily-stat-card__metric' }, - React.createElement('span', { className: 'hr-daily-stat-card__label' }, '已对账条数'), - React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--reconciled tabular-nums' }, String(item.reconciledCount)) - ), - React.createElement('div', { className: 'hr-daily-stat-card__metric' }, - React.createElement('span', { className: 'hr-daily-stat-card__label' }, '加氢量'), - React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--kg tabular-nums' }, hrFormatKg(item.totalKg)) - ), - React.createElement('div', { className: 'hr-daily-stat-card__metric' }, - React.createElement('span', { className: 'hr-daily-stat-card__label' }, '加氢总额'), - React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--amount tabular-nums' }, hrFormatYuan(item.totalAmount)) + React.createElement('div', { className: 'hr-daily-stat-card__metrics-bottom' }, + React.createElement('div', { className: 'hr-daily-stat-card__metric' }, + React.createElement('span', { className: 'hr-daily-stat-card__label' }, '加氢量'), + React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--kg tabular-nums' }, hrFormatKg(item.totalKg)) + ), + React.createElement('div', { className: 'hr-daily-stat-card__metric' }, + React.createElement('span', { className: 'hr-daily-stat-card__label' }, '加氢总额'), + React.createElement('span', { className: 'hr-daily-stat-card__value hr-daily-stat-card__value--amount tabular-nums' }, hrFormatYuan(item.totalAmount)) + ) ) ) );