Browse Source

修复SP数据同步到main的bug
MQ全部改为Redis传输
码牌交易金额去掉放大10000倍
调通激活机制,20天贷记卡满1000激活
修复商户激活数统计bug

lichunlei 3 năm trước cách đây
mục cha
commit
ededc5893e
41 tập tin đã thay đổi với 1240 bổ sung273 xóa
  1. 2 2
      AppStart/Helper/AlipayPayBackService.cs
  2. 36 36
      AppStart/Helper/MerchantTypeSetService.cs
  3. 1 19
      AppStart/Helper/Profit/ProfitHelper.cs
  4. 1 1
      AppStart/Helper/Profit/StandardService.cs
  5. 280 8
      AppStart/Helper/StatService.cs
  6. 86 41
      AppStart/Helper/StatTimerService.cs
  7. 28 14
      AppStart/Helper/SycnSpServer/SycnSpActiveService.cs
  8. 12 2
      AppStart/Helper/SycnSpServer/SycnSpBindService.cs
  9. 35 32
      AppStart/Helper/SycnSpServer/SycnSpMerchantService.cs
  10. 0 7
      AppStart/Helper/SycnSpServer/SycnSpService.cs
  11. 72 38
      AppStart/Helper/SycnSpServer/SycnSpTradeService.cs
  12. 2 2
      AppStart/Helper/WeChatPayBackService.cs
  13. 58 45
      AppStart/RabbitMQClient.cs
  14. 347 0
      AppStart/RabbitMQClientV2.cs
  15. 35 0
      AppStart/Timer/AlipayPayBack2Timer.cs
  16. 35 0
      AppStart/Timer/PosTradeStatTimer.cs
  17. 35 0
      AppStart/Timer/SycnSpTimer.cs
  18. 35 0
      AppStart/Timer/TimerStatTimer.cs
  19. 14 2
      Controllers/HomeController.cs
  20. 11 0
      Models/MachineForMerNo.cs
  21. 1 1
      Models/PosMachinesTwo.cs
  22. 15 0
      Models/TmpUser.cs
  23. 15 3
      Models/WebCMSEntities.cs
  24. 11 0
      PxcModels/MachineForMerNo.cs
  25. 1 1
      PxcModels/PosMachinesTwo.cs
  26. 15 3
      PxcModels/WebCMSEntities.cs
  27. 16 16
      Startup.cs
  28. BIN
      bin/Debug/netcoreapp3.0/MySystem.dll
  29. BIN
      bin/Debug/netcoreapp3.0/MySystem.pdb
  30. BIN
      bin/Debug/netcoreapp3.0/bsserver_com/static/ReferenceQrCode/0a247f953a81c29a.png
  31. 20 0
      bin/Debug/netcoreapp3.0/log/SycnSpServer监控/2022/3/15/content.log
  32. 5 0
      bin/Debug/netcoreapp3.0/log/public_service/2022/3/15/content.log
  33. 4 0
      bin/Debug/netcoreapp3.0/log/sycn_sp_server_err/2022/3/15/content.log
  34. 12 0
      bin/Debug/netcoreapp3.0/log/服务商平台查询申请单状态API/2022/3/15/content.log
  35. BIN
      bin/release/netcoreapp3.0/MySystem.dll
  36. BIN
      bin/release/netcoreapp3.0/MySystem.pdb
  37. BIN
      obj/Debug/netcoreapp3.0/MySystem.dll
  38. BIN
      obj/Debug/netcoreapp3.0/MySystem.pdb
  39. BIN
      obj/release/netcoreapp3.0/MySystem.csprojAssemblyReference.cache
  40. BIN
      obj/release/netcoreapp3.0/MySystem.dll
  41. BIN
      obj/release/netcoreapp3.0/MySystem.pdb

+ 2 - 2
AppStart/Helper/AlipayPayBackService.cs

@@ -61,8 +61,8 @@ namespace MySystem
                         {
                             order.Status = 1;
                             order.UpdateDate = DateTime.Now;
-                            order.PayMoney = order.PayMoney * 10000M;
-                            order.MaxDivi = order.MaxDivi * 10000M;
+                            order.PayMoney = order.PayMoney;
+                            order.MaxDivi = order.MaxDivi;
                             db.SaveChanges();
                             BothdisDbconn.Instance.SendMq("Pop:ConsumerOrders", order);
                             RedisDbconn.Instance.AddList("ConsumerOrdersStat", order.Id);

+ 36 - 36
AppStart/Helper/MerchantTypeSetService.cs

@@ -43,42 +43,42 @@ namespace MySystem
         public void dosomething()
         {
             // TODO: 每天扫描非商户型创客的持有机具数量
-            WebCMSEntities spdb = new WebCMSEntities();
-            PxcModels.WebCMSEntities db = new PxcModels.WebCMSEntities();
-            DateTime yesterday = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 00:00:00");
-            DateTime today = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00:00");
-            List<BindRecord> binds = spdb.BindRecord.Where(m => m.CreateTime >= yesterday && m.CreateTime < today).ToList();
-            foreach (BindRecord bind in binds)
-            {
-                string Mobile = bind.MerNewSnNo;
-                string MerNo = bind.MerNo;
-                string BeforeNum = "";
-                string AfterNum = "";
-                if (Mobile.Contains("****") && Mobile.Length == 11)
-                {
-                    BeforeNum = Mobile.Substring(0, 3);
-                    AfterNum = Mobile.Substring(7);
-                }
-                string Name = bind.MerName;
-                PxcModels.Users user = db.Users.FirstOrDefault(m => m.Mobile.StartsWith(BeforeNum) && m.Mobile.EndsWith(AfterNum) && m.RealName == Name && m.AuthFlag == 1 && m.MerchantType == 0);
-                if (user != null)
-                {
-                    user.MerchantType = 1;
-                    PxcModels.PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.KqMerNo == MerNo) ?? new PxcModels.PosMerchantInfo();
-                    merchant.MerUserType = 1;
-                    PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.BindMerchantId == merchant.Id);
-                    if (pos != null)
-                    {
-                        pos.UserId = user.Id;
-                    }
-                    db.SaveChanges();
-                    BothdisDbconn.Instance.SendMq("Pop:Users", user);
-                    BothdisDbconn.Instance.SendMq("Pop:PosMerchantInfo", merchant);
-                    BothdisDbconn.Instance.SendMq("Pop:PosMachinesTwo", pos);
-                }
-            }
-            spdb.Dispose();
-            db.Dispose();
+            // WebCMSEntities spdb = new WebCMSEntities();
+            // PxcModels.WebCMSEntities db = new PxcModels.WebCMSEntities();
+            // DateTime yesterday = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 00:00:00");
+            // DateTime today = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " 00:00:00");
+            // List<BindRecord> binds = spdb.BindRecord.Where(m => m.CreateTime >= yesterday && m.CreateTime < today).ToList();
+            // foreach (BindRecord bind in binds)
+            // {
+            //     string Mobile = bind.MerNewSnNo;
+            //     string MerNo = bind.MerNo;
+            //     string BeforeNum = "";
+            //     string AfterNum = "";
+            //     if (Mobile.Contains("****") && Mobile.Length == 11)
+            //     {
+            //         BeforeNum = Mobile.Substring(0, 3);
+            //         AfterNum = Mobile.Substring(7);
+            //     }
+            //     string Name = bind.MerName;
+            //     PxcModels.Users user = db.Users.FirstOrDefault(m => m.Mobile.StartsWith(BeforeNum) && m.Mobile.EndsWith(AfterNum) && m.RealName == Name && m.AuthFlag == 1 && m.MerchantType == 0);
+            //     if (user != null)
+            //     {
+            //         user.MerchantType = 1;
+            //         PxcModels.PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.KqMerNo == MerNo) ?? new PxcModels.PosMerchantInfo();
+            //         merchant.MerUserType = 1;
+            //         PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.BindMerchantId == merchant.Id);
+            //         if (pos != null)
+            //         {
+            //             pos.SeoTitle = user.Id.ToString(); // 记录商户型创客的Id
+            //         }
+            //         db.SaveChanges();
+            //         BothdisDbconn.Instance.SendMq("Pop:Users", user);
+            //         BothdisDbconn.Instance.SendMq("Pop:PosMerchantInfo", merchant);
+            //         BothdisDbconn.Instance.SendMq("Pop:PosMachinesTwo", pos);
+            //     }
+            // }
+            // spdb.Dispose();
+            // db.Dispose();
         }
     }
 }

+ 1 - 19
AppStart/Helper/Profit/ProfitHelper.cs

