Files

116 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 |
| 找不到接口 | 软件未运行;启动软件并进入项目后重试 |