75 lines
2.9 KiB
JavaScript
75 lines
2.9 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
const Service = require('../core/base_service');
|
||
|
|
|
||
|
|
const { Op } = require('sequelize');
|
||
|
|
|
||
|
|
const fileName = "Contest";
|
||
|
|
|
||
|
|
class ContestService extends Service {
|
||
|
|
// 系统获取竞赛基本信息
|
||
|
|
async contestMsg(uid) {
|
||
|
|
const { ctx } = this;
|
||
|
|
try {
|
||
|
|
const user = await ctx.model4.Account.findOne({ attributes: ['contest_uid'], where: { uid } });
|
||
|
|
if (!user) return false;
|
||
|
|
const result = await ctx.model4.Contest.findOne({ where: { uid: user.dataValues.contest_uid }, order: [['created_at', 'DESC']] });
|
||
|
|
console.log(result)
|
||
|
|
return result || false;
|
||
|
|
} catch (error) {
|
||
|
|
const blockName = fileName + "--" + "contestMsg";
|
||
|
|
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
|
||
|
|
return 'error';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 系统获取排名信息
|
||
|
|
async ranking(uid) {
|
||
|
|
const { ctx } = this;
|
||
|
|
try {
|
||
|
|
// 按得分降序排序,得分相同时按创建时间降序排序
|
||
|
|
let include = [
|
||
|
|
{
|
||
|
|
model: ctx.model4.Account,
|
||
|
|
attributes: ['account_name'],
|
||
|
|
}
|
||
|
|
];
|
||
|
|
ctx.model4.Examination.belongsTo(ctx.model4.Account, { foreignKey: 'user_uid', targetKey: 'uid' });
|
||
|
|
const result = await ctx.model4.Examination.findAll({
|
||
|
|
attributes: ['score', 'created_at', 'updated_at'],
|
||
|
|
where: { updated_at: { [Op.ne]: null } },
|
||
|
|
// 先按得分降序排序
|
||
|
|
order: [['score', 'DESC'],],
|
||
|
|
limit: 100,
|
||
|
|
include,
|
||
|
|
});
|
||
|
|
if (result.length == 0) return false;
|
||
|
|
// 使用 Set 获取不同得分值
|
||
|
|
const uniqueScore = new Set(result.map(item => item.dataValues.score));
|
||
|
|
// 将 Set 转换为数组
|
||
|
|
const uniqueScoreArr = Array.from(uniqueScore);
|
||
|
|
// 对数组进行降序排序
|
||
|
|
uniqueScoreArr.sort((a, b) => b - a);
|
||
|
|
let allScoreArr = [];
|
||
|
|
uniqueScoreArr.forEach(score => {
|
||
|
|
let sameScoreArr = [];
|
||
|
|
result.forEach(item => {
|
||
|
|
if (item.dataValues.score == score) {
|
||
|
|
sameScoreArr.push(item);
|
||
|
|
item.timeDifference = item.dataValues.updated_at - item.dataValues.created_at;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
// 按创建时间降序排序
|
||
|
|
sameScoreArr.sort((a, b) => b.timeDifference - a.timeDifference);
|
||
|
|
allScoreArr.push(...sameScoreArr);
|
||
|
|
});
|
||
|
|
return allScoreArr;
|
||
|
|
} catch (error) {
|
||
|
|
const blockName = fileName + "--" + "ranking";
|
||
|
|
ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error);
|
||
|
|
return 'error';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = ContestService;
|