@@ -22,25 +22,7 @@ namespace MySystem
         { 
             try
             {
-                WebCMSEntities db = new WebCMSEntities();
-                if (pos.Id > 0)
-                {
-                    Users user = db.Users.FirstOrDefault(m => m.Id == pos.BuyUserId);
-                    if (user != null)
-                    {
-                        ProfitResult result = ActivationProft(pos, new ProfitUsers()
-                        {
-                            UserId = user.Id,
-                            UserLevel = user.UserLevel,
-                            UserNav = user.ParentNav,
-                            CreateDate = user.CreateDate.Value,
-                        });
-                        if (result.UserId > 0)
-                        { 
-                            
-                        }
-                    }
-                }
+                
             }
             catch (Exception ex)
             {

+ 1 - 1
AppStart/Helper/Profit/StandardService.cs

@@ -54,7 +54,7 @@ namespace MySystem
                     List<MerchantRebateDetail> list = db.MerchantRebateDetail.Where(m => m.TradeMonth == TradeMonth && m.SyncStatus == 0).ToList();
                     foreach (MerchantRebateDetail sub in list)
                     {
-                        MachineForSnNo machinefor = RedisDbconn.Instance.Get<MachineForSnNo>("MachineForSnNo:" + sub.SnNo) ?? new MachineForSnNo();
+                        MachineForMerNo machinefor = RedisDbconn.Instance.Get<MachineForMerNo>("MachineForMerNo:" + sub.SnNo) ?? new MachineForMerNo();
                         PosMachines machine = RedisDbconn.Instance.Get<PosMachines>("PosMachines:" + machinefor.SnId) ?? new PosMachines();
                         Users user = RedisDbconn.Instance.Get<Users>("Users:" + machine.UserId) ?? new Users();
                         int TopUserId = 0;

+ 280 - 8
AppStart/Helper/StatService.cs

@@ -24,7 +24,8 @@ namespace MySystem
                 if (string.IsNullOrEmpty(flag))
                 {
                     function.WritePage("/Stat/", doDate + ".txt", DateTime.Now.ToString("HH:mm:ss"));
-                    dosomething(doDate);
+                    dosomething1(doDate);
+                    dosomething2(doDate);
                 }
                 string Msg = "success";
                 jobInfo.Status = Msg == "success" ? 1 : 0;
@@ -56,17 +57,62 @@ namespace MySystem
             RedisDbconn.Instance.Clear("TeamTotalCloudPayAmount*");
             RedisDbconn.Instance.Clear("TeamTotalPosAmount*");
 
-            RedisDbconn.Instance.Clear("TotalUser*");
-            RedisDbconn.Instance.Clear("TeamTotalUser*");
-            RedisDbconn.Instance.Clear("AddUser*");
-            RedisDbconn.Instance.Clear("TeamAddUser*");
+            // RedisDbconn.Instance.Clear("TotalUser*");
+            // RedisDbconn.Instance.Clear("TeamTotalUser*");
+            // RedisDbconn.Instance.Clear("AddUser*");
+            // RedisDbconn.Instance.Clear("TeamAddUser*");
 
-            RedisDbconn.Instance.Clear("TotalPosMerchant*");
-            RedisDbconn.Instance.Clear("TeamTotalPosMerchant*");
+            // RedisDbconn.Instance.Clear("TotalPosMerchant*");
+            // RedisDbconn.Instance.Clear("TeamTotalPosMerchant*");
 
             RedisDbconn.Instance.Clear("MerTotalAmount*");
         }
-        public void dosomething(string date)
+
+
+        // 1. 前一天的绑定记录和创客信息匹配,设置商户型创客
+        public void dosomething1(string date)
+        {
+            // TODO: 每天扫描非商户型创客的持有机具数量
+            SpModels.WebCMSEntities spdb = new SpModels.WebCMSEntities();
+            WebCMSEntities db = new WebCMSEntities();
+            DateTime yesterday = DateTime.Parse(date + " 00:00:00");
+            DateTime today = DateTime.Parse(DateTime.Parse(date).AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00");
+            List<SpModels.BindRecord> binds = spdb.BindRecord.Where(m => m.CreateTime >= yesterday && m.CreateTime < today).ToList();
+            foreach (SpModels.BindRecord bind in binds)
+            {
+                string Mobile = bind.MerNewSnNo;
+                string MerNo = bind.MerNo;
+                string BeforeNum = "";
+                string AfterNum = "";
+                if (Mobile.Contains("****") && Mobile.Length == 11)
+                {
+                    BeforeNum = Mobile.Substring(0, 3);
+                    AfterNum = Mobile.Substring(7);
+                }
+                string Name = bind.MerName;
+                PxcModels.Users user = db.Users.FirstOrDefault(m => m.Mobile.StartsWith(BeforeNum) && m.Mobile.EndsWith(AfterNum) && m.RealName == Name && m.AuthFlag == 1 && m.MerchantType == 0);
+                if (user != null)
+                {
+                    user.MerchantType = 1;
+                    PxcModels.PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.KqMerNo == MerNo) ?? new PxcModels.PosMerchantInfo();
+                    merchant.MerUserType = 1;
+                    PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.BindMerchantId == merchant.Id);
+                    if (pos != null)
+                    {
+                        pos.SeoTitle = user.Id.ToString(); // 记录商户型创客的Id
+                    }
+                    db.SaveChanges();
+                    BothdisDbconn.Instance.SendMq("Pop:Users", user);
+                    BothdisDbconn.Instance.SendMq("Pop:PosMerchantInfo", merchant);
+                    BothdisDbconn.Instance.SendMq("Pop:PosMachinesTwo", pos);
+                }
+            }
+            spdb.Dispose();
+            db.Dispose();
+        }
+
+        // 2. 每天统计前一天的交易额,每笔交易判断商户号的所属人是商户型创客,如果是,则从此人开始累计交易额,若不是,则从此人上级开始累计交易额 
+        public void dosomething2(string date)
         {
             WebCMSEntities db = new WebCMSEntities();
             string yesterday = date + " 00:00:00";
@@ -81,6 +127,14 @@ namespace MySystem
                 int MerchantId = int.Parse(dr["MerchantId"].ToString()); //商户Id
                 int QrPayFlag = int.Parse(dr["QrPayFlag"].ToString()); //云闪付
                 decimal TradeAmount = decimal.Parse(dr[4].ToString()); //当日交易额
+                PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == MerchantId) ?? new PosMerchantInfo();
+                MachineForMerNo machineFor = db.MachineForMerNo.FirstOrDefault(m => m.MerNo == merchant.KqMerNo) ?? new MachineForMerNo();
+                PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == machineFor.SnId) ?? new PosMachinesTwo();
+                int MerchantTypeUserId = int.Parse(function.CheckInt(pos.SeoTitle));
+                if (MerchantTypeUserId > 0)
+                {
+                    UserId = MerchantTypeUserId;
+                }
                 RedisDbconn.Instance.AddNumber("MerTotalAmount:" + MerchantId, TradeAmount);
                 RedisDbconn.Instance.AddNumber("MerTotalAmount:" + MerchantId + ":" + TradeMonth, TradeAmount); //商户当月交易
                 RedisDbconn.Instance.AddNumber("MerTotalAmount:" + MerchantId + ":" + TradeDate, TradeAmount); //商户当日交易
@@ -129,6 +183,224 @@ namespace MySystem
                         }
                         UserId = user.ParentUserId;
                     }
