lrf 2 年之前
父節點
當前提交
696187f4c7
共有 1 個文件被更改,包括 26 次插入21 次删除
  1. 26 21
      app/service/eliminate.js

+ 26 - 21
app/service/eliminate.js

@@ -394,21 +394,29 @@ class EliminateService extends CrudService {
   // 自动推进至下一场
   async toNextRace(data) {
     const { match_id, group_id, project_id, player_one, player_one_score, player_one_node, player_two, player_two_node, player_two_score } = data;
+    const number = await this.getPersonNumber({ match_id, group_id, project_id });
+    const chartLevel = this.getLevel(number);
+    const chartData = this.getChartData(chartLevel);
+    // 通过整图关系,找到下一步
+    const { edges, nodes } = chartData;
     let winner = _.get(data, 'winner');
     let looser;
-    // 找到输家
+    let looserNode;
+    // 找到败者
     if (!winner) {
       if (player_one_score > player_two_score) winner = player_one;
       else winner = player_two;
     }
-    if (winner === player_one) looser = player_two;
-    else looser = player_one;
+    // 设置败者并获取败者节点
+    if (winner === player_one) {
+      looser = player_two;
+      looserNode = nodes.find(f => f.id === player_two_node);
+    } else {
+      looser = player_one;
+      looserNode = nodes.find(f => f.id === player_one_node);
+    }
+    const looserNextNodeMark = `${looserNode.mark || ''}l`;
 
-    const number = await this.getPersonNumber({ match_id, group_id, project_id });
-    const chartLevel = this.getLevel(number);
-    const chartData = this.getChartData(chartLevel);
-    // 通过整图关系,找到下一步
-    const { edges, nodes } = chartData;
     // 通过边关系找到下一节点
     const list = edges.filter(f => f.source === player_one_node || f.source === player_two_node);
     const getTarget = nodeEdge => _.get(nodeEdge, 'target');
@@ -418,34 +426,31 @@ class EliminateService extends CrudService {
     const node = nodes.find(f => f.id === target);
     const { id } = node;
     const wQeury = {
-      $or: [
-        { player_one_node: id, player_one: { $exists: false } },
-        { player_two_node: id, player_two: { $exists: false } },
-      ],
+      $or: [{ player_one_node: id }, { player_two_node: id }],
     };
     const wEData = await this.model.findOne(wQeury);
+    if (!wEData) return data;
     if (id === wEData.player_one_node) wEData.player_one = winner;
-    else wEData.player_two = winner;
+    else if (id === wEData.player_two_node) wEData.player_two = winner;
     await wEData.save();
     // 再得出败者的节点id
-    const { mark, level } = node;
+    const { level } = node;
     let midArr = nodes.filter(f => f.level === level);
     // 先过滤掉胜者节点的mark类型
-    midArr = midArr.filter(f => f.mark !== mark);
+    midArr = midArr.filter(f => f.mark === looserNextNodeMark);
+    console.log(midArr);
     // 再依次找,哪个节点没有人,没有人就安排上
     midArr = _.orderBy(midArr, [ 'pos' ], [ 'asc' ]);
     for (const n of midArr) {
       const { id } = n;
       const query = {
-        $or: [
-          { player_one_node: id, player_one: { $exists: false } },
-          { player_two_node: id, player_two: { $exists: false } },
-        ],
+        $or: [{ player_one_node: id }, { player_two_node: id }],
       };
       const eliminate = await this.model.findOne(query);
       if (!eliminate) continue;
-      if (eliminate.player_one_node === id) eliminate.player_one = looser;
-      else eliminate.player_two = looser;
+      if (!ObjectId.isValid(eliminate.player_one)) eliminate.player_one = looser;
+      else if (!ObjectId.isValid(eliminate.player_two)) eliminate.player_two = looser;
+      else continue;
       await eliminate.save();
       break;
     }