diff --git a/client/src/pages/api/admin/countTraining.ts b/client/src/pages/api/admin/countTraining.ts deleted file mode 100644 index a3485cb9c..000000000 --- a/client/src/pages/api/admin/countTraining.ts +++ /dev/null @@ -1,37 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next'; -import { jsonRes } from '@/service/response'; -import { authUser } from '@/service/utils/auth'; -import { connectToDatabase, TrainingData } from '@/service/mongo'; -import { TrainingModeEnum } from '@/constants/plugin'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await authUser({ req, authRoot: true }); - - await connectToDatabase(); - - // split queue data - const result = await TrainingData.aggregate([ - { - $group: { - _id: '$mode', - count: { $sum: 1 } - } - } - ]); - - jsonRes(res, { - data: { - qaListLen: result.find((item) => item._id === TrainingModeEnum.qa)?.count || 0, - vectorListLen: result.find((item) => item._id === TrainingModeEnum.index)?.count || 0 - } - }); - } catch (error) { - console.log(error); - jsonRes(res, { - code: 500, - error - }); - } -} diff --git a/client/src/pages/api/admin/withdraw.ts b/client/src/pages/api/admin/withdraw.ts new file mode 100644 index 000000000..a674dc250 --- /dev/null +++ b/client/src/pages/api/admin/withdraw.ts @@ -0,0 +1,62 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@/service/response'; +import { authUser } from '@/service/utils/auth'; +import { connectToDatabase, TrainingData, User, promotionRecord } from '@/service/mongo'; +import { TrainingModeEnum } from '@/constants/plugin'; +import mongoose from 'mongoose'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + await authUser({ req, authRoot: true }); + const { amount, userId, type } = req.body as { + amount: number; + userId: number; + type: 'withdraw'; + }; + await connectToDatabase(); + + if (!userId || !amount || type !== 'withdraw' || amount <= 0) { + throw new Error('params is error'); + } + + // check promotion balance + const countResidue: { totalAmount: number }[] = await promotionRecord.aggregate([ + { $match: { userId: new mongoose.Types.ObjectId(userId) } }, + { + $group: { + _id: null, // 分组条件,这里使用 null 表示不分组 + totalAmount: { $sum: '$amount' } // 计算 amount 字段的总和 + } + }, + { + $project: { + _id: false, // 排除 _id 字段 + totalAmount: true // 只返回 totalAmount 字段 + } + } + ]); + + const balance = countResidue[0].totalAmount; + + if (balance < amount) { + throw new Error('可提现余额不足'); + } + + // add record + await promotionRecord.create({ + userId, + type, + amount: -amount + }); + + jsonRes(res, { + data: balance + }); + } catch (error) { + jsonRes(res, { + code: 500, + error + }); + } +} diff --git a/client/src/pages/number/index.tsx b/client/src/pages/number/index.tsx index 66f4661e7..368739bba 100644 --- a/client/src/pages/number/index.tsx +++ b/client/src/pages/number/index.tsx @@ -220,7 +220,8 @@ const NumberSetting = ({ tableType }: { tableType: `${TableEnum}` }) => { {[ { label: '佣金比例', value: `${userInfo?.promotion.rate || 15}%` }, { label: '已注册用户数', value: `${invitedAmount}人` }, - { label: '累计佣金', value: `¥${historyAmount}` } + { label: '累计佣金', value: `¥${historyAmount}` }, + { label: '可用佣金', value: `¥${residueAmount}` } ].map((item) => ( {item.label}