+                    else
+                    {
+                        UserId = 0;
+                    }
+                }
+            }
+            db.Dispose();
+        }
+
+        // 3. 前一天的激活记录,根据创客类型,如果是商户型创客,则激活奖励的起始人从此人上级计算。如果不是,则从此人开始计算
+        public void dosomething3(string date)
+        { 
+            WebCMSEntities db = new WebCMSEntities();
+            DateTime yesterday = DateTime.Parse(date + " 00:00:00");
+            DateTime today = DateTime.Parse(DateTime.Parse(date).AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00");
+            List<PosMachinesTwo> posList = db.PosMachinesTwo.Where(m => m.ActivationTime >= yesterday && m.ActivationTime < today).ToList();
+            foreach (PosMachinesTwo pos in posList)
+            {
+                int GetUserId = pos.UserId;
+                string ParentNav = "";
+                Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId);
+                if (user != null)
+                {
+                    ParentNav = user.ParentNav;
+                    if (user.MerchantType == 1)
+                    { 
+                        Users puser = db.Users.FirstOrDefault(m => m.Id == user.ParentUserId);
+                        if (puser != null)
+                        { 
+                            GetUserId = puser.Id;
+                            ParentNav = puser.ParentNav;
+                        }
+                    }
+                    int TopUserId = 0;
+                    if (!string.IsNullOrEmpty(ParentNav))
+                    {
+                        TopUserId = int.Parse(ParentNav.Trim(',').Replace(",,", ","));
+                    }
+                    decimal ActPrize = decimal.Parse(function.CheckNum(pos.SeoTitle)) / 100;
+                    if (ActPrize > 0)
+                    {
+                        PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == pos.BindMerchantId) ?? new PosMerchantInfo();
+                        Users merUser = db.Users.FirstOrDefault(m => m.Id == merchant.UserId) ?? new Users();
+                        db.ActiveReward.Add(new ActiveReward()
+                        {
+                            CreateDate = DateTime.Now,
+                            UpdateDate = DateTime.Now,
+                            UserId = GetUserId, //创客
+                            MerchantId = pos.BindMerchantId, //商户
+                            StandardDate = pos.ActivationTime, //达标日期
+                            RewardAmount = ActPrize, //奖励金额
+                            BrandId = pos.BrandId, //品牌
+                            UserNav = ParentNav, //创客父级
+                            DirectBuddyNo = merchant.UserId, //商户直属创客
+                            KqMerNo = merchant.KqMerNo, //渠道商户编号
+                            KqSnNo = pos.PosSn, //渠道SN号
+                            SnType = pos.PosSnType, //机具类型
+                            SnApplyUserId = pos.BuyUserId, //机具申请创客
+                            ActType = 0, //激活类型
+                            SnStoreId = pos.StoreId, //SN仓库
+                            RewardTips = "激活奖励", //奖励描述
+                            Remark = "激活奖励", //备注
+                            ActDate = pos.ActivationTime, //激活时间
+                            TopUserId = TopUserId, //顶级创客
+                        });
+                        db.SaveChanges();
+                        string IdBrand = GetUserId + "_" + pos.BrandId;
+                        UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
+                        if (userData == null)
+                        {
+                            userData = db.UserMachineData.Add(new UserMachineData()
+                            {
+                                IdBrand = IdBrand,
+                            }).Entity;
+                            db.SaveChanges();
+                        }
+                        userData.ActProfit += ActPrize;
+                        db.SaveChanges();
+                        RedisDbconn.Instance.Set("UserMachineData:" + IdBrand, userData);
+
+                        string dateString = DateTime.Now.ToString("yyyyMMdd");
+                        string monthString = DateTime.Now.ToString("yyyyMMdd");
+                        // 激活奖励列表
+                        List<string> dates = RedisDbconn.Instance.GetList<string>("ActiveRewardDay:" + GetUserId + ":" + pos.BrandId);
+                        if (!dates.Contains(dateString))
+                        { 
+                            RedisDbconn.Instance.AddList("ActiveRewardDay:" + GetUserId + ":" + pos.BrandId, dateString);
+                            RedisDbconn.Instance.AddNumber("ActiveRewardAmt:" + GetUserId + ":" + pos.BrandId + ":" + dateString, ActPrize);
+                        }
+                        List<string> months = RedisDbconn.Instance.GetList<string>("ActiveRewardMonth:" + GetUserId + ":" + pos.BrandId);
+                        if (!months.Contains(monthString))
+                        { 
+                            RedisDbconn.Instance.AddList("ActiveRewardMonth:" + GetUserId + ":" + pos.BrandId, monthString);
+                            RedisDbconn.Instance.AddNumber("ActiveRewardAmt:" + GetUserId + ":" + pos.BrandId + ":" + monthString, ActPrize);
+                        }
+
+                        // 激活奖励详情
+                        List<int> actPrizeList = RedisDbconn.Instance.GetList<int>("ActiveRewardDetail:" + GetUserId + ":" + pos.BrandId + ":" + dateString);
+                        if (!actPrizeList.Contains(pos.BindMerchantId))
+                        { 
+                            RedisDbconn.Instance.AddList("ActiveRewardDetail:" + GetUserId + ":" + pos.BrandId + ":" + dateString, pos.BindMerchantId);
+                            RedisDbconn.Instance.AddNumber("ActiveRewardAmt:" + pos.BindMerchantId + ":" + pos.BrandId + ":" + dateString, ActPrize);
+                        }
+                    }
+                }
+            }
+            db.Dispose();
+        }
+
+
+        //3. 前一天的激活记录,根据创客类型,如果是商户型创客,则开机奖励的起始人从此人上级计算。如果不是,则从此人开始计算
+        public void dosomething4(string date)
+        { 
+            WebCMSEntities db = new WebCMSEntities();
+            DateTime yesterday = DateTime.Parse(date + " 00:00:00");
+            DateTime today = DateTime.Parse(DateTime.Parse(date).AddDays(1).ToString("yyyy-MM-dd") + " 00:00:00");
+            List<PosMachinesTwo> posList = db.PosMachinesTwo.Where(m => m.CreditTrade >= 1000).ToList();
+            foreach (PosMachinesTwo pos in posList)
+            {
+                if (pos.ActivationTime > DateTime.Now.AddDays(-20))
+                {
+                    decimal ActPrize = decimal.Parse(function.CheckNum(pos.SeoTitle));
+                    if (ActPrize > 0)
+                    {
+                        Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId) ?? new Users();
+                        PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == pos.BindMerchantId) ?? new PosMerchantInfo();
+                        if (!string.IsNullOrEmpty(user.ParentNav))
+                        {
+                            decimal Prize = 20;
+                            string[] ParentNavs = user.ParentNav.Trim(',').Replace(",,", ",").Split(',');
+                            for (int i = ParentNavs.Length - 1; i >= 0; i--)
+                            {
+                                int UserId = int.Parse(ParentNavs[i]);
+                                Users puser = db.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1);
+                                if (puser != null)
+                                {
+                                    int pTopUserId = 0;
+                                    if (!string.IsNullOrEmpty(puser.ParentNav))
+                                    {
+                                        pTopUserId = int.Parse(puser.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
+                                    }
+                                    OpenRewardDetail detail = db.OpenRewardDetail.Add(new OpenRewardDetail()
+                                    {
+                                        CreateDate = DateTime.Now,
+                                        UpdateDate = DateTime.Now,
+                                        TradeMonth = yesterday.ToString("yyyyMM"), //交易月
+                                        TradeDate = yesterday, //达标日期
+                                        UserId = puser.Id, //创客
+                                        BrandId = pos.BrandId, //品牌
+                                        ProductName = RelationClass.GetKqProductsInfo(pos.BrandId), //产品名称
+                                        MerchantId = pos.BindMerchantId, //商户
+                                        DirectUserId = merchant.UserId, //商户直属人
+                                        SnNo = pos.PosSn, //SN号
+                                        MerNo = merchant.KqMerNo, //渠道商户号
+                                        SnType = pos.PosSnType, //机具类型
+                                        StandardDate = pos.ActivationTime, //商户的激活日期
+                                        SnStoreId = pos.StoreId, //SN仓库
+                                        MerBuddyType = puser.MerchantType, //商户创客类型
+                                        RewardType = 1, //奖励类型 1-开机直接奖励,2-开机间接奖励
+                                        RewardTips = "开机奖励", //奖励描述
+                                        CreditTradeAmt = pos.CreditTrade, //贷记卡交易总金额
+                                        DebitTradeAmt = pos.DebitCardTrade, //借记卡交易总金额
+                                        CreditRewardAmount = Prize, //贷记卡交易奖励金额
+                                        RewardDesc = "开机奖励", //奖励描述
+                                        TopUserId = pTopUserId, //顶级创客
+                                    }).Entity;
+                                    db.OpenReward.Add(new OpenReward()
+                                    {
+                                        CreateDate = DateTime.Now,
+                                        UpdateDate = DateTime.Now,
+                                        TradeMonth = yesterday.ToString("yyyyMM"), //交易月
+                                        TradeDate = DateTime.Now, //达标日期
+                                        UserId = puser.Id, //创客
+                                        BrandId = pos.BrandId, //品牌
+                                        RewardType = 2, //奖励类型
+                                        CreditTradeAmt = pos.CreditTrade, //贷记卡交易总金额
+                                        DebitTradeAmt = pos.DebitCardTrade, //借记卡交易总金额
+                                        CreditRewardAmount = Prize, //贷记卡交易奖励金额
+                                        RewardDesc = "开机奖励", //奖励描述
+                                        TopUserId = pTopUserId, //顶级创客
+                                    });
+                                    Prize -= 10;
+                                    string IdBrand = puser.Id + "_" + pos.BrandId;
+                                    UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
+                                    if (userData == null)
+                                    {
+                                        userData = db.UserMachineData.Add(new UserMachineData()
+                                        {
+                                            IdBrand = IdBrand,
+                                        }).Entity;
+                                        db.SaveChanges();
+                                    }
+                                    userData.OpenProfit += Prize;
+                                    db.SaveChanges();
+                                    RedisDbconn.Instance.Set("UserMachineData:" + IdBrand, userData);
+
+                                    string dateString = DateTime.Now.ToString("yyyyMMdd");
+                                    string monthString = DateTime.Now.ToString("yyyyMMdd");
+                                    // 开机奖励列表
+                                    List<string> dates = RedisDbconn.Instance.GetList<string>("OpenRewardDay:" + puser.Id + ":" + pos.BrandId);
+                                    if (!dates.Contains(dateString))
+                                    { 
+                                        RedisDbconn.Instance.AddList("OpenRewardDay:" + puser.Id + ":" + pos.BrandId, dateString);
+                                        RedisDbconn.Instance.AddNumber("OpenRewardAmt:" + puser.Id + ":" + pos.BrandId + ":" + dateString, Prize);
+                                    }
+                                    List<string> months = RedisDbconn.Instance.GetList<string>("OpenRewardMonth:" + puser.Id + ":" + pos.BrandId);
+                                    if (!months.Contains(monthString))
+                                    { 
+                                        RedisDbconn.Instance.AddList("OpenRewardMonth:" + puser.Id + ":" + pos.BrandId, monthString);
+                                        RedisDbconn.Instance.AddNumber("OpenRewardAmt:" + puser.Id + ":" + pos.BrandId + ":" + monthString, Prize);
+                                    }
+
+                                    // 开机奖励详情
+                                    RedisDbconn.Instance.AddList("OpenRewardDetail:" + puser.Id + ":" + pos.BrandId + ":" + dateString, detail);
+                                }
+                            }
+                        }
+                    }
                 }
             }
             db.Dispose();

+ 86 - 41
AppStart/Helper/StatTimerService.cs

@@ -16,7 +16,6 @@ namespace MySystem
 
         public void Start(JobMqMsg jobInfo)
         {
-            string content = "";
             try
             {
                 dosomething();
@@ -27,54 +26,17 @@ namespace MySystem
             }
             catch (Exception ex)
             {
-                if (!string.IsNullOrEmpty(content))
-                {
-                    Dictionary<string, string> data = new Dictionary<string, string>();
-                    data.Add("ErrTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
-                    data.Add("ErrMsg", ex.ToString());
-                    function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(data), "public_err");
-                }
-                else
-                {
-                    function.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "public_service");
-                }
+                function.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "public_service");
             }
         }
 
         public void dosomething()
         {
             WebCMSEntities db = new WebCMSEntities();
-            string yesterday = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd HH:mm:ss");
+            string yesterday = DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd HH:mm:ss");
             string today = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
-            
-            // DataTable dt = dbconn.dtable("select Id from Users where CreateDate>='" + yesterday + "' and CreateDate<'" + today + "' order by Id");
-            // foreach (DataRow dr in dt.Rows)
-            // {
-            //     int UserId = int.Parse(dr["Id"].ToString()); //创客ID
-            //     int Level = 0;
-            //     while (UserId > 0)
-            //     {
-            //         Level += 1;
-            //         Users user = db.Users.FirstOrDefault(m => m.Id == UserId);
-            //         if (user != null)
-            //         {
-            //             if (user.AuthFlag == 1)
-            //             {
-            //                 if (Level == 1)
-            //                 {
-            //                     RedisDbconn.Instance.AddInt("TotalUser:" + UserId); //累计总创客                
-            //                     RedisDbconn.Instance.AddInt("AddUser:" + UserId + ":" + TradeDate); //新增创客       
-            //                     RedisDbconn.Instance.AddInt("AddUser:" + UserId + ":" + TradeMonth); //新增创客
-            //                 }
-            //                 RedisDbconn.Instance.AddInt("TeamTotalUser:" + UserId); //累计总创客                
-            //                 RedisDbconn.Instance.AddInt("TeamAddUser:" + UserId + ":" + TradeDate); //新增创客
-            //                 RedisDbconn.Instance.AddInt("TeamAddUser:" + UserId + ":" + TradeMonth); //新增创客
-            //             }
-            //             UserId = user.ParentUserId;
-            //         }
-            //     }
-            // }
 
+            // 统计商户激活数据
             DataTable dt = dbconn.dtable("select UserId,BrandId,MerStandardDate from PosMerchantInfo where MerStandardDate>='" + yesterday + "' and MerStandardDate<'" + today + "' and QueryCount=0");
             dbconn.op("update PosMerchantInfo set QueryCount=1 where MerStandardDate>='" + yesterday + "' and MerStandardDate<'" + today + "' and QueryCount=0");
             foreach (DataRow dr in dt.Rows)
@@ -108,6 +70,89 @@ namespace MySystem
                         }
                         UserId = user.ParentUserId;
                     }
