press-next
Version:
Vue3 组件库,支持 Composition API
253 lines (211 loc) • 5.44 kB
text/typescript
import { getBattleId, getFirstValidBattle, getRedSide } from './battle-id';
import { getGpBattleState } from './battle-status';
import { SCHEDULE_TYPE_MAP } from './config';
import { checkOneTeamEmpty } from './is-one-team-empty';
import { getMiddleButtonTitle } from './middle-button';
import { flattenTeamInfo, getTeamInfo } from './team-info';
let teamMap = {};
/**
* 处理赛程列表的主要函数
*
* 淘汰赛和循环赛的 scheList 格式不同,淘汰赛为[[1轮1场,1轮2场],[2轮1场,2轮2场],]
* 循环赛轮次为同一个,为[[x轮1组1场,x轮1组2场],[x轮2组1场,x轮2组2场]]
*/
export function handleScheList({
treeRoundList,
teamList,
isPreview,
isAdmin,
isManualStart,
openAILive,
}: {
treeRoundList: Array<Record<string, any>>;
teamList: Array<Record<string, any>>;
myTeamId?: string;
isPreview?: number;
isAdmin?: boolean,
isManualStart?: boolean;
openAILive: boolean;
}) {
let tempScheType: number;
const res = treeRoundList.reduce((acc: Array<any>, treeRound: any) => {
const {
scheItem,
curScheType,
} = handleGpSchInfo({
treeRound,
teamList,
isPreview,
isAdmin,
isManualStart,
openAILive,
scheType: tempScheType,
});
if (curScheType) {
tempScheType = curScheType;
}
acc.push(scheItem);
return acc;
}, []);
const obj = {
scheList: res,
};
return obj;
}
// 处理赛程
function handleGpSchInfo({
treeRound = {},
teamList,
isPreview,
isAdmin,
isManualStart,
openAILive,
scheType,
}: {
treeRound: Record<string, any>,
teamList: Array<Record<string, any>>;
isPreview?: number;
isManualStart?: boolean;
isAdmin?: boolean;
openAILive: boolean;
scheType?: number;
}) {
const res: any = [];
const nodeList = (treeRound.node_list) || [];
teamMap = flattenTeamInfo(teamList);
const roundInfo = treeRound.round_info || {};
let i = 0;
let curScheType = scheType;
while (i < nodeList.length) {
const scheGroupList: any = [];
scheGroupList.push(handleGpNodeItem({ nodeItem: nodeList[i],
isPreview,
isAdmin,
isManualStart,
openAILive,
}));
if (nodeList[i].sch_type) {
curScheType = nodeList[i].sch_type;
}
const isEliminationType = curScheType == SCHEDULE_TYPE_MAP.DOUBLE_FAIL
|| curScheType == SCHEDULE_TYPE_MAP.KNOCK_OUT;
// 只有淘汰赛的时候,才一定要找下一组
if (isEliminationType && nodeList.length != 1) {
i += 1;
scheGroupList.push(handleGpNodeItem({
nodeItem: nodeList[i],
isPreview,
isAdmin,
isManualStart,
openAILive,
}));
}
res.push({
battleList: scheGroupList,
roundInfo,
partitionId: nodeList[i]?.sch_rule?.partition_id,
isChamp: isChamp(),
});
i += 1;
}
function isChamp() {
return nodeList[i] && nodeList[i].sch_type == 4 && nodeList.length == 1;
}
return {
scheItem: res,
curScheType,
};
}
// 处理节点项,即 node_list 的每一项,nodeItem 是两个队伍
function handleGpNodeItem({
nodeItem,
isPreview = 0,
isAdmin,
isManualStart,
openAILive,
}: {
nodeItem: Record<string, any>,
isPreview?: number,
isManualStart?: boolean,
isAdmin?: boolean,
openAILive: boolean,
}) {
const upTeamInfo = getTeamInfo({
nodeItem,
pos: 'a',
isPreview,
teamMap,
});
const downTeamInfo = getTeamInfo({
nodeItem,
pos: 'b',
isPreview,
teamMap,
});
const curBattle = getBattleId(nodeItem);
const firstValidBattle = getFirstValidBattle(nodeItem);
const { battle_id: battleId } = curBattle;
const boType = nodeItem.sch_score?.bo_type || 1;
const curBo = nodeItem.sch_score?.cur_bo || 1;
const roomType = nodeItem.sch_score?.room_type || 1;
const {
timeDesc,
statusDesc,
playingDesc,
listViewStatusDesc,
battleDesc,
} = getGpBattleState({
state: nodeItem.state,
curBo: nodeItem.sch_score?.cur_bo,
battleList: nodeItem.battle_list,
isManualStart,
time: nodeItem.battle_list?.[nodeItem.battle_list?.length - 1]?.ctime || nodeItem.utime,
});
const redSide = getRedSide(nodeItem);
// 顶号相关,不区分用户类型
const abnormalErr = nodeItem.sch_score?.err_flag === 9999;
const isAtLeastOneTeamEmpty = checkOneTeamEmpty({
teamAId: nodeItem?.sch_score?.teama_id,
teamBId: nodeItem?.sch_score?.teamb_id,
});
const buttonInfo = getMiddleButtonTitle({
isAdmin,
isAtLeastOneTeamEmpty,
state: nodeItem.state,
curBattle,
openAILive,
});
const scheGroup: any = {
teamList: [
upTeamInfo,
downTeamInfo,
],
upTeamInfo,
downTeamInfo,
battleid: battleId,
battleId,
boType,
curBo,
roomType,
showVS: listViewStatusDesc === '未开始',
timeDesc,
statusDesc, // 出现在赛程树中,有 “待管理员开赛”
playingDesc,
listViewStatusDesc,
battleDesc,
redSide,
schid: nodeItem.sch_id,
sch_id: nodeItem.sch_id,
state: nodeItem.state,
schId: nodeItem.sch_id,
status: nodeItem.status,
realStatus: nodeItem.state,
nodeItem,
abnormalErr,
middleButtonTitle: buttonInfo.title,
middleButtonClass: buttonInfo.class,
isAtLeastOneTeamEmpty,
firstValidBattleId: firstValidBattle?.battle_id,
};
return scheGroup;
}