/// <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)); }