+                    else
+                    { 
+                        UserId = 0;
+                    }
+                }
+            }
+            db.Dispose();
+        }
+
+        public void ResetUserData()
+        {
+            RedisDbconn.Instance.Clear("TotalUser:*");
+            RedisDbconn.Instance.Clear("TeamTotalUser:*");
+            RedisDbconn.Instance.Clear("AddUser:*");
+            RedisDbconn.Instance.Clear("TeamAddUser:*");
+            WebCMSEntities db = new WebCMSEntities();
+            // 统计创客数据
+            DataTable dt = dbconn.dtable("select Id,AuthFlag from Users where AuthFlag=1 order by Id");
+            foreach (DataRow dr in dt.Rows)
+            {
+                int UserId = int.Parse(dr["Id"].ToString()); //创客ID
+                DateTime date = DateTime.Parse(dr["AuthFlag"].ToString());
+                string TradeMonth = date.ToString("yyyyMM");
+                string TradeDate = date.ToString("yyyyMMdd");
+                int Level = 0;
+                while (UserId > 0)
+                {
+                    Level += 1;
+                    Users user = db.Users.FirstOrDefault(m => m.Id == UserId);
+                    if (user != null)
+                    {
+                        if (user.AuthFlag == 1)
+                        {
+                            if (Level == 1)
+                            {
+                                RedisDbconn.Instance.AddInt("TotalUser:" + UserId); //累计总创客                
+                                RedisDbconn.Instance.AddInt("AddUser:" + UserId + ":" + TradeDate); //新增创客       
+                                RedisDbconn.Instance.AddInt("AddUser:" + UserId + ":" + TradeMonth); //新增创客
+                            }
+                            RedisDbconn.Instance.AddInt("TeamTotalUser:" + UserId); //累计总创客                
+                            RedisDbconn.Instance.AddInt("TeamAddUser:" + UserId + ":" + TradeDate); //新增创客
+                            RedisDbconn.Instance.AddInt("TeamAddUser:" + UserId + ":" + TradeMonth); //新增创客
+                        }
+                        UserId = user.ParentUserId;
+                    }
+                }
+            }
+            db.Dispose();
+        }
+
+        public void SetUserData(int uid)
+        {
+            WebCMSEntities db = new WebCMSEntities();
+            // 统计创客数据
+            DataTable dt = dbconn.dtable("select Id,AuthFlag from Users where Id=" + uid + " and AuthFlag=1 order by Id");
+            if (dt.Rows.Count > 0)
+            {
+                DataRow dr = dt.Rows[0];
+                int UserId = int.Parse(dr["Id"].ToString()); //创客ID
+                DateTime date = DateTime.Parse(dr["AuthFlag"].ToString());
+                string TradeMonth = date.ToString("yyyyMM");
+                string TradeDate = date.ToString("yyyyMMdd");
+                int Level = 0;
+                while (UserId > 0)
+                {
+                    Level += 1;
+                    Users user = db.Users.FirstOrDefault(m => m.Id == UserId);
+                    if (user != null)
+                    {
+                        if (user.AuthFlag == 1)
+                        {
+                            if (Level == 1)
+                            {
+                                RedisDbconn.Instance.AddInt("TotalUser:" + UserId); //累计总创客                
+                                RedisDbconn.Instance.AddInt("AddUser:" + UserId + ":" + TradeDate); //新增创客       
+                                RedisDbconn.Instance.AddInt("AddUser:" + UserId + ":" + TradeMonth); //新增创客
+                            }
+                            RedisDbconn.Instance.AddInt("TeamTotalUser:" + UserId); //累计总创客                
+                            RedisDbconn.Instance.AddInt("TeamAddUser:" + UserId + ":" + TradeDate); //新增创客
+                            RedisDbconn.Instance.AddInt("TeamAddUser:" + UserId + ":" + TradeMonth); //新增创客
+                        }
+                        UserId = user.ParentUserId;
+                    }
                 }
             }
             db.Dispose();

+ 28 - 14
AppStart/Helper/SycnSpServer/SycnSpActiveService.cs

@@ -25,30 +25,44 @@ namespace MySystem
             {
                 if (act.ActivateStatus == "00")
                 {
-                    PxcModels.MachineForSnNo posFor = db.MachineForSnNo.FirstOrDefault(m => m.SnNo == act.SnNo) ?? new PxcModels.MachineForSnNo();
+                    PxcModels.MachineForMerNo posFor = db.MachineForMerNo.FirstOrDefault(m => m.MerNo == act.MerNo) ?? new PxcModels.MachineForMerNo();
                     PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == posFor.SnId && m.ActivationState == 0);
                     if (pos != null)
                     {
-                        pos.ActivationState = 1;
-                        pos.ActivationTime = DateTime.Now;
-                        BothdisDbconn.Instance.SendMq("Pop:PosMachinesTwo", pos);
+                        // pos.ActivationState = 1;
+                        // pos.ActivationTime = DateTime.Now;
+                        pos.SeoTitle = act.SeoTitle;
+                        db.SaveChanges();
+                        RedisDbconn.Instance.Set("PosMachinesTwo:" + pos.Id, pos);
+                        RedisDbconn.Instance.Set("PosMachinesTwo:" + pos.PosSn, pos);
 
-                        PxcModels.PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == pos.BindMerchantId);
-                        if (merchant != null)
+                        // PxcModels.PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == pos.BindMerchantId);
+                        // if (merchant != null)
+                        // {
+                        //     merchant.ActiveStatus = 1;
+                        //     merchant.MerStandardDate = DateTime.Now;
+                        //     db.SaveChanges();
+                        //     RedisDbconn.Instance.Set("PosMerchantInfo:" + merchant.Id, merchant);
+                        // }
+
+                        ActivateRecord edit = spdb.ActivateRecord.FirstOrDefault(m => m.Id == act.Id);
+                        if (edit != null)
                         {
-                            merchant.ActiveStatus = 1;
-                            merchant.MerStandardDate = DateTime.Now;
-                            BothdisDbconn.Instance.SendMq("Pop:PosMerchantInfo", merchant);
+                            edit.Status = 2;
                         }
 
                         // 激活奖励
                         // ProfitHelper.Instance.StartListenActiveDo(pos);
                     }
-                }
-                ActivateRecord edit = spdb.ActivateRecord.FirstOrDefault(m => m.Id == act.Id);
-                if (edit != null)
-                {
-                    edit.Status = 2;
+                    pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == posFor.SnId && m.ActivationState == 1);
+                    if (pos != null)
+                    {
+                        ActivateRecord edit = spdb.ActivateRecord.FirstOrDefault(m => m.Id == act.Id);
+                        if (edit != null)
+                        {
+                            edit.Status = 2;
+                        }
+                    }
                 }
             }
             spdb.SaveChanges();

+ 12 - 2
AppStart/Helper/SycnSpServer/SycnSpBindService.cs

@@ -20,7 +20,7 @@ namespace MySystem
             PxcModels.WebCMSEntities db = new PxcModels.WebCMSEntities();
             DateTime start = DateTime.Now.AddDays(-2);
             function.WriteLog("2", "SycnSpServer监控");
-            var Binds = spdb.BindRecord.Select(m => new { m.Id, m.CreateTime, m.Status, m.MerSnNo }).Where(m => m.CreateTime >= start && m.Status == 1).OrderByDescending(m => m.Id).ToList();
+            var Binds = spdb.BindRecord.Select(m => new { m.Id, m.CreateTime, m.Status, m.MerNo, m.MerSnNo }).Where(m => m.CreateTime >= start && m.Status == 1).OrderByDescending(m => m.Id).ToList();
             function.WriteLog("3:count:" + Binds.Count, "SycnSpServer监控");
             foreach (var Bind in Binds)
             {
@@ -30,7 +30,17 @@ namespace MySystem
                 {
                     pos.BindingState = 1;
                     pos.BindingTime = DateTime.Now;
-                    BothdisDbconn.Instance.SendMq("Pop:PosMachinesTwo", pos);
+                    PxcModels.MachineForMerNo merFor = db.MachineForMerNo.FirstOrDefault(m => m.MerNo == Bind.MerNo);
+                    if (merFor == null)
+                    {
+                        merFor = db.MachineForMerNo.Add(new PxcModels.MachineForMerNo()
+                        {
+                            MerNo = Bind.MerNo,
+                            SnId = pos.Id,
+                        }).Entity;
+                    }
+                    db.SaveChanges();
+                    RedisDbconn.Instance.Set("PosMachinesTwo", pos);
                 }
                 BindRecord edit = spdb.BindRecord.FirstOrDefault(m => m.Id == Bind.Id);
                 if (edit != null)

+ 35 - 32
AppStart/Helper/SycnSpServer/SycnSpMerchantService.cs

@@ -21,40 +21,43 @@ namespace MySystem
             var Mers = spdb.Merchants.Where(m => m.CreateTime >= start && m.Status == 1).OrderByDescending(m => m.Id).ToList();
             foreach (var Mer in Mers)
             {
-                PxcModels.MachineForSnNo posFor = db.MachineForSnNo.FirstOrDefault(m => m.SnNo == Mer.SnNo) ?? new PxcModels.MachineForSnNo();
+                PxcModels.MachineForMerNo posFor = db.MachineForMerNo.FirstOrDefault(m => m.MerNo == Mer.MerNo) ?? new PxcModels.MachineForMerNo();
                 PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == posFor.SnId) ?? new PxcModels.PosMachinesTwo();
-                PxcModels.Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId) ?? new PxcModels.Users();
-                int TopUserId = 0;
-                if (!string.IsNullOrEmpty(user.ParentNav))
+                if (pos.BindingState == 1)
                 {
-                    TopUserId = int.Parse(user.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
-                }
-                PxcModels.PosMerchantInfo add = db.PosMerchantInfo.Add(new PxcModels.PosMerchantInfo()
-                {
-                    CreateDate = Mer.CreateTime,
-                    UpdateDate = Mer.UpdateTime,
-                    TopUserId = TopUserId,
-                    MerUserType = user.MerchantType,
-                    BrandId = int.Parse(Mer.ProductType),
-                    SnStoreId = pos.StoreId,
-                    SnType = pos.PosSnType,
-                    UserId = pos.UserId,
-                    MgrName = Mer.AgentName,
-                    MerStatus = 1,
-                    KqSnNo = Mer.SnNo,
-                    KqMerNo = Mer.MerNo,
-                    MerIdcardNo = Mer.MerIdcardNo,
-                    MerRealName = Mer.MerRealName,
-                    MerchantMobile = Mer.MerMobile,
-                    MerchantName = Mer.MerName,
-                    MerchantNo = Mer.MerNo,
-                }).Entity;
-                db.SaveChanges();
-                pos.BindMerchantId = add.Id;
-                Merchants edit = spdb.Merchants.FirstOrDefault(m => m.Id == Mer.Id);
-                if (edit != null)
-                {
-                    edit.Status = 2;
+                    PxcModels.Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId) ?? new PxcModels.Users();
+                    int TopUserId = 0;
+                    if (!string.IsNullOrEmpty(user.ParentNav))
+                    {
+                        TopUserId = int.Parse(user.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
+                    }
+                    PxcModels.PosMerchantInfo add = db.PosMerchantInfo.Add(new PxcModels.PosMerchantInfo()
+                    {
+                        CreateDate = Mer.CreateTime,
+                        UpdateDate = Mer.UpdateTime,
+                        TopUserId = TopUserId,
+                        MerUserType = user.MerchantType,
+                        BrandId = int.Parse(Mer.ProductType),
+                        SnStoreId = pos.StoreId,
+                        SnType = pos.PosSnType,
+                        UserId = pos.UserId,
+                        MgrName = Mer.AgentName,
+                        MerStatus = 1,
+                        KqSnNo = Mer.SnNo,
+                        KqMerNo = Mer.MerNo,
+                        MerIdcardNo = Mer.MerIdcardNo,
+                        MerRealName = Mer.MerRealName,
+                        MerchantMobile = Mer.MerMobile,
+                        MerchantName = Mer.MerName,
+                        MerchantNo = Mer.MerNo,
+                    }).Entity;
+                    db.SaveChanges();
+                    pos.BindMerchantId = add.Id;
+                    Merchants edit = spdb.Merchants.FirstOrDefault(m => m.Id == Mer.Id);
+                    if (edit != null)
+                    {
+                        edit.Status = 2;
+                    }
                 }
             }
             spdb.SaveChanges();

