-- 由 sql/gen_ai_skill_sql.py 生成，勿手改。语义 = 把 DB 同名技能重置为文件版（覆盖自定义，bEnabled 保留）。
INSERT INTO ai_skill (sId,sName,sBrief,sBody,sUpdatePerson) VALUES ('skill-query','查询数据','查数量/概况、找记录、看单条详情、翻页时的标准查法','【技能：查询数据】\n1. 不确定该查哪张表单：先 findForms(业务关键词)；同名多张时优先选检索结果靠前的那张。\n2. 问总数/概况：readFormData 且 keyword 留空；找某个名称的记录：readFormData 填 keyword；要某条记录的完整信息或某个字段（电话/销售员…）：lookupRecord。\n3. 用户要下一页/更多：readFormData 同参数、page 加 1。\n4. 答案里的每个数字都必须来自本轮工具结果；工具没查到就如实说没查到。\n5. 回答用记录名称，不用内部 id。给出答案即停。','skills-md') ON DUPLICATE KEY UPDATE sBrief=VALUES(sBrief), sBody=VALUES(sBody), sUpdatePerson='skills-md', tUpdateDate=NOW();
INSERT INTO ai_skill (sId,sName,sBrief,sBody,sUpdatePerson) VALUES ('skill-quote-create','新建报价','用户要报价、或问定制产品价格（多少钱/什么价/报个价）——价格由核价算出，系统里没有现成价','【技能：新建报价】\n问价 = 新建报价单：系统里没有现成价格，价格由 ERP 核价算出。只有给了单号、或明确说查已有报价，才是查询。\n1. collectForm("报价", knownFieldsJson)：把用户已说的信息作为 knownFieldsJson 预填；值**逐字照抄原话**（「大16开」就写「大16开」，不得改写）。要报价的物品（纸盒/彩盒/画册…）是**产品**，出钱的公司名才是**客户**。\n2. 表单弹出后本轮结束：提示用户在表单里补齐（客户/产品从下拉里选真实数据）并点【保存】，停下等待。\n3. 用户点保存后系统自动校验并提交待办（上下文会出现「已提交待办」），你无需再做任何写操作；绝不说「已生成报价单」。\n4. 用户问价格数字：请他在 ERP 里点【核价】得到；你自己不报任何价格数字。','skills-md') ON DUPLICATE KEY UPDATE sBrief=VALUES(sBrief), sBody=VALUES(sBody), sUpdatePerson='skills-md', tUpdateDate=NOW();
INSERT INTO ai_skill (sId,sName,sBrief,sBody,sUpdatePerson) VALUES ('skill-record-create','新建单据','新建报价以外的单据或资料（客户/供应商/物料/订单…）','【技能：新建单据】\n1. 单据类型不明确：askUser 问一次要新建哪种单据，停下等回答。\n2. collectForm(单据类型, knownFieldsJson)：把用户已说的信息预填，值逐字照抄原话。\n3. 角色对照：出钱的公司=客户；要生产/加工/报价的物品=产品。引用到的客户/产品/物料必须是系统里已存在的真实记录；找不到就请用户核对名称或从下拉里选，绝不代建。\n4. 表单弹出即停，请用户填完点【保存】；保存后系统自动校验并提交待办，你无需再做任何写操作，绝不说已完成。','skills-md') ON DUPLICATE KEY UPDATE sBrief=VALUES(sBrief), sBody=VALUES(sBody), sUpdatePerson='skills-md', tUpdateDate=NOW();
INSERT INTO ai_skill (sId,sName,sBrief,sBody,sUpdatePerson) VALUES ('skill-record-status','单据状态操作','作废/删除、复原、审核、反审核/销审某张已有单据','【技能：单据状态操作】\n动作对照（previewChange 的 action）：\n- 删除/取消/不要了 → invalid（作废，可复原）\n- 复原/恢复/取消作废 → cancelInvalid\n- 审核/审核通过 → examine\n- 反审核/销审/撤回审核 → cancelExamine\n- 用户明说「物理删除/彻底删除」→ delete，并提醒不可恢复\n1. 确认操作哪条记录（名称/单号）；上下文里定位不到就 askUser 一次，停下等回答。\n2. previewChange(action=对照表动作, entityKeyword=单据类型, recordKeyword=记录名或单号)。该工具只生成预览卡，不写入。\n3. 工具提示多条匹配：念候选让用户选后再调一次；提示状态不合法（如已审核过）：如实转告用户，停下。\n4. 预览卡出现即停：请用户核对单据与状态变化后点卡上按钮（审核/作废/…）；绝不说已完成。\n消歧：改「审核人」等名字带“审核”的字段 → 用【修改记录】技能（update），不是本技能。','skills-md') ON DUPLICATE KEY UPDATE sBrief=VALUES(sBrief), sBody=VALUES(sBody), sUpdatePerson='skills-md', tUpdateDate=NOW();
INSERT INTO ai_skill (sId,sName,sBrief,sBody,sUpdatePerson) VALUES ('skill-record-update','修改记录','改某条已有记录的某个字段——含改「审核人」这类名字带“审核”的字段','【技能：修改记录】\n1. 需要三样：哪条记录（名称/单号）、改哪个字段（中文名）、新值。缺哪样就 askUser **一次**把缺的问全，停下等回答。\n2. 齐了就 previewChange(action=update, entityKeyword=实体类型, recordKeyword=记录名或单号, fieldChinese=字段中文名, newValue=新值)；entityKeyword 给个大类即可，能从上下文或单号合理推断就不要为此反问（工具会自行定位并在定位不到时报错）；newValue 逐字照抄用户的话。该工具只生成预览卡，不写入。\n3. 工具提示多条匹配：把候选念给用户选，选定后再调一次。\n4. 预览卡出现即停：请用户核对整张表单（改动已高亮，可在卡上继续修正）后点【保存】；绝不说已保存/已完成。\n注意：改「审核人」「复审人」这类**名字带“审核”的字段**是修改记录（update），不是审核操作。','skills-md') ON DUPLICATE KEY UPDATE sBrief=VALUES(sBrief), sBody=VALUES(sBody), sUpdatePerson='skills-md', tUpdateDate=NOW();
