public void SetWaiver(EntityBase loopObj) { var loop = (GameLoop)loopObj; var order = GameHelper.GetGameOrder(loop.OrderId); if (loop.WaiverOption == WaiverOption.A) { loop.Score1 = Globals.TT_SCORE_WAIVER; loop.Score2 = Globals.TT_SCORE_WIN; loop.Game1 = 0; loop.Game2 = order.WinGame; loop.Fen1 = 0; loop.Fen2 = order.WinGame * Globals.TT_ONE_GAME_FEN; } else if (loop.WaiverOption == WaiverOption.B) { loop.Score1 = Globals.TT_SCORE_WIN; loop.Score2 = Globals.TT_SCORE_WAIVER; loop.Game1 = order.WinGame; loop.Game2 = 0; loop.Fen1 = order.WinGame * Globals.TT_ONE_GAME_FEN; loop.Fen2 = 0; } else { loop.Score1 = Globals.TT_SCORE_WAIVER; loop.Score2 = Globals.TT_SCORE_WAIVER; loop.Game1 = 0; loop.Game2 = 0; loop.Fen1 = 0; loop.Fen2 = 0; } }
/// <summary> /// 单淘汰,按人抽签 /// </summary> /// <param name="request">Request.GameOrder.Entities</param> /// <returns>Response.EmptyEntity</returns> public Response Execute(string request) { var req = JsonConvert.DeserializeObject <Request <GameOrder> >(request); var order = GameHelper.GetGameOrder(req.Filter.Id); if (order.State != GameOrderState.NOTSTART.Id) { return(ResultHelper.Fail("比赛已经开始,不能再进行抽签。")); } var memberList = GetGameTeamList(order); if (memberList.IsNullOrEmpty()) { return(ResultHelper.Fail("无参赛人员,不能进行抽签。")); } //参照2名算法 order.KnockoutCount = 2; order.SetKnockOutAB(GameHelper.GetGame(order.GameId).IsKnockOutAB); //获取1,2名位置列表 var posListAll = KnockoutDrawHelper.CalRankPosAndSort(order.KnockoutTotal, order.KnockoutCount, 1); var posListTwo = KnockoutDrawHelper.CalRankPosAndSort(order.KnockoutTotal, order.KnockoutCount, 2); posListAll.AddRange(posListTwo); //初始化所有位置 order.PositionList = new List <GamePosition>(); for (int i = 0; i < order.KnockoutTotal; i++) { order.PositionList.Add(new GamePosition { Index = i }); } //取小值循环 int count = Math.Min(posListAll.Count, memberList.Count); for (int i = 0; i < count; i++) { order.PositionList[posListAll[i]].UserId = memberList[i].Id.Link(memberList[i].TeamName); if (i < posListAll.Count / 2) { order.PositionList[posListAll[i]].IsSeed = true; } memberList[i].IsEnterPos = true; } //检查轮空或者抢号 CheckByeOrKnock(order, posListAll, memberList); //检查相同单位 GetGamePositionList.CheckSameCorpTeamId(order); var resultOrder = ResultHelper.Success(new List <EntityBase> { order }); return(resultOrder); }
public void SetScore(EntityBase loopObj) { var loop = (GameLoop)loopObj; var maps = GameHelper.GetLoopMapList(loop.Id); var order = GameHelper.GetGameOrder(loop.OrderId); loop.Fen1 = 0; loop.Fen2 = 0; loop.Game1 = 0; loop.Game2 = 0; loop.Score1 = 0; loop.Score2 = 0; loop.Team1 = 0; loop.Team2 = 0; foreach (var item in maps) { var obj = item as GameLoopMap; if (obj != null && (obj.Fen1 > 0 || obj.Fen2 > 0)) { loop.Fen1 += obj.Fen1; loop.Fen2 += obj.Fen2; loop.Game1 += obj.Game1; loop.Game2 += obj.Game2; if (obj.Game1 > obj.Game2) { loop.Team1++; } else { loop.Team2++; } } } //爱米模式 if (order.TeamScoreMode == TeamScoreMode.SINGLE_RACE.Id) { loop.Score1 = order.TeamScoreMode == TeamScoreMode.SINGLE_RACE.Id ? loop.Team1 : Globals.TT_SCORE_WIN; loop.Score2 = order.TeamScoreMode == TeamScoreMode.SINGLE_RACE.Id ? loop.Team2 : Globals.TT_SCORE_FAIL; } else { if (loop.Team1 > loop.Team2) { loop.Score1 = Globals.TT_SCORE_WIN; loop.Score2 = Globals.TT_SCORE_FAIL; } else if (loop.Team1 < loop.Team2) { loop.Score1 = Globals.TT_SCORE_FAIL; loop.Score2 = Globals.TT_SCORE_WIN; } } }
/// <summary> /// 第二轮淘汰赛,获取按人抽签位置列表 /// </summary> /// <param name="request">Request.GameOrder.Entities</param> /// <returns>Response.EmptyEntity</returns> public Response Execute(string request) { var req = JsonConvert.DeserializeObject <Request <GameOrder> >(request); var firstOrder = GameHelper.GetGameOrder(req.Filter.Id); firstOrder.CalAllPosition = req.Filter.CalAllPosition; firstOrder.SeedList = req.Filter.SeedList; firstOrder.KnockOutAB = req.Filter.KnockOutAB.IsNotNullOrEmpty() ? req.Filter.KnockOutAB : KnockOutAB.A; //设置AB选项 var game = GameHelper.GetGame(firstOrder.GameId); firstOrder.SetKnockOutAB(game.IsKnockOutAB); //第一次检查小组赛是否结束,是否已计算排名或已经抽过签(AB组分开验证) if (!firstOrder.CalAllPosition) { var cmdValidate = CommandHelper.CreateProcedure(FetchType.Execute, "sp_CheckGameGroupState"); cmdValidate.Params.Add("@gameId", firstOrder.GameId); cmdValidate.Params.Add("@knockOutAB", firstOrder.KnockOutAB); cmdValidate.CreateParamMsg(); var resultVal = DbContext.GetInstance().Execute(cmdValidate); //验证失败,返回错误信息 if (!resultVal.IsSuccess) { return(resultVal); } } if (firstOrder.CalAllPosition) { SetPositionListTwo(firstOrder, false); CheckSameCorpTeamId(firstOrder); //第二次返回所有名次 firstOrder.MemberList = GetGroupKnockUserList(firstOrder, firstOrder.BeginRankAB, firstOrder.EndRankAB); } else { SetPositionListFirst(firstOrder); //第一次仅返回第一名 firstOrder.MemberList = GetGroupKnockUserList(firstOrder, firstOrder.BeginRankAB, firstOrder.BeginRankAB); } var resultOrder = ResultHelper.Success(new List <EntityBase> { firstOrder }); return(resultOrder); }
public void SetWaiver(EntityBase loopObj) { var loop = (GameLoop)loopObj; var order = GameHelper.GetGameOrder(loop.OrderId); //爱猕模式 var isSingleRace = order.TeamScoreMode == TeamScoreMode.SINGLE_RACE.Id; if (loop.WaiverOption == WaiverOption.A) { loop.Score1 = Globals.TT_SCORE_WAIVER; loop.Score2 = isSingleRace ? order.WinTeam * 2 - 1 : Globals.TT_SCORE_WIN; loop.Team1 = 0; loop.Team2 = isSingleRace ? order.WinTeam * 2 - 1 : order.WinTeam; loop.Game1 = 0; loop.Game2 = loop.Team2 * order.WinGame; loop.Fen1 = 0; loop.Fen2 = loop.Game2 * Globals.TT_ONE_GAME_FEN; } else if (loop.WaiverOption == WaiverOption.B) { loop.Score1 = isSingleRace ? order.WinTeam * 2 - 1 : Globals.TT_SCORE_WIN; loop.Score2 = Globals.TT_SCORE_WAIVER; loop.Team1 = isSingleRace ? order.WinTeam * 2 - 1 : order.WinTeam; loop.Team2 = 0; loop.Game1 = loop.Team1 * order.WinGame; loop.Game2 = 0; loop.Fen1 = loop.Game1 * Globals.TT_ONE_GAME_FEN; loop.Fen2 = 0; } else { loop.Team1 = 0; loop.Team2 = 0; loop.Score1 = Globals.TT_SCORE_WAIVER; loop.Score2 = Globals.TT_SCORE_WAIVER; loop.Game1 = 0; loop.Game2 = 0; loop.Fen1 = 0; loop.Fen2 = 0; } }
/// <summary> /// 团体比赛结束一次对决 /// </summary> /// <param name="currentUser">忽略</param> /// <param name="request">Request.GameLoop.Entities</param> /// <returns>Response.EmptyEntity</returns> public Response Execute(string request) { var req = JsonConvert.DeserializeObject <Request <GameLoop> >(request); var temp = req.FirstEntity(); //非轮空,非双方弃权,需要胜方签名 if (!temp.IsBye && temp.WaiverOption != WaiverOption.AB && Ext.IsNullOrEmpty(temp.WinSign)) { return(ResultHelper.Fail("非轮空,非双方弃权,需要胜方签名。")); } var loop = GameHelper.GetLoop(temp.Id); //从数据库取出,重新赋值 loop.IsBye = req.Entities.First().IsBye; loop.State = GameLoopState.FINISH.Id; loop.WaiverOption = temp.WaiverOption.GetId(); loop.WinSign = temp.WinSign; loop.JudgeSign = temp.JudgeSign; //更新结束时间 loop.EndTime = DateTime.Now; if (loop.StartTime == null) { loop.StartTime = loop.EndTime; } loop.SetRowModified(); loop.Team1Id = loop.Team1Id.GetId(); loop.Team2Id = loop.Team2Id.GetId(); IWaiver waiver = new TeamWaiver(); if (loop.WaiverOption.IsNotNullOrEmpty()) { waiver.SetWaiver(loop); } else { waiver.SetScore(loop); var order = GameHelper.GetGameOrder(loop.OrderId.GetId()); //验证爱猕模式需要打完所有对阵 if (order.TeamScoreMode == TeamScoreMode.SINGLE_RACE.Id) { if (loop.Team1 + loop.Team2 != order.WinTeam * 2 - 1) { return(ResultHelper.Fail(string.Format("需要打满{0}场。", order.WinTeam * 2 - 1))); } } else { int max = loop.Team1 > loop.Team2 ? loop.Team1 : loop.Team2; if (max < order.WinTeam) { //团队比赛胜场检查 return(ResultHelper.Fail(string.Format("胜方需要赢{0}场。", order.WinTeam))); } } } List <EntityBase> entities = new List <EntityBase>(); entities.Add(loop); SetNextLoop(loop, entities); var cmdSave = CommandHelper.CreateSave(entities); //更新个人积分 var cmdUpdateScore = CommandHelper.CreateProcedure(FetchType.Execute, "sp_UpdateGameSportScoreForTeam"); cmdUpdateScore.Params.Add("@GameId", loop.GameId); cmdUpdateScore.Params.Add("@LoopId", loop.Id.GetId()); cmdSave.AfterCommands = new List <Command> { cmdUpdateScore }; return(DbContext.GetInstance().Execute(cmdSave)); }
private static Response Excute(List <GameGroup> gplist) { if (gplist.IsNullOrEmpty()) { return(ResultHelper.Fail("无数据。")); } //检查比赛状态,比赛准备才允许小组抽签 var firstGroup = gplist.First(); var game = GameHelper.GetGame(firstGroup.GameId); if (game.State != GameState.PREPARE.Id) { return(ResultHelper.Fail("比赛准备才能进行小组抽签。")); } bool isRoundThenKnock = game.KnockoutOption == KnockoutOption.ROUND_KNOCKOUT.Id; //先循环后淘汰,验证组成员 if (isRoundThenKnock) { var firstOrder = GameHelper.GetGameOrder(firstGroup.OrderId); //根据OrderNo排序 foreach (var group in gplist) { //验证小组人数不足出线人数 if (group.MemberList.Count < firstOrder.KnockoutCountAB) { return(ResultHelper.Fail(string.Format("{0}人数不足要求出线人数{1}个,无法保存。", group.Name, firstOrder.KnockoutCount))); } group.MemberList = group.MemberList.OrderBy(p => p.OrderNo).ToList(); } } var memberEntities = new List <EntityBase>(); var loopEntities = new List <EntityBase>(); foreach (var group in gplist) { if (group.MemberList.IsNotNullOrEmpty()) { //先循环后淘汰,创建组成员 if (isRoundThenKnock) { CreateOneGroupMembers(memberEntities, group); } //创建组循环赛 CreateOneGroupLoops(loopEntities, group); } } //合并数据 var entities = new List <EntityBase>(); //先循环后淘汰,保存组成员 if (isRoundThenKnock && memberEntities.IsNotNullOrEmpty()) { entities.AddRange(memberEntities); } if (loopEntities.IsNotNullOrEmpty()) { entities.AddRange(loopEntities); } var cmdSave = CommandHelper.CreateSave(entities); //删除原来生成的小组赛轮次表,后面重新生成 var cmdDelete = CommandHelper.CreateProcedure(FetchType.Execute, "sp_DeleteGameGroup"); cmdDelete.Params.Add("@GameId", gplist.First().GameId); cmdDelete.Params.Add("@GroupIdString", GetGroupIdString(gplist)); cmdSave.PreCommands.Add(cmdDelete); return(DbContext.GetInstance().Execute(cmdSave)); }
/// <summary> /// 第二轮淘汰赛,保存按人抽签 /// </summary> /// <param name="request">Request.GameOrder.Entities</param> /// <returns>Response.EmptyEntity</returns> public Response Execute(string request) { var req = JsonConvert.DeserializeObject <Request <GameOrder> >(request); var temp = req.FirstEntity(); //验证数据 var valResult = Validate(temp); if (!valResult.IsSuccess) { return(valResult); } var firstOrder = GameHelper.GetGameOrder(req.Entities.First().Id); //设置新的位置列表 firstOrder.PositionList = temp.PositionList; //缓存KnockOutAB,保存之前再恢复 string tempKnockOutAB = firstOrder.KnockOutAB; firstOrder.KnockOutAB = temp.KnockOutAB.IsNotNullOrEmpty() ? temp.KnockOutAB : KnockOutAB.A; //设置AB选项 var game = GameHelper.GetGame(firstOrder.GameId); firstOrder.SetKnockOutAB(game.IsKnockOutAB); var entities = new List <EntityBase>(); //获取第二轮淘汰比赛所有场次(非附加赛) List <GameLoop> loopList = null; //获取第二轮编号(用于小组循环后淘汰) var actualNextOrderId = temp.KnockOutAB == KnockOutAB.B ? firstOrder.NextOrderBId : firstOrder.NextOrderId; if (firstOrder.KnockoutOption == KnockoutOption.ROUND.Id) { //小组循环后淘汰,设置本轮次结束,并获取下轮次比赛 firstOrder.State = GameOrderState.FINISH.Id; firstOrder.SetRowModified(); entities.Add(firstOrder); //获取第二轮比赛 loopList = GameHelper.GetOrderLoopListNoExtra(actualNextOrderId); } else { //单淘汰,获取第一轮比赛 var cmd = CommandHelper.CreateText <GameLoop>(); cmd.Text = "SELECT * FROM GameLoop WHERE GameId=@gameId AND OrderId=@orderId AND IsExtra=0 AND ISNULL(KnockLoopId,'')='' ORDER BY OrderNo"; cmd.Params.Add("@gameId", firstOrder.GameId); cmd.Params.Add("@orderId", firstOrder.Id); loopList = DbContext.GetInstance().Execute(cmd).Entities.ToList <EntityBase, GameLoop>(); } //将相邻位置球员进入对应场次比赛 SetEnterKnockPos(firstOrder, entities, loopList); var cmdSave = CommandHelper.CreateSave(entities); //保存之前删除原来抢位赛(单淘汰为第一轮,小组循环后为第二轮) var cmdDelete = CommandHelper.CreateText(FetchType.Execute, "DELETE FROM GameLoop WHERE GameId=@gameId AND OrderId=@orderId AND ISNULL(KnockLoopId,'')!=''"); cmdDelete.Params.Add("@gameId", firstOrder.GameId); cmdDelete.Params.Add("@orderId", firstOrder.KnockoutOption == KnockoutOption.ROUND.Id ? actualNextOrderId : firstOrder.Id); cmdSave.PreCommands = new List <Command> { cmdDelete }; //保存前恢复firstOrder.KnockOutAB原数据(小组赛第一轮为空) firstOrder.KnockOutAB = tempKnockOutAB; return(DbContext.GetInstance().Execute(cmdSave)); }
/// <summary> /// 单打比赛保存比赛结果详情,每次保存一次对阵结果,单打比赛要设置比赛结束 /// </summary> /// <param name="currentUser">忽略</param> /// <param name="request">Request.GameLoop.Entities</param> /// <returns>Response.EmptyEntity</returns> public Response Execute(string request) { var req = JsonConvert.DeserializeObject <Request <GameLoop> >(request); var temp = req.FirstEntity(); //非轮空,非双方弃权,需要胜方签名 if (!temp.IsBye && temp.WaiverOption != WaiverOption.AB && Ext.IsNullOrEmpty(temp.WinSign)) { return(ResultHelper.Fail("非轮空,非双方弃权,需要胜方签名。")); } var loop = GameHelper.GetLoop(temp.Id); //从数据库取出,重新赋值 loop.IsBye = req.Entities.First().IsBye; loop.State = GameLoopState.FINISH.Id; loop.DetailList = temp.DetailList; loop.WaiverOption = temp.WaiverOption.GetId(); loop.WinSign = temp.WinSign; loop.JudgeSign = temp.JudgeSign; //更新结束时间 loop.EndTime = DateTime.Now; if (loop.StartTime == null) { loop.StartTime = loop.EndTime; } loop.SetRowModified(); loop.Team1Id = loop.Team1Id.GetId(); loop.Team2Id = loop.Team2Id.GetId(); var entities = new List <EntityBase>(); IWaiver waiver = new OneWaiver(); if (loop.WaiverOption.IsNotNullOrEmpty()) { waiver.SetWaiver(loop); } else { waiver.SetScore(loop); var order = GameHelper.GetGameOrder(loop.OrderId.GetId()); int max = loop.Game1 > loop.Game2 ? loop.Game1 : loop.Game2; if (max != order.WinGame) { //个人比赛胜局检查 return(ResultHelper.Fail(string.Format("胜方需要赢{0}局。", order.WinGame))); } foreach (var item in loop.DetailList) { //item.SetNewEntity(); item.LoopId = loop.Id.GetId(); int maxFen = item.Fen1 > item.Fen2 ? item.Fen1 : item.Fen2; if (maxFen >= 11) //大致判小局分数是否有效 { item.RowState = RowState.Modified; //获取小局对阵列表时,已经生成空对阵,故此处只需要保存相应小局的得分,状态更改为修改状态 entities.Add(item); } entities.Add(item); } } entities.Add(loop); SetNextLoopUser(loop, entities); var cmdSave = CommandHelper.CreateSave(entities); //cmdSave.PreCommands = new List<Command> { GameHelper.GetDeleteLoopDetailCmd(loop.Id, null) };//此处不需要再删除原有的对阵 //更新个人积分 var cmdUpdateScore = CommandHelper.CreateProcedure(FetchType.Execute, "sp_UpdateGameSportScoreForOne"); cmdUpdateScore.Params.Add("@GameId", loop.GameId); cmdUpdateScore.Params.Add("@LoopId", loop.Id.GetId()); cmdSave.AfterCommands = new List <Command> { cmdUpdateScore }; return(DbContext.GetInstance().Execute(cmdSave)); }