+ 0 - 7
AppStart/Helper/SycnSpServer/SycnSpService.cs

@@ -17,17 +17,11 @@ namespace MySystem
         {
             try
             {
-                function.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(jobInfo), "SycnSpServer监控");
                 string OrderString = jobInfo.OrderString;
-                function.WriteLog(OrderString, "SycnSpServer监控");
                 if (OrderString.StartsWith("Sp:") && OrderString.EndsWith(":SpServer"))
                 {
-                    function.WriteLog("ok", "SycnSpServer监控");
                     string Kind = OrderString.Split(':')[1];
-                    function.WriteLog("Kind:" + Kind, "SycnSpServer监控");
                     dosomething(Kind);
-                    function.WriteLog("finish:" + Kind, "SycnSpServer监控");
-                    function.WriteLog("\r\n\r\n\r\n", "SycnSpServer监控");
                     jobInfo.Status = 1;
                     jobInfo.Msg = "执行完成";
                     RabbitMQClient.Instance.SendMsg(Newtonsoft.Json.JsonConvert.SerializeObject(jobInfo), "SycnSpServerBack");
@@ -35,7 +29,6 @@ namespace MySystem
             }
             catch (Exception ex)
             {
-                function.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "sycn_sp_server_err");
             }
         }
 

+ 72 - 38
AppStart/Helper/SycnSpServer/SycnSpTradeService.cs

@@ -21,49 +21,83 @@ namespace MySystem
             List<TradeRecord> trades = spdb.TradeRecord.Where(m => m.CreateDate >= start && m.Status == 1).OrderByDescending(m => m.Id).ToList();
             foreach (TradeRecord trade in trades)
             {
-                PxcModels.MachineForSnNo posFor = db.MachineForSnNo.FirstOrDefault(m => m.SnNo == trade.TradeSnNo) ?? new PxcModels.MachineForSnNo();
-                PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == posFor.SnId) ?? new PxcModels.PosMachinesTwo();
-                PxcModels.Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId) ?? new PxcModels.Users();
-                int TopUserId = 0;
-                if (!string.IsNullOrEmpty(user.ParentNav))
+                PxcModels.MachineForMerNo posFor = db.MachineForMerNo.FirstOrDefault(m => m.MerNo == trade.MerNo) ?? new PxcModels.MachineForMerNo();
+                PxcModels.PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == posFor.SnId);
+                if (pos != null)
                 {
-                    TopUserId = int.Parse(user.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
-                }
-                bool check = db.TradeRecord.Any(m => m.RecordNo == trade.TradeSerialNo);
-                if (!check)
-                {
-                    db.TradeRecord.Add(new PxcModels.TradeRecord()
+                    if (pos.BindMerchantId > 0)
                     {
-                        CreateDate = trade.CreateDate,
-                        UpdateDate = trade.UpdateDate,
-                        RecordNo = trade.TradeSerialNo, //单号
-                        UserId = pos.UserId, //创客
-                        MerchantId = pos.BindMerchantId, //商户
-                        MerNo = trade.MerNo, //渠道商户编号
-                        MerHelpFlag = 0, //是否属于扶持周期内商户
-                        HelpMonthCount = 0, //扶持第几个月
-                        MerBuddyType = user.MerchantType, //商户创客类型
-                        SnNo = trade.TradeSnNo, //渠道SN号
-                        // TradeDate = DateTime.Parse(trade.TradeTime), //交易日期
-                        TradeSerialNo = trade.ChannelSerial, //交易流水号
-                        TradeAmount = trade.TradeAmount / 100, //交易金额
-                        BankCardType = int.Parse(trade.BankCardType), //银行卡类型
-                        QrPayFlag = trade.TradeType == "02" ? 1 : 0, //云闪付标识
-                        BrandId = int.Parse(trade.ProductType), //品牌
-                        Remark = trade.Remark, //备注
-                        TopUserId = TopUserId, //顶级创客
-                        MerUserId = pos.UserId, //商户直属创客
-                    });
-                }
-                TradeRecord edit = spdb.TradeRecord.FirstOrDefault(m => m.Id == trade.Id);
-                if (edit != null)
-                {
-                    edit.Status = 2;
+                        PxcModels.Users user = db.Users.FirstOrDefault(m => m.Id == pos.UserId) ?? new PxcModels.Users();
+                        int TopUserId = 0;
+                        if (!string.IsNullOrEmpty(user.ParentNav))
+                        {
+                            TopUserId = int.Parse(user.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
+                        }
+                        bool check = db.TradeRecord.Any(m => m.RecordNo == trade.TradeSerialNo);
+                        if (!check)
+                        {
+                            decimal TradeAmount = trade.TradeAmount / 100;
+                            int BankCardType = int.Parse(trade.BankCardType);
+                            db.TradeRecord.Add(new PxcModels.TradeRecord()
+                            {
+                                CreateDate = trade.CreateDate,
+                                UpdateDate = trade.UpdateDate,
+                                RecordNo = trade.TradeSerialNo, //单号
+                                UserId = pos.UserId, //创客
+                                MerchantId = pos.BindMerchantId, //商户
+                                MerNo = trade.MerNo, //渠道商户编号
+                                MerHelpFlag = 0, //是否属于扶持周期内商户
+                                HelpMonthCount = 0, //扶持第几个月
+                                MerBuddyType = user.MerchantType, //商户创客类型
+                                SnNo = trade.TradeSnNo, //渠道SN号
+                                                        // TradeDate = DateTime.Parse(trade.TradeTime), //交易日期
+                                TradeSerialNo = trade.ChannelSerial, //交易流水号
+                                TradeAmount = TradeAmount, //交易金额
+                                BankCardType = BankCardType, //银行卡类型
+                                QrPayFlag = trade.TradeType == "02" ? 1 : 0, //云闪付标识
+                                BrandId = int.Parse(trade.ProductType), //品牌
+                                Remark = trade.Remark, //备注
+                                TopUserId = TopUserId, //顶级创客
+                                MerUserId = pos.UserId, //商户直属创客
+                            });
+                            if (BankCardType == 1)
+                            {
+                                pos.CreditTrade += TradeAmount;
+                            }
+                            else if (BankCardType == 0)
+                            { 
+                                pos.DebitCardTrade += TradeAmount;
+                            }
+                            if (pos.CreditTrade < 1000)
+                            {
+                                pos.IsPurchase = 99;
+                            }
+                            else if(pos.CreditTrade >= 1000 && pos.ActivationState == 0 && pos.TransferTime > DateTime.Now.AddDays(-20))
+                            {
+                                pos.IsPurchase = 0;
+                                pos.ActivationState = 1;
+                                pos.ActivationTime = DateTime.Now;
+                                PxcModels.PosMerchantInfo merchant = db.PosMerchantInfo.FirstOrDefault(m => m.Id == pos.BindMerchantId);
+                                if (merchant != null)
+                                {
+                                    merchant.ActiveStatus = 1;
+                                    merchant.MerStandardDate = DateTime.Now;
+                                    db.SaveChanges();
+                                    RedisDbconn.Instance.Set("PosMerchantInfo:" + merchant.Id, merchant);
+                                }
+                            }
+                            db.SaveChanges();
+                        }
+                        TradeRecord edit = spdb.TradeRecord.FirstOrDefault(m => m.Id == trade.Id);
+                        if (edit != null)
+                        {
+                            edit.Status = 2;
+                        }
+                        spdb.SaveChanges();
+                    }
                 }
             }
-            spdb.SaveChanges();
             spdb.Dispose();
-            db.SaveChanges();
             db.Dispose();
         }
     }

+ 2 - 2
AppStart/Helper/WeChatPayBackService.cs

