Browse Source

✨ feat: 新增人工客服处理功能

Pchen0 1 week ago
parent
commit
86a6d8736d
3 changed files with 68 additions and 14 deletions
  1. 15 12
      apis/Kefu/Order/CreateOrder.js
  2. 21 1
      apis/MCP/workorderMcp/McpRPC.js
  3. 32 1
      lib/Lepao/WorkOrderMcp.js

+ 15 - 12
apis/Kefu/Order/CreateOrder.js

@@ -39,7 +39,7 @@ class CreateOrder extends API {
             type: 'user'
         }
 
-        let sql, r
+        let sql, r, need_manual = 0
 
         if (!id) {
             if ([title].some(value => value === '' || value === null || value === undefined))
@@ -59,7 +59,7 @@ class CreateOrder extends API {
             sql = 'INSERT INTO work_order (title, email, msg, create_user, create_time, update_time) VALUES (?, ?, ?, ?, ?, ?)'
             r = await db.query(sql, [title, email, msg, uuid, time, time])
         } else {
-            const selectSql = 'SELECT msg, state, email FROM work_order WHERE id = ? AND create_user = ?'
+            const selectSql = 'SELECT msg, state, email, need_manual FROM work_order WHERE id = ? AND create_user = ?'
             const selectRows = await db.query(selectSql, [id, uuid])
             if (!selectRows || selectRows.length !== 1 || selectRows[0].state === 2)
                 return res.json({
@@ -72,6 +72,7 @@ class CreateOrder extends API {
 
             sql = 'UPDATE work_order SET msg = ?, update_time = ?, state = 0 WHERE id = ? AND create_user = ?'
             r = await db.query(sql, [msg, time, id, uuid])
+            need_manual = selectRows[0].need_manual
         }
 
         try {
@@ -82,16 +83,18 @@ class CreateOrder extends API {
                 })
 
                 try {
-                    this.logger.info(`工单转发OneBot开始:orderId=${r.insertId || id}`)
-                    await OneBotV11.sendOrderMessage({
-                        orderId: r.insertId || id,
-                        title,
-                        role: '用户',
-                        senderUuid: uuid,
-                        content,
-                        files: files ?? []
-                    })
-                    this.logger.info(`工单转发OneBot结束:orderId=${r.insertId || id}`)
+                    if (need_manual == 0) {
+                        this.logger.info(`工单转发OneBot开始:orderId=${r.insertId || id}`)
+                        await OneBotV11.sendOrderMessage({
+                            orderId: r.insertId || id,
+                            title,
+                            role: '用户',
+                            senderUuid: uuid,
+                            content,
+                            files: files ?? []
+                        })
+                        this.logger.info(`工单转发OneBot结束:orderId=${r.insertId || id}`)
+                    }
                 } catch (botErr) {
                     this.logger.error(`OneBot v11 转发工单消息失败:${botErr.stack}`)
                 }

+ 21 - 1
apis/MCP/workorderMcp/McpRPC.js

@@ -25,7 +25,24 @@ class McpRpc extends API {
             } else if (method === 'tools/list') {
                 result = {
                     "tools": [
-                        
+                        {
+                            "name": "need_manual",
+                            "description": "提交转人工服务请求",
+                            "inputSchema": {
+                                "type": "object",
+                                "properties": {
+                                    "sender": {
+                                        "type": "string",
+                                        "description": "Unique user identifier from the chat platform"
+                                    },
+                                    "order_id": {
+                                        "type": "integer",
+                                        "description": "Order ID of the work order to submit"
+                                    }
+                                },
+                                "required": ["sender", "order_id"]
+                            }
+                        },
                         {
                             "name": "unbind_account",
                             "description": "解绑被他人绑定的乐跑账号",
@@ -70,6 +87,9 @@ class McpRpc extends API {
                 let output
 
                 switch (name) {
+                    case "need_manual":
+                        output = await MCP.need_manual(args)
+                        break
                     case "get_account_info":
                         output = await MCP.get_account_info(args)
                         break

+ 32 - 1
lib/Lepao/WorkOrderMcp.js

@@ -138,7 +138,38 @@ class WorkOrderMcp {
         }
     }
 
-   
+    async need_manual({ sender, order_id }) {
+        try {
+            if ([sender, order_id].some(value => value === '' || value === null || value === undefined))
+                return '缺少参数'
+
+            this.logger.info(`MCP接收转人工服务请求:${order_id}`)
+
+            const selectSql = 'SELECT msg, state, email, need_manual FROM work_order WHERE id = ? AND create_user = ?'
+            const selectRows = await db.query(selectSql, [order_id, sender])
+            if (!selectRows || selectRows.length !== 1)
+                return '未找到你创建的工单,请核对工单ID'
+            if (selectRows[0].state === 2) return '工单已关闭,无法提交转人工服务,请提交新工单'
+            if (selectRows[0].need_manual === 1) return '该工单已提交转人工服务,无需重复提交'
+            
+            msg = selectRows[0].msg
+            msg.push({
+                time: Date.now(),
+                content: '人工处理请求已提交,请耐心等待人工客服处理',
+                uuid: 'e4fe0277-0b1a-41a1-b25f-8b6e4cec3281',
+                type: 'system'
+            })
+
+            let updateSql = `UPDATE work_order SET msg = ?, need_manual = 1, update_time = ? WHERE id = ? AND create_user = ?`
+            let updateRows = await db.query(updateSql, [msg, Date.now(), order_id, sender])
+            if (!updateRows || updateRows.affectedRows !== 1) return '系统出错,请稍后再试'
+            
+            return `转人工服务请求已提交,后续消息AI助理小妍将不再回复`
+        } catch (error) {
+            this.logger.error(`MCP转人工服务出错:${error.stack}`)
+            return '系统出错,请稍后再试'
+        }
+    }
 }
 
 const WORKORDERMCP = new WorkOrderMcp()