Files
bd-contest/app/service/Contest.js

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;