using System; using System.Collections.Generic; using System.Threading; using System.Linq; using System.Data; using MySystem; using MySystem.PxcModels; using Library; public class RedPackageV2Helper { public readonly static RedPackageV2Helper Instance = new RedPackageV2Helper(); private RedPackageV2Helper() { } public void Start() { Thread th = new Thread(DoWorks); th.IsBackground = true; th.Start(); } private void DoWorks() { while (true) { if (DateTime.Now.Hour >= 3 && DateTime.Now < DateTime.Parse("2023-10-01 00:00:00")) { string ActivityDate = DateTime.Now.AddDays(-1).ToString("yyyyMMdd"); string check = function.ReadInstance("/Activity/RedPackage/" + ActivityDate + ".txt"); if (string.IsNullOrEmpty(check)) { function.WritePage("/Activity/RedPackage/", ActivityDate + ".txt", DateTime.Now.ToString()); function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), "生成指定未领取红包日志"); WebCMSEntities db = new WebCMSEntities(); try { // decimal TotalPrize = 888.88M; // DateTime start = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 07:50:00"); // DateTime today = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00:00"); // string PreDate = DateTime.Now.AddDays(-2).ToString("yyyyMMdd"); List list = new List(); list.Add(88.88M); list.Add(40.76M); list.Add(38.88M); list.Add(18.88M); list.Add(15.88M); list.Add(11.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(8.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(5.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(3.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); list.Add(1.88M); // TotalPrize -= 88.88M; // for (int i = 1; i < 150; i++) // { // list.Add(0.88M); // TotalPrize -= 0.88M; // } // for (int i = 0; i < 150; i++) // { // if (TotalPrize > 0) // { // int BigPrize = function.get_Random(1, 150); // decimal PrizeAmt = (decimal)function.get_Random(88, 1000) / 100M; // if (TotalPrize > PrizeAmt) // { // list[BigPrize] += PrizeAmt; // TotalPrize -= PrizeAmt; // } // else // { // list[BigPrize] += TotalPrize; // TotalPrize = 0; // } // } // else // { // break; // } // } foreach (decimal PrizeAmt in list) { db.ActivityRedPackageStock.Add(new ActivityRedPackageStock() { CreateDate = DateTime.Now, PrizeAmt = PrizeAmt, ActivityDate = ActivityDate, SeoTitle = function.get_Random(20), }); } db.SaveChanges(); } catch (Exception ex) { function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "生成指定未领取红包异常"); } db.Dispose(); function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "\n\n", "生成指定未领取红包日志"); } redisStock(); } Thread.Sleep(60000); } } // 将红包加入缓存 public void redisStock() { string ActivityDate = DateTime.Now.AddDays(-1).ToString("yyyyMMdd"); string check = function.ReadInstance("/Activity/RedPackageRedis/" + ActivityDate + ".txt"); if (!string.IsNullOrEmpty(check)) { return; } function.WritePage("/Activity/RedPackageRedis/", ActivityDate + ".txt", DateTime.Now.ToString()); WebCMSEntities db = new WebCMSEntities(); List list = db.ActivityRedPackageStock.Where(m => m.ActivityDate == ActivityDate && m.PrizeAmt != 88.88M).OrderBy(m => m.SeoTitle).ToList(); int i = 0; foreach(ActivityRedPackageStock sub in list) { i += 1; if(i == 18) { ActivityRedPackageStock best = db.ActivityRedPackageStock.FirstOrDefault(m => m.ActivityDate == ActivityDate && m.PrizeAmt == 88.88M); if(best != null) { RedisDbconn.Instance.AddList("RedPackageList:" + ActivityDate, best); } } RedisDbconn.Instance.AddList("RedPackageList:" + ActivityDate, sub); } string PreDate = DateTime.Now.AddDays(-2).ToString("yyyyMMdd"); string PreMakerCode = ""; string PreRealName = ""; decimal PrePrizeAmt = 0; bool checkPre = db.ActivityRedPackageStock.Any(m => m.ActivityDate == PreDate); if (checkPre) { ActivityRedPackageStock preInfo = db.ActivityRedPackageStock.Where(m => m.ActivityDate == PreDate).OrderByDescending(m => m.PrizeAmt).FirstOrDefault(); if (preInfo != null) { Users user = db.Users.FirstOrDefault(m => m.Id == preInfo.UserId) ?? new Users(); PreMakerCode = user.MakerCode; PreRealName = user.RealName; PrePrizeAmt = preInfo.PrizeAmt; RedisDbconn.Instance.Set("PreInfoString:" + PreDate, PreMakerCode + "|" + PreRealName + "|" + PrePrizeAmt); RedisDbconn.Instance.SetExpire("PreInfoString:" + PreDate, 7200); } } db.Dispose(); } public void StartStatTop10() { Thread th = new Thread(StartStatTop10Do); th.IsBackground = true; th.Start(); } private void StartStatTop10Do() { while (true) { if(DateTime.Now.Hour >= 7 && DateTime.Now.Hour <= 10 && DateTime.Now < DateTime.Parse("2023-10-01 00:00:00")) { OtherMySqlConn.connstr = Library.ConfigurationManager.AppSettings["Pxc1SqlConnStr"].ToString(); OtherMySqlConn.op("delete from ActivityRedPackageTop10"); using (WebCMSEntities db = new WebCMSEntities()) { DataTable dt = OtherMySqlConn.dtable("select UserId,sum(PrizeAmt) from ActivityRedPackageJoins group by UserId order by sum(PrizeAmt) desc"); int index = 0; foreach (DataRow dr in dt.Rows) { index += 1; int UserId = int.Parse(dr["UserId"].ToString()); decimal PrizeAmt = decimal.Parse(dr[1].ToString()); db.ActivityRedPackageTop10.Add(new ActivityRedPackageTop10() { Sort = index, UserId = UserId, PrizeAmt = PrizeAmt, Kind = 1, }); db.SaveChanges(); } dt = OtherMySqlConn.dtable("select UserId,count(Id) from ActivityRedPackageJoins group by UserId order by count(Id) desc"); index = 0; foreach (DataRow dr in dt.Rows) { index += 1; int UserId = int.Parse(dr["UserId"].ToString()); int PrizeCount = int.Parse(dr[1].ToString()); db.ActivityRedPackageTop10.Add(new ActivityRedPackageTop10() { Sort = index, UserId = UserId, TimeNum = PrizeCount, Kind = 2, }); db.SaveChanges(); } } } Thread.Sleep(300000); } } public void StartSendPrize() { Thread th = new Thread(StartSendPrizeNewDo); th.IsBackground = true; th.Start(); } private void StartSendPrizeNewDo() { while (true) { string content = RedisDbconn.Instance.RPop("RedPrizeQueue"); if (!string.IsNullOrEmpty(content) && DateTime.Now < DateTime.Parse("2023-10-01 00:00:00")) { try { string[] data = content.Split(':'); int Id = int.Parse(function.CheckInt(data[0])); int UserId = int.Parse(function.CheckInt(data[1])); string ActivityDate = data[2]; using (WebCMSEntities db = new WebCMSEntities()) { ActivityRedPackageStock edit = db.ActivityRedPackageStock.FirstOrDefault(m => m.Id == Id); if(edit != null) { edit.UserId = UserId; edit.UpdateDate = DateTime.Now; ActivityRedPackageJoins query = db.ActivityRedPackageJoins.Add(new ActivityRedPackageJoins() { CreateDate = DateTime.Now, //创建时间 Status = 1, UserId = UserId, //创客 ActivityDate = ActivityDate, //期数 PrizeAmt = edit.PrizeAmt, }).Entity; db.SaveChanges(); StartGetAccount(db, UserId, query.Id, edit.PrizeAmt); } } } catch (Exception ex) { function.WriteLog(ex.ToString(), "发放红包奖励异常"); } Thread.Sleep(200); } else { Thread.Sleep(500); } } } private void StartGetAccount(WebCMSEntities db, int UserId, int Id, decimal PrizeAmt) { try { UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId); if (account == null) { account = db.UserAccount.Add(new UserAccount() { Id = UserId, UserId = UserId, }).Entity; db.SaveChanges(); } decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额 decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额 decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额 account.BalanceAmount += PrizeAmt; account.TotalAmount += PrizeAmt; decimal AfterTotalAmount = account.TotalAmount; //变更后总金额 decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额 decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额 UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord() { CreateDate = DateTime.Now, UpdateDate = DateTime.Now, UserId = UserId, //创客 ChangeType = 31, //变动类型 ChangeAmount = PrizeAmt, //变更金额 BeforeTotalAmount = BeforeTotalAmount, //变更前总金额 AfterTotalAmount = AfterTotalAmount, //变更后总金额 BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额 AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额 BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额 AfterBalanceAmount = AfterBalanceAmount, //变更后余额 QueryCount = Id, Remark = "开机抢红包活动", }).Entity; db.SaveChanges(); } catch (Exception ex) { function.WriteLog(ex.ToString(), "领取红包奖励异常"); } } }