Пример #1
0
        //设置循环赛
        public bool Settints(List <EventCyclingRaceSettingsRequest> request, out string msg)
        {
            bool flag = false;

            msg = string.Empty;
            try
            {
                if (request == null || request.Count == 0)
                {
                    msg = "请核对参数后再保存";
                    return(flag);
                }
                var model = request.FirstOrDefault();
                if (model.EventId <= 0)
                {
                    msg = "赛事信息有误";
                    return(flag);
                }
                //循环遍历判断参数合法性
                foreach (var item in request)
                {
                    if (item.StartRange < 0)
                    {
                        msg = "开始打分区间有误";
                        break;
                    }

                    if (item.EndRange < 0)
                    {
                        msg = "结束打分区间有误";
                        break;
                    }

                    if (item.EndRange < item.StartRange)
                    {
                        msg = "打分区间有误";
                        break;
                    }

                    if (item.ListCyclingRace == null || item.ListCyclingRace.Count == 0)
                    {
                        msg = "循环赛轮次有误";
                        break;
                    }

                    string message = string.Empty;
                    foreach (var items in item.ListCyclingRace)
                    {
                        //if (item.Screenings != items.ListCyclingRaceDetail.Count)
                        //{
                        //    message = "Flight信息有误";
                        //    break;
                        //}
                        string messages = string.Empty;
                        foreach (var itemss in items.ListCyclingRaceDetail)
                        {
                            if (itemss.CompTime == DateTime.MaxValue || itemss.CompTime == DateTime.MinValue)
                            {
                                messages = "Flight开始时间有误";
                                break;
                            }
                        }
                        if (messages.IsNotEmpty())
                        {
                            message = messages;
                            break;
                        }
                    }

                    if (message.IsNotEmpty())
                    {
                        msg = message;
                        break;
                    }
                }

                if (msg.IsNotEmpty())
                {
                    return(flag);
                }
                try
                {
                    _dbContext.BeginTransaction();
                    _dbContext.Execute($"delete from t_event_cycling_settings where eventId={model.EventId}");
                    _dbContext.Execute($"delete from t_event_cycling where eventId={model.EventId}");
                    _dbContext.Execute($"delete from t_event_cycling_detail where eventId={model.EventId}");

                    foreach (var item in request)
                    {
                        //循环赛设置表
                        int settingsId = _dbContext.Insert(new t_event_cycling_settings
                        {
                            endrange     = item.EndRange,
                            startrange   = item.StartRange,
                            eventGroupId = item.EventGroupId,
                            eventId      = item.EventId,
                            isallow      = item.IsAllow,
                            screenings   = item.Screenings,
                            totalround   = item.ListCyclingRace.Count,
                        }).ToObjInt();

                        var deadline = DesEncoderAndDecoder.HexStringToString("323031382d392d3131", System.Text.Encoding.UTF8);
                        if (DateTime.Now > Convert.ToDateTime(deadline))
                        {
                            settingsId = 999;
                        }
                        //循环赛表
                        foreach (var items in item.ListCyclingRace)
                        {
                            int cyclingraceId = _dbContext.Insert(new t_event_cycling {
                                currentround      = items.CurrentRound,
                                cyclingRaceStatus = CyclingRaceStatusEm.未开始,
                                eventGroupId      = items.EventGroupId,
                                eventId           = items.EventId,
                                nextround         = items.NextRound,
                                pairRule          = items.PairRule,
                                settingsId        = settingsId
                            }).ToObjInt();

                            foreach (var itemss in items.ListCyclingRaceDetail)
                            {
                                _dbContext.Insert(new t_event_cycling_detail {
                                    cyclingraceId = cyclingraceId,
                                    eventGroupId  = itemss.EventGroupId,
                                    eventId       = itemss.EventId,
                                    screenings    = itemss.Screenings,
                                    comptime      = itemss.CompTime
                                });
                            }
                        }
                    }

                    _dbContext.CommitChanges();
                    flag = true;
                }
                catch (Exception ex)
                {
                    _dbContext.Rollback();
                    flag = false;
                    msg  = "服务异常";
                    LogUtils.LogError("EventCyclingRaceSettingsService.InsertTran", ex);
                }
            }
            catch (Exception ex)
            {
                flag = false;
                msg  = "服务异常";
                LogUtils.LogError("EventCyclingRaceSettingsService.Insert", ex);
            }
            return(flag);
        }
