Exemplo n.º 1
0
        /// <summary>
        /// 开始计算本期所有投注结果
        /// </summary>
        /// <param name="issueCode">期号</param>
        /// <param name="openResult">开奖结果</param>
        public virtual string Calculate(string lotteryType, string issueCode, string openResult)
        {
            string key = lotteryType + "_" + issueCode;

            // LogManager.Error(key+"----");
            //计算投注
            List <Running> outBettRunning = null;

            if (IssueBettingNumsing.CreateInstance().HasRunning(key, out outBettRunning))
            {
                this.CalculateBetting(lotteryType, issueCode, openResult);
            }

            //计算追号
            List <Running> outRunning = null;

            if (IssueCatchNumsing.CreateInstance().HasRunning(key, out outRunning))
            {
                this.CalculateCatchNums(lotteryType, issueCode, openResult);
            }
            else
            {
                //  LogManager.Error(key + "----"+"线程正在处理");
            }

            return("");
        }
Exemplo n.º 2
0
        /// <summary>
        /// 计算投注结果
        /// </summary>
        /// <param name="issueCode">当前期号</param>
        /// <param name="openResult">开奖结果</param>
        private void CalculateBetting(string lotteryCode, string issueCode, string openResult)
        {
            //获取本期所有投注数据,进行计算
            int pageSize   = 50;
            int totalCount = 0;

            IDbContextFactory factory = new DbContextFactory();
            var betDetailService      = new BetDetailService(new Repo <BetDetail>(factory));

            var result = betDetailService.GetIssuesBetDetail(lotteryCode, issueCode);

            totalCount = result.Count;
            LogManager.Info(lotteryCode + " 期数:" + issueCode + " 待计算总投注数:" + totalCount);
            if (totalCount < 1)
            {
                IssueCatchNumsing.CreateInstance().CompledRunning(lotteryCode + "_" + issueCode);
                return;
            }
            List <BetDetail> details = new List <BetDetail>();
            var curIndex             = 1;

            for (var i = 0; i < totalCount; i++)
            {
                if (result[i].IsBuyTogether == 1 && result[i].GroupByState == 0)
                {
                    continue;
                }
                details.Add(result[i]);
                if (curIndex == pageSize || (i + 1) == totalCount)
                {
                    PoolParam param = new PoolParam()
                    {
                        Issue       = issueCode,
                        openResult  = openResult,
                        PageSize    = pageSize,
                        pageIndex   = i,
                        lotteryCode = lotteryCode,
                        Details     = details
                    };
                    IssueBettingNumsing.CreateInstance().PutRunning(lotteryCode + "_" + issueCode, new Running()
                    {
                        IsCompled = false,
                        PageIndex = i
                    });

                    ThreadPool.QueueUserWorkItem(CalculatePage, param);
                    details  = new List <BetDetail>();
                    curIndex = 1;
                }
                curIndex++;
            }
        }
Exemplo n.º 3
0
        private void CalculatePage(object obj)
        {
            PoolParam param = obj as PoolParam;
            string    key   = param.lotteryCode + "_" + param.Issue;

            if (param == null)
            {
                LogManager.Info("PoolParam 为null,直接返回!");
                return;
            }
            if (param.WhileIndex > 3)
            {
                string betCodes = "";
                param.Details.ForEach(x => betCodes += x.BetCode);
                LogManager.Error("投注超过三次计算,结束计算:" + betCodes);
                return;
            }
            string issueCode  = param.Issue;
            string openResult = param.openResult;

            LogManager.Info("开始计算结果:" + param.ToString());
            //IDbContextFactory factory = new DbContextFactory();
            //var betDetailService = new BetDetailService(new Repo<BetDetail>(factory));
            //var messageService = new MessageService(new Repo<Message>(factory));

            List <BetDetail> source      = param.Details;
            List <BetDetail> errorSource = new List <BetDetail>();

            //循环进行计算
            foreach (var item in source)
            {
                int code = item.PalyRadioCode;
                try
                {
                    ICalculate calculate = RadioContentFactory.CreateInstance(code);
                    LogManager.Info(string.Format("创建ICalculate code={0}; 对象为{1}", code, calculate.GetType().ToString()));
                    calculate.Calculate(issueCode, openResult, item);
                    item.OpenResult = openResult;
                    if (item.IsMatch)
                    {
                        item.Stauts = BasicModel.BetResultType.Winning;
                        //插入中奖消息
                        // messageService.Create(CreateMsg(item.BetCode, item.WinMoney, item.UserId, 0));
                        //messageService.Save();
                        LotteryIssuesData.CreateMessage(CreateMsg(item.BetCode, item.WinMoney, item.UserId, 0));
                    }
                    else
                    {
                        item.Stauts = BasicModel.BetResultType.NotWinning;
                        if (item.IsBuyTogether == 1)
                        {
                            //修改子项为未中奖
                            LotteryIssuesData.UpdateBuyTogerher(item.Id, 2, 0m);
                        }
                    }

                    OpenOfficialQueue.CreateInstance().Put(item);//添加至更新队列 计算返点以及余额
                    //保存状态
                    // betDetailService.UpdateOpenState(item);
                    if (!LotteryIssuesData.UpdateOpenState(item))
                    {
                        errorSource.Add(item);
                    }
                }
                catch (Exception ex)
                {
                    LogManager.Error(string.Format("第{0}期,投注明细项id为{1} 计算过程中发生异常", issueCode, item.Id), ex);
                    errorSource.Add(item);//失败项目,添加至列表中,稍后更新
                }
            }
            int errorCount = errorSource.Count;

            if (errorCount > 0)
            {
                param.Details     = errorSource;
                param.WhileIndex += 1;
                //继续计算
                CalculatePage(param);
                LogManager.Info("计算失败项总数为" + errorCount + " 系统将继续计算!");
            }

            //betDetailService.Save();
            LogManager.Info("计算结果结束:" + param.ToString());


            //完成计算
            IssueBettingNumsing.CreateInstance().CompledRunning(key, param.pageIndex);
        }