@@ -72,8 +72,8 @@ namespace MySystem
                                 {
                                     order.Status = 1;
                                     order.UpdateDate = DateTime.Now;
-                                    order.PayMoney = order.PayMoney * 10000M;
-                                    order.MaxDivi = order.MaxDivi * 10000M;
+                                    order.PayMoney = order.PayMoney;
+                                    order.MaxDivi = order.MaxDivi;
                                     db.SaveChanges();
                                     BothdisDbconn.Instance.SendMq("Pop:ConsumerOrders", order);
                                     RedisDbconn.Instance.AddList("ConsumerOrdersStat", order.Id);

+ 58 - 45
AppStart/RabbitMQClient.cs

@@ -22,28 +22,28 @@ namespace MySystem
         #region 单对单发送
         public void SendMsg(string content, string QueueName = "")
         {
-            // RedisDbconn.Instance.AddList("MainServerMq", QueueName + "#cut#" + content);
+            RedisDbconn.Instance.AddList(QueueName, content);
             //创建连接对象工厂
-            var factory = new ConnectionFactory()
-            {
-                UserName = UserName,
-                Password = Password,
-                AutomaticRecoveryEnabled = true,  //如果connection挂掉是否重新连接
-                TopologyRecoveryEnabled = true  //连接恢复后,连接的交换机,队列等是否一同恢复
-            };
-            List<AmqpTcpEndpoint> p = new List<AmqpTcpEndpoint>();
-            string[] HostNames = HostName.Split(',');
-            foreach (string subHostName in HostNames)
-            {
-                string[] subHostNameData = subHostName.Split(':');
-                p.Add(new AmqpTcpEndpoint(subHostNameData[0], int.Parse(subHostNameData[1])));
-            }
-            var conn = factory.CreateConnection(p);
-            var channel = conn.CreateModel();
-            channel.QueueDeclare(QueueName, true, false, false);
-            channel.BasicPublish("", QueueName, null, Encoding.Default.GetBytes(content));
-            channel.Dispose();
-            conn.Dispose();
+            // var factory = new ConnectionFactory()
+            // {
+            //     UserName = UserName,
+            //     Password = Password,
+            //     AutomaticRecoveryEnabled = true,  //如果connection挂掉是否重新连接
+            //     TopologyRecoveryEnabled = true  //连接恢复后,连接的交换机,队列等是否一同恢复
+            // };
+            // List<AmqpTcpEndpoint> p = new List<AmqpTcpEndpoint>();
+            // string[] HostNames = HostName.Split(',');
+            // foreach (string subHostName in HostNames)
+            // {
+            //     string[] subHostNameData = subHostName.Split(':');
+            //     p.Add(new AmqpTcpEndpoint(subHostNameData[0], int.Parse(subHostNameData[1])));
+            // }
+            // var conn = factory.CreateConnection(p);
+            // var channel = conn.CreateModel();
+            // channel.QueueDeclare(QueueName, true, false, false);
+            // channel.BasicPublish("", QueueName, null, Encoding.Default.GetBytes(content));
+            // channel.Dispose();
+            // conn.Dispose();
         }
         #endregion
 
@@ -109,14 +109,16 @@ namespace MySystem
         #endregion
 
         #region 单对单接收
-        public void StartReceive(string QueueName)
-        {
+        public static IConnection _connection;
+        public void CreateConn()
+        { 
             var factory = new ConnectionFactory()
             {
                 UserName = UserName,
                 Password = Password,
                 AutomaticRecoveryEnabled = true,  //如果connection挂掉是否重新连接
-                TopologyRecoveryEnabled = true  //连接恢复后,连接的交换机,队列等是否一同恢复
+                TopologyRecoveryEnabled = true,  //连接恢复后,连接的交换机,队列等是否一同恢复
+                RequestedHeartbeat = TimeSpan.FromMinutes(1),
             };
             List<AmqpTcpEndpoint> p = new List<AmqpTcpEndpoint>();
             string[] HostNames = HostName.Split(',');
@@ -125,17 +127,38 @@ namespace MySystem
                 string[] subHostNameData = subHostName.Split(':');
                 p.Add(new AmqpTcpEndpoint(subHostNameData[0], int.Parse(subHostNameData[1])));
             }
-            var conn = factory.CreateConnection(p);
-            var channel = conn.CreateModel();
+            _connection = factory.CreateConnection(p);
+        }
+        public void StartReceive(string QueueName)
+        {
+            if (_connection == null)
+            {
+                CreateConn();
+            }
+            else if (!_connection.IsOpen)
+            {
+                CreateConn();
+            }
+            var channel = _connection.CreateModel();
             channel.QueueDeclare(QueueName, true, false, false);
             EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
             consumer.Received += (a, e) =>
             {
-                string MsgContent = Encoding.Default.GetString(e.Body.ToArray());
-                if (QueueName == "PublicMainServer")
-                { 
+                string MsgContent = Encoding.Default.GetString(e.Body.ToArray());                
+                if (QueueName == "TimerStat")
+                {
                     JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
-                    ReceiveTaskService.Instance.Start(job);
+                    StatTimerService.Instance.Start(job);
+                }
+                else if (QueueName == "PosTradeStat")
+                {
+                    JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
+                    StatService.Instance.Start(job);
+                }
+                else if (QueueName == "SycnSpServer")
+                {
+                    JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
+                    SycnSpService.Instance.Start(job);
                 }
                 else if (QueueName == "CheckWeChatSign")
                 {
@@ -194,21 +217,11 @@ namespace MySystem
                 {
                     DeleteMySqlDataService.Instance.Start(MsgContent);
                 }
-                else if (QueueName == "SycnSpServer")
-                {
-                    JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
-                    SycnSpService.Instance.Start(job);
-                }
-                else if (QueueName == "TimerStat")
-                {
-                    JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
-                    StatTimerService.Instance.Start(job);
-                }
-                else if (QueueName == "PosTradeStat")
-                {
-                    JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
-                    StatService.Instance.Start(job);
-                }
+                // else if (QueueName == "PublicMainServer")
+                // { 
+                //     JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
+                //     ReceiveTaskService.Instance.Start(job);
+                // }
                 // else if (QueueName == "SycnTableData")
                 // {
                 //     JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);

+ 347 - 0
AppStart/RabbitMQClientV2.cs

@@ -0,0 +1,347 @@
+using Newtonsoft.Json;
+using RabbitMQ.Client;
+using RabbitMQ.Client.Events;
+using System;
+using System.Text;
+
+namespace MySystem
+{
+    class ConfigModel
+    {
+    }
+
+    public enum ExchangeTypeEnum
+    {
+        /// <summary>
+        /// 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
+        /// 很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
+        /// </summary>
+        fanout = 1,
+
+        /// <summary>
+        /// 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配
+        /// 。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,
+        /// 则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
+        /// </summary>
+        direct = 2,
+
+        /// <summary>
+        /// 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。
+        /// 符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。
+        /// 因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”
+        /// </summary>
+        topic = 3,
+
+        header = 4
+    }
+
+
+    /// <summary>
+    /// 数据被执行后的处理方式
+    /// </summary>
+    public enum ProcessingResultsEnum
+    {
+        /// <summary>
+        /// 处理成功
+        /// </summary>
+        Accept,
+
+        /// <summary>
+        /// 可以重试的错误
+        /// </summary>
+        Retry,
+
+        /// <summary>
+        /// 无需重试的错误
+        /// </summary>
+        Reject,
+    }
+
+    /// <summary>
+    /// 消息队列的配置信息
+    /// </summary>
+    public class RabbitMqConfigModel
+    {
+        #region host
+        /// <summary>
+        /// 服务器IP地址
+        /// </summary>
+        public string IP { get; set; }
+
+        /// <summary>
+        /// 服务器端口,默认是 5672
+        /// </summary>
+        public int Port { get; set; }
+
+        /// <summary>
+        /// 登录用户名
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 登录密码
+        /// </summary>
+        public string Password { get; set; }
+        /// <summary>
+        /// 虚拟主机名称
+        /// </summary>
+        public string VirtualHost { get; set; }
+        #endregion
+
+        #region Queue
+        /// <summary>
+        /// 队列名称
+        /// </summary>
+        public string QueueName { get; set; }
+
+        /// <summary>
+        /// 是否持久化该队列
+        /// </summary>
+        public bool DurableQueue { get; set; }
+        #endregion
+
+        #region exchange
+        /// <summary>
+        /// 路由名称
+        /// </summary>
+        public string ExchangeName { get; set; }
+
+        /// <summary>
+        /// 路由的类型枚举
+        /// </summary>
+        public ExchangeTypeEnum ExchangeType { get; set; }
+
+        /// <summary>
+        /// 路由的关键字
+        /// </summary>
+        public string RoutingKey { get; set; }
+
+        #endregion
+
+        #region message
+        /// <summary>
+        /// 是否持久化队列中的消息
+        /// </summary>
+        public bool DurableMessage { get; set; }
+        #endregion
+    }
+    /// <summary>
+    /// 基类
+    /// </summary>
+    public class BaseService
+    {
+
+        public static IConnection _connection;
+
+        /// <summary>
+        /// 服务器配置
+        /// </summary>
+        public RabbitMqConfigModel RabbitConfig { get; set; }
+
+
+        #region 构造函数
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="config"></param>
+        public BaseService(RabbitMqConfigModel config)
+        {
+            try
+            {
+                RabbitConfig = config;
+                CreateConn();
+            }
+            catch (Exception)
+            {
+                throw;
+            }
+        }
+        #endregion
+
+        #region 方法
+        #region 初始化
+        /// <summary>
+        /// 创建连接
+        /// </summary>
+        public void CreateConn()
+        {
+            ConnectionFactory cf = new ConnectionFactory();
+            cf.Port = RabbitConfig.Port; //服务器的端口
+            cf.Endpoint = new AmqpTcpEndpoint(new Uri("amqp://" + RabbitConfig.IP + "/")); //服务器ip
+            cf.UserName = RabbitConfig.UserName; //登录账户
+            cf.Password = RabbitConfig.Password; //登录账户
+            cf.VirtualHost = RabbitConfig.VirtualHost; //虚拟主机
+            cf.RequestedHeartbeat = TimeSpan.Parse("60"); //虚拟主机
+
+            _connection = cf.CreateConnection();
+        }
+        #endregion
+
+        #region 发送消息
+        /// <summary>
+        /// 发送消息,泛型
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        public bool Send<T>(T messageInfo, ref string errMsg)
+        {
+            if (messageInfo == null)
+            {
+                errMsg = "消息对象不能为空";
+                return false;
+            }
+            string value = JsonConvert.SerializeObject(messageInfo);
+            return Send(value, ref errMsg);
+        }
+        /// <summary>
+        /// 发送消息,string类型
+        /// </summary>
+        /// <param name="message"></param>
+        /// <param name="errMsg"></param>
+        /// <returns></returns>
+        public bool Send(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+            {
+                return false;
+            }
+            try
+            {
+                if (!_connection.IsOpen)
+                {
+                    CreateConn();
+                }
+                using (var channel = _connection.CreateModel())
+                {
+                    //推送消息
+                    byte[] bytes = Encoding.UTF8.GetBytes(message);
+
+                    IBasicProperties properties = channel.CreateBasicProperties();
+                    properties.DeliveryMode = Convert.ToByte(RabbitConfig.DurableMessage ? 2 : 1); //支持可持久化数据
+
+                    if (string.IsNullOrEmpty(RabbitConfig.ExchangeName))
+                    {
+                        //使用自定义的路由
+                        channel.ExchangeDeclare(RabbitConfig.ExchangeName, RabbitConfig.ExchangeType.ToString(), RabbitConfig.DurableMessage, false, null);
+                        channel.BasicPublish("", RabbitConfig.QueueName, properties, bytes);
+                    }
+                    else
+                    {
+                        //申明消息队列,且为可持久化的,如果队列的名称不存在,系统会自动创建,有的话不会覆盖
+                        channel.QueueDeclare(RabbitConfig.QueueName, RabbitConfig.DurableQueue, false, false, null);
+                        channel.BasicPublish(RabbitConfig.ExchangeName, RabbitConfig.RoutingKey, properties, bytes);
+                    }
+                    return true;
+                }
+
+            }
+            catch (Exception ex)
+            {
+                Library.function.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "发送MQ队列消息异常");
+                return false;
+            }
+        }
+        #endregion
+    }
+    public class RabbitBasicService : BaseService
+    {
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="config"></param>
+        public RabbitBasicService(RabbitMqConfigModel config)
+        : base(config)
+        { }
+
+
+        /// <summary>
+        /// 接受消息,使用Action进行处理
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="method"></param>
+        public void Receive()
+        {
+            try
+            {
+                using (var channel = _connection.CreateModel())
+                {
+                    //申明队列
+                    channel.QueueDeclare(RabbitConfig.QueueName, RabbitConfig.DurableQueue, false, false, null);
+                    //使用路由
+                    if (!string.IsNullOrEmpty(RabbitConfig.ExchangeName))
+                    {
+                        //申明路由
+                        channel.ExchangeDeclare(RabbitConfig.ExchangeName, RabbitConfig.ExchangeType.ToString(), RabbitConfig.DurableQueue);
+                        //队列和交换机绑定
+                        channel.QueueBind(RabbitConfig.QueueName, RabbitConfig.ExchangeName, RabbitConfig.RoutingKey);
+                    }
+
+                    //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
+                    channel.BasicQos(0, 1, false);
+                    //在队列上定义一个消费者
+                    // var customer = new QueueingBasicConsumer(channel);
+                    var customer = new EventingBasicConsumer(channel);
+                    EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
+                    consumer.Received += (a, e) =>
+                    {
+                        string MsgContent = Encoding.Default.GetString(e.Body.ToArray());
+                        
+                        channel.BasicAck(e.DeliveryTag, true); //收到回复后,RabbitMQ会直接在队列中删除这条消息
+                    };
+                    //消费队列,并设置应答模式为程序主动应答
+                    channel.BasicConsume(RabbitConfig.QueueName, false, customer);
+
+                    // while (true)//timer
+                    // {
+                    //     //阻塞函数,获取队列中的消息
+                    //     ProcessingResultsEnum processingResult = ProcessingResultsEnum.Retry;
+                    //     ulong deliveryTag = 0;
+                    //     try
+                    //     {
+                    //         //Thread.Sleep(10);
+
+                    //         var ea = customer.Queue.Dequeue();
+                    //         deliveryTag = ea.DeliveryTag;
+                    //         byte[] bytes = ea.Body;
+                    //         string body = Encoding.UTF8.GetString(bytes);
+                    //         // T info = JsonConvert.DeserializeObject<T>(body);
+                    //         method(body);
+                    //         processingResult = ProcessingResultsEnum.Accept;
+                    //     }
+                    //     catch (Exception ex)
+                    //     {
+                    //         processingResult = ProcessingResultsEnum.Reject; //系统无法处理的错误
+                    //     }
+                    //     finally
+                    //     {
+                    //         switch (processingResult)
+                    //         {
+                    //             case ProcessingResultsEnum.Accept:
+                    //                 //回复确认处理成功
+                    //                 channel.BasicAck(deliveryTag,
+                    //                 false);//处理单挑信息
+                    //                 break;
+                    //             case ProcessingResultsEnum.Retry:
+                    //                 //发生错误了,但是还可以重新提交给队列重新分配
+                    //                 channel.BasicNack(deliveryTag, false, true);
+                    //                 break;
+                    //             case ProcessingResultsEnum.Reject:
+                    //                 //发生严重错误,无法继续进行,这种情况应该写日志或者是发送消息通知管理员
+                    //                 channel.BasicNack(deliveryTag, false, false);
+                    //                 //写日志
+                    //                 break;
+                    //         }
+                    //     }
+                    // }
+
+                }
+            }
+            catch (Exception ex)
+            {
+            }
+        }
+    }
+    #endregion
+}

+ 35 - 0
AppStart/Timer/AlipayPayBack2Timer.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+using Microsoft.Extensions.Hosting;
+using MySystem;
+using MySystem.Models;
+using Library;
+using LitJson;
+
+public class AlipayPayBack2Timer : BackgroundService
+{
+    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+    {
+        while (!stoppingToken.IsCancellationRequested)
+        {
+            int timespan = 10000;
+            await Task.Delay(timespan).ContinueWith(tsk =>
+            {
+                DoWorks();
+            });
+        }
+    }
+
+    private void DoWorks()
+    {
+        string MsgContent = RedisDbconn.Instance.RPop<string>("AlipayPayBack2");
+        if (!string.IsNullOrEmpty(MsgContent))
+        {
+            JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
+            AlipayPayBack2Service.Instance.Start(job);
+        }
+    }
+}

+ 35 - 0
AppStart/Timer/PosTradeStatTimer.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+using Microsoft.Extensions.Hosting;
+using MySystem;
+using MySystem.Models;
+using Library;
+using LitJson;
+
+public class PosTradeStatTimer : BackgroundService
+{
+    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+    {
+        while (!stoppingToken.IsCancellationRequested)
+        {
+            int timespan = 10000;
+            await Task.Delay(timespan).ContinueWith(tsk =>
+            {
+                DoWorks();
+            });
+        }
+    }
+
+    private void DoWorks()
+    {
+        string MsgContent = RedisDbconn.Instance.RPop<string>("PosTradeStat");
+        if (!string.IsNullOrEmpty(MsgContent))
+        {
+            JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
+            StatService.Instance.Start(job);
+        }
+    }
+}

+ 35 - 0
AppStart/Timer/SycnSpTimer.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+using Microsoft.Extensions.Hosting;
+using MySystem;
+using MySystem.Models;
+using Library;
+using LitJson;
+
+public class SycnSpTimer : BackgroundService
+{
+    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+    {
+        while (!stoppingToken.IsCancellationRequested)
+        {
+            int timespan = 10;
+            await Task.Delay(timespan).ContinueWith(tsk =>
+            {
+                DoWorks();
+            });
+        }
+    }
+
+    private void DoWorks()
+    {
+        string MsgContent = RedisDbconn.Instance.RPop<string>("SycnSpServer");
+        if (!string.IsNullOrEmpty(MsgContent))
+        {
+            JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
+            SycnSpService.Instance.Start(job);
+        }
+    }
+}

+ 35 - 0
AppStart/Timer/TimerStatTimer.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+using Microsoft.Extensions.Hosting;
+using MySystem;
+using MySystem.Models;
+using Library;
+using LitJson;
+
+public class TimerStatTimer : BackgroundService
+{
+    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+    {
+        while (!stoppingToken.IsCancellationRequested)
+        {
+            int timespan = 10000;
+            await Task.Delay(timespan).ContinueWith(tsk =>
+            {
+                DoWorks();
+            });
+        }
+    }
+
+    private void DoWorks()
+    {
+        string MsgContent = RedisDbconn.Instance.RPop<string>("TimerStat");
+        if (!string.IsNullOrEmpty(MsgContent))
+        {
+            JobMqMsg job = Newtonsoft.Json.JsonConvert.DeserializeObject<JobMqMsg>(MsgContent);
+            StatTimerService.Instance.Start(job);
+        }
+    }
+}

+ 14 - 2
Controllers/HomeController.cs

@@ -56,9 +56,15 @@ namespace MySystem.Controllers
             return "ok";
         }
 
-        public string test()
+        public string cleartrade()
+        {
+            StatService.Instance.clear();
+            return "ok";
+        }
+
+        public string stattrade(string d)
         {
-            StatService.Instance.dosomething("2022-03-13");
+            StatService.Instance.dosomething2(d);
             return "ok";
         }
 
@@ -131,5 +137,11 @@ namespace MySystem.Controllers
             db.Dispose();
         }
 
+
+        public string test()
+        {
+            // StatService.Instance.dosomething1("2022-03-14");
+            return "ok";
+        }
     }
 }

