Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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;
                }
            }
        }
Exemplo n.º 4
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 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);
        }
Exemplo n.º 5
0
        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;
            }
        }
Exemplo n.º 6
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));
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
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));
        }
Exemplo n.º 9
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.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));
        }