基线:全量源码首提(D1 版本控制落地,含第一轮优化 B1-B4/A1/A4/缩放修复)

This commit is contained in:
dqb-dev
2026-10-01 22:15:22 +08:00
commit 1e65792b09
499 changed files with 204579 additions and 0 deletions
@@ -0,0 +1,115 @@
---
name: dqb-daoru-baojia
description: 成套报价软件"导入报价"技能——把用户拖进 AI 助手对话框的甲方报价 Excel(.xlsx)由 AI 看表确定列含义后导入当前项目。当用户说"导入报价""把这个报价表/Excel导进去""解析这份报价单并导入""拖给你的报价文件帮我导一下""这是甲方报价,导入软件"等,或用户直接拖入一个报价 .xlsx 文件要求处理时使用。AI 负责:看表(excelgrid)→确定每列是柜号/名称/型号/单位/数量(mapping)→预览→用户确认后导入;软件负责按映射确定性解析、事务落库和界面刷新(与软件"导入报价"按钮同源)。
---
# 报价表拖入导入(AI 看表定列 → 软件同源解析落库)
不同甲方的报价表样千差万别(列位漂移、sheet 名不同、有无规格列……)。
本技能让 **AI(LLM) 看表判断结构**,软件按 AI 给出的列映射**确定性解析+事务落库**——
数据不经过 AI 转写,不会错位。软件端与手工点"导入报价"按钮 100% 同一条管线。
## 铁律
1. **必须先预览,用户明确确认后才 `--exec` 真导入**;禁止拿到文件直接导入。
2. **路径必须用用户拖入文件的真实绝对路径**(会话中附件给出的本地路径,原样使用;含空格/中文要加引号)。
3. **只支持 .xlsx**;.xls 老格式让用户先用 Excel 另存为 .xlsx。
4. **不要自己读 Excel 内容/手工转写数据**——AI 只看表头定列,行数据全部由软件按映射解析。
5. **导入是追加,不是覆盖,软件有防重复拦截**:预览响应里的 `existing` 非空 = 项目里已有同名图号
(这份文件很可能导入过)。此时**必须先把 existing 清单亮给用户**,说明"再导会产生双份数据",
并问用户怎么办:同一份报价就不要再导 / 用户在软件里删掉旧图号后再导 / 用户明确同意重复才可加
`--allow-duplicate`。**软件在重名时会直接拒绝 `--exec`(duplicate 拦截)**,不要反复重试。
6. 不执行任何直接 SQL;一切走脚本(已封装 /api/excelgrid 与 /api/importquote)。
## 前置自检(第一步必做)
```bash
TOKEN=$(cat ~/.zcode/chengtao/token.txt)
curl -s "http://127.0.0.1:18790/api/xuanxing?token=$TOKEN"
```
- 返回 `ok:false` 且含"没有打开项目"→ **请用户先在软件项目列表双击进入项目**。
- 读不到令牌/端口不通 → 软件没运行,请用户先打开成套报价软件(daoru.js 会自动扫 18790~18799)。
## 工作流(四步)
### ① 看表:列出工作表 → 看表头网格
```bash
node "<本技能目录>/daoru.js" "<拖入xlsx绝对路径>" --grid
node "<本技能目录>/daoru.js" "<同一个xlsx绝对路径>" --grid "屏柜汇总表" 14
node "<本技能目录>/daoru.js" "<同一个xlsx绝对路径>" --grid "屏柜分项表" 14
```
输出带行号/列号的网格文本。**AI 据表头文字判断**:哪个 sheet 是箱柜汇总、哪个是元件明细、
每列是什么(柜号/箱柜名称/型号/单位/数量…)、数据从哪行开始。
### ② 定列:写 mapping.json
根据①看到的表头写映射文件(0 基列号;该表没有的列写 -1):
```json
{
"summarySheet": "屏柜汇总表",
"detailSheet": "屏柜分项表",
"summary": { "seq": 0, "cabinet": 1, "name": 2, "model": 3, "spec": -1, "unit": 4, "qty": 5 },
"detail": { "seq": 0, "name": 1, "spec": 2, "unit": 3, "qty": 4, "price": 5, "amount": 6, "vendor": 7 }
}
```
- summary 键:seq序号 cabinet柜号 name箱柜名称 model型号 spec规格 unit单位 qty数量
- detail 键:seq序号 name元件名称 spec型号规格 unit单位 qty数量 price单价 amount金额 vendor厂家
- **逐列核对**:以表头文字为准,不要套用默认列号(例:有的表"单位"在 E 列=4,有的在 F 列=5)。
- **特例免 mapping**:sheet 名为"设备汇总表/设备明细表"(正泰识图格式)时软件自动识别,直接走③。
### ③ 预览(不落库)
```bash
node "<本技能目录>/daoru.js" "<xlsx绝对路径>" --mapping "<mapping.json路径>"
```
输出:图号数、箱号数、元件总数,每个图号下的箱柜清单(柜号、箱名、型号、单位、数量、元件条数)。
**AI 要抽查核对**:拿网格里看到的某台柜(如 G1 高压进线柜 单位=台 数量=1)与预览输出对得上才算数;
对不上说明列映射错了,回①重新看表改 mapping。
### ④ 用户确认后真导入
用户明确回复"导入/确认/可以"后:
```bash
node "<本技能目录>/daoru.js" "<同一个xlsx绝对路径>" --mapping "<mapping.json路径>" --exec
```
成功输出:`✅ 报价已导入当前项目:图号 N 个、箱号 N 个、元件 N 条;软件界面已自动刷新。`
导入完成后软件自动保存未完成编辑、清缓存并重算汇总,**不需要再做任何刷新操作**。
## 汇报格式建议
```
📄 已看表并解析报价表:<文件名>
列映射:汇总表"单位"=E列、"数量"=F列(按实际表头判断)
识别到:图号 N 个 / 箱柜 N 台 / 元件 N 条
1. <图号名>(M 台)
- G1 高压进线柜 HXGN-12(1台,元件 n 条)
- …
⚠️ 导入是追加式,重复导入会产生重复数据。
尚未导入,确认导入吗?
```
完成:
```
✅ 已导入:图号 N 个、箱柜 N 台、元件 N 条,软件界面已自动刷新。
```
## 排错
| 现象 | 处理 |
|---|---|
| 文件不存在 | 确认拖入文件路径是否可访问,请用户重新拖入 |
| 仅支持 .xlsx | .xls → Excel 另存为 .xlsx;其他格式(csv/pdf/图片)不走本技能 |
| 当前没有打开项目 | 请用户双击进入项目后再说"继续导入" |
| 预览 0 图号/箱号 或 数量明显不对 | 列映射错位——回①重新看表头,逐列核对 mapping 后再预览 |
| 预览/导入出现 existing 或 ⛔duplicate | 项目里已有同名图号(文件可能导过)——按铁律5:亮出清单问用户,绝不默默重复导入 |
| sheet 名不含"汇总/分项"字样 | 看表判断哪个 sheet 是箱柜清单、哪个是元件明细,把真实 sheet 名写进 mapping |
| 找不到接口 | 软件未运行;启动软件并进入项目后重试 |