fix: delete 支持 quantity/amount 精确匹配,避免误删同名记录

- AI prompt 新增「删除规则补充」:用户指定数量/金额时同时返回对应字段
- 后端 handleAIResult delete 分支改为动态构建 SQL,quantity/amount 存在时追加 AND 条件
- 新增删除查询日志方便排查
This commit is contained in:
2026-07-22 15:44:33 +08:00
parent 4fe5abb74a
commit 3d7732474d

View File

@@ -347,7 +347,12 @@ async function analyzeWithDeepSeek(text, historyMessages, username, isAdmin) {
- 删除所有金额为0的记录delete_item="__AMOUNT_ZERO__" - 删除所有金额为0的记录delete_item="__AMOUNT_ZERO__"
- 删除物品名为空、null、undefined 的记录delete_item="__NULL_NAME__" - 删除物品名为空、null、undefined 的记录delete_item="__NULL_NAME__"
- 不要再返回 action="ask" 来处理删除请求,只要确定是删除意图,就必须返回 action="delete" 并填好 delete_item。 - 不要再返回 action="ask" 来处理删除请求,只要确定是删除意图,就必须返回 action="delete" 并填好 delete_item。
- 若用户描述的是特定记录(如名字叫XXX的),则 delete_item 填那个物品名。 - 若用户描述的是特定记录(如"名字叫XXX的"),则 delete_item 填那个物品名。
⚠️ 删除规则补充(重要):
- 如果用户说"删除数量X的那条/那个记录",你必须同时返回 quantity 字段,值为 X。
- 如果用户提到"金额为Y的/价格Y的"来区分记录,你必须同时返回 amount 字段,值为 Y。
- 提供这些字段后,系统只会精确删除匹配的那一条,避免误删同名记录。
⚠️ 附件补充规则: ⚠️ 附件补充规则:
- 如果用户发送图片并明确说"这是XX的图片"或"作为附件存到XX采购里" - 如果用户发送图片并明确说"这是XX的图片"或"作为附件存到XX采购里"
@@ -398,7 +403,13 @@ function handleAIResult(aiResult, roomId, username, originalText, attachments) {
} else if (itemName === '__NULL_NAME__') { } else if (itemName === '__NULL_NAME__') {
purchases = db.prepare("SELECT id, item, amount, payment_method, status, applicant, created_at FROM purchases WHERE room_id = ? AND (item IS NULL OR item = '' OR item = 'null' OR item = 'undefined')").all(roomId); purchases = db.prepare("SELECT id, item, amount, payment_method, status, applicant, created_at FROM purchases WHERE room_id = ? AND (item IS NULL OR item = '' OR item = 'null' OR item = 'undefined')").all(roomId);
} else { } else {
purchases = db.prepare('SELECT id, item, amount, payment_method, status, applicant, created_at FROM purchases WHERE room_id = ? AND item LIKE ?').all(roomId, `%${itemName}%`); // 动态构建查询:根据 AI 提供的 quantity/amount 精确匹配
let query = 'SELECT id, item, amount, payment_method, status, applicant, created_at FROM purchases WHERE room_id = ? AND item LIKE ?';
const params = [roomId, `%${itemName}%`];
if (aiResult.quantity !== undefined) { query += ' AND quantity = ?'; params.push(aiResult.quantity); }
if (aiResult.amount !== undefined) { query += ' AND amount = ?'; params.push(aiResult.amount); }
console.log('🔍 删除查询:', query, params);
purchases = db.prepare(query).all(...params);
} }
if (purchases.length === 0) { if (purchases.length === 0) {
const label = itemName === '__AMOUNT_ZERO__' ? '金额为0' : (itemName === '__NULL_NAME__' ? '名称为空' : `"${itemName}"`); const label = itemName === '__AMOUNT_ZERO__' ? '金额为0' : (itemName === '__NULL_NAME__' ? '名称为空' : `"${itemName}"`);