feat: sync full workspace including web modules, docs, and configurations to Gitea

Optimized the root .gitignore to exclude virtual environments, node modules,
and temp folders to ensure clean and lightweight version tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
王冕
2026-06-09 18:12:25 +08:00
parent 351688006e
commit a27e3b8e43
1510 changed files with 162044 additions and 1517 deletions

157
docs/ANTD-DESIGN-SPEC.md Normal file
View File

@@ -0,0 +1,157 @@
# Ant DesignANTD设计规范
> 本文档汇总 **Ant Design 官方设计理念** 与 **在本仓库ONE-OS / web 端原型)中的落地约定**。
> 官方参考:[设计价值观](https://ant.design/docs/spec/values-cn) · [设计模式](https://ant.design/docs/spec/overview-cn) · [组件总览](https://ant.design/components/overview-cn)
主题内更细的 Token 与主题说明见:`axhub-make/src/themes/antd-new/DESIGN.md`
---
## 一、产品定位与适用场景
Ant Design 面向 **企业级中后台**:数据密集、流程复杂、角色多样。目标是 **降低协作成本、保证一致性、提升交付效率**
| 适合 | 需谨慎 |
|------|--------|
| 管理后台、运营台、审批与报表 | 强品牌 C 端营销页(需额外视觉体系) |
| 表单、表格、筛选、仪表盘 | 与另一套 UI 库混用(易产生样式与交互冲突) |
| 内部工具、B 端 SaaS | 极简移动端 H5可评估 [Ant Design Mobile](https://mobile.ant.design) |
---
## 二、四大设计价值观(官方)
设计语言层面的「为什么这样设计」,实现组件与文档时应与之对齐。
### 1. 自然Natural
- 感知、行为符合用户习惯,减少刻意学习与记忆。
- 文案、隐喻贴近真实业务场景,避免生造概念。
- 动效克制,用于说明状态与空间关系,而非炫技。
### 2. 确定性Certainty
- **设计确定性**:模式可预期(同类操作用同类组件与布局)。
- **实现确定性**:设计 Token、组件 API 稳定,减少「同一需求多种写法」。
- **用户心智确定性**:同一语义的按钮、颜色、反馈在全站一致。
### 3. 意义感Meaning
- 每个元素应有清晰目的:为何展示、为谁服务、与上下游任务的关系。
- 避免为填满版面而堆组件;信息层级服务于 **主任务路径**
### 4. 生长感Growth
- 系统随业务扩展:模块、主题、国际化可演进。
- 优先使用 Token / `ConfigProvider` 扩展,而非大量硬编码覆盖组件内部样式。
---
## 三、页面与交互层面的设计原则(落地检查清单)
在画原型或写页面时,可逐条对照(与 Arco 等体系表述不同,但可并行使用)。
| 原则 | 要求 |
|------|------|
| **Stay on the Page** | 能在当前页完成的,尽量不跳转;必要时用抽屉、步骤条、标签页拆分。 |
| **React Immediately** | 点击、提交、加载、成功/失败要有即时可见反馈(按钮 loading、表格骨架屏、`message` 等)。 |
| **Provide an Invitation** | 主操作、可编辑区域通过主次按钮、留白与分组被自然发现。 |
| **Make it Direct** | 能直接点的不要藏三层菜单;表格行内操作与批量操作语义区分清楚。 |
| **Keep it Lightweight** | 同一屏信息密度可控;复杂筛选可折叠或分步;避免无意义装饰。 |
| **Use Transition** | 展开/收起、抽屉、模态出现与消失使用组件自带动效,保持节奏一致。 |
---
## 四、视觉与 Token摘要
详细数值与分类见 `axhub-make/src/themes/antd-new/DESIGN.md`。此处仅列 **命名与用法约定**
### 1. 色彩语义
- **主色Primary**:主按钮、链接、关键选中态。
- **功能色**Success / Warning / Error / Info 仅表达对应语义,不混用作装饰。
- **中性色**:标题、正文、次要说明、边框、背景层级与 antd 文字色阶梯对齐。
### 2. 间距与布局
-**4px 基准网格** 思考间距;列表、表单优先用 `Space``Row`/`Col` 而非零散 `margin`
- 使用 **24 栅格** 做响应式分栏;断点含义与 antd 文档一致。
### 3. 字体与层级
- 正文默认 **14px**;标题用 `Typography.Title` 层级,避免随意放大字号破坏韵律。
- 辅助说明可用 **12px** 次要色,但需保证对比度与可读性。
### 4. 圆角与层级
- 控件与卡片圆角与主题 Token 一致弹层类Modal、Dropdown阴影强于内容区卡片体现 **Z 轴层级**
---
## 五、组件选用与反馈层级
### 1. 反馈方式选择
| 场景 | 推荐 |
|------|------|
| 操作成功/失败一句话 | `message` |
| 需稍后查看或带标题的通告 | `notification` |
| 需用户明确确认或中断流程 | `Modal` / `Popconfirm` |
| 复杂表单、多步编辑、详情+编辑 | `Drawer` 或独立页 |
| 行内轻确认 | `Popconfirm` |
原则:**能不打断主流程就不弹 Modal**;全局提示不要过于频繁堆叠。
### 2. 表单
- 使用 **Form** 管理字段、校验与提交;标签、必填星号、错误信息与 antd 默认模式一致。
- 长表单:分组(`Divider` / 卡片)、分步(`Steps`)或分 Tab避免单屏过长。
### 3. 表格
- **小数据**:常规分页即可。
- **大数据**:虚拟滚动、列固定、合理 `scroll`;避免无分页的一次性超大渲染。
- 操作列:主次分明(主操作用 `Button type="link"` 或主色按钮,危险操作用 `danger` + 二次确认)。
### 4. 按钮语义
| 类型 | 用途 |
|------|------|
| `primary` | 每区块/每弹窗 **唯一** 主路径提交或强引导 |
| `default` | 次要操作 |
| `dashed` | 添加、可选扩展 |
| `link` | 表格行内、弱干扰文字链 |
| `text` | 工具栏内轻量操作 |
---
## 六、无障碍与国际化(建议)
- **键盘**焦点顺序合理Modal 打开后焦点 trap可交互元素可被 Tab 聚焦。
- **颜色**:不单独依赖颜色传达状态(配合图标、文案)。
- **文案**:按钮与标题用 **动词或动宾结构**(如「设为已读」「导出报表」);错误信息说明原因与下一步。
- **国际化**:面向多语言时避免写死拼接顺序,使用参数化文案;日期数字格式交给 `ConfigProvider` locale。
---
## 七、在本项目中的开发约定web 端 JSX 原型)
1. **入口**:通过 `window.antd` 取组件时,保持与官方 API 一致,避免魔改组件封装导致文档与代码脱节。
2. **主题**:全局主题以 `ConfigProvider` + Token 为准;局部特殊色尽量与 Token 映射一致,减少 `#` 硬编码。
3. **样式覆盖**:优先 `className` + 外层布局控制;避免对 `.ant-*` 大段 `!important`
4. **一致性**:同一业务场景(如列表筛选、详情抽屉)在不同页面复用相同结构与组件组合,便于用户形成习惯。
---
## 八、文档与协作
- 新增复杂页:在原型或 PR 中说明 **主任务、信息架构、关键反馈** 与本文档哪几条原则对应。
- 与设计师对齐时:以 antd 组件名为沟通基准,减少「自定义组件名」与实现不一致。
---
## 九、延伸阅读
- [定制主题](https://ant.design/docs/react/customize-theme-cn)
- [从 v4 到 v5](https://ant.design/docs/react/migration-v5-cn)(若仓库存在混版本引用)
- 仓库内主题细则:`axhub-make/src/themes/antd-new/DESIGN.md`

View File

@@ -0,0 +1,119 @@
# 《数字化资产 ONE-OS 运管平台》用户使用手册(初稿)
> 依据录屏画面可见文案整理;未在画面确认或存在多版本文案处已标注「待补充」。
> 视频时长约 32.8 秒。
---
## 一、产品简介
本录屏展示的是 `数字化资产 ONE-OS 运管平台` 移动端界面。用户可通过账号密码登录,使用底部导航在 `待办``业务``地图``我的` 等模块间切换;在 `业务管理` 中进入 `运维管理` 下的 `车辆管理`,对车辆进行车牌搜索与多条件筛选(运营状态、省份、城市),列表区域会展示车辆数量统计与车牌列表。
- 产品全称:`数字化资产 ONE-OS 运管平台`
- 副标题:`氢智能服务平台`
- 其他模块详情:`待补充`
---
## 二、适用对象
- 需要使用本运管平台进行日常登录与业务操作的内部运营或管理人员
- 需要查看待办任务、进入业务管理并维护车辆信息列表的用户
- 更细分的角色与权限说明:`待补充`
---
## 三、页面说明
### 3.1 登录页
| 元素类型 | 可见文案 / 说明 |
|------|------|
| 主标题 | 数字化资产 ONE-OS 运管平台 |
| 副标题 | 氢智能服务平台 |
| 输入框 | 账号区可见示例 `admin`;密码区带眼睛图标 |
| 协议 | 阅读并同意《用户服务协议》和《隐私政策》 |
| 主按钮 | 立即登录 |
| 次按钮 | 手机号授权登录 |
| 底部链接 | 游客登录 |
未展示项:忘记密码、验证码、错误提示。
### 3.2 待办
| 元素类型 | 可见文案 / 说明 |
|------|------|
| 顶栏标题 | 待办 |
| 区块标题 | 待办任务 |
| 统计 | 共 0 条任务 |
| 底部导航 | 待办、业务、地图、我的 |
### 3.3 业务管理
| 分组 | 可见入口 |
|------|------|
| 运维管理 | 车辆管理、备车、交车、还车、替换车、调拨、年审、异动、故障、司机安全培训 |
| 审批管理 | 审核中心 |
| 数据可视化 | 车辆统计、氢费统计、氢量汇总、电量汇总、里程查询 |
说明:个别菜单名称可能存在版本差异,以线上为准。
### 3.4 车辆管理列表页
| 元素类型 | 可见文案 / 说明 |
|------|------|
| 顶栏 | 左侧返回、标题“车辆管理”、右上角更多图标 |
| 搜索 | 占位文案:请输入车牌号查询 |
| 筛选入口 | 搜索框右侧漏斗图标 |
| 列表标签 | 全国 |
| 统计灰字 | 当前车辆数 / 总车辆数等,口径待补充 |
| 列表内容 | 以车牌号为主文案,行尾 `>` 表示可进入下级 |
### 3.5 筛选抽屉
| 元素类型 | 可见文案 / 说明 |
|------|------|
| 抽屉标题 | 筛选 |
| 车辆运营状态 | 全部、租赁、自营、可运营、待运营、退出运营 |
| 车辆运营省份 | 全部、江苏省、浙江省、安徽省、山东省、河南省、湖北省、广东省、四川省、贵州省、陕西省 |
| 车辆运营城市 | 与省份联动,示例可见:合肥市等 |
| 底部按钮 | 重置、确定 |
---
## 四、操作流程
1. 打开应用,进入登录页。
2. 输入或确认账号、密码。
3. 勾选《用户服务协议》和《隐私政策》。
4. 点击 `立即登录`
5. 进入底部 `待办` 模块,查看待办任务列表。
6. 点击底部 `业务`,进入 `业务管理`
7.`运维管理` 中点击 `车辆管理`
8. 浏览车辆列表与顶部数量统计。
9. 如需查询,点击搜索框并输入车牌号。
10. 如需筛选,点击漏斗图标打开 `筛选` 抽屉。
11. 依次选择 `车辆运营状态``车辆运营省份``车辆运营城市`
12. 点击 `确定` 应用筛选条件。
13. 如需清空条件,点击 `重置`
14. 点击左上角返回,回到上一级页面。
---
## 五、注意事项
1. 本手册基于录屏画面整理,未识别语音内容。
2. 个别文案存在版本差异时,以线上正式环境为准。
3. 车辆数统计口径、筛选是否支持多选、详情页结构等仍需补充确认。
4. 地图、我的、车辆详情页、更多菜单等未在视频中完整展示,当前均记为 `待补充`
---
## 六、待补充项
- 登录失败、未勾选协议时的提示文案
- 车辆详情页字段与操作
- 更多菜单中的功能项
- 地图模块说明
- 我的模块说明
- 各角色权限差异

View File

@@ -0,0 +1,256 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ONEOS 与旧资产管理平台对比及迁移总结</title>
<style>
:root {
--primary: #1a56db;
--primary-light: #e8effc;
--text: #1f2937;
--muted: #6b7280;
--border: #e5e7eb;
--bg: #f9fafb;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", sans-serif;
color: var(--text);
line-height: 1.65;
background: var(--bg);
padding: 40px 24px 60px;
}
.page {
max-width: 820px;
margin: 0 auto;
background: #fff;
border-radius: 12px;
box-shadow: 0 4px 24px rgba(0,0,0,.08);
overflow: hidden;
}
.cover {
background: linear-gradient(135deg, #1e3a8a 0%, #1a56db 55%, #3b82f6 100%);
color: #fff;
padding: 48px 48px 40px;
}
.cover .tag {
display: inline-block;
font-size: 12px;
letter-spacing: .08em;
opacity: .85;
margin-bottom: 12px;
}
.cover h1 {
font-size: 26px;
font-weight: 700;
line-height: 1.35;
margin-bottom: 16px;
}
.cover .meta { font-size: 14px; opacity: .9; }
.cover .meta span { margin-right: 20px; }
.body { padding: 40px 48px 48px; }
h2 {
font-size: 18px;
color: var(--primary);
border-left: 4px solid var(--primary);
padding-left: 12px;
margin: 32px 0 16px;
}
h2:first-child { margin-top: 0; }
h3 { font-size: 15px; color: #111827; margin: 20px 0 10px; }
p { margin-bottom: 12px; font-size: 14px; }
.lead {
font-size: 15px;
color: #374151;
background: var(--primary-light);
border-radius: 8px;
padding: 16px 20px;
}
table.compare {
width: 100%;
border-collapse: collapse;
font-size: 13px;
margin: 16px 0 24px;
}
table.compare th,
table.compare td {
border: 1px solid var(--border);
padding: 10px 14px;
text-align: left;
vertical-align: top;
}
table.compare th { background: #f3f4f6; font-weight: 600; width: 22%; }
.pill {
display: inline-block;
font-size: 11px;
font-weight: 600;
padding: 2px 8px;
border-radius: 4px;
margin-right: 6px;
}
.pill-new { background: #dbeafe; color: #1d4ed8; }
.pill-old { background: #f3f4f6; color: #4b5563; }
ul.items { list-style: none; margin: 0 0 8px; }
ul.items > li {
position: relative;
padding: 8px 0 8px 20px;
font-size: 13.5px;
border-bottom: 1px dashed var(--border);
}
ul.items > li:last-child { border-bottom: none; }
ul.items > li::before {
content: "";
position: absolute;
left: 0;
top: 15px;
width: 6px;
height: 6px;
background: var(--primary);
border-radius: 50%;
}
ul.items strong { color: #111827; }
ul.items em { color: var(--muted); font-style: normal; font-size: 12.5px; }
.section-label {
display: inline-block;
font-size: 12px;
font-weight: 700;
color: #fff;
background: var(--primary);
padding: 3px 10px;
border-radius: 4px;
margin-bottom: 12px;
}
.migration-box {
background: #fffbeb;
border: 1px solid #fcd34d;
border-radius: 8px;
padding: 16px 20px;
}
.migration-box h3 { margin-top: 0; color: #92400e; }
.footer {
margin-top: 32px;
padding-top: 16px;
border-top: 1px solid var(--border);
font-size: 12px;
color: var(--muted);
text-align: center;
}
@media print {
body { background: #fff; padding: 0; }
.page { box-shadow: none; border-radius: 0; }
}
</style>
</head>
<body>
<div class="page">
<header class="cover">
<div class="tag">系统对比 · 迁移总结</div>
<h1>ONEOS 与旧资产管理平台<br />对比及迁移情况汇报</h1>
<div class="meta">
<span>新版系统ONEOS</span>
<span>旧版系统:旧资产管理平台</span>
</div>
</header>
<main class="body">
<section>
<h2>一、汇报主旨</h2>
<p class="lead">
说明 <strong>ONEOS</strong> 相对 <strong>旧资产管理平台</strong> 在业务、运维两方面的核心优化,
以及旧系统向新系统的迁移成效,便于管理层快速把握建设成果与后续重点。
</p>
</section>
<section>
<h2>二、系统定位对比</h2>
<table class="compare">
<thead>
<tr>
<th>维度</th>
<th><span class="pill pill-new">ONEOS</span>新版</th>
<th><span class="pill pill-old">旧版</span>旧资产管理平台</th>
</tr>
</thead>
<tbody>
<tr>
<td>定位</td>
<td>业务—财务—能源—运维一体化,数据由业务驱动、流程闭环</td>
<td>以资产管理为主,多环节依赖人工统计与线下协同</td>
</tr>
<tr>
<td>数据可信</td>
<td>关键数据来自业务单据,可追溯、不可随意篡改</td>
<td>部分可人工修改,易出现业务与账务不闭环</td>
</tr>
<tr>
<td>自动化</td>
<td>账单、收付款、对账、台账、报表自动或半自动</td>
<td>账单与能源对账等大量依赖人工汇总</td>
</tr>
</tbody>
</table>
</section>
<section>
<h2>三、新版核心优化</h2>
<span class="section-label">A · 业务层面</span>
<ul class="items">
<li><strong>合同管理</strong>:归档合同改动可查询;支持新增车辆、转三方、快速续签、试用转正式、附加服务费用并留痕。<em>(旧:历史不留痕,无法一键转三方/续签)</em></li>
<li><strong>账单自动生成</strong>:提车应收、租赁账单、还车应结等按规则生成应收/实收,并产生待办提醒。</li>
<li><strong>收付款自动化</strong>:各业务线首付款逐步对接财务,自动形成收付款单,业务自主勾对流水。</li>
<li><strong>能源自助对账</strong>:氢电账单导入、一键对账;按车牌与加氢时间归集站端/客户对账单,支持能源账户自动扣费。<em>(旧:人工统计)</em></li>
<li><strong>台账自动生成</strong>:按实收统计期初账单、保证金余额;不足抵扣下期时预警。</li>
<li><strong>业务数据统计</strong>:按月统计租赁、自营、氢费、电费等业绩/成本/利润,支持全览→业务员→客户→项目→明细钻取。</li>
</ul>
<span class="section-label" style="margin-top: 24px;">B · 运维层面</span>
<ul class="items">
<li><strong>车辆全生命周期</strong>:采购至报废/销售统一在新系统发起,数据来自业务、不可随意篡改。<em>(旧:可人工改数,数据易脱节)</em></li>
<li><strong>日常备车</strong>:备车库提前备车,提升交车时效。<em>(旧:现场备车效率低、不确定性大)</em></li>
<li><strong>安全培训线上化</strong>:司机扫码上传证件、线上培训留痕。</li>
<li><strong>交还车优化</strong>:自动计算轮胎磨损、证照、无忧包减免等;连拍提效,单车约省 5 分钟。</li>
<li><strong>故障处理</strong>:微信群机器人 + AI 方案 + 工单;需人工时自动生成待办。</li>
<li><strong>维修管理</strong>:向维修站派单、站端接单上传、审核后对接财务(开发中)。</li>
<li><strong>运维数据统计</strong>:按月统计备车/交还车/调拨/异动等;故障、维修、保养(后两者计划第二版)。</li>
</ul>
</section>
<section>
<h2>四、迁移情况总结</h2>
<div class="migration-box">
<h3>总体判断</h3>
<p>
旧平台业务正分模块迁移至 <strong>ONEOS</strong><strong>业务财务主线</strong>(合同、账单、收付款、能源对账、台账、经营分析)已具备自动化与留痕;
<strong>运维主线</strong>(车辆全生命周期、交还车、备车、培训、故障、维修)已实现线上化与数据统计。
</p>
<p style="margin-bottom: 0;">
<strong>迁移价值</strong>:由「人盯人、表对表」转向「规则驱动 + 待办提醒 + 数据钻取」,显著降低人工对账、改数与重复录入成本;维修财务闭环(进行中)、保养统计(第二版规划)为后续重点。
</p>
</div>
</section>
<section>
<h2>五、关键对比一览</h2>
<table class="compare">
<thead>
<tr><th>能力域</th><th>旧资产管理平台</th><th>ONEOS</th></tr>
</thead>
<tbody>
<tr><td>合同</td><td>改动难追溯;转三方/续签繁琐</td><td>全量留痕;多种扩展与一键操作</td></tr>
<tr><td>账单与收款</td><td>手工建账核对</td><td>规则生成应收实收 + 待办</td></tr>
<tr><td>氢/电对账</td><td>人工统计</td><td>导入、一键对账、自动扣费</td></tr>
<tr><td>经营分析</td><td>分散难下钻</td><td>按月统计 + 多级钻取</td></tr>
<tr><td>车辆数据</td><td>可人工改</td><td>业务驱动、不可随意篡改</td></tr>
<tr><td>交还车/备车</td><td>现场操作重</td><td>备车库 + 自动计费 + 连拍</td></tr>
<tr><td>故障与维修</td><td>记录分散</td><td>机器人+AI+工单+派单(财务对接开发中)</td></tr>
</tbody>
</table>
</section>
<p class="footer">文档生成日期2026年5月 · 仅供内部汇报使用</p>
</main>
</div>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,244 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成小羚羚氢能产业数字化平台方案书 Word 文档"""
from pathlib import Path
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.shared import Cm, Pt, RGBColor
OUTPUT = Path(__file__).resolve().parent / "小羚羚氢能产业数字化平台方案书.docx"
FONT_CN = "微软雅黑"
COLOR_PRIMARY = RGBColor(0x00, 0xBF, 0xA5)
COLOR_TITLE = RGBColor(0x1A, 0x1F, 0x2E)
COLOR_MUTED = RGBColor(0x5C, 0x65, 0x78)
def set_run_font(run, size=11, bold=False, color=None, name=FONT_CN):
run.font.name = name
run._element.rPr.rFonts.set(qn("w:eastAsia"), name)
run.font.size = Pt(size)
run.font.bold = bold
if color:
run.font.color.rgb = color
def add_para(doc, text, size=11, bold=False, color=None, align=None, space_after=6):
p = doc.add_paragraph()
if align is not None:
p.alignment = align
p.paragraph_format.space_after = Pt(space_after)
p.paragraph_format.line_spacing = 1.35
run = p.add_run(text)
set_run_font(run, size=size, bold=bold, color=color)
return p
def add_heading(doc, text, level=1):
h = doc.add_heading(level=level)
h.clear()
run = h.add_run(text)
sizes = {1: 22, 2: 16, 3: 13}
set_run_font(run, size=sizes.get(level, 12), bold=True, color=COLOR_TITLE if level == 1 else COLOR_PRIMARY)
h.paragraph_format.space_before = Pt(14 if level > 1 else 0)
h.paragraph_format.space_after = Pt(8)
return h
def shade_cell(cell, fill="E8F8F4"):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
shd = tcPr.find(qn("w:shd"))
if shd is None:
from docx.oxml import OxmlElement
shd = OxmlElement("w:shd")
tcPr.append(shd)
shd.set(qn("w:fill"), fill)
shd.set(qn("w:val"), "clear")
def add_table(doc, headers, rows, col_widths=None):
table = doc.add_table(rows=1 + len(rows), cols=len(headers))
table.style = "Table Grid"
table.alignment = WD_TABLE_ALIGNMENT.CENTER
hdr_cells = table.rows[0].cells
for i, h in enumerate(headers):
hdr_cells[i].text = ""
run = hdr_cells[i].paragraphs[0].add_run(h)
set_run_font(run, size=10, bold=True, color=COLOR_TITLE)
shade_cell(hdr_cells[i], "D4F5EC")
for ri, row in enumerate(rows):
cells = table.rows[ri + 1].cells
for ci, val in enumerate(row):
cells[ci].text = ""
run = cells[ci].paragraphs[0].add_run(str(val))
set_run_font(run, size=10)
if ri % 2 == 1:
shade_cell(cells[ci], "F7FBFA")
if col_widths:
for row in table.rows:
for i, w in enumerate(col_widths):
row.cells[i].width = Cm(w)
doc.add_paragraph()
return table
def build_document():
doc = Document()
section = doc.sections[0]
section.top_margin = Cm(2.5)
section.bottom_margin = Cm(2.5)
section.left_margin = Cm(2.8)
section.right_margin = Cm(2.8)
# 封面
add_para(doc, "", space_after=24)
add_para(doc, "羚牛氢能 · OneOS 生态", size=12, color=COLOR_MUTED, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=12)
add_para(doc, "小羚羚氢能产业数字化平台方案书", size=26, bold=True, color=COLOR_PRIMARY, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=16)
add_para(doc, "手机端「小羚羚」多端协同 · 氢能产业链数字化规划", size=13, color=COLOR_MUTED, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=32)
meta = doc.add_paragraph()
meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
for line in ["文档版本v1.0", "文档类型:平台建设规划 / 商业计划", "适用读者:管理层、产品、业务、项目团队"]:
r = meta.add_run(line + "\n")
set_run_font(r, size=11, color=COLOR_MUTED)
doc.add_page_break()
# 一、概述
add_heading(doc, "一、项目概述", 1)
add_para(doc, "以手机端「小羚羚」为统一入口,连接内部运营、车队客户、司机、加氢站、维修站、制氢企业与集团客户,实现氢气采购—加氢站—氢能车运营全链路数字化闭环。")
add_para(doc, "一句话定位", size=12, bold=True, color=COLOR_PRIMARY, space_after=4)
add_para(doc, "小羚羚 = 氢能产业的「业务操作系统」:一端登录、多角色协同,把合同、车辆、能源、维保、氢气贸易串成可落地、可风控、可结算的完整商业链条。")
add_heading(doc, "核心指标", 2)
add_table(doc, ["指标项", "目标值"], [
["目标用户角色", "7 类"],
["业务闭环条数", "3 条"],
["产业链覆盖", "上中下游(制氢采购 → 加氢站 → 氢能车运营)"],
["首期上线周期", "6 个月"],
], col_widths=[5, 11])
# 二、产业链商业计划
add_heading(doc, "二、氢能产业链商业计划(上游 → 下游)", 1)
add_para(doc, "覆盖氢气采购、加氢站运营、氢能车租赁/自营三大环节,形成「制氢—储运—加注—运营—结算」一体化商业模式。")
add_heading(doc, "2.1 产业链三段式布局", 2)
add_table(doc, ["环节", "业务内容", "平台价值"], [
["上游 · 制氢采购", "制氢企业挂牌售氢、管束车调度、到站交付", "氢气贸易与物流协同"],
["中游 · 加氢站", "预约接单、电子加氢卡结算、巡检与对账", "加注服务数字化与氢费结算"],
["下游 · 氢能车运营", "租赁/自营、交还车、能源与 ETC 账单闭环", "车辆运营与资产管理"],
], col_widths=[3.5, 7, 5.5])
add_heading(doc, "2.2 商业模式与收入结构", 2)
add_heading(doc, "上游 · 氢气贸易", 3)
add_para(doc, "制氢企业在线挂牌售氢;加氢站/运营方发起采购询价;成交后管束车配送到站。平台收取交易撮合费、物流调度服务费、数据监测服务费。")
add_heading(doc, "中游 · 加氢服务", 3)
add_para(doc, "司机预约加氢、电子加氢卡预充值结算;站点 OCR 识别加氢量自动入账;氢费对账线上化。平台收取 SaaS 服务费、支付通道费、对账增值服务费。")
add_heading(doc, "下游 · 车辆运营", 3)
add_para(doc, "租赁/自营合同在线签约;交还车+替换车闭环;能源/ETC/维保账单聚合;客户评级与敏感客户风控。平台核心收入为租赁服务费、资产管理费、金融结算服务。")
# 三、平台架构
add_heading(doc, "三、平台架构:七类用户 · 一套数据底座", 1)
add_table(doc, ["用户端", "主体", "核心能力", "关键场景"], [
["内部用户", "羚牛氢能员工", "合同-收款-交还车-结算全链路;车辆全生命周期;风控审批", "业务员/运维/能源/财务/法务/CEO 等"],
["车队长", "车队管理者", "一键租车报价签约;车辆运行/账单/开票/对讲", "注册验证、在线合同、实时定位"],
["氢能车司机", "自营+外部租赁", "路线导航、能源账单、安全培训考试、预约加氢、故障救援", "内外部司机差异化权限"],
["加氢站用户", "站点运营", "预约接单、电子加氢卡结算、OCR 识别加氢量、氢费对账", "特种设备/行驶证校验"],
["维修站用户", "维保服务", "维修/保养派单接单、费用记录、运维核实对账", "配件人工自动入账"],
["制氢企业", "氢气供应", "在线挂牌售氢、管束车监测、询价成交与运费结算", "对接加氢站采购"],
["集团客户", "企业级客户", "多项目车辆/账单/能源/ETC 总览;在线租车签约", "类车队长但主体为企业"],
], col_widths=[2.2, 2.5, 6.3, 5])
# 四、分角色方案
add_heading(doc, "四、分角色业务方案(可落地)", 1)
add_heading(doc, "4.1 内部用户 — 运营中枢与风控大脑", 2)
add_para(doc, "羚牛氢能内部员工 · 多部门协同", size=10, color=COLOR_MUTED)
add_para(doc, "业务条线 A氢能车租赁/自营", size=11, bold=True)
add_para(doc, "合同发起 → 客户评级/敏感客户校验 → 标准/非标合同审批 → 收款 → 交车 → 账单收款 → 还车 → 还车结算。过程中支持替换车业务,全程留痕、可审计。")
add_para(doc, "业务条线 B车辆全生命周期", size=11, bold=True)
add_para(doc, "采购/外租 → 验车入库 → 维修/年审/保养/故障/事故 → 出库(出售/报废/停租)。形成单车全生命周期数据档案,支撑资产决策与残值管理。")
add_para(doc, "覆盖角色业务员、客服、运维、能源、安全、财务、法务、CEO 等;按岗位分配功能模块与审批权限。")
add_heading(doc, "4.2 车队长 — 车队管理者自助门户", 2)
add_para(doc, "注册验证 · 在线租车 · 合同签约", size=10, color=COLOR_MUTED)
add_para(doc, "一键登录验证注册状态:未注册客户可快速登记营业执照/身份证;已注册客户直接进入管理页。")
add_table(doc, ["步骤", "动作", "系统响应"], [
["1", "选择车型、数量、租期发起租车意向", "短信/推送通知对应业务员"],
["2", "系统按地区自动生成报价单", "业务员可调整并与客户在线沟通"],
["3", "确认报价并提交", "自动生成电子合同,推送客户签章"],
["4", "运维完成交车", "车队长查看车辆运行、账单、开票、对讲"],
], col_widths=[1.2, 6, 8.8])
add_para(doc, "交车后能力:实时定位/轨迹、氢/电能源账单、ETC、合同账单、付款、在线开票、语音对讲类对讲机")
add_heading(doc, "4.3 氢能车司机 — 自营与外部双轨", 2)
add_table(doc, ["类型", "核心能力"], [
["内部自营司机", "定位/轨迹、送货路线规划与导航、氢/电/ETC 账单、安全培训与定期考试、证照管理、氢/电量提醒、预约附近加氢站(校验特种设备登记/行驶证)、故障提报、紧急救援"],
["外部租赁司机", "轨迹与路线导航、能源/ETC 账单、安全培训、司机与车辆证件管理、预约加氢(证件校验提示)、故障提报、紧急救援;不含集团内部物流专属调度能力"],
], col_widths=[3, 13])
add_heading(doc, "4.4 加氢站用户 — 加注服务与氢费结算", 2)
add_table(doc, ["功能模块", "说明"], [
["预约接单", "验证车辆特种设备检验登记、行驶证后确认服务"],
["电子加氢卡结算", "扫描司机电子加氢卡,预充值客户直接扣款"],
["加氢过程管理", "加氢前/中/后检查、卸气记录、站点巡检记录"],
["OCR 加氢量识别", "拍摄加氢机面板自动识别加氢量,绑定车辆生成记录"],
["氢费对账", "接收并操作氢费对账单,线上确认"],
["氢气采购", "向制氢企业发起采购(与上游模块联动)"],
], col_widths=[3.5, 12.5])
add_heading(doc, "4.5 维修站用户 — 维保派单与对账", 2)
add_para(doc, "接收内部员工发起的维修/保养派单 → 记录维修过程与人工/配件费用 → 自动生成维修记录 → 运维核实 → 内部用户与维修站在线对账及账期结算。与车辆全生命周期数据打通。")
add_heading(doc, "4.6 制氢企业 — 氢气在线交易与物流", 2)
add_para(doc, "企业资质验证后,在线发布氢气对外采购价(类商城模式);对接管束车实时数据,监测氢气运输车状态;加氢站发起询价与采购申请 → 制氢企业成交 → 运输到场 → 自动计算管束车使用费用。")
add_para(doc, "关键能力:挂牌售氢 · 询价采购 · 物流调度 · 运费结算")
add_heading(doc, "4.7 集团客户 — 企业级总览与在线租车", 2)
add_para(doc, "主体为企业(区别于个人车队长):查看集团所有租赁/自营项目车辆使用情况、全项目账单与结算、电子开票、能源费(氢/电、ETC、司机信息汇总。同时支持 APP 在线租车并生成对应合同,完成业务闭环。")
add_para(doc, "与车队长差异:车队长侧重单车队运营;集团客户侧重企业级多项目、多合同、多车队的统一视图与集团采购决策。", bold=True)
# 五、业务闭环
add_heading(doc, "五、三大业务闭环总览", 1)
loops = [
("闭环一 · 租赁/自营运营(核心收入)", "意向单 → 报价 → 合同(评级/敏感客户审批)→ 交车 → 运营监控 → 账单收款 → 还车 → 结算 → 替换车(如需)"),
("闭环二 · 车辆资产生命周期(资产管控)", "采购/外租 → 验车入库 → 维保/年审/故障/事故 → 能源消耗 → 出库处置;全链路数据沉淀至 OneOS 数据底座"),
("闭环三 · 氢气贸易与加注(产业延伸)", "制氢企业挂牌 → 加氢站询价采购 → 管束车配送 → 司机预约加氢 → 电子加氢卡结算 → 氢费对账 → 运营账单聚合"),
]
for title, flow in loops:
add_para(doc, title, size=12, bold=True, color=COLOR_PRIMARY)
add_para(doc, flow)
# 六、路线图
add_heading(doc, "六、分阶段落地路线图", 1)
add_table(doc, ["阶段", "周期", "重点模块", "交付成果"], [
["第一阶段", "06 月", "内部用户 + 车队长 + 司机核心闭环", "合同审批、交还车、替换车、基础账单"],
["第二阶段", "612 月", "加氢站 + 维修站接入", "预约加氢、电子加氢卡、维修派单对账"],
["第三阶段", "1218 月", "制氢企业 + 氢气采购商城", "挂牌售氢、管束车调度、到站结算"],
["第四阶段", "1824 月", "集团客户 + 数据智能", "集团总览、风控模型、产业数据分析"],
], col_widths=[2.2, 2, 5.8, 6])
# 七、汇报要点
add_heading(doc, "七、向管理层汇报要点", 1)
points = [
"小羚羚不是单一 App而是氢能产业多端协同的数字化入口与 OneOS Web 端形成「大屏管控 + 手机执行」互补。",
"首期 6 个月聚焦租赁闭环与内部风控,快速产生业务价值;氢气贸易模块作为第二增长曲线。",
"客户评级与敏感客户审批机制内嵌合同流程,从源头降低收账风险,支撑非标业务合规扩张。",
"七类用户共用同一数据底座,避免信息孤岛,为后续氢能产业数据分析与智能调度奠定基础。",
]
for i, pt in enumerate(points, 1):
add_para(doc, f"{i}. {pt}")
add_para(doc, "", space_after=24)
add_para(doc, "— 文档结束 —", size=10, color=COLOR_MUTED, align=WD_ALIGN_PARAGRAPH.CENTER)
add_para(doc, "羚牛氢能 · 小羚羚平台方案 · OneOS 生态 · 供内部汇报使用", size=10, color=COLOR_MUTED, align=WD_ALIGN_PARAGRAPH.CENTER)
doc.save(OUTPUT)
return OUTPUT
if __name__ == "__main__":
path = build_document()
print(f"已生成:{path}")

View File

@@ -0,0 +1,129 @@
#!/usr/bin/env python3
"""将「关于暂缓下月工资发放事宜的通知」正文叠到扫描件上,输出 工资通知-暂缓下月.png"""
from __future__ import annotations
import re
import textwrap
from pathlib import Path
from PIL import Image, ImageDraw, ImageFont
ROOT = Path(__file__).resolve().parent
SRC_PNG = ROOT / "工资通知-原图.png"
TXT = ROOT / "关于暂缓下月工资发放事宜的通知.txt"
OUT = ROOT / "工资通知-暂缓下月.png"
SONGTI = "/System/Library/Fonts/Supplemental/Songti.ttc"
MARGIN_L = 72
MARGIN_R = 72
LINE_H = 34
TITLE_Y = 128
CHARS_PER_LINE = 24
def load_font(size: int, bold: bool = False) -> ImageFont.FreeTypeFont:
idx = 1 if bold else 7
return ImageFont.truetype(SONGTI, size, encoding="utf-8", index=idx)
def text_width(s: str, font: ImageFont.FreeTypeFont, draw: ImageDraw.ImageDraw) -> int:
bbox = draw.textbbox((0, 0), s, font=font)
return bbox[2] - bbox[0]
def wrap_line_to_chars(s: str, width: int) -> list[str]:
s = s.strip()
if not s:
return []
return textwrap.wrap(s, width=width, break_long_words=False, break_on_hyphens=False)
def draw_body_paragraph(
draw: ImageDraw.ImageDraw,
y: int,
text: str,
font: ImageFont.FreeTypeFont,
x0: int,
line_h: int,
first_indent: bool,
) -> int:
max_chars = CHARS_PER_LINE - (2 if first_indent else 0)
parts = wrap_line_to_chars(text, max_chars)
for part in parts:
line = ("  " + part) if first_indent else part
draw.text((x0, y), line, font=font, fill=(30, 30, 30))
y += line_h
return y
def main() -> None:
im = Image.open(SRC_PNG).convert("RGB")
draw = ImageDraw.Draw(im)
w, _h = im.size
paper = (255, 255, 255)
# 覆盖标题与正文,下缘略低于原「正文末行」留白,整块至公章上沿(公章约自 y≥708
draw.rectangle([32, 114, w - 34, 706], fill=paper)
# y=706716 狭长带:盖住正文与公章之间的浅灰水印,仅涂左侧留白,不压住公章顶边圆弧
draw.rectangle([36, 706, 446, 716], fill=paper)
# 清空左下角旧署名/日期笔迹(不覆盖右下角公章 x≈453596
draw.rectangle([120, 716, 446, 832], fill=paper)
raw = TXT.read_text(encoding="utf-8")
lines = [ln.rstrip() for ln in raw.splitlines()]
title = lines[0].strip()
i = 1
while i < len(lines) and not lines[i].strip():
i += 1
font_title = load_font(26, bold=True)
font_body = load_font(22, bold=False)
x0 = MARGIN_L
max_px = w - MARGIN_L - MARGIN_R
y = TITLE_Y
tw = text_width(title, font_title, draw)
draw.text(((w - tw) // 2, y), title, font=font_title, fill=(30, 30, 30))
y += 54
while i < len(lines):
line = lines[i].strip()
i += 1
if not line:
y += LINE_H // 2
continue
if line == "全体员工:":
draw.text((x0, y), line, font=font_body, fill=(30, 30, 30))
y += LINE_H
continue
if line == "特此通知。":
twl = text_width(line, font_body, draw)
draw.text((x0 + max_px - twl, y), line, font=font_body, fill=(30, 30, 30))
y += LINE_H * 2
continue
if line.startswith("浙江羚牛"):
twl = text_width(line, font_body, draw)
draw.text((x0 + max_px - twl, y), line, font=font_body, fill=(30, 30, 30))
y += LINE_H
continue
if re.match(r"^\d{4}\d{1,2}月\d{1,2}日$", line):
twl = text_width(line, font_body, draw)
draw.text((x0 + max_px - twl, y), line, font=font_body, fill=(30, 30, 30))
y += LINE_H
continue
first_indent = not bool(re.match(r"^[一二三四五六七八九十]+、", line))
y = draw_body_paragraph(draw, y, line, font_body, x0, LINE_H, first_indent)
im.save(OUT, format="PNG", optimize=True)
print(f"写入 {OUT}")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,836 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>保险采购 · 比价单操作手册</title>
<style>
@page { size: A4; margin: 18mm 16mm 20mm 16mm; }
* { box-sizing: border-box; }
body {
font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
color: #1e293b;
line-height: 1.65;
font-size: 11pt;
margin: 0;
padding: 0;
background: #fff;
}
.cover {
min-height: 260mm;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
page-break-after: always;
background: linear-gradient(160deg, #ecfdf5 0%, #eff6ff 45%, #fff 100%);
border-bottom: 4px solid #059669;
padding: 40px 32px;
}
.cover-badge {
display: inline-block;
padding: 6px 14px;
border-radius: 999px;
background: #059669;
color: #fff;
font-size: 10pt;
font-weight: 700;
letter-spacing: 1px;
margin-bottom: 24px;
}
.cover h1 {
font-size: 28pt;
margin: 0 0 12px;
color: #0f172a;
font-weight: 800;
}
.cover .subtitle {
font-size: 14pt;
color: #475569;
margin-bottom: 48px;
}
.cover-meta {
font-size: 10pt;
color: #64748b;
line-height: 2;
}
.cover-meta strong { color: #334155; }
h2 {
font-size: 16pt;
color: #0f172a;
border-left: 5px solid #059669;
padding-left: 12px;
margin: 28px 0 14px;
page-break-after: avoid;
}
h3 {
font-size: 12.5pt;
color: #1e40af;
margin: 20px 0 10px;
page-break-after: avoid;
}
h4 {
font-size: 11pt;
color: #334155;
margin: 14px 0 8px;
}
p { margin: 8px 0; }
ul, ol { margin: 8px 0; padding-left: 22px; }
li { margin: 4px 0; }
.section { page-break-inside: avoid; margin-bottom: 18px; }
.toc { page-break-after: always; padding: 20px 0; }
.toc ol { font-size: 11pt; line-height: 2.2; }
.toc a { color: #1d4ed8; text-decoration: none; }
.info-box {
background: #f0fdf4;
border: 1px solid #bbf7d0;
border-radius: 10px;
padding: 12px 16px;
margin: 12px 0;
font-size: 10.5pt;
}
.warn-box {
background: #fff7ed;
border: 1px solid #fed7aa;
border-radius: 10px;
padding: 12px 16px;
margin: 12px 0;
font-size: 10.5pt;
}
.tip-box {
background: #eff6ff;
border: 1px solid #bfdbfe;
border-radius: 10px;
padding: 12px 16px;
margin: 12px 0;
font-size: 10.5pt;
}
table.data {
width: 100%;
border-collapse: collapse;
font-size: 10pt;
margin: 12px 0;
}
table.data th, table.data td {
border: 1px solid #e2e8f0;
padding: 8px 10px;
text-align: left;
vertical-align: top;
}
table.data th {
background: #f8fafc;
font-weight: 700;
color: #334155;
}
.diagram-wrap {
margin: 16px 0;
text-align: center;
page-break-inside: avoid;
}
.diagram-wrap svg { max-width: 100%; height: auto; }
.diagram-caption {
font-size: 9.5pt;
color: #64748b;
margin-top: 6px;
text-align: center;
}
.step-card {
border: 1px solid #e2e8f0;
border-radius: 12px;
overflow: hidden;
margin: 16px 0;
page-break-inside: avoid;
}
.step-card-header {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 16px;
background: linear-gradient(90deg, #ecfdf5, #f8fafc);
border-bottom: 1px solid #e2e8f0;
}
.step-num {
width: 32px;
height: 32px;
border-radius: 50%;
background: #059669;
color: #fff;
font-weight: 800;
display: flex;
align-items: center;
justify-content: center;
font-size: 14pt;
flex-shrink: 0;
}
.step-card-header h3 { margin: 0; color: #0f172a; font-size: 12pt; }
.step-card-body { padding: 14px 16px; display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media print {
.step-card-body { grid-template-columns: 1fr 1fr; }
}
.step-text { font-size: 10.5pt; }
.ui-mock {
border: 1px solid #cbd5e1;
border-radius: 8px;
background: #f8fafc;
padding: 10px;
font-size: 9pt;
}
.ui-mock-title {
font-weight: 700;
color: #475569;
margin-bottom: 8px;
padding-bottom: 6px;
border-bottom: 1px dashed #cbd5e1;
font-size: 9pt;
}
.ui-btn {
display: inline-block;
padding: 3px 10px;
border-radius: 6px;
font-size: 8.5pt;
font-weight: 600;
margin: 2px;
}
.ui-btn-primary { background: #2563eb; color: #fff; }
.ui-btn-green { background: #059669; color: #fff; }
.ui-btn-default { background: #fff; border: 1px solid #d1d5db; color: #334155; }
.ui-tag { display: inline-block; padding: 1px 6px; border-radius: 4px; font-size: 8pt; font-weight: 600; }
.ui-tag-green { background: #dcfce7; color: #166534; }
.ui-tag-blue { background: #dbeafe; color: #1e40af; }
.ui-tag-orange { background: #ffedd5; color: #c2410c; }
.ui-tag-red { background: #fee2e2; color: #b91c1c; }
.ui-row { display: flex; gap: 6px; align-items: center; margin: 4px 0; flex-wrap: wrap; }
.ui-field {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 4px;
padding: 4px 8px;
flex: 1;
min-width: 60px;
color: #64748b;
font-size: 8.5pt;
}
.ui-table { width: 100%; border-collapse: collapse; font-size: 8pt; }
.ui-table th, .ui-table td { border: 1px solid #e2e8f0; padding: 4px 6px; background: #fff; }
.ui-table th { background: #f1f5f9; font-weight: 700; }
.amount-bar {
display: flex;
gap: 8px;
margin-top: 8px;
}
.amount-box {
flex: 1;
border-radius: 8px;
padding: 8px;
font-size: 8pt;
}
.amount-box-green { background: #ecfdf5; border: 1px solid #bbf7d0; }
.amount-box-blue { background: #eff6ff; border: 1px solid #bfdbfe; }
.amount-val { font-size: 14pt; font-weight: 800; }
.amount-green { color: #059669; }
.amount-blue { color: #1d4ed8; }
.checklist { list-style: none; padding: 0; }
.checklist li::before { content: "☐ "; color: #059669; font-weight: 700; }
.page-break { page-break-before: always; }
.footer-note {
margin-top: 32px;
padding-top: 12px;
border-top: 1px solid #e2e8f0;
font-size: 9pt;
color: #94a3b8;
text-align: center;
}
.status-flow { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; justify-content: center; margin: 12px 0; font-size: 9pt; }
.status-node {
padding: 6px 12px;
border-radius: 8px;
font-weight: 700;
border: 1px solid;
}
.status-arrow { color: #94a3b8; font-weight: 700; }
.sn-default { background: #f1f5f9; border-color: #cbd5e1; color: #475569; }
.sn-process { background: #dbeafe; border-color: #93c5fd; color: #1d4ed8; }
.sn-success { background: #dcfce7; border-color: #86efac; color: #166534; }
.sn-error { background: #fee2e2; border-color: #fca5a5; color: #b91c1c; }
</style>
</head>
<body>
<!-- 封面 -->
<div class="cover">
<div class="cover-badge">ONE-OS · 业务管理</div>
<h1>保险采购</h1>
<div class="subtitle">比价单操作手册(详细版)</div>
<div class="cover-meta">
<div><strong>适用模块:</strong>业务管理 → 保险采购 → 比价单</div>
<div><strong>适用角色:</strong>采购专员、运营专员</div>
<div><strong>文档版本:</strong>V1.0 &nbsp;|&nbsp; <strong>更新日期:</strong>2026-06-01</div>
<div><strong>路径:</strong>工具栏「比价单管理」/ KPI「险种临期预警」</div>
</div>
</div>
<!-- 目录 -->
<div class="toc">
<h2>目录</h2>
<ol>
<li><a href="#s1">模块概述与核心概念</a></li>
<li><a href="#s2">全流程总览(流程图)</a></li>
<li><a href="#s3">三种创建入口</a></li>
<li><a href="#s4">分步操作说明7 步详解)</a></li>
<li><a href="#s5">采购状态与审批流转</a></li>
<li><a href="#s6">金额汇总说明</a></li>
<li><a href="#s7">提交前自查清单</a></li>
<li><a href="#s8">比价单管理与预警看板</a></li>
<li><a href="#s9">常见问题与处理</a></li>
<li><a href="#s10">字段速查表</a></li>
</ol>
</div>
<!-- 1 概述 -->
<h2 id="s1">一、模块概述与核心概念</h2>
<div class="section">
<div class="info-box">
<strong>比价单</strong>是一次保险采购批次,内含多条<strong>购买记录</strong>(车辆 × 险种)。
比价单与「保单管理」台账<strong>相互独立</strong>,不自动同步;审批通过后需另行录入台账。
</div>
<table class="data">
<tr><th style="width:28%">概念</th><th>说明</th></tr>
<tr><td>比价单</td><td>一次采购任务,含创建日期、创建人、备注、附件及多条购买记录</td></tr>
<tr><td>购买记录</td><td>表格中每一行 = 一辆车 + 一种险种 + 报价 + 最晚付费日</td></tr>
<tr><td>最终比价结果</td><td>从多家报价中选定的一条,作为该行采购金额依据</td></tr>
<tr><td>采购状态</td><td>未提交 → 审批中 → 审批通过;亦可被工作流回写为撤回/审批驳回</td></tr>
<tr><td>最晚付费日</td><td>采购付款截止日≤3 天为临期,过期为超期,列表有标签提醒</td></tr>
</table>
</div>
<!-- 2 全流程 -->
<h2 id="s2">二、全流程总览</h2>
<div class="diagram-wrap">
<svg viewBox="0 0 720 320" width="700" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="arrow" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
<path d="M0,0 L6,3 L0,6 Z" fill="#64748b"/>
</marker>
<linearGradient id="g1" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#ecfdf5"/><stop offset="100%" stop-color="#d1fae5"/></linearGradient>
<linearGradient id="g2" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#eff6ff"/><stop offset="100%" stop-color="#dbeafe"/></linearGradient>
</defs>
<!-- 入口 -->
<rect x="20" y="20" width="120" height="44" rx="8" fill="url(#g1)" stroke="#059669" stroke-width="1.5"/>
<text x="80" y="47" text-anchor="middle" font-size="11" font-weight="700" fill="#065f46">创建比价单</text>
<!-- 维护记录 -->
<rect x="170" y="20" width="120" height="44" rx="8" fill="#fff" stroke="#94a3b8" stroke-width="1.5"/>
<text x="230" y="47" text-anchor="middle" font-size="11" font-weight="600" fill="#334155">添加购买记录</text>
<!-- 报价 -->
<rect x="320" y="20" width="120" height="44" rx="8" fill="#fff" stroke="#94a3b8" stroke-width="1.5"/>
<text x="380" y="47" text-anchor="middle" font-size="11" font-weight="600" fill="#334155">录入报价</text>
<!-- 付费日 -->
<rect x="470" y="20" width="120" height="44" rx="8" fill="#fff" stroke="#94a3b8" stroke-width="1.5"/>
<text x="530" y="47" text-anchor="middle" font-size="11" font-weight="600" fill="#334155">填最晚付费日</text>
<!-- 保存 -->
<rect x="620" y="20" width="80" height="44" rx="8" fill="url(#g1)" stroke="#059669" stroke-width="1.5"/>
<text x="660" y="47" text-anchor="middle" font-size="11" font-weight="700" fill="#065f46">保存</text>
<line x1="140" y1="42" x2="168" y2="42" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<line x1="290" y1="42" x2="318" y2="42" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<line x1="440" y1="42" x2="468" y2="42" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<line x1="590" y1="42" x2="618" y2="42" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<!-- 下行:提交 -->
<rect x="170" y="120" width="140" height="50" rx="8" fill="url(#g2)" stroke="#2563eb" stroke-width="1.5"/>
<text x="240" y="142" text-anchor="middle" font-size="11" font-weight="700" fill="#1e40af">勾选购买记录</text>
<text x="240" y="158" text-anchor="middle" font-size="9" fill="#3b82f6">须满足提交条件</text>
<rect x="350" y="120" width="140" height="50" rx="8" fill="url(#g2)" stroke="#2563eb" stroke-width="1.5"/>
<text x="420" y="142" text-anchor="middle" font-size="11" font-weight="700" fill="#1e40af">提交采购申请</text>
<text x="420" y="158" text-anchor="middle" font-size="9" fill="#3b82f6">进入审批流程</text>
<rect x="530" y="120" width="140" height="50" rx="8" fill="#fef3c7" stroke="#f59e0b" stroke-width="1.5"/>
<text x="600" y="142" text-anchor="middle" font-size="11" font-weight="700" fill="#b45309">审批中心办理</text>
<text x="600" y="158" text-anchor="middle" font-size="9" fill="#d97706">通过/驳回/撤回</text>
<line x1="660" y1="64" x2="660" y2="90" stroke="#64748b" stroke-width="1.5"/>
<line x1="660" y1="90" x2="240" y2="90" stroke="#64748b" stroke-width="1.5"/>
<line x1="240" y1="90" x2="240" y2="118" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<line x1="310" y1="145" x2="348" y2="145" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<line x1="490" y1="145" x2="528" y2="145" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<!-- 回写 -->
<rect x="200" y="220" width="320" height="50" rx="8" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="360" y="242" text-anchor="middle" font-size="11" font-weight="600" fill="#334155">工作流回写采购状态至比价单</text>
<text x="360" y="258" text-anchor="middle" font-size="9" fill="#64748b">审批中 → 审批通过 / 撤回 / 审批驳回</text>
<line x1="600" y1="170" x2="600" y2="195" stroke="#64748b" stroke-width="1.5"/>
<line x1="600" y1="195" x2="360" y2="195" stroke="#64748b" stroke-width="1.5"/>
<line x1="360" y1="195" x2="360" y2="218" stroke="#64748b" stroke-width="1.5" marker-end="url(#arrow)"/>
<!-- 图例 -->
<rect x="20" y="290" width="14" height="14" rx="3" fill="url(#g1)" stroke="#059669"/>
<text x="40" y="301" font-size="9" fill="#64748b">必填/关键步骤</text>
<rect x="130" y="290" width="14" height="14" rx="3" fill="url(#g2)" stroke="#2563eb"/>
<text x="150" y="301" font-size="9" fill="#64748b">采购提交</text>
<rect x="230" y="290" width="14" height="14" rx="3" fill="#fef3c7" stroke="#f59e0b"/>
<text x="250" y="301" font-size="9" fill="#64748b">审批环节</text>
</svg>
<div class="diagram-caption">图 1 · 比价单从创建到审批回写全流程</div>
</div>
<!-- 3 创建入口 -->
<h2 id="s3">三、三种创建入口</h2>
<div class="diagram-wrap">
<svg viewBox="0 0 700 200" width="680" xmlns="http://www.w3.org/2000/svg">
<rect x="280" y="10" width="140" height="40" rx="20" fill="#059669"/>
<text x="350" y="36" text-anchor="middle" font-size="12" font-weight="700" fill="#fff">进入比价单编辑器</text>
<line x1="350" y1="50" x2="350" y2="70" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="120" y1="70" x2="580" y2="70" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="120" y1="70" x2="120" y2="85" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="350" y1="70" x2="350" y2="85" stroke="#94a3b8" stroke-width="1.5"/>
<line x1="580" y1="70" x2="580" y2="85" stroke="#94a3b8" stroke-width="1.5"/>
<rect x="30" y="85" width="180" height="90" rx="10" fill="#f0fdf4" stroke="#86efac"/>
<text x="120" y="110" text-anchor="middle" font-size="11" font-weight="700" fill="#166534">入口 A · 手动新建</text>
<text x="120" y="128" text-anchor="middle" font-size="9" fill="#475569">比价单管理</text>
<text x="120" y="142" text-anchor="middle" font-size="9" fill="#475569">→ 新建比价单</text>
<text x="120" y="162" text-anchor="middle" font-size="8.5" fill="#64748b">空白编辑器,逐行添加</text>
<rect x="260" y="85" width="180" height="90" rx="10" fill="#eff6ff" stroke="#93c5fd"/>
<text x="350" y="110" text-anchor="middle" font-size="11" font-weight="700" fill="#1e40af">入口 B · 编辑历史</text>
<text x="350" y="128" text-anchor="middle" font-size="9" fill="#475569">比价单管理列表</text>
<text x="350" y="142" text-anchor="middle" font-size="9" fill="#475569">→ 点击「编辑」</text>
<text x="350" y="162" text-anchor="middle" font-size="8.5" fill="#64748b">继续维护未完结批次</text>
<rect x="490" y="85" width="180" height="90" rx="10" fill="#fff7ed" stroke="#fdba74"/>
<text x="580" y="110" text-anchor="middle" font-size="11" font-weight="700" fill="#c2410c">入口 C · 一键生成</text>
<text x="580" y="128" text-anchor="middle" font-size="9" fill="#475569">KPI 临期预警/核心逾期</text>
<text x="580" y="142" text-anchor="middle" font-size="9" fill="#475569">→ 一键生成比价单</text>
<text x="580" y="162" text-anchor="middle" font-size="8.5" fill="#64748b">自动带入车辆,跳过已提交记录</text>
</svg>
<div class="diagram-caption">图 2 · 三种进入比价单编辑器的方式</div>
</div>
<div class="warn-box">
<strong>注意(入口 C</strong>一键生成后备注会自动填充,但<strong>附件为空</strong>,须手动上传至少 1 个附件后方可保存;报价也需逐行补录。
</div>
<!-- 4 分步操作 -->
<h2 id="s4" class="page-break">四、分步操作说明7 步详解)</h2>
<div class="step-card">
<div class="step-card-header">
<div class="step-num">1</div>
<h3>进入比价单编辑器</h3>
</div>
<div class="step-card-body">
<div class="step-text">
<p><strong>操作路径:</strong></p>
<ol>
<li>打开「业务管理 → 保险采购」</li>
<li>点击工具栏 <strong>「比价单管理」</strong></li>
<li>选择「新建比价单」或列表「编辑」</li>
</ol>
<p><strong>预期结果:</strong>弹出全屏比价单编辑弹窗,标题显示「新建比价单」或「编辑比价单」。</p>
</div>
<div class="ui-mock">
<div class="ui-mock-title">界面示意 · 工具栏入口</div>
<div class="ui-row">
<span class="ui-btn ui-btn-green">比价单管理</span>
<span style="font-size:8pt;color:#94a3b8">保单管理 · 筛选条件 ...</span>
</div>
<div style="margin-top:8px;padding:8px;background:#fff;border-radius:6px;border:1px solid #e2e8f0">
<div style="font-weight:700;font-size:9pt;margin-bottom:6px">比价单管理</div>
<div class="ui-row">
<span class="ui-btn ui-btn-green">新建比价单</span>
<span style="font-size:8pt">共 3 条比价单</span>
</div>
<table class="ui-table" style="margin-top:6px">
<tr><th>创建日期</th><th>总车辆</th><th>操作</th></tr>
<tr><td>2026-05-28</td><td>5</td><td><span style="color:#059669">编辑</span></td></tr>
</table>
</div>
</div>
</div>
</div>
<div class="step-card">
<div class="step-card-header">
<div class="step-num">2</div>
<h3>添加购买记录</h3>
</div>
<div class="step-card-body">
<div class="step-text">
<p><strong>方式一:逐行新增</strong></p>
<ol>
<li>点击表格上方 <strong>「新增一行」</strong></li>
<li>在「车牌号」或「VIN」列选择/输入车辆</li>
<li>确认「投保方式」「保险类型」</li>
</ol>
<p><strong>方式二:批量选车</strong></p>
<ol>
<li>顶部筛选区「车辆」→ 输入多个车牌或 VIN换行/逗号分隔)</li>
<li>确认后批量带入匹配车辆</li>
</ol>
<p>选车后客户、品牌、到期日等字段<strong>自动只读带出</strong>。支持「暂无车牌」仅 VIN 车辆。</p>
</div>
<div class="ui-mock">
<div class="ui-mock-title">界面示意 · 购买记录表格</div>
<div class="ui-row">
<span class="ui-field">车辆:已选 3 辆车 ▼</span>
<span class="ui-field">险种:交强险 ▼</span>
<span class="ui-btn ui-btn-default">新增一行</span>
</div>
<table class="ui-table" style="margin-top:6px">
<tr><th></th><th>车牌号</th><th>保险类型</th><th>投保方式</th><th>客户</th></tr>
<tr><td></td><td>沪A03561F</td><td>交强险</td><td>续保</td><td>上海迅杰物流</td></tr>
<tr><td></td><td>暂无车牌</td><td>商业险</td><td>新保</td><td></td></tr>
</table>
</div>
</div>
</div>
<div class="step-card page-break">
<div class="step-card-header">
<div class="step-num">3</div>
<h3>录入报价(每行必做)</h3>
</div>
<div class="step-card-body">
<div class="step-text">
<p><strong>操作步骤:</strong></p>
<ol>
<li>点击该行 <strong>「报价情况」</strong> 列(带红色 * 必填标识)</li>
<li>在弹层中点击「新增报价」</li>
<li>填写<strong>保险公司</strong><strong>保险费金额</strong></li>
<li>将最优报价点击 <strong>「设为最终比价结果」</strong></li>
</ol>
<p>一行可录多家报价,但提交前须有且仅有一个「最终比价结果」,行内以高亮卡片展示。</p>
<div class="tip-box" style="margin-top:8px;padding:8px">
切换保险类型会清空该行已有报价,请谨慎操作。
</div>
</div>
<div class="ui-mock">
<div class="ui-mock-title">界面示意 · 报价弹层</div>
<div style="background:#fff;border:1px solid #e2e8f0;border-radius:6px;padding:8px">
<div style="font-weight:700;font-size:9pt;margin-bottom:6px">沪A03561F · 交强险</div>
<div style="border:2px solid #059669;border-radius:6px;padding:6px;margin-bottom:6px;background:#ecfdf5">
<span class="ui-tag ui-tag-green">最终比价结果</span>
<div style="margin-top:4px;font-size:8.5pt">中国人保 · ¥ 4,280.00</div>
</div>
<div style="border:1px solid #e2e8f0;border-radius:6px;padding:6px;margin-bottom:6px">
<div style="font-size:8.5pt">中国平安 · ¥ 4,560.00</div>
</div>
<span class="ui-btn ui-btn-green">+ 新增报价</span>
</div>
</div>
</div>
</div>
<div class="step-card">
<div class="step-card-header">
<div class="step-num">4</div>
<h3>填写最晚付费日期</h3>
</div>
<div class="step-card-body">
<div class="step-text">
<p>在「最晚付费日期」列点击日期选择器,为每行指定付款截止日期。</p>
<ul>
<li><span class="ui-tag ui-tag-green">剩余N天</span> — 正常</li>
<li><span class="ui-tag ui-tag-orange">临期N天</span> — 距截止 ≤ 3 天</li>
<li><span class="ui-tag ui-tag-red">超期N天</span> — 已过截止日</li>
</ul>
<p><strong>提交采购时,勾选行必须已填最晚付费日期。</strong></p>
</div>
<div class="ui-mock">
<div class="ui-mock-title">界面示意 · 最晚付费日期</div>
<table class="ui-table">
<tr><th>最晚付费日期</th><th>状态标签</th></tr>
<tr><td>2026-06-05</td><td><span class="ui-tag ui-tag-orange">临期2天</span></td></tr>
<tr><td>2026-05-28</td><td><span class="ui-tag ui-tag-red">超期3天</span></td></tr>
<tr><td>2026-07-01</td><td><span class="ui-tag ui-tag-green">剩余30天</span></td></tr>
</table>
</div>
</div>
</div>
<div class="step-card">
<div class="step-card-header">
<div class="step-num">5</div>
<h3>填写备注与附件,保存比价单</h3>
</div>
<div class="step-card-body">
<div class="step-text">
<p>编辑器底部区域:</p>
<ol>
<li><strong>备注</strong>(必填 *):填写本批次采购说明</li>
<li><strong>附件</strong>(必填 *):上传至少 1 个文件,不限格式与数量</li>
<li>点击 <strong>「保存比价单」</strong></li>
</ol>
<p>未填备注或未传附件时,系统提示「请填写备注」或「请上传附件」,无法保存。</p>
<p>保存后可继续编辑,不会关闭弹窗。</p>
</div>
<div class="ui-mock">
<div class="ui-mock-title">界面示意 · 底部保存区</div>
<div class="ui-field" style="margin-bottom:6px">备注 * :本次续保批次,共 5 辆车...</div>
<div class="ui-row">
<span class="ui-btn ui-btn-default">点击或拖拽上传附件</span>
<span style="font-size:8pt">报价单.pdf ✓</span>
</div>
<div class="amount-bar">
<div class="amount-box amount-box-green">
<div>当前保单总金额</div>
<div class="amount-val amount-green">21,400.00 <span style="font-size:9pt"></span></div>
<div style="font-size:7.5pt;color:#64748b">全单已确认 5 项</div>
</div>
<div class="amount-box amount-box-blue">
<div>已选保单总金额</div>
<div class="amount-val amount-blue">8,560.00 <span style="font-size:9pt"></span></div>
<div style="font-size:7.5pt;color:#64748b">已勾选 2 条</div>
</div>
</div>
<div class="ui-row" style="margin-top:8px;justify-content:flex-end">
<span class="ui-btn ui-btn-default">取消</span>
<span class="ui-btn ui-btn-default">保存比价单</span>
<span class="ui-btn ui-btn-primary">提交采购申请</span>
</div>
</div>
</div>
</div>
<div class="step-card page-break">
<div class="step-card-header">
<div class="step-num">6</div>
<h3>勾选并提交采购申请</h3>
</div>
<div class="step-card-body">
<div class="step-text">
<p><strong>操作步骤:</strong></p>
<ol>
<li>在表格左侧勾选需要提交采购的购买记录</li>
<li>确认底部「已选保单总金额」无误</li>
<li>点击 <strong>「提交采购申请」</strong></li>
</ol>
<p><strong>系统校验(全部通过才可提交):</strong></p>
<ul>
<li>勾选行已有报价且已设最终比价结果</li>
<li>勾选行已填最晚付费日期</li>
<li>勾选行采购状态为「未提交 / 撤回 / 审批驳回」</li>
<li>备注、附件已填写</li>
</ul>
<p>若比价单尚未保存,系统会先弹出「保存并提交采购」确认框。</p>
<p>成功后提示「比价单审批流程提交成功」,勾选行状态变为 <strong>审批中</strong></p>
</div>
<div class="ui-mock">
<div class="ui-mock-title">界面示意 · 提交后状态</div>
<table class="ui-table">
<tr><th></th><th>车牌号</th><th>采购状态</th><th>当前审批人</th></tr>
<tr><td style="color:#cbd5e1"></td><td>沪A03561F</td><td><span class="ui-tag ui-tag-blue">审批中</span></td><td>李专员</td></tr>
<tr><td></td><td>粤B58888F</td><td><span class="ui-tag" style="background:#f1f5f9;color:#64748b">未提交</span></td><td></td></tr>
</table>
<div style="margin-top:6px;font-size:8pt;color:#64748b">审批中、审批通过的行:多选框禁用,不可重复提交</div>
</div>
</div>
</div>
<div class="step-card">
<div class="step-card-header">
<div class="step-num">7</div>
<h3>跟踪审批与后续处理</h3>
</div>
<div class="step-card-body">
<div class="step-text">
<p><strong>在保险采购页查看:</strong></p>
<ul>
<li>编辑弹窗内「采购状态」「当前审批人」列</li>
<li>「比价单管理」列表的已提交采购数量、审批通过数量</li>
<li>临期/超期最晚付费看板</li>
</ul>
<p><strong>在审批中心办理:</strong></p>
<ul>
<li>审批通过 → 状态回写「审批通过」,多选框保持禁用</li>
<li>撤回 / 审批驳回 → 回写后可重新勾选并提交</li>
</ul>
</div>
<div class="ui-mock">
<div class="ui-mock-title">界面示意 · 比价单管理列表</div>
<div class="ui-row" style="margin-bottom:6px">
<div style="flex:1;background:#fff7ed;border:1px solid #fed7aa;border-radius:6px;padding:6px;text-align:center">
<div style="font-size:8pt;color:#c2410c">最晚付费临期</div>
<div style="font-size:14pt;font-weight:800;color:#c2410c">3</div>
</div>
<div style="flex:1;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;padding:6px;text-align:center">
<div style="font-size:8pt;color:#b91c1c">最晚付费超期</div>
<div style="font-size:14pt;font-weight:800;color:#b91c1c">1</div>
</div>
</div>
<table class="ui-table">
<tr><th>创建日期</th><th>已提交</th><th>审批通过</th><th>操作</th></tr>
<tr><td>2026-05-28</td><td>3</td><td>1</td><td>编辑 / 删除</td></tr>
</table>
</div>
</div>
</div>
<!-- 5 状态 -->
<h2 id="s5" class="page-break">五、采购状态与审批流转</h2>
<div class="diagram-wrap">
<svg viewBox="0 0 680 180" width="660" xmlns="http://www.w3.org/2000/svg">
<defs><marker id="a2" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto"><path d="M0,0 L6,3 L0,6 Z" fill="#64748b"/></marker></defs>
<rect x="20" y="60" width="90" height="36" rx="6" fill="#f1f5f9" stroke="#cbd5e1"/>
<text x="65" y="83" text-anchor="middle" font-size="10" font-weight="700" fill="#475569">未提交</text>
<rect x="150" y="60" width="90" height="36" rx="6" fill="#dbeafe" stroke="#93c5fd"/>
<text x="195" y="83" text-anchor="middle" font-size="10" font-weight="700" fill="#1d4ed8">审批中</text>
<rect x="280" y="60" width="100" height="36" rx="6" fill="#dcfce7" stroke="#86efac"/>
<text x="330" y="83" text-anchor="middle" font-size="10" font-weight="700" fill="#166534">审批通过</text>
<rect x="150" y="130" width="90" height="36" rx="6" fill="#f1f5f9" stroke="#cbd5e1"/>
<text x="195" y="153" text-anchor="middle" font-size="10" font-weight="700" fill="#475569">撤回</text>
<rect x="280" y="130" width="100" height="36" rx="6" fill="#fee2e2" stroke="#fca5a5"/>
<text x="330" y="153" text-anchor="middle" font-size="10" font-weight="700" fill="#b91c1c">审批驳回</text>
<line x1="110" y1="78" x2="148" y2="78" stroke="#64748b" marker-end="url(#a2)"/>
<text x="129" y="72" font-size="8" fill="#64748b">提交</text>
<line x1="240" y1="78" x2="278" y2="78" stroke="#64748b" marker-end="url(#a2)"/>
<text x="259" y="72" font-size="8" fill="#64748b">通过</text>
<line x1="195" y1="96" x2="195" y2="128" stroke="#64748b" marker-end="url(#a2)"/>
<text x="205" y="115" font-size="8" fill="#64748b">撤回</text>
<line x1="330" y1="96" x2="330" y2="128" stroke="#64748b" marker-end="url(#a2)"/>
<text x="340" y="115" font-size="8" fill="#64748b">驳回</text>
<path d="M240 148 Q 130 148 110 96" fill="none" stroke="#059669" stroke-width="1.5" marker-end="url(#a2)"/>
<text x="100" y="140" font-size="8" fill="#059669">可重新提交</text>
<path d="M330 166 Q 450 166 480 78" fill="none" stroke="#059669" stroke-width="1.5" marker-end="url(#a2)"/>
<text x="430" y="130" font-size="8" fill="#059669">可重新提交</text>
<rect x="430" y="20" width="230" height="50" rx="8" fill="#f8fafc" stroke="#e2e8f0"/>
<text x="545" y="42" text-anchor="middle" font-size="9" font-weight="600" fill="#334155">审批中 / 审批通过 → 多选框禁用</text>
<text x="545" y="58" text-anchor="middle" font-size="8.5" fill="#64748b">撤回 / 驳回 / 未提交 → 可勾选提交</text>
</svg>
<div class="diagram-caption">图 3 · 采购状态流转与可提交条件</div>
</div>
<table class="data">
<tr><th>状态</th><th>含义</th><th>可否勾选提交</th><th>办理位置</th></tr>
<tr><td>未提交</td><td>尚未发起采购审批</td><td>✓ 可以</td><td>本页提交</td></tr>
<tr><td>审批中</td><td>已提交,流程进行中</td><td>✗ 禁用</td><td>审批中心审批</td></tr>
<tr><td>审批通过</td><td>末节点已通过</td><td>✗ 禁用</td><td></td></tr>
<tr><td>撤回</td><td>申请人或审批人撤回</td><td>✓ 可以</td><td>审批中心操作</td></tr>
<tr><td>审批驳回</td><td>审批未通过</td><td>✓ 可以</td><td>审批中心操作</td></tr>
</table>
<!-- 6 金额 -->
<h2 id="s6">六、金额汇总说明</h2>
<div class="section">
<p>编辑器底部左右并排展示两个金额栏,实时随报价与勾选变化:</p>
<table class="data">
<tr><th style="width:30%">栏位</th><th>计算规则</th><th>样式</th></tr>
<tr>
<td><strong>当前保单总金额</strong></td>
<td>本比价单所有已设「最终比价结果」的购买记录,保险费合计</td>
<td>绿色背景</td>
</tr>
<tr>
<td><strong>已选保单总金额</strong></td>
<td>当前勾选且已设最终比价结果的行,保险费合计</td>
<td>蓝色背景</td>
</tr>
</table>
<div class="tip-box">辅助文案:左侧显示「全单已确认 N 项」;右侧显示「已勾选 N 条 · 可提交 M 项确认报价」。</div>
</div>
<!-- 7 自查 -->
<h2 id="s7">七、提交前自查清单</h2>
<div class="section">
<p>勾选购买记录并点击「提交采购申请」前,请逐项确认:</p>
<ul class="checklist">
<li>每一勾选行已新增至少一条报价</li>
<li>每一勾选行已设为「最终比价结果」</li>
<li>每一勾选行已填写「最晚付费日期」</li>
<li>勾选行采购状态不是「审批中」或「审批通过」</li>
<li>比价单「备注」已填写(非空)</li>
<li>比价单「附件」已上传至少 1 个文件</li>
<li>「已选保单总金额」与预期一致</li>
<li>比价单已保存(新建单首次提交会自动提示保存)</li>
</ul>
</div>
<!-- 8 管理 -->
<h2 id="s8" class="page-break">八、比价单管理与预警看板</h2>
<h3>8.1 比价单管理列表</h3>
<table class="data">
<tr><th>功能</th><th>说明</th></tr>
<tr><td>筛选</td><td>按创建时间范围、车牌号(支持 VIN 模糊匹配)查询</td></tr>
<tr><td>新建 / 编辑</td><td>进入编辑器维护购买记录</td></tr>
<tr><td>删除</td><td>删除整单,不可恢复,需二次确认</td></tr>
<tr><td>统计列</td><td>总车辆、保险数量、附件数、已提交采购数量、审批通过数量</td></tr>
</table>
<h3>8.2 最晚付费预警看板</h3>
<table class="data">
<tr><th>看板</th><th>规则</th><th>用途</th></tr>
<tr><td>最晚付费临期</td><td>距最晚付费日 ≤ 3 天</td><td>提醒尽快完成采购付款</td></tr>
<tr><td>最晚付费超期</td><td>已超过最晚付费日</td><td>标识逾期风险,优先处理</td></tr>
</table>
<h3>8.3 编辑器内筛选</h3>
<ul>
<li>按车辆(多选车牌/VIN</li>
<li>按保险类型</li>
<li>勾选「仅显示最晚付费日期 3 天内的记录」</li>
</ul>
<!-- 9 FAQ -->
<h2 id="s9">九、常见问题与处理</h2>
<table class="data">
<tr><th style="width:35%">问题</th><th>原因</th><th>处理办法</th></tr>
<tr>
<td>提示「请填写备注」/「请上传附件」</td>
<td>备注或附件未填</td>
<td>在底部填写备注并上传至少 1 个附件后保存</td>
</tr>
<tr>
<td>提示「须新增保险报价」</td>
<td>勾选行无报价</td>
<td>进入「报价情况」新增报价</td>
</tr>
<tr>
<td>提示「须将报价设为最终比价结果」</td>
<td>有报价但未确认最终方案</td>
<td>在报价弹层点击「设为最终比价结果」</td>
</tr>
<tr>
<td>提示「须填写最晚付费日期」</td>
<td>勾选行缺日期</td>
<td>在对应行选择最晚付费日期</td>
</tr>
<tr>
<td>勾选框灰色不可选</td>
<td>该行已审批中或审批通过</td>
<td>无需重复提交;等审批结束或驳回后操作</td>
</tr>
<tr>
<td>一键生成后无法保存</td>
<td>附件未上传</td>
<td>补传附件、补录报价后保存</td>
</tr>
<tr>
<td>当前审批人显示「—」</td>
<td>工作流尚未回写</td>
<td>属正常情况,待审批流回写后自动展示</td>
</tr>
</table>
<!-- 10 字段 -->
<h2 id="s10">十、字段速查表</h2>
<table class="data">
<tr><th>字段</th><th>必填</th><th>可编辑</th><th>说明</th></tr>
<tr><td>车牌号 / VIN</td><td>至少一项</td><td></td><td>选车后自动关联车辆档案</td></tr>
<tr><td>投保方式</td><td></td><td></td><td>新保 / 续保</td></tr>
<tr><td>保险类型</td><td></td><td></td><td>交强/商业/超赔/货物/驾意</td></tr>
<tr><td>报价情况</td><td>提交时必填</td><td></td><td>保险公司 + 金额,须设最终比价结果</td></tr>
<tr><td>最晚付费日期</td><td>提交时必填</td><td></td><td>驱动临期/超期提醒</td></tr>
<tr><td>备注</td><td>保存时必填</td><td></td><td>整单级别,非行级</td></tr>
<tr><td>附件</td><td>保存时必填</td><td></td><td>整单级别≥1 个文件</td></tr>
<tr><td>采购状态</td><td></td><td></td><td>由提交操作及工作流回写</td></tr>
<tr><td>当前审批人</td><td></td><td></td><td>工作流回写,可为空</td></tr>
<tr><td>客户/品牌/到期日等</td><td></td><td></td><td>选车后自动带出</td></tr>
</table>
<div class="footer-note">
ONE-OS 保险采购 · 比价单操作手册 V1.0 · 生成日期 2026-06-01<br/>
如有流程变更,请以系统内「查看需求说明」最新版本为准。
</div>
</body>
</html>

View File

@@ -0,0 +1,186 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>氢能车故障 · 微信群机器人 + AI 闭环方案</title>
<style>
:root { --p: #0d9488; --p2: #ccfbf1; --text: #1f2937; --muted: #64748b; --border: #e2e8f0; }
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: "PingFang SC", "Microsoft YaHei", sans-serif; color: var(--text); line-height: 1.7; background: #f8fafc; padding: 32px 20px 48px; }
.page { max-width: 900px; margin: 0 auto; background: #fff; border-radius: 12px; box-shadow: 0 2px 20px rgba(0,0,0,.06); overflow: hidden; }
.head { background: linear-gradient(120deg, #0f766e, #14b8a6); color: #fff; padding: 40px 44px; }
.head h1 { font-size: 24px; margin-bottom: 8px; }
.head p { font-size: 14px; opacity: .92; }
.body { padding: 36px 44px 44px; }
h2 { font-size: 17px; color: var(--p); border-left: 4px solid var(--p); padding-left: 12px; margin: 28px 0 14px; }
h2:first-child { margin-top: 0; }
h3 { font-size: 14px; margin: 16px 0 8px; color: #0f172a; }
p, li { font-size: 14px; margin-bottom: 8px; }
ul { padding-left: 20px; margin-bottom: 12px; }
.box { background: var(--p2); border-radius: 8px; padding: 14px 18px; margin: 12px 0; font-size: 14px; }
table { width: 100%; border-collapse: collapse; font-size: 13px; margin: 12px 0 20px; }
th, td { border: 1px solid var(--border); padding: 9px 12px; text-align: left; vertical-align: top; }
th { background: #f1f5f9; font-weight: 600; }
.flow-wrap { background: #f8fafc; border: 1px solid var(--border); border-radius: 8px; padding: 20px; margin: 16px 0; overflow-x: auto; }
.mermaid { font-size: 13px; }
.step { display: flex; gap: 12px; margin-bottom: 14px; align-items: flex-start; }
.step-num { flex: 0 0 28px; height: 28px; background: var(--p); color: #fff; border-radius: 50%; font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.step-body { flex: 1; }
.tag { display: inline-block; font-size: 11px; padding: 2px 8px; border-radius: 4px; margin-right: 6px; font-weight: 600; }
.tag-wx { background: #dcfce7; color: #166534; }
.tag-ai { background: #dbeafe; color: #1e40af; }
.tag-os { background: #fef3c7; color: #92400e; }
.footer { text-align: center; font-size: 12px; color: var(--muted); margin-top: 28px; padding-top: 16px; border-top: 1px solid var(--border); }
</style>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
</head>
<body>
<div class="page">
<header class="head">
<h1>氢能车故障 · 微信群机器人 + AI 闭环方案</h1>
<p>ONEOS 运维场景 · 客户报障 → AI 知识库应答 → 工单追踪 → 人工待办兜底</p>
</header>
<main class="body">
<h2>一、业务目标</h2>
<p class="box">
客户在<strong>微信服务群</strong>发送氢能车故障信息并 <strong>@故障机器人</strong> 后,系统自动识别车辆与故障内容,
结合 <strong>AI 知识库</strong> 给出可执行的初步解决方案;全程<strong>追踪解决进展</strong>,最终在 ONEOS 形成标准<strong>故障工单</strong>
若 AI 无法闭环或客户确认未解决,则自动生成<strong>人工待办任务</strong>,由运维人员介入处理并留痕。
</p>
<h2>二、端到端流程图</h2>
<div class="flow-wrap">
<pre class="mermaid">
flowchart TB
A[客户在微信群发送故障信息并@机器人] --> B[机器人采集消息/图片/语音]
B --> C[解析车牌、故障现象、发生场景]
C --> D{能否匹配车辆与客户?}
D -->|否| E[机器人追问补充信息]
E --> C
D -->|是| F[写入 ONEOS 故障草稿/会话记录]
F --> G[AI 检索氢能车故障知识库]
G --> H[生成结构化解决方案回复微信群]
H --> I[创建故障工单 来源=客户报告]
I --> J[状态: 处理中 · 解决情况: 未解决/临时排故]
J --> K{客户反馈是否已解决?}
K -->|已解决| L[工单闭环 解决情况=已解决]
K -->|未解决/超时未回复| M{AI 置信度是否达标?}
M -->|达标且客户接受| N[标记临时排故 继续观察]
M -->|不达标或需现场| O[生成人工待办任务]
O --> P[运维人员在 ONEOS 接单处理]
P --> Q[更新方案/派维修/关闭工单]
L --> R[归档 全链路留痕可查]
Q --> R
</pre>
</div>
<h2>三、分阶段说明</h2>
<div class="step">
<span class="step-num">1</span>
<div class="step-body">
<span class="tag tag-wx">微信侧</span><strong>客户报障</strong>
<p>客户在专属服务群用文字/图片/语音描述故障,并 @「氢能故障助手」机器人。机器人记录:群 ID、发送人、时间、原文、附件。</p>
</div>
</div>
<div class="step">
<span class="step-num">2</span>
<div class="step-body">
<span class="tag tag-wx">微信侧</span><strong>信息结构化</strong>
<p>自动抽取:<strong>车牌</strong><strong>故障现象</strong>(何时/何地/何种状态/何后果)、可选故障类型(供氢/燃料电池/三电等)。缺车牌时机器人群内追问,最多 2 轮。</p>
</div>
</div>
<div class="step">
<span class="step-num">3</span>
<div class="step-body">
<span class="tag tag-ai">AI</span><strong>知识库应答</strong>
<p>以「车型 + 故障类型 + 现象关键词」检索知识库(历史案例、维保手册、标准排障 SOP输出</p>
<ul>
<li>可能原因(按概率排序)</li>
<li>客户可执行的自检/临时措施(安全前提下)</li>
<li>是否需停运、是否需进站/上门</li>
<li>预计处理时效说明</li>
</ul>
<p>机器人在群内回复,并附「已解决 / 仍未解决」快捷反馈按钮(或关键词回复)。</p>
</div>
</div>
<div class="step">
<span class="step-num">4</span>
<div class="step-body">
<span class="tag tag-os">ONEOS</span><strong>生成故障工单</strong>
<p>同步创建 ONEOS 故障单(与现有「故障管理」模块一致),建议字段映射:</p>
<table>
<tr><th>工单字段</th><th>来源</th></tr>
<tr><td>故障来源</td><td>固定:客户报告(微信群机器人)</td></tr>
<tr><td>车牌 / 车辆信息</td><td>解析 + 车辆主数据匹配</td></tr>
<tr><td>故障描述</td><td>客户原文 + AI 归纳</td></tr>
<tr><td>故障类型 / 等级</td><td>AI 初判 + 人工可改</td></tr>
<tr><td>故障上报时间</td><td>微信消息时间</td></tr>
<tr><td>故障证据</td><td>微信群图片/语音附件</td></tr>
<tr><td>AI 建议方案</td><td>知识库输出全文(只读留痕)</td></tr>
<tr><td>微信群会话 ID</td><td>用于回溯对话</td></tr>
</table>
</div>
</div>
<div class="step">
<span class="step-num">5</span>
<div class="step-body">
<span class="tag tag-os">ONEOS</span><strong>追踪解决情况</strong>
<p>与现有「解决情况」枚举对齐:<strong>未解决 → 临时排故 → 已解决</strong>。触发方式:</p>
<ul>
<li>客户在微信点击/回复「已解决」→ 已解决</li>
<li>客户回复「临时好了」→ 临时排故</li>
<li>超过约定时限(如 4 小时)无反馈 → 系统提醒 + 可升级人工</li>
</ul>
</div>
</div>
<div class="step">
<span class="step-num">6</span>
<div class="step-body">
<span class="tag tag-os">ONEOS</span><strong>人工待办(兜底)</strong>
<p>满足任一条件即生成<strong>工作台待办任务</strong>,并通知责任运维:</p>
<ul>
<li>客户明确反馈「未解决」或重复报同一故障</li>
<li>AI 置信度低于阈值(如 &lt; 70%)或知识库无命中</li>
<li>故障等级为 L1/L2特急/紧急)</li>
<li>涉及供氢/泄漏等高风险关键词(强制人工)</li>
<li>超时未闭环(如 24 小时仍为「未解决」)</li>
</ul>
<p>待办内容故障单号、车牌、客户、现象摘要、AI 已尝试方案、微信群链接。运维处理后在工单中填写最终方案并关闭。</p>
</div>
</div>
<h2>四、状态与职责</h2>
<table>
<tr><th>对象</th><th>状态</th><th>说明</th></tr>
<tr><td>微信会话</td><td>进行中 / 待客户确认 / 已结束</td><td>对应一次 @ 机器人的报障会话</td></tr>
<tr><td>故障工单</td><td>待处理 / 处理中 / 已关闭</td><td>ONEOS 故障管理列表(待处理 Tab</td></tr>
<tr><td>解决情况</td><td>未解决 / 临时排故 / 已解决</td><td>与现有故障模块一致</td></tr>
<tr><td>待办任务</td><td>待办 / 已完成</td><td>工作台 · 待办任务,类型:故障人工介入</td></tr>
</table>
<h2>五、角色分工</h2>
<table>
<tr><th>角色</th><th>职责</th></tr>
<tr><td>客户</td><td>群内 @ 机器人报障,按指引反馈是否解决</td></tr>
<tr><td>微信群机器人</td><td>收消息、追问、回方案、收集反馈</td></tr>
<tr><td>AI 知识库</td><td>检索案例与 SOP生成结构化方案与置信度</td></tr>
<tr><td>ONEOS 系统</td><td>建单、追踪、待办、统计、与维修单关联(可选)</td></tr>
<tr><td>运维人员</td><td>处理待办、更新工单、必要时派维修站</td></tr>
</table>
<h2>六、价值小结</h2>
<ul>
<li><strong>响应快</strong>7×24 自动应答,减少客户等待</li>
<li><strong>可追溯</strong>:微信对话 + 工单 + 待办全链路留痕</li>
<li><strong>降本增效</strong>:常见问题 AI 闭环,复杂问题才占用人工</li>
<li><strong>数据沉淀</strong>:结案案例反哺知识库,持续优化命中率</li>
</ul>
<p class="footer">ONEOS · 运维管理 · 故障管理模块配套方案 · 2026年5月</p>
</main>
</div>
<script>mermaid.initialize({ startOnLoad: true, theme: 'neutral', flowchart: { curve: 'basis' } });</script>
</body>
</html>