UNPKG

press-next

Version:

Vue3 组件库,支持 Composition API

253 lines (211 loc) 5.44 kB
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; }