Browse Source

mcp加入分页处理

cq.tianyong 9 hours ago
parent
commit
1795471eee
2 changed files with 95 additions and 21 deletions
  1. 2 1
      apis/MCP/aiAssistantMcp/McpRPC.js
  2. 93 20
      lib/AIChat/AiAssistantMcp.js

+ 2 - 1
apis/MCP/aiAssistantMcp/McpRPC.js

@@ -150,7 +150,8 @@ const tools = [
             properties: {
                 sender,
                 username: { type: 'string' },
-                password: { type: 'string' }
+                password: { type: 'string' },
+                ...pageProps
             },
             required: ['sender', 'username', 'password']
         }

+ 93 - 20
lib/AIChat/AiAssistantMcp.js

@@ -21,6 +21,16 @@ function pageArgs({ current = 1, pagesize = 10 } = {}, max = 20) {
     return { current: c, pagesize: p, offset: (c - 1) * p }
 }
 
+function pagination(page, totalRows) {
+    const total = Number(totalRows?.[0]?.total || 0)
+    return {
+        current: page.current,
+        pagesize: page.pagesize,
+        total,
+        total_pages: Math.ceil(total / page.pagesize)
+    }
+}
+
 function asJson(data) {
     return JSON.stringify(data)
 }
@@ -112,6 +122,12 @@ class AiAssistantMcp {
             where.push('auto_run = ?')
             params.push(Number(auto_run))
         }
+        const totalRows = await db.query(
+            `SELECT COUNT(*) AS total
+             FROM lepao_account
+             WHERE ${where.join(' AND ')}`,
+            params
+        )
         const rows = await db.query(
             `SELECT student_num, name, state, area, auto_run, auto_time, today_auto_time,
                     target_count, total_num, term_num, auto_day, notice_type, email, notes
@@ -121,8 +137,8 @@ class AiAssistantMcp {
              LIMIT ? OFFSET ?`,
             [...params, String(page.pagesize), String(page.offset)]
         )
-        if (!rows) return '查询失败'
-        return asJson({ list: rows.map(mapLepaoAccount) })
+        if (!rows || !totalRows) return '查询失败'
+        return asJson({ list: rows.map(mapLepaoAccount), pagination: pagination(page, totalRows) })
     }
 
     async list_lepao_records(args) {
@@ -151,6 +167,13 @@ class AiAssistantMcp {
             where.push('r.time < ?')
             params.push(end_time)
         }
+        const totalRows = await db.query(
+            `SELECT COUNT(*) AS total
+             FROM lepao_record r
+             LEFT JOIN lepao_account a ON r.lepao_account = a.student_num
+             WHERE ${where.join(' AND ')}`,
+            params
+        )
         const rows = await db.query(
             `SELECT r.public_id, r.time, r.result, r.run_mode, r.lepao_account, a.name
              FROM lepao_record r
@@ -160,8 +183,8 @@ class AiAssistantMcp {
              LIMIT ? OFFSET ?`,
             [...params, String(page.pagesize), String(page.offset)]
         )
-        if (!rows) return '查询失败'
-        return asJson({ list: rows })
+        if (!rows || !totalRows) return '查询失败'
+        return asJson({ list: rows, pagination: pagination(page, totalRows) })
     }
 
     async list_lepao_count_ledger(args) {
@@ -186,6 +209,12 @@ class AiAssistantMcp {
             where.push('created_at <= FROM_UNIXTIME(? / 1000)')
             params.push(end_time)
         }
+        const totalRows = await db.query(
+            `SELECT COUNT(*) AS total
+             FROM lepao_count_ledger
+             WHERE ${where.join(' AND ')}`,
+            params
+        )
         const rows = await db.query(
             `SELECT delta, balance_before, balance_after, biz_type, remark,
                     UNIX_TIMESTAMP(created_at) * 1000 AS created_at
@@ -195,8 +224,8 @@ class AiAssistantMcp {
              LIMIT ? OFFSET ?`,
             [...params, String(page.pagesize), String(page.offset)]
         )
-        if (!rows) return '查询失败'
-        return asJson({ list: rows })
+        if (!rows || !totalRows) return '查询失败'
+        return asJson({ list: rows, pagination: pagination(page, totalRows) })
     }
 
     async list_goods(args) {
@@ -212,6 +241,12 @@ class AiAssistantMcp {
             where.push('category = ?')
             params.push(category)
         }
+        const totalRows = await db.query(
+            `SELECT COUNT(*) AS total
+             FROM goods
+             WHERE ${where.join(' AND ')}`,
+            params
+        )
         const rows = await db.query(
             `SELECT name, price, num, \`limit\`, description, category, features
              FROM goods
@@ -220,8 +255,8 @@ class AiAssistantMcp {
              LIMIT ? OFFSET ?`,
             [...params, String(page.pagesize), String(page.offset)]
         )
-        if (!rows) return '查询失败'
-        return asJson({ list: rows.map(r => ({ ...r, features: parseJson(r.features, []) })) })
+        if (!rows || !totalRows) return '查询失败'
+        return asJson({ list: rows.map(r => ({ ...r, features: parseJson(r.features, []) })), pagination: pagination(page, totalRows) })
     }
 
     async list_my_orders(args) {
@@ -238,6 +273,13 @@ class AiAssistantMcp {
             where.push('o.orderId = ?')
             params.push(order_id)
         }
+        const totalRows = await db.query(
+            `SELECT COUNT(*) AS total
+             FROM orders o
+             JOIN goods g ON o.goods_id = g.id
+             WHERE ${where.join(' AND ')}`,
+            params
+        )
         const rows = await db.query(
             `SELECT o.orderId, o.state, o.create_time, o.price, o.pay_type, g.name AS goods_name
              FROM orders o
@@ -247,7 +289,7 @@ class AiAssistantMcp {
              LIMIT ? OFFSET ?`,
             [...params, String(page.pagesize), String(page.offset)]
         )
-        if (!rows) return '查询失败'
+        if (!rows || !totalRows) return '查询失败'
         return asJson({
             list: rows.map(r => ({
                 order_no: r.orderId,
@@ -256,7 +298,8 @@ class AiAssistantMcp {
                 price: r.price,
                 pay_type: r.pay_type,
                 goods_name: r.goods_name
-            }))
+            })),
+            pagination: pagination(page, totalRows)
         })
     }
 
