refactor: 重构代码减少重复并添加分页
后端 (records.js): - 提取通用分页查询函数 queryPagedRecords - 5个列表接口 (orders/other-income/red-envelope/milk-tea/dispatches) 复用同一函数 后端 (stats.js): - 为 monthly-records, boss-records, partner-records, daily-detail 添加分页支持 - 新增 page, limit, totalCount 返回字段 前端 (order-list.js): - 提取通用列表配置 listConfig - 统一渲染函数 renderOrderItem/renderOtherIncomeItem 等 - 大幅减少代码重复 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
a03e92d437
commit
2ebac98f07
+52
-61
@@ -15,89 +15,80 @@ router.post('/', (req, res) => {
|
||||
res.json({ id: result.lastInsertRowid });
|
||||
});
|
||||
|
||||
// 接单列表
|
||||
router.get('/orders', (req, res) => {
|
||||
const { page = 1, limit = 20 } = req.query;
|
||||
// 通用分页查询函数
|
||||
function queryPagedRecords(userId, year, month, options) {
|
||||
const { page = 1, limit = 20 } = options;
|
||||
const offset = (Number(page) - 1) * Number(limit);
|
||||
const { startDate, endDate } = getMonthRange(req.query.year, req.query.month);
|
||||
const { startDate, endDate } = getMonthRange(year, month);
|
||||
|
||||
let whereClause = `user_id = ? AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ?`;
|
||||
const params = [userId, startDate, endDate];
|
||||
|
||||
if (options.category) {
|
||||
whereClause += ` AND category = ?`;
|
||||
params.push(options.category);
|
||||
}
|
||||
if (options.type) {
|
||||
whereClause += ` AND type = ?`;
|
||||
params.push(options.type);
|
||||
}
|
||||
if (options.excludeCategories && options.excludeCategories.length > 0) {
|
||||
whereClause += ` AND category NOT IN (${options.excludeCategories.map(() => '?').join(',')})`;
|
||||
params.push(...options.excludeCategories);
|
||||
}
|
||||
|
||||
const total = db.prepare(
|
||||
`SELECT COUNT(*) as count FROM records WHERE user_id = ? AND category = '接单' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ?`
|
||||
).get(req.user.id, startDate, endDate).count;
|
||||
`SELECT COUNT(*) as count FROM records WHERE ${whereClause}`
|
||||
).get(...params).count;
|
||||
|
||||
const records = db.prepare(
|
||||
`SELECT * FROM records WHERE user_id = ? AND category = '接单' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ? ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
||||
).all(req.user.id, startDate, endDate, Number(limit), offset);
|
||||
`SELECT * FROM records WHERE ${whereClause} ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
||||
).all(...params, Number(limit), offset);
|
||||
|
||||
res.json({ records, total, page: Number(page), limit: Number(limit) });
|
||||
return { records, total, page: Number(page), limit: Number(limit) };
|
||||
}
|
||||
|
||||
// 接单列表
|
||||
router.get('/orders', (req, res) => {
|
||||
const result = queryPagedRecords(req.user.id, req.query.year, req.query.month, {
|
||||
category: '接单'
|
||||
});
|
||||
res.json(result);
|
||||
});
|
||||
|
||||
// 红包及其他收入列表
|
||||
router.get('/other-income', (req, res) => {
|
||||
const { page = 1, limit = 20 } = req.query;
|
||||
const offset = (Number(page) - 1) * Number(limit);
|
||||
const { startDate, endDate } = getMonthRange(req.query.year, req.query.month);
|
||||
|
||||
const total = db.prepare(
|
||||
`SELECT COUNT(*) as count FROM records WHERE user_id = ? AND type = 'income' AND category != '接单' AND category != '派单' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ?`
|
||||
).get(req.user.id, startDate, endDate).count;
|
||||
|
||||
const records = db.prepare(
|
||||
`SELECT * FROM records WHERE user_id = ? AND type = 'income' AND category != '接单' AND category != '派单' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ? ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
||||
).all(req.user.id, startDate, endDate, Number(limit), offset);
|
||||
|
||||
res.json({ records, total, page: Number(page), limit: Number(limit) });
|
||||
const result = queryPagedRecords(req.user.id, req.query.year, req.query.month, {
|
||||
type: 'income',
|
||||
excludeCategories: ['接单', '派单']
|
||||
});
|
||||
res.json(result);
|
||||
});
|
||||
|
||||
// 红包收入列表
|
||||
router.get('/red-envelope', (req, res) => {
|
||||
const { page = 1, limit = 20 } = req.query;
|
||||
const offset = (Number(page) - 1) * Number(limit);
|
||||
const { startDate, endDate } = getMonthRange(req.query.year, req.query.month);
|
||||
|
||||
const total = db.prepare(
|
||||
`SELECT COUNT(*) as count FROM records WHERE user_id = ? AND type = 'income' AND category = '红包收入' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ?`
|
||||
).get(req.user.id, startDate, endDate).count;
|
||||
|
||||
const records = db.prepare(
|
||||
`SELECT * FROM records WHERE user_id = ? AND type = 'income' AND category = '红包收入' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ? ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
||||
).all(req.user.id, startDate, endDate, Number(limit), offset);
|
||||
|
||||
res.json({ records, total, page: Number(page), limit: Number(limit) });
|
||||
const result = queryPagedRecords(req.user.id, req.query.year, req.query.month, {
|
||||
type: 'income',
|
||||
category: '红包收入'
|
||||
});
|
||||
res.json(result);
|
||||
});
|
||||
|
||||
// 奶茶收入列表
|
||||
router.get('/milk-tea', (req, res) => {
|
||||
const { page = 1, limit = 20 } = req.query;
|
||||
const offset = (Number(page) - 1) * Number(limit);
|
||||
const { startDate, endDate } = getMonthRange(req.query.year, req.query.month);
|
||||
|
||||
const total = db.prepare(
|
||||
`SELECT COUNT(*) as count FROM records WHERE user_id = ? AND type = 'income' AND category = '奶茶' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ?`
|
||||
).get(req.user.id, startDate, endDate).count;
|
||||
|
||||
const records = db.prepare(
|
||||
`SELECT * FROM records WHERE user_id = ? AND type = 'income' AND category = '奶茶' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ? ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
||||
).all(req.user.id, startDate, endDate, Number(limit), offset);
|
||||
|
||||
res.json({ records, total, page: Number(page), limit: Number(limit) });
|
||||
const result = queryPagedRecords(req.user.id, req.query.year, req.query.month, {
|
||||
type: 'income',
|
||||
category: '奶茶'
|
||||
});
|
||||
res.json(result);
|
||||
});
|
||||
|
||||
// 派单列表
|
||||
router.get('/dispatches', (req, res) => {
|
||||
const { page = 1, limit = 20 } = req.query;
|
||||
const offset = (Number(page) - 1) * Number(limit);
|
||||
const { startDate, endDate } = getMonthRange(req.query.year, req.query.month);
|
||||
|
||||
const total = db.prepare(
|
||||
`SELECT COUNT(*) as count FROM records WHERE user_id = ? AND category = '派单' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ?`
|
||||
).get(req.user.id, startDate, endDate).count;
|
||||
|
||||
const records = db.prepare(
|
||||
`SELECT * FROM records WHERE user_id = ? AND category = '派单' AND DATE(created_at, 'localtime') >= ? AND DATE(created_at, 'localtime') < ? ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
||||
).all(req.user.id, startDate, endDate, Number(limit), offset);
|
||||
|
||||
res.json({ records, total, page: Number(page), limit: Number(limit) });
|
||||
const result = queryPagedRecords(req.user.id, req.query.year, req.query.month, {
|
||||
category: '派单'
|
||||
});
|
||||
res.json(result);
|
||||
});
|
||||
|
||||
// 获取记录列表
|
||||
|
||||
Reference in New Issue
Block a user