|
@@ -17,6 +17,120 @@ class MatchSmallGroupScheduleService extends CrudService {
|
|
this.defaultModule = this.app.config.defaultModel || 'Race';
|
|
this.defaultModule = this.app.config.defaultModel || 'Race';
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ async result({ match_id, group_id, project_id }) {
|
|
|
|
+ const { refMods, populate } = this.getRefMods();
|
|
|
|
+ let list = await this.model.find({ match_id, group_id, project_id }).populate({
|
|
|
|
+ path: 'team_id',
|
|
|
|
+ model: this.ctx.model.Race.MatchTeamGroup,
|
|
|
|
+ select: 'name',
|
|
|
|
+ });
|
|
|
|
+ if (list.length <= 0) return;
|
|
|
|
+ list = JSON.parse(JSON.stringify(list));
|
|
|
|
+ list = list.map(i => {
|
|
|
|
+ const { winner, player_one, player_one_score, player_two, player_two_score } = i;
|
|
|
|
+ if (winner) return i;
|
|
|
|
+ if (player_one_score > player_two_score) i.winner = player_one;
|
|
|
|
+ else i.winner = player_two;
|
|
|
|
+ i.team_name = _.get(i, 'team_id.name');
|
|
|
|
+ i.team_id = _.get(i, 'team_id._id');
|
|
|
|
+ return i;
|
|
|
|
+ });
|
|
|
|
+ const newArr = [];
|
|
|
|
+ for (const i of list) {
|
|
|
|
+ const d = await this.getPlayerName(i);
|
|
|
|
+ newArr.push(d);
|
|
|
|
+ }
|
|
|
|
+ list = _.groupBy(newArr, 'team_id');
|
|
|
|
+ const arr = [];
|
|
|
|
+ for (const team_id in list) {
|
|
|
|
+ const groups = list[team_id];
|
|
|
|
+ const team_name = _.get(_.head(groups), 'team_name');
|
|
|
|
+ const obj = { team_name };
|
|
|
|
+ let players = [];
|
|
|
|
+ const p1s = groups.map(i => ({ player: i.player_one, player_name: i.player_one_name }));
|
|
|
|
+ const p2s = groups.map(i => ({ player: i.player_two, player_name: i.player_two_name }));
|
|
|
|
+ players.push(...p1s, ...p2s);
|
|
|
|
+ players = _.uniqBy(players, 'player');
|
|
|
|
+ // 转换成object[], player:选手; win: 胜场; score:净胜球
|
|
|
|
+ players = players.map(i => ({ player: i.player, player_name: i.player_name, win: 0, score: 0 }));
|
|
|
|
+ for (const g of groups) {
|
|
|
|
+ const { winner, player_one, player_one_score, player_two, player_two_score } = g;
|
|
|
|
+ const p1RoundScore = this.getScore(player_one_score, player_two_score);
|
|
|
|
+ const p2RoundScore = this.getScore(player_two_score, player_one_score);
|
|
|
|
+ const p1 = players.find(f => f.player === player_one);
|
|
|
|
+ const p2 = players.find(f => f.player === player_two);
|
|
|
|
+ // p1,p2谁没有就不行
|
|
|
|
+ if (!p1 || !p2) continue;
|
|
|
|
+ p1.score = p1.score + p1RoundScore || 0;
|
|
|
|
+ p2.score = p2.score + p2RoundScore || 0;
|
|
|
|
+ if (winner === player_one) p1.win += 1;
|
|
|
|
+ else p2.win += 1;
|
|
|
|
+ }
|
|
|
|
+ players = _.orderBy(players, [ 'win', 'score' ], [ 'desc', 'desc' ]);
|
|
|
|
+ obj.score = players;
|
|
|
|
+ const playerArr = players.map(i => i.player_name);
|
|
|
|
+ const scoreList = [];
|
|
|
|
+ for (const p1 of players) {
|
|
|
|
+ // 每列的第一个位置是选手
|
|
|
|
+ const marr = [ p1.player_name ];
|
|
|
|
+ for (const p2 of players) {
|
|
|
|
+ // 循环表头的选手, 自己和自己没分
|
|
|
|
+ if (p1.player === p2.player) continue;
|
|
|
|
+ const r = groups.find(f => (f.player_one === p1.player && f.player_two === p2.player) || (f.player_one === p2.player && f.player_two === p1.player));
|
|
|
|
+ if (!r) marr.push(null);
|
|
|
|
+ else {
|
|
|
|
+ const { player_one_score, player_two_score } = r;
|
|
|
|
+ console.log(`${p1.player_name}:${p2.player_name} -> ${player_one_score}:${player_two_score}`);
|
|
|
|
+ marr.push(`${player_one_score}:${player_two_score}`);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ scoreList.push(marr);
|
|
|
|
+ }
|
|
|
|
+ obj.table = [ ...playerArr, ...scoreList ];
|
|
|
|
+ arr.push(obj);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return arr;
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 计算净胜分
|
|
|
|
+ * @param {String|Number} s1 分数1
|
|
|
|
+ * @param {String|Number} s2 分数2
|
|
|
|
+ * @return {Number} 净胜分
|
|
|
|
+ */
|
|
|
|
+ getScore(s1, s2) {
|
|
|
|
+ return (parseInt(s1) || 0) - (parseInt(s2) || 0);
|
|
|
|
+ }
|
|
|
|
+ // 换选手名称
|
|
|
|
+ async getPlayerName(data) {
|
|
|
|
+ if (!data) return data;
|
|
|
|
+ data = JSON.parse(JSON.stringify(data));
|
|
|
|
+ const { player_type, player_one, player_two } = data;
|
|
|
|
+ if (!player_type) return data;
|
|
|
|
+ // 人处理
|
|
|
|
+ if (player_type === 'Race.User') {
|
|
|
|
+ if (player_one) {
|
|
|
|
+ const p1 = await this.userModel.findById(player_one, { user_id: 1 }).populate({ path: 'user_id', model: this.baseUserModel, select: 'name' });
|
|
|
|
+ data.player_one_name = _.get(p1, 'user_id.name');
|
|
|
|
+ }
|
|
|
|
+ if (player_two) {
|
|
|
|
+ const p2 = await this.userModel.findById(player_two, { user_id: 1 }).populate({ path: 'user_id', model: this.baseUserModel, select: 'name' });
|
|
|
|
+ data.player_two_name = _.get(p2, 'user_id.name');
|
|
|
|
+ }
|
|
|
|
+ } else if (player_type === 'Race.TeamApply') {
|
|
|
|
+ if (player_one) {
|
|
|
|
+ const p1 = await this.teamApplyModel.findById(player_one, { one_member_name: 1, two_member_name: 1 });
|
|
|
|
+ data.player_one_name = `${_.get(p1, 'one_member_name')}-${_.get(p1, 'two_member_name')}`;
|
|
|
|
+ }
|
|
|
|
+ if (player_two) {
|
|
|
|
+ const p2 = await this.teamApplyModel.findById(player_two, { one_member_name: 1, two_member_name: 1 });
|
|
|
|
+ data.player_two_name = `${_.get(p2, 'one_member_name')}-${_.get(p2, 'two_member_name')}`;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+ }
|
|
|
|
+
|
|
async saveAll(data) {
|
|
async saveAll(data) {
|
|
for (const i of data) {
|
|
for (const i of data) {
|
|
const { _id } = i;
|
|
const { _id } = i;
|