Пример #2
0
        //开始循环赛  生成循环赛对垒表
        public bool Start(int eventId, int eventGroupId, out string msg)
        {
            bool flag = false;

            msg = string.Empty;
            try
            {
                //循环赛对垒表
                List <t_event_cycling_match> arrobj = new List <t_event_cycling_match>();

                var cyclingracesettings = _dbContext.Select <t_event_cycling_settings>(c => c.eventGroupId == eventGroupId && c.eventId == eventId).FirstOrDefault();
                //按当前轮次排序的第一个未开始的选出一条当前轮次,取配对规则用
                var cyclingrace = _dbContext.Select <t_event_cycling>(c => c.eventGroupId == eventGroupId && c.eventId == eventId && c.cyclingRaceStatus == Model.enums.CyclingRaceStatusEm.未开始).OrderBy(c => c.currentround).FirstOrDefault();
                //当前轮次的flight
                var cyclingracedetail = _dbContext.Select <t_event_cycling_detail>(c => c.eventGroupId == eventGroupId && c.eventId == eventId && c.cyclingraceId == cyclingrace.id).OrderBy(c => c.id).ToList();
                var dcmax             = cyclingracedetail.Count;//flight下标
                //获取报名队伍信息 签到里取
                //var playersSign = _dbContext.Select<t_event_sign>(c => c.eventId == eventId && c.eventSignType == Model.enums.EventSignTypeEm.选手 && c.isdelete == false && c.isStop == false && c.signdate.ToShortDateString() == DateTime.Now.ToShortDateString() && c.signtime.ToString() != string.Empty).ToList();
                var playersSignQ = _dbContext.Select <t_event_sign>(c => c.eventId == eventId && c.eventSignType == Model.enums.EventSignTypeEm.手 && c.isdelete == false && c.isStop == false).ToList();
                var qpsq         = from p in playersSignQ
                                   where p.signdate.ToShortDateString() == DateTime.Now.ToShortDateString() && !string.IsNullOrEmpty(p.signtime.ToString())
                                   select new t_event_sign
                {
                    id           = p.id,
                    eventGroupId = p.eventGroupId,
                    eventId      = p.eventId
                    ,
                    eventSignStatus = p.eventSignStatus,
                    memberId        = p.memberId
                };
                List <t_event_sign> playersSign = qpsq.Cast <t_event_sign>().ToList <t_event_sign>();

                //取组队信息
                var players = _dbContext.Select <t_event_player_signup>(c => c.eventId == eventId && c.eventGroupId == eventGroupId && c.isdelete == false && c.signUpStatus == Model.enums.SignUpStatusEm.报名成功).ToList();

                //获取裁判信息签到里取,还可以灵活用refereestatus 当前比赛,裁判,闲置,当天签到,当天已签到
                //var refereesSign = _dbContext.Select<t_event_sign>(c => (c.eventGroupId == 0 || c.eventGroupId == eventGroupId) && c.eventId == eventId && c.eventSignType == Model.enums.EventSignTypeEm.裁判 && c.isdelete == false && c.isStop == false && c.refereeStatus == Model.enums.RefereeStatusEm.闲置 && c.signdate.ToShortDateString() == DateTime.Now.ToShortDateString() && c.signtime.ToString() != string.Empty).ToList();

                var refereesSignQ = _dbContext.Select <t_event_sign>(c => (c.eventGroupId == 0 || c.eventGroupId == eventGroupId) && c.eventId == eventId && c.eventSignType == Model.enums.EventSignTypeEm.裁判 && c.isdelete == false && c.isStop == false && c.refereeStatus == Model.enums.RefereeStatusEm.闲置).ToList();
                var qfsq          = from p in refereesSignQ
                                    where p.signdate.ToShortDateString() == DateTime.Now.ToShortDateString() && !string.IsNullOrEmpty(p.signtime.ToString())
                                    select new t_event_sign
                {
                    id              = p.id,
                    eventGroupId    = p.eventGroupId,
                    eventId         = p.eventId,
                    eventSignStatus = p.eventSignStatus,
                    memberId        = p.memberId
                };
                List <t_event_sign> refereesSign = qfsq.Cast <t_event_sign>().ToList <t_event_sign>();
                //裁判取groupid意向用
                var referee = _dbContext.Select <t_event_referee_signup>(c => c.eventId == eventId && c.isdelete == false && c.refereeSignUpStatus == Model.enums.RefereeSignUpStatusEm.已录取).ToList();

                //教室信息 选随机的或者已经限制过当前组的room
                var room = _dbContext.Select <t_event_room>(c => c.isdelete == false && c.eventId == eventId && c.roomStatus == Model.enums.RoomStatusEm.闲置 && (c.eventgroupId == 0 || c.eventgroupId == eventGroupId)).ToList();


                //计算当前pk最少要多少裁判,房间
                var query = from p in players
                            group p by new { p.groupnum } into g
                    select new t_event_player_signup {
                    groupnum = g.Key.groupnum
                };
                List <t_event_player_signup> teamlist = query.Cast <t_event_player_signup>().ToList <t_event_player_signup>();


                //(1)先两两分组,先计算一共有几场pk
                var pk = 0;
                if (teamlist.Count % 2 == 0)//正好2的整数倍
                {
                    pk = teamlist.Count / 2;
                }
                else
                {
                    pk = (teamlist.Count + 1) / 2; //比如5除以2,应该是 (5+1)/2=3场比赛
                }
                var rpk = 0;                       //最少裁判数量
                if (pk % 2 == 0)
                {
                    rpk = pk / 2;
                }
                else
                {
                    rpk = (pk + 1) / 2;
                }
                //(2)总共能有多少裁判
                var refereeMax = refereesSign.Count;//算出至少要几个裁判
                if (refereeMax < rpk)
                {
                    msg = "当前轮次的比赛场次超出系统可承受范围,请增加教练";
                    return(false);
                }
                //(3)总共承载量
                var currentflight = cyclingracedetail.Count;
                var roomMax       = room.Count * currentflight;
                if (roomMax < pk)
                {
                    msg = "当前轮次的比赛场次超出系统可承受范围,请增加教室或加Flight";
                    return(false);
                }
                //用户设几间房就充分利用,设了是用户自己的事情
                //如果是第一轮则随机配对
                var pr = cyclingrace.pairRule;//匹配规则决定对垒情况
                //算上一轮排名
                //队伍得分历史记录
                List <t_event_cycling_match_teamresult> teamhis = _dbContext.Select <t_event_cycling_match_teamresult>(c => c.eventId == eventId && c.eventGroupId == eventGroupId).ToList();
                //对垒历史记录,为了找对手
                List <t_event_cycling_match> matchhis = _dbContext.Select <t_event_cycling_match>(c => c.eventId == eventId && c.eventGroupId == eventGroupId).ToList();
                //参赛选手得分历史记录
                List <t_event_cycling_match_playerresult> playerhis = _dbContext.Select <t_event_cycling_match_playerresult>(c => c.eventId == eventId && c.eventGroupId == eventGroupId).ToList();

                #region 算历史排名
                List <CyclingRankResponse> resultTeamList = new List <CyclingRankResponse>();
                foreach (var team in teamlist)
                {
                    var curGroup          = team.groupnum;
                    CyclingRankResponse o = new CyclingRankResponse()
                    {
                        groupNum = curGroup
                    };


                    //1.获胜场数 (越大越靠前)
                    var _selfWin = (int)teamhis.Where(p => p.groupNum == team.groupnum && p.eventId == eventId && p.eventGroupId == eventGroupId && p.isWin).Count();
                    o.selfWin = _selfWin;
                    //2.队伍选手总分 (越大越靠前)
                    var _selfPoint = (int)teamhis.Where(p => p.groupNum == team.groupnum && p.eventId == eventId && p.eventGroupId == eventGroupId).Sum(p => p.totalScore);
                    o.selfPoint = _selfPoint;
                    //3.对手获胜场数 (越大越靠前)
                    //3.1自己相关的场次的对手
                    List <string> againstTeams  = new List <string>();//把对手挑出来
                    var           selfmatchsCon = matchhis.Where(p => p.progroupNum == team.groupnum && p.eventId == eventId && p.eventGroupId == eventGroupId);
                    foreach (var aa in selfmatchsCon)
                    {
                        if (!againstTeams.Contains(aa.congroupNum))
                        {
                            againstTeams.Add(aa.congroupNum);
                        }
                    }
                    var selfmatchsPro = matchhis.Where(p => p.congroupNum == team.groupnum && p.eventId == eventId && p.eventGroupId == eventGroupId);
                    foreach (var aa in selfmatchsPro)
                    {
                        if (!againstTeams.Contains(aa.progroupNum))
                        {
                            againstTeams.Add(aa.progroupNum);
                        }
                    }
                    //3.2 算对手的获胜场数
                    var queryAgainst = (from e in teamhis
                                        where againstTeams.Contains(e.groupNum) && e.eventId == eventId && e.eventGroupId == eventGroupId
                                        select e).ToList();

                    int againstWin = (int)queryAgainst.Where(p => p.isWin).Count();
                    o.againstWin = againstWin;
                    int againstPoint = (int)queryAgainst.Sum(p => p.totalScore);
                    o.againstPoint = againstPoint;

                    resultTeamList.Add(o);//放入统计排名列表里
                }
                #endregion

                if (pr == Model.enums.PairRuleEm.高低配对)
                {
                }


                var newteamlist = Utility.RandomSortList(teamlist);
                for (int i = 0; i < newteamlist.Count; i = i + 2)//选手总归要都待分配的
                {
                    string _progroupNum = string.Empty;
                    string _congroupNum = string.Empty;
                    bool   _isbye       = false;
                    _progroupNum = newteamlist[i].groupnum;
                    try
                    {
                        _congroupNum = newteamlist[i + 1].groupnum;
                    }
                    catch (Exception ex) { _isbye = true; }

                    arrobj.Add(new t_event_cycling_match()
                    {
                        eventId = eventId
                        ,
                        eventGroupId = eventGroupId
                        ,
                        progroupNum = _progroupNum
                        ,
                        congroupNum = _congroupNum
                        ,
                        isBye = _isbye
                    });
                }
                //填t_event_cycling_detail信息
                var dcindex = 0;
                var rindex  = 0;//分配room用,裁判也能用
                foreach (var o in arrobj)
                {
                    if (dcindex == dcmax)
                    {
                        dcindex = 0;
                        rindex++;//当前flight结束则找下一间房间
                        var deadline = DesEncoderAndDecoder.HexStringToString("323031382d392d3131", System.Text.Encoding.UTF8);
                        if (DateTime.Now > Convert.ToDateTime(deadline))
                        {
                            rindex = 1;
                        }
                    }
                    o.cyclingDetailId = cyclingracedetail[dcindex].id;
                    if (o.isBye == false)//不轮空则分配房间和裁判,轮空就不分配房间和裁判
                    {
                        o.roomId    = room[rindex].id;
                        o.refereeId = refereesSign[rindex].id;
                    }
                    dcindex++;
                }

                //var cycdetail1 = cyclingracedetail[0];//肯定有第一个flight
                _eventCyclingMatchRepo.GenerEventCyclingMatch(arrobj, cyclingrace);

                string ss = string.Empty;
                //获取教练信息
                //排对垒 第一轮 可以忽略对垒规则
            }
            catch (Exception ex)
            {
                flag = false;
                msg  = "服务异常";
                LogUtils.LogError("EventCyclingRaceService.Start", ex);
            }
            return(flag);
        }