@@ -432,20 +475,46 @@ class AiAssistantMcp {
             taskWhere.push('room = ?')
             taskParams.push(room)
         }
+        const isRecordQuery = Boolean(task_id || (area && building && room))
+        if (!isRecordQuery) {
+            const totalRows = await db.query(
+                `SELECT COUNT(*) AS total
+                 FROM power_task
+                 WHERE ${taskWhere.join(' AND ')}`,
+                taskParams
+            )
+            const tasks = await db.query(
+                `SELECT id, area, building, room, balance, lowest, koufei_date, update_time, notes
+                 FROM power_task
+                 WHERE ${taskWhere.join(' AND ')}
+                 ORDER BY id DESC
+                 LIMIT ? OFFSET ?`,
+                [...taskParams, String(page.pagesize), String(page.offset)]
+            )
+            if (!tasks || !totalRows) return '查询失败'
+            return asJson({
+                tasks: tasks.map(({ id, ...task }) => task),
+                pagination: pagination(page, totalRows)
+            })
+        }
+
         const tasks = await db.query(
             `SELECT id, area, building, room, balance, lowest, koufei_date, update_time, notes
              FROM power_task
              WHERE ${taskWhere.join(' AND ')}
              ORDER BY id DESC
-             LIMIT ? OFFSET ?`,
-            [...taskParams, String(page.pagesize), String(page.offset)]
+             LIMIT 1`,
+            taskParams
         )
         if (!tasks) return '查询失败'
-        if (!task_id && !(area && building && room)) {
-            return asJson({ tasks: tasks.map(({ id, ...task }) => task) })
-        }
-        if (tasks.length === 0) return asJson({ task: null, records: [] })
+        if (tasks.length === 0) return asJson({ task: null, records: [], pagination: pagination(page, [{ total: 0 }]) })
 
+        const totalRows = await db.query(
+            `SELECT COUNT(*) AS total
+             FROM power_change_record
+             WHERE task_id = ?`,
+            [tasks[0].id]
+        )
         const records = await db.query(
             `SELECT time, balance, old_balance, change_time
              FROM power_change_record
@@ -455,29 +524,33 @@ class AiAssistantMcp {
             [tasks[0].id, String(page.pagesize), String(page.offset)]
         )
         const { id, ...task } = tasks[0]
-        return asJson({ task, records: records || [] })
+        if (!records || !totalRows) return '查询失败'
+        return asJson({ task, records, pagination: pagination(page, totalRows) })
     }
 
     async query_qxs_book_list(args) {
-        const { sender, username, password } = args
+        const { sender, username, password, current, pagesize } = args
         if (required([sender, username, password])) return '缺少 sender、username 或 password'
         try {
+            const page = pageArgs({ current, pagesize })
             const qxs = new QxsBookList()
             const { accessToken } = await qxs.qxsLogin(username, password)
             const { userInfo } = await qxs.qsxUserInfo(accessToken)
             const { bookList } = await qxs.qsxGetList(accessToken, userInfo.termCode)
+            const list = bookList || []
             return asJson({
                 user: {
                     realname: userInfo.userName,
                     termName: userInfo.termName
                 },
-                list: (bookList || []).map(book => ({
+                list: list.slice(page.offset, page.offset + page.pagesize).map(book => ({
                     title: book.title || book.bookName || '',
                     isbn: book.isbn || '',
                     author: book.author || '',
                     publisher: book.publisher || '',
                     className: book.className || ''
-                }))
+                })),
+                pagination: pagination(page, [{ total: list.length }])
             })
         } catch (err) {
             return err.message || '查询趣选书书单失败'