'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;