This commit is contained in:
张成
2025-12-16 15:55:42 +08:00
parent f3e6413bfe
commit 41e03daa50
7 changed files with 1077 additions and 28 deletions

View File

@@ -9,32 +9,59 @@ module.exports = {
/**
* @swagger
* /api/invite/info:
* get:
* post:
* summary: 获取邀请信息
* description: 根据用户ID获取邀请码和邀请链接
* description: 根据设备SN码获取邀请码和邀请链接
* tags: [前端-推广邀请]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - sn_code
* properties:
* sn_code:
* type: string
* description: 设备SN码
* responses:
* 200:
* description: 获取成功
*/
'GET /invite/info': async (ctx) => {
'POST /invite/info': async (ctx) => {
try {
// 从query或body中获取user_id实际应该从token中解析
// 从body中获取sn_code
const body = ctx.getBody();
const user_id = body.user_id || ctx.query?.user_id;
const { sn_code } = body;
if (!user_id) {
return ctx.fail('请先登录');
if (!sn_code) {
return ctx.fail('请提供设备SN码');
}
// 生成邀请码基于用户ID
const invite_code = `INV${user_id}${Date.now().toString(36).toUpperCase()}`;
const { pla_account } = await Framework.getModels();
// 根据sn_code查找用户
const user = await pla_account.findOne({
where: { sn_code }
});
if (!user) {
return ctx.fail('用户不存在');
}
// 生成邀请码基于用户ID和sn_code
const invite_code = `INV${user.id}_${Date.now().toString(36).toUpperCase()}`;
const invite_link = `https://work.light120.com/invite?code=${invite_code}`;
// 保存邀请码到用户记录可以保存到invite_code字段如果没有则保存到备注或其他字段
// 这里暂时不保存到数据库,每次生成新的
return ctx.success({
invite_code,
invite_link,
user_id
user_id: user.id,
sn_code: user.sn_code
});
} catch (error) {
console.error('获取邀请信息失败:', error);
@@ -45,30 +72,83 @@ module.exports = {
/**
* @swagger
* /api/invite/statistics:
* get:
* post:
* summary: 获取邀请统计
* description: 根据用户ID获取邀请统计数据
* description: 根据设备SN码获取邀请统计数据
* tags: [前端-推广邀请]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - sn_code
* properties:
* sn_code:
* type: string
* description: 设备SN码
* responses:
* 200:
* description: 获取成功
*/
'GET /invite/statistics': async (ctx) => {
'POST /invite/statistics': async (ctx) => {
try {
// 从query或body中获取user_id实际应该从token中解析
// 从body中获取sn_code
const body = ctx.getBody() || {};
const user_id = body.user_id || ctx.query?.user_id;
const { sn_code } = body;
if (!user_id) {
return ctx.fail('请先登录');
if (!sn_code) {
return ctx.fail('请提供设备SN码');
}
// 这里可以从数据库查询邀请统计,暂时返回模拟数据
const { pla_account } = await Framework.getModels();
// 根据sn_code查找用户
const user = await pla_account.findOne({
where: { sn_code }
});
if (!user) {
return ctx.fail('用户不存在');
}
// 查询邀请统计
const { invite_record } = await Framework.getModels();
// 查询总邀请数
const totalInvites = await invite_record.count({
where: {
inviter_id: user.id,
is_delete: 0
}
});
// 查询已发放奖励的邀请数(活跃邀请)
const activeInvites = await invite_record.count({
where: {
inviter_id: user.id,
reward_status: 1,
is_delete: 0
}
});
// 查询总奖励天数
const rewardRecords = await invite_record.findAll({
where: {
inviter_id: user.id,
reward_status: 1,
is_delete: 0
},
attributes: ['reward_value']
});
const totalRewardDays = rewardRecords.reduce((sum, record) => {
return sum + (record.reward_value || 0);
}, 0);
return ctx.success({
totalInvites: 0,
activeInvites: 0,
rewardPoints: 0,
rewardAmount: 0
totalInvites: totalInvites || 0
});
} catch (error) {
console.error('获取邀请统计失败:', error);
@@ -89,16 +169,27 @@ module.exports = {
*/
'POST /invite/generate': async (ctx) => {
try {
// 从query或body中获取user_id实际应该从token中解析
// 从body中获取sn_code
const body = ctx.getBody() || {};
const user_id = body.user_id || ctx.query?.user_id;
const { sn_code } = body;
if (!user_id) {
return ctx.fail('请先登录');
if (!sn_code) {
return ctx.fail('请提供设备SN码');
}
const { pla_account } = await Framework.getModels();
// 根据sn_code查找用户
const user = await pla_account.findOne({
where: { sn_code }
});
if (!user) {
return ctx.fail('用户不存在');
}
// 生成新的邀请码
const invite_code = `INV${user_id}${Date.now().toString(36).toUpperCase()}`;
const invite_code = `INV${user.id}_${Date.now().toString(36).toUpperCase()}`;
const invite_link = `https://work.light120.com/invite?code=${invite_code}`;
return ctx.success({
@@ -109,6 +200,100 @@ module.exports = {
console.error('生成邀请码失败:', error);
return ctx.fail('生成邀请码失败: ' + error.message);
}
},
/**
* @swagger
* /api/invite/records:
* post:
* summary: 获取邀请记录列表
* description: 根据设备SN码获取邀请记录列表
* tags: [前端-推广邀请]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - sn_code
* properties:
* sn_code:
* type: string
* description: 设备SN码
* page:
* type: integer
* description: 页码可选默认1
* pageSize:
* type: integer
* description: 每页数量可选默认20
* responses:
* 200:
* description: 获取成功
*/
'POST /invite/records': async (ctx) => {
try {
const body = ctx.getBody() || {};
const { sn_code, page = 1, pageSize = 20 } = body;
if (!sn_code) {
return ctx.fail('请提供设备SN码');
}
const { pla_account, invite_record } = await Framework.getModels();
// 根据sn_code查找用户
const user = await pla_account.findOne({
where: { sn_code }
});
if (!user) {
return ctx.fail('用户不存在');
}
// 查询邀请记录列表
const offset = (page - 1) * pageSize;
const records = await invite_record.findAll({
where: {
inviter_id: user.id,
is_delete: 0
},
order: [['register_time', 'DESC']],
limit: pageSize,
offset: offset
});
const total = await invite_record.count({
where: {
inviter_id: user.id,
is_delete: 0
}
});
// 格式化记录数据
const formattedRecords = records.map(record => {
const recordData = record.toJSON();
return {
id: recordData.id,
invitee_phone: recordData.invitee_phone,
invite_code: recordData.invite_code,
register_time: recordData.register_time,
reward_status: recordData.reward_status,
reward_value: recordData.reward_value,
reward_type: recordData.reward_type
};
});
return ctx.success({
list: formattedRecords,
total: total,
page: page,
pageSize: pageSize
});
} catch (error) {
console.error('获取邀请记录列表失败:', error);
return ctx.fail('获取邀请记录列表失败: ' + error.message);
}
}
};