Ejemplo n.º 1
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 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));
        }