+ 11 - 0
Models/MachineForMerNo.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Models
+{
+    public partial class MachineForMerNo
+    {
+        public string MerNo { get; set; }
+        public int SnId { get; set; }
+    }
+}

+ 1 - 1
Models/PosMachinesTwo.cs

@@ -36,7 +36,7 @@ namespace MySystem.Models
         public int BuyUserId { get; set; }
         public DateTime? TransferTime { get; set; }
         public string PosSn { get; set; }
-        public ulong IsPurchase { get; set; }
+        public int IsPurchase { get; set; }
         public int UserId { get; set; }
         public DateTime? BindingTime { get; set; }
         public DateTime? ActivationTime { get; set; }

+ 15 - 0
Models/TmpUser.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Models
+{
+    public partial class TmpUser
+    {
+        public string Id { get; set; }
+        public string MakerCode { get; set; }
+        public string Mobile { get; set; }
+        public string ReferenceCode { get; set; }
+        public string ReferenceMobile { get; set; }
+        public string ParentNav { get; set; }
+    }
+}

+ 15 - 3
Models/WebCMSEntities.cs

@@ -49,6 +49,7 @@ namespace MySystem.Models
         public virtual DbSet<MachineApplyDetail> MachineApplyDetail { get; set; }
         public virtual DbSet<MachineChange> MachineChange { get; set; }
         public virtual DbSet<MachineChangeDetail> MachineChangeDetail { get; set; }
+        public virtual DbSet<MachineForMerNo> MachineForMerNo { get; set; }
         public virtual DbSet<MachineForQrCode> MachineForQrCode { get; set; }
         public virtual DbSet<MachineForSnNo> MachineForSnNo { get; set; }
         public virtual DbSet<MachineRenew> MachineRenew { get; set; }
@@ -2850,6 +2851,19 @@ namespace MySystem.Models
                 entity.Property(e => e.Version).HasColumnType("int(11)");
             });
 
+            modelBuilder.Entity<MachineForMerNo>(entity =>
+            {
+                entity.HasKey(e => e.MerNo)
+                    .HasName("PRIMARY");
+
+                entity.Property(e => e.MerNo)
+                    .HasColumnType("varchar(50)")
+                    .HasCharSet("utf8")
+                    .HasCollation("utf8_general_ci");
+
+                entity.Property(e => e.SnId).HasColumnType("int(11)");
+            });
+
             modelBuilder.Entity<MachineForQrCode>(entity =>
             {
                 entity.HasKey(e => e.DataId)
@@ -6321,9 +6335,7 @@ namespace MySystem.Models
                     .HasCharSet("utf8")
                     .HasCollation("utf8_general_ci");
 
-                entity.Property(e => e.IsPurchase)
-                    .HasColumnType("bit(1)")
-                    .HasDefaultValueSql("b'0'");
+                entity.Property(e => e.IsPurchase).HasColumnType("int(11)");
 
                 entity.Property(e => e.IsVip)
                     .HasColumnType("bit(1)")

+ 11 - 0
PxcModels/MachineForMerNo.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.PxcModels
+{
+    public partial class MachineForMerNo
+    {
+        public string MerNo { get; set; }
+        public int SnId { get; set; }
+    }
+}

+ 1 - 1
PxcModels/PosMachinesTwo.cs

@@ -36,7 +36,7 @@ namespace MySystem.PxcModels
         public int BuyUserId { get; set; }
         public DateTime? TransferTime { get; set; }
         public string PosSn { get; set; }
-        public ulong IsPurchase { get; set; }
+        public int IsPurchase { get; set; }
         public int UserId { get; set; }
         public DateTime? BindingTime { get; set; }
         public DateTime? ActivationTime { get; set; }

+ 15 - 3
PxcModels/WebCMSEntities.cs

@@ -49,6 +49,7 @@ namespace MySystem.PxcModels
         public virtual DbSet<MachineApplyDetail> MachineApplyDetail { get; set; }
         public virtual DbSet<MachineChange> MachineChange { get; set; }
         public virtual DbSet<MachineChangeDetail> MachineChangeDetail { get; set; }
+        public virtual DbSet<MachineForMerNo> MachineForMerNo { get; set; }
         public virtual DbSet<MachineForQrCode> MachineForQrCode { get; set; }
         public virtual DbSet<MachineForSnNo> MachineForSnNo { get; set; }
         public virtual DbSet<MachineRenew> MachineRenew { get; set; }
@@ -2850,6 +2851,19 @@ namespace MySystem.PxcModels
                 entity.Property(e => e.Version).HasColumnType("int(11)");
             });
 
