lrf 2 年之前
父节点
当前提交
a80beb2021

+ 9 - 0
app/controller/config/.matchSmallGroupSchedule.js

@@ -80,4 +80,13 @@ module.exports = {
       count: true,
     },
   },
+  result: {
+    parameters: {
+      query: {
+        match_id: 'match_id',
+        group_id: 'group_id',
+        project_id: 'project_id',
+      },
+    },
+  },
 };

+ 114 - 0
app/service/matchSmallGroupSchedule.js

@@ -17,6 +17,120 @@ class MatchSmallGroupScheduleService extends CrudService {
     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) {
     for (const i of data) {
       const { _id } = i;

+ 2 - 1
app/z_router/matchSmallGroupSchedule.js

@@ -7,10 +7,11 @@ const rkey = 'msgs';
 const ckey = 'matchSmallGroupSchedule';
 const keyZh = '小组赛赛程';
 const routes = [
+  { method: 'get', path: `${rkey}/result`, controller: `${ckey}.result`, name: `${ckey}Result`, zh: `${keyZh}小组赛结果查询` },
   { method: 'post', path: `${rkey}/saveAll`, controller: `${ckey}.saveAll`, name: `${ckey}saveAll`, zh: `${keyZh}全部保存` },
   { method: 'get', path: `${rkey}`, controller: `${ckey}.index`, name: `${ckey}Query`, zh: `${keyZh}列表查询` },
   { method: 'get', path: `${rkey}/:id`, controller: `${ckey}.show`, name: `${ckey}Show`, zh: `${keyZh}查询` },
-  { method: 'post', path: `${rkey}`, controller: `${ckey}.create`, middleware: ['password'], name: `${ckey}Create`, zh: `创建${keyZh}` },
+  { method: 'post', path: `${rkey}`, controller: `${ckey}.create`, middleware: [ 'password' ], name: `${ckey}Create`, zh: `创建${keyZh}` },
   { method: 'post', path: `${rkey}/:id`, controller: `${ckey}.update`, name: `${ckey}Update`, zh: `修改${keyZh}` },
   { method: 'delete', path: `${rkey}/:id`, controller: `${ckey}.destroy`, name: `${ckey}Delete`, zh: `删除${keyZh}` },
 ];