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