+            modelBuilder.Entity<MachineForMerNo>(entity =>
+            {
+                entity.HasKey(e => e.MerNo)
+                    .HasName("PRIMARY");
+
+                entity.Property(e => e.MerNo)
+                    .HasColumnType("varchar(50)")
+                    .HasCharSet("utf8")
+                    .HasCollation("utf8_general_ci");
+
+                entity.Property(e => e.SnId).HasColumnType("int(11)");
+            });
+
             modelBuilder.Entity<MachineForQrCode>(entity =>
             {
                 entity.HasKey(e => e.DataId)
@@ -6321,9 +6335,7 @@ namespace MySystem.PxcModels
                     .HasCharSet("utf8")
                     .HasCollation("utf8_general_ci");
 
-                entity.Property(e => e.IsPurchase)
-                    .HasColumnType("bit(1)")
-                    .HasDefaultValueSql("b'0'");
+                entity.Property(e => e.IsPurchase).HasColumnType("int(11)");
 
                 entity.Property(e => e.IsVip)
                     .HasColumnType("bit(1)")

+ 16 - 16
Startup.cs

@@ -88,6 +88,11 @@ namespace MySystem
             // services.AddHostedService<TradeService>();
             // services.AddHostedService<TeamTopService>();
             // services.AddHostedService<PopService>();
+            
+            services.AddHostedService<TimerStatTimer>(); //实时统计创客、激活商户数
+            services.AddHostedService<PosTradeStatTimer>(); // 统计头天的交易额、商户型创客、激活奖励、开机奖励
+            services.AddHostedService<SycnSpTimer>(); //同步SP数据
+            services.AddHostedService<AlipayPayBack2Timer>(); //支付宝回调处理
 
             //services.AddHttpContextAccessor();
 
@@ -212,22 +217,17 @@ namespace MySystem
             // app.UseMiddleware<GraphQLMiddleware>();
 
             //当前必须打开的
-            // RabbitMQClient.Instance.ListenSendMsg();
-            RabbitMQClient.Instance.StartReceive("MerchantConfirmList");
-            RabbitMQClient.Instance.StartReceive("MakeReferenceQrCode");
-            RabbitMQClient.Instance.StartReceive("CheckWeChatSign");
-            RabbitMQClient.Instance.StartReceive("CheckAlipaySign");
-            RabbitMQClient.Instance.StartReceive("PublicMainServer");
-            RabbitMQClient.Instance.StartReceive("DeleteMySqlData");
-            RabbitMQClient.Instance.StartReceive("WeChatPayBack");
-            RabbitMQClient.Instance.StartReceive("AlipayPayBack");
-            RabbitMQClient.Instance.StartReceive("AlipayPayBack2");
-            // RabbitMQClient.Instance.StartReceive("PosTradeStat");
-            RabbitMQClient.Instance.StartReceive("TimerStat");
-            RabbitMQClient.Instance.StartReceive("ConsumerOrdersReturnDo");
-            RabbitMQClient.Instance.StartReceive("ConsumerOrdersReturnStat");
-            RabbitMQClient.Instance.StartReceive("ConsumerOrdersStat");
-            RabbitMQClient.Instance.StartReceive("SycnSpServer");
+            // RabbitMQClient.Instance.StartReceive("MerchantConfirmList");
+            // RabbitMQClient.Instance.StartReceive("MakeReferenceQrCode");
+            // RabbitMQClient.Instance.StartReceive("CheckWeChatSign");
+            // RabbitMQClient.Instance.StartReceive("CheckAlipaySign");
+            // RabbitMQClient.Instance.StartReceive("DeleteMySqlData");
+            // RabbitMQClient.Instance.StartReceive("WeChatPayBack");
+            // RabbitMQClient.Instance.StartReceive("AlipayPayBack");
+            // RabbitMQClient.Instance.StartReceive("ConsumerOrdersReturnDo");
+            // RabbitMQClient.Instance.StartReceive("ConsumerOrdersReturnStat");
+            // RabbitMQClient.Instance.StartReceive("ConsumerOrdersStat");
+            // RabbitMQClient.Instance.StartReceive("PublicMainServer");
 
 
             // 备用,暂时不放开的

BIN
bin/Debug/netcoreapp3.0/MySystem.dll


BIN
bin/Debug/netcoreapp3.0/MySystem.pdb


BIN
bin/Debug/netcoreapp3.0/bsserver_com/static/ReferenceQrCode/0a247f953a81c29a.png


+ 20 - 0
bin/Debug/netcoreapp3.0/log/SycnSpServer监控/2022/3/15/content.log

@@ -0,0 +1,20 @@
+{"Id":22,"Status":0,"Msg":null,"Note":"激活数据投产","OrderString":"Sp:active:SpServer","BrandInfo":null,"StartId":0,"EndId":0,"FinishId":16215216,"TableType":0}
+Sp:active:SpServer
+ok
+Kind:active
+finish:active
+
+
+
+
+{"Id":21,"Status":0,"Msg":null,"Note":"绑定数据投产","OrderString":"Sp:bind:SpServer","BrandInfo":null,"StartId":0,"EndId":0,"FinishId":16215217,"TableType":0}
+Sp:bind:SpServer
+ok
+Kind:bind
+1
+2
+3:count:5
+{"Id":24,"Status":0,"Msg":null,"Note":"商户数据投产","OrderString":"Sp:merchant:SpServer","BrandInfo":null,"StartId":0,"EndId":0,"FinishId":16215234,"TableType":0}
+Sp:merchant:SpServer
+ok
+Kind:merchant

+ 5 - 0
bin/Debug/netcoreapp3.0/log/public_service/2022/3/15/content.log

@@ -0,0 +1,5 @@
+03/15/2022 15:48:20:System.IO.FileNotFoundException: /Users/Shared/Previously Relocated Items/Security/MyDisk/我的/项目/myprogram_vs2019/KeXiaoShuang/MainServer/bin/Debug/netcoreapp3.0//static/QrCodeBg.png
+   at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
+   at System.Drawing.Image.FromFile(String filename)
+   at MySystem.MakeReferenceQrCodeService.MakeQRCode(String sourcepath, String qrcode, String resultpath, Users us) in /Users/Shared/Previously Relocated Items/Security/MyDisk/我的/项目/myprogram_vs2019/KeXiaoShuang/MainServer/AppStart/Helper/MakeReferenceQrCodeService.cs:line 62
+   at MySystem.MakeReferenceQrCodeService.Start(String uid) in /Users/Shared/Previously Relocated Items/Security/MyDisk/我的/项目/myprogram_vs2019/KeXiaoShuang/MainServer/AppStart/Helper/MakeReferenceQrCodeService.cs:line 32

+ 4 - 0
bin/Debug/netcoreapp3.0/log/sycn_sp_server_err/2022/3/15/content.log

@@ -0,0 +1,4 @@
+03/15/2022 15:48:34:System.NullReferenceException: Object reference not set to an instance of an object.
+   at MySystem.SycnSpBindService.Start() in /Users/Shared/Previously Relocated Items/Security/MyDisk/我的/项目/myprogram_vs2019/KeXiaoShuang/MainServer/AppStart/Helper/SycnSpServer/SycnSpBindService.cs:line 52
+   at MySystem.SycnSpService.dosomething(String Kind) in /Users/Shared/Previously Relocated Items/Security/MyDisk/我的/项目/myprogram_vs2019/KeXiaoShuang/MainServer/AppStart/Helper/SycnSpServer/SycnSpService.cs:line 46
+   at MySystem.SycnSpService.Start(JobMqMsg jobInfo) in /Users/Shared/Previously Relocated Items/Security/MyDisk/我的/项目/myprogram_vs2019/KeXiaoShuang/MainServer/AppStart/Helper/SycnSpServer/SycnSpService.cs:line 28

+ 12 - 0
bin/Debug/netcoreapp3.0/log/服务商平台查询申请单状态API/2022/3/15/content.log

@@ -0,0 +1,12 @@
+{"applyment_id":2000002272727120,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031113503858323834","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGR7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc21Wbjljb3JlUjIxcXh5bWh5Y08AAgShFS9iAwQAjScA"}
+{"applyment_id":2000002273485321,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031318061258279293","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFa7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydGpibDhsb3JlUjIxcXh5bWh5Y3YAAgShFS9iAwQAjScA"}
+{"applyment_id":2000002272727120,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031113503858323834","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGR7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc21Wbjljb3JlUjIxcXh5bWh5Y08AAgShFS9iAwQAjScA"}
+{"applyment_id":2000002273485321,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031318061258279293","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFa7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydGpibDhsb3JlUjIxcXh5bWh5Y3YAAgShFS9iAwQAjScA"}
+{"applyment_id":2000002272727120,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031113503858323834","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGR7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc21Wbjljb3JlUjIxcXh5bWh5Y08AAgShFS9iAwQAjScA"}
+{"applyment_id":2000002273485321,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031318061258279293","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFa7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydGpibDhsb3JlUjIxcXh5bWh5Y3YAAgShFS9iAwQAjScA"}
+{"applyment_id":2000002272727120,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031113503858323834","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGR7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc21Wbjljb3JlUjIxcXh5bWh5Y08AAgShFS9iAwQAjScA"}
+{"applyment_id":2000002273485321,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031318061258279293","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFa7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydGpibDhsb3JlUjIxcXh5bWh5Y3YAAgShFS9iAwQAjScA"}
+{"applyment_id":2000002272727120,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031113503858323834","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGR7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc21Wbjljb3JlUjIxcXh5bWh5Y08AAgShFS9iAwQAjScA"}
+{"applyment_id":2000002273485321,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031318061258279293","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFa7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydGpibDhsb3JlUjIxcXh5bWh5Y3YAAgShFS9iAwQAjScA"}
+{"applyment_id":2000002272727120,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031113503858323834","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQGR7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc21Wbjljb3JlUjIxcXh5bWh5Y08AAgShFS9iAwQAjScA"}
+{"applyment_id":2000002273485321,"applyment_state":"APPLYMENT_STATE_AUDITING","applyment_state_msg":"1、申请单正在审核中;2、可让超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤","audit_detail":[],"business_code":"KXS2022031318061258279293","sign_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFa7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydGpibDhsb3JlUjIxcXh5bWh5Y3YAAgShFS9iAwQAjScA"}

BIN
bin/release/netcoreapp3.0/MySystem.dll


BIN
bin/release/netcoreapp3.0/MySystem.pdb


BIN
obj/Debug/netcoreapp3.0/MySystem.dll


BIN
obj/Debug/netcoreapp3.0/MySystem.pdb


BIN
obj/release/netcoreapp3.0/MySystem.csprojAssemblyReference.cache


BIN
obj/release/netcoreapp3.0/MySystem.dll


BIN
obj/release/netcoreapp3.0/MySystem.pdb