北斗导航定位通信综合实践赛服务系统
This commit is contained in:
75
app/service/Contest.js
Normal file
75
app/service/Contest.js
Normal file
@@ -0,0 +1,75 @@
|
||||
'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;
|
||||
Reference in New Issue
Block a user