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