|
@@ -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;
|
|
|
}
|