瀏覽代碼

机具购券奖励逻辑单独封装

lcl 1 年之前
父節點
當前提交
7c08f74441

二進制
.DS_Store


+ 58 - 57
AppStart/Helper/LeaderCompPrizeHelper.cs

@@ -49,8 +49,8 @@ namespace MySystem
 
         public void Ready(string curMonth)
         {
-            CustomerSqlConn.op("delete from LeaderCompTradeStat;delete from LeaderCompTmp;delete from LeaderCompPrize;delete from LeaderCompAddTrade;", MysqlConn.SqlConnStr);
-            doSomething(curMonth, curMonth);
+            // CustomerSqlConn.op("delete from LeaderCompTradeStat;delete from LeaderCompTmp;delete from LeaderCompPrize;delete from LeaderCompAddTrade;", MysqlConn.SqlConnStr);
+            // doSomething(curMonth, curMonth);
             SendPrize(curMonth, curMonth);
         }
 
@@ -70,56 +70,56 @@ namespace MySystem
 
                 
                 //创客团队交易额
-                string sql = "";
-                int num = 0;
-                DataTable dt = CustomerSqlConn.dtable("select UserId,sum(HelpNonDirectTradeAmt + NotHelpNonDirectTradeAmt + ProfitNonDirectTradeAmt + HelpNonDirectDebitTradeAmt + NotHelpNonDirectDebitTradeAmt + ProfitNonDirectDebitTradeAmt) Amt from TradeDaySummary where Id>=15055757 and TradeMonth='" + month + "' and SeoTitle='team' and UserId>0 group by UserId", MysqlConn.ReadSqlConnStr);
-                foreach(DataRow dr in dt.Rows)
-                {
-                    int UserId = int.Parse(dr["UserId"].ToString());
-                    decimal TradeAmount = decimal.Parse(dr["Amt"].ToString());
-                    //码牌团队交易额(直联)
-                    bool check = mpmaindb.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
-                    if (check)
-                    {
-                        TradeAmount += mpmaindb.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount) * 4;
-                    }
-                    check = mpmaindb.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
-                    if (check)
-                    {
-                        TradeAmount += mpmaindb.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount);
-                    }
-                    //码牌团队交易额(银联)
-                    check = mpmaindb2.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
-                    if (check)
-                    {
-                        TradeAmount += mpmaindb2.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount) * 4;
-                    }
-                    check = mpmaindb2.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
-                    if (check)
-                    {
-                        TradeAmount += mpmaindb2.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount);
-                    }
-                    //广电卡扶持期按1万/张计入职级
-                    check = db.UserTradeMonthSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.BrandId == 14);
-                    if (check)
-                    {
-                        TradeAmount += db.UserTradeMonthSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.BrandId == 14).Sum(m => m.ActiveBuddyMerStatus) * 10000;
-                    }
-                    sql += "insert into LeaderCompTradeStat (CreateDate,UserId,StatMonth,TradeAmount) values (now(), " + UserId + ", '" + month + "-" + checkMonth + "', " + TradeAmount + ");\n";
-                    num += 1;
-                    if(num >= 200)
-                    {
-                        CustomerSqlConn.op(sql, MysqlConn.SqlConnStr);
-                        sql = "";
-                        num = 0;
-                    }
-                }
+                // string sql = "";
+                // int num = 0;
+                // DataTable dt = CustomerSqlConn.dtable("select UserId,sum(HelpNonDirectTradeAmt + NotHelpNonDirectTradeAmt + ProfitNonDirectTradeAmt + HelpNonDirectDebitTradeAmt + NotHelpNonDirectDebitTradeAmt + ProfitNonDirectDebitTradeAmt) Amt from TradeDaySummary where Id>=15055757 and TradeMonth='" + month + "' and SeoTitle='team' and UserId>0 group by UserId", MysqlConn.ReadSqlConnStr);
+                // foreach(DataRow dr in dt.Rows)
+                // {
+                //     int UserId = int.Parse(dr["UserId"].ToString());
+                //     decimal TradeAmount = decimal.Parse(dr["Amt"].ToString());
+                //     //码牌团队交易额(直联)
+                //     bool check = mpmaindb.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
+                //     if (check)
+                //     {
+                //         TradeAmount += mpmaindb.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount) * 4;
+                //     }
+                //     check = mpmaindb.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
+                //     if (check)
+                //     {
+                //         TradeAmount += mpmaindb.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount);
+                //     }
+                //     //码牌团队交易额(银联)
+                //     check = mpmaindb2.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
+                //     if (check)
+                //     {
+                //         TradeAmount += mpmaindb2.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount) * 4;
+                //     }
+                //     check = mpmaindb2.UserAmountSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1);
+                //     if (check)
+                //     {
+                //         TradeAmount += mpmaindb2.UserAmountSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.IsAct == 1).Sum(m => m.TotalAmount);
+                //     }
+                //     //广电卡扶持期按1万/张计入职级
+                //     check = db.UserTradeMonthSummary.Any(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.BrandId == 14);
+                //     if (check)
+                //     {
+                //         TradeAmount += db.UserTradeMonthSummary.Where(m => m.UserId == UserId && m.TradeMonth == month && m.SeoTitle == "team" && m.BrandId == 14).Sum(m => m.ActiveBuddyMerStatus) * 10000;
+                //     }
+                //     sql += "insert into LeaderCompTradeStat (CreateDate,UserId,StatMonth,TradeAmount) values (now(), " + UserId + ", '" + month + "-" + checkMonth + "', " + TradeAmount + ");\n";
+                //     num += 1;
+                //     if(num >= 200)
+                //     {
+                //         CustomerSqlConn.op(sql, MysqlConn.SqlConnStr);
+                //         sql = "";
+                //         num = 0;
+                //     }
+                // }
 
-                if(!string.IsNullOrEmpty(sql))
-                {
-                    CustomerSqlConn.op(sql, MysqlConn.SqlConnStr);
-                }
-                CustomerSqlConn.op("update LeaderCompTradeStat leader set ParentUserId=case when (select ParentUserId from Users where Id=leader.UserId) is null then 0 else (select ParentUserId from Users where Id=leader.UserId) end,ParentNav=(select ParentNav from Users where Id=leader.UserId) where StatMonth='" + MonthString + "' and UserId>1", MysqlConn.SqlConnStr);
+                // if(!string.IsNullOrEmpty(sql))
+                // {
+                //     CustomerSqlConn.op(sql, MysqlConn.SqlConnStr);
+                // }
+                // CustomerSqlConn.op("update LeaderCompTradeStat leader set ParentUserId=case when (select ParentUserId from Users where Id=leader.UserId) is null then 0 else (select ParentUserId from Users where Id=leader.UserId) end,ParentNav=(select ParentNav from Users where Id=leader.UserId) where StatMonth='" + MonthString + "' and UserId>1", MysqlConn.SqlConnStr);
 
                 function.WriteLog("start-----" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), "领导人达标奖励日志");
 
@@ -198,11 +198,12 @@ namespace MySystem
         {
             string MonthFlag = month + "-" + checkDate;
             WebCMSEntities db = new WebCMSEntities();
-            DataTable dt = CustomerSqlConn.dtable("select ParentUserId,count(1) from LeaderCompTmp where SUBSTR(EveryMonthData,1,1)='1' GROUP BY ParentUserId", MysqlConn.SqlConnStr);
+            DataTable dt = CustomerSqlConn.dtable("select ParentUserId,ParentNav,count(1) from LeaderCompTmp where SUBSTR(EveryMonthData,1,1)='1' GROUP BY ParentUserId,ParentNav", MysqlConn.SqlConnStr);
             foreach(DataRow dr in dt.Rows)
             {
                 int ParentUserId = int.Parse(function.CheckInt(dr["ParentUserId"].ToString()));
-                int Count = int.Parse(function.CheckInt(dr[1].ToString()));
+                string ParentNav = dr["ParentNav"].ToString();
+                int Count = int.Parse(function.CheckInt(dr[2].ToString()));
                 LeaderCompPrize edit = db.LeaderCompPrize.FirstOrDefault(m => m.StatMonth == MonthFlag && m.UserId == ParentUserId);
                 if(edit == null)
                 {
@@ -215,16 +216,16 @@ namespace MySystem
                     db.SaveChanges();
                 }
                 edit.DirectCount = Count; //达标市场
-                DataTable dtsub = CustomerSqlConn.dtable("select ParentUserId,count(1) from LeaderCompTmp where ParentNav like '%," + ParentUserId + ",%' and ParentUserId!=" + ParentUserId + " and ParentUserId in (select Id from Users where ParentUserId=" + ParentUserId + ") and SUBSTR(EveryMonthData,2,1)='2' group by ParentUserId", MysqlConn.SqlConnStr);
+                DataTable dtsub = CustomerSqlConn.dtable("select SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(ParentNav, '" + ParentNav + "', ''),',',2),',',-1),count(1) from LeaderCompTmp where ParentUserId!=" + ParentUserId + " and ParentNav like '%," + ParentUserId + ",%' and SUBSTR(EveryMonthData,2,1)='2' group by SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(ParentNav, '" + ParentNav + "', ''),',',2),',',-1)", MysqlConn.SqlConnStr);
                 foreach(DataRow drsub in dtsub.Rows)
-                {                    
-                    int SubCount = int.Parse(function.CheckInt(dr[1].ToString()));
+                {
+                    int SubCount = int.Parse(function.CheckInt(drsub[1].ToString()));
                     edit.NotDirectCount += SubCount; //深度达标总数
                     if(SubCount > Count)
                     {
                         SubCount = Count;
                     }
-                    edit.SecDirectCount = SubCount; //深度达标计奖数
+                    edit.SecDirectCount += SubCount; //深度达标计奖数
                 }
                 edit.CompPrize = edit.SecDirectCount * 500;
                 db.SaveChanges();

+ 536 - 0
AppStart/Helper/PosCouponPrize/PosCouponPrizeService.cs

@@ -0,0 +1,536 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Data;
+using System.Threading;
+using MySystem.PxcModels;
+using Library;
+using LitJson;
+
+namespace MySystem
+{
+    public class PosCouponPrizeService
+    {
+        public readonly static PosCouponPrizeService Instance = new PosCouponPrizeService();
+        private PosCouponPrizeService()
+        { }
+
+
+        public void Start()
+        {
+            Thread th = new Thread(ready);
+            th.IsBackground = true;
+            th.Start();
+        }
+        
+        private void ready()
+        { 
+            bool op = true;
+            while (op)
+            {
+                string content = RedisDbconn.Instance.RPop<string>("PosCouponPrizeQueue");
+                if (!string.IsNullOrEmpty(content))
+                {
+                    try
+                    {
+                        dosomething(int.Parse(function.CheckInt(content)));
+                    }
+                    catch(Exception ex)
+                    {
+                        function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "商城下单机具券发奖异常");
+                    }
+                }
+                else
+                {
+                    Thread.Sleep(2000);
+                }
+            }
+        }
+
+        private void dosomething(int OrderId)
+        { 
+            WebCMSEntities db = new WebCMSEntities();
+            OpModels.WebCMSEntities opdb = new OpModels.WebCMSEntities();
+            Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId);
+            if(order != null)
+            {
+                List<int> ChkIds = new List<int>(); //机具券商品Id集合
+                ChkIds.Add(10);
+                ChkIds.Add(12);
+                ChkIds.Add(77);
+                ChkIds.Add(78);
+                ChkIds.Add(79);
+                //判断是否是指定商品
+                if(ChkIds.Contains(order.ProductId))
+                {
+                    int Kind = 0;
+                    if (order.ProductId == 10)
+                    {
+                        Kind = 1;
+                    }
+                    else if (order.ProductId == 11)
+                    {
+                        Kind = 2;
+                    }
+                    int CouponCount = 0;
+                    if(Kind == 1)
+                    {
+                        CouponCount = 3 * order.BuyCount;
+                    }
+                    else if(Kind == 2)
+                    {
+                        CouponCount = 2 * order.BuyCount;
+                    }
+
+                    UserRankItem orderUser = GetUserLevel(db, order.UserId);
+                    string ParentNav = orderUser.ParentNav + "," + orderUser.Id + ",";
+                    string[] ParentNavList = ParentNav.Trim(',').Replace(",,", ",").Split(',');
+                    Array.Reverse(ParentNavList);
+                    int index = 0;
+                    bool DirectPrizeFlag = false; //推荐奖励发放标识
+                    bool BuyPrizeFlag = false; //购机奖励发放标识
+                    decimal BuyPrize = 0; //购机奖励
+                    foreach(string ParentId in ParentNavList)
+                    {
+                        UserRankItem parentUser = GetUserLevel(db, int.Parse(ParentId));
+                        index += 1;
+                        if(index == 1 && (orderUser.LeaderLevel > 0 || orderUser.OperateLevel > 0) && !DirectPrizeFlag)
+                        {
+                            DirectPrize(db, order.Id, order.UserId, order.BuyCount);
+                            DirectPrizeFlag = true;
+                        }
+                        if(index > 1)
+                        {
+                            if(Utils.Instance.IsStandardUser(parentUser.Id) && !DirectPrizeFlag)
+                            {
+                                DirectPrize(db, order.Id, parentUser.Id, order.BuyCount);
+                                DirectPrizeFlag = true;
+                            }
+                        }
+                        if(parentUser.OperateLevel > 0 && CheckOpReserve(opdb, order.BuyCount, parentUser.Id) && !BuyPrizeFlag)
+                        {
+                            //购机奖
+                            decimal CurBuyPrize = GetBuyPrize(parentUser);
+                            OpAccount(db, order.Id, parentUser.Id, CurBuyPrize - BuyPrize, order.BuyCount);
+                            BuyPrizeFlag = true;
+                            BuyPrize = CurBuyPrize;
+
+                            //扣减备用金
+                            OperateAmountChange(opdb, parentUser.Id, GetWithdrawMoney(parentUser) * order.BuyCount, 2, 1, "商城购机");
+                            //返回到余额
+                            OperateAmountChange(opdb, parentUser.Id, GetWithdrawMoney(parentUser) * order.BuyCount, 1, 2, "商城购机");
+                        }
+                        if(parentUser.LeaderLevel > 0 && CheckLeaderReserve(db, order.BuyCount, parentUser.Id) && !BuyPrizeFlag)
+                        {
+                            //购机奖
+                            decimal CurBuyPrize = GetBuyPrize(parentUser);
+                            OpAccount(db, order.Id, parentUser.Id, CurBuyPrize - BuyPrize, order.BuyCount);
+                            BuyPrizeFlag = true;
+                            BuyPrize = CurBuyPrize;
+
+                            //扣减备用金
+                            OpReserve(db, order.Id, parentUser.Id, GetWithdrawMoney(parentUser) * order.BuyCount, 2, order.UserId, "购机奖励");
+                            //返回到余额
+                            OpLeaderAccount(db, order, parentUser.Id, GetWithdrawMoney(parentUser), order.BuyCount);
+
+                            //给券打大盟主标记
+                            if(parentUser.LeaderLevel == 2)
+                            {
+                                List<int> couponIds = db.PosCoupons.Where(m => m.IsLock == 0 && m.IsUse == 0 && m.UserId == 0 && m.QueryCount == Kind).OrderBy(m => m.Id).Take(CouponCount).ToList().Select(m => m.Id).ToList();
+                                SetPosCouponLeaderFlag(db, parentUser.Id, order.BuyCount, couponIds);
+                            }
+                        }
+                    }
+                }
+            }
+            db.Dispose();
+            opdb.Dispose();
+        }
+
+        /// <summary>
+        /// 获取创客各种等级
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="UserId"></param>
+        /// <returns></returns>
+        public UserRankItem GetUserLevel(WebCMSEntities db, int UserId)
+        {
+            UserRankItem dic = new UserRankItem();
+            DateTime now = DateTime.Now;
+            Users user = db.Users.FirstOrDefault(m => m.Id == UserId) ?? new Users();
+            UserRankWhite userWhite = db.UserRankWhite.FirstOrDefault(m => m.Id == UserId && m.UpdateDate > now) ?? new UserRankWhite();
+            Leaders leader = db.Leaders.FirstOrDefault(m => m.Id == UserId && m.ExpiredDate > now) ?? new Leaders();
+            dic.UserLevel = userWhite.Rank > user.UserLevel ? userWhite.Rank : user.UserLevel;
+            dic.LeaderLevel = leader.LeaderLevel;
+            dic.OperateLevel = user.UserType;
+            dic.Id = user.Id;
+            dic.ParentUserId = user.ParentUserId;
+            dic.ParentNav = user.ParentNav;
+            return dic;
+        }
+
+        /// <summary>
+        /// 直推奖励
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="OrderId"></param>
+        /// <param name="UserId"></param>
+        /// <param name="Count"></param>
+        public void DirectPrize(WebCMSEntities db, int OrderId, int UserId, int Count = 1)
+        {
+            UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
+            if (account == null)
+            {
+                account = db.UserAccount.Add(new UserAccount()
+                {
+                    Id = UserId,
+                    UserId = UserId,
+                }).Entity;
+                db.SaveChanges();
+            }
+            decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
+            decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
+            decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
+            account.BalanceAmount += 100 * Count;
+            account.TotalAmount += 100 * Count;
+            decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
+            decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
+            decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
+            UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
+            {
+                CreateDate = DateTime.Now,
+                UpdateDate = DateTime.Now,
+                UserId = UserId, //创客
+                ChangeType = 112, //变动类型
+                ChangeAmount = 100 * Count, //变更金额
+                BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
+                AfterTotalAmount = AfterTotalAmount, //变更后总金额
+                BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
+                AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
+                BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
+                AfterBalanceAmount = AfterBalanceAmount, //变更后余额
+                QueryCount = OrderId,
+            }).Entity;
+            db.SaveChanges();
+        }
+    
+        /// <summary>
+        /// 判断盟主储蓄金足够
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="Count"></param>
+        /// <param name="UserId"></param>
+        /// <returns></returns>
+        public bool CheckLeaderReserve(WebCMSEntities db, int Count, int UserId)
+        {
+            UserAccount acccount = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new UserAccount();
+            if(acccount.LeaderReserve >= 400 * Count)
+            {
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 判断运营中心/合伙人额度足够
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="Count"></param>
+        /// <param name="UserId"></param>
+        /// <returns></returns>
+        public bool CheckOpReserve(OpModels.WebCMSEntities db, int Count, int UserId)
+        {
+            OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId) ?? new OpModels.UserAccount();
+            if(account.TotalAmt >= 400 * Count)
+            {
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 扣减/增加盟主储蓄金
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="OrderId"></param>
+        /// <param name="UserId"></param>
+        /// <param name="Money"></param>
+        /// <param name="ChangeType"></param>
+        /// <param name="SourceUserId"></param>
+        /// <param name="Remark"></param>
+        public void OpReserve(WebCMSEntities db, int OrderId, int UserId, decimal Money, int ChangeType, int SourceUserId = 0, string Remark = "储备金购买")
+        {
+            UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
+            if (account == null)
+            {
+                account = db.UserAccount.Add(new UserAccount()
+                {
+                    Id = UserId,
+                    UserId = UserId,
+                }).Entity;
+                db.SaveChanges();
+            }
+            decimal BeforeAmount = account.LeaderReserve; //变更前总金额
+            if(ChangeType == 1)
+            {
+                account.LeaderReserve += Money;
+            }
+            else
+            {
+                account.LeaderReserve -= Money;
+            }
+            decimal AfterAmount = account.LeaderReserve; //变更后总金额
+            LeaderReserveRecord add = db.LeaderReserveRecord.Add(new LeaderReserveRecord()
+            {
+                CreateDate = DateTime.Now,
+                ChangeType = ChangeType,
+                OrderId = OrderId,
+                Remark = Remark,
+                AfterAmt = AfterAmount,
+                BeforeAmt = BeforeAmount,
+                ChangeAmt = Money,
+                TradeDate = DateTime.Now.ToString("yyyyMMdd"),
+                TradeMonth = DateTime.Now.ToString("yyyyMM"),
+                UserId = UserId,
+                SourceUserId = SourceUserId,
+                Sort = GetLeaderReserveRecordType(Remark),
+            }).Entity;
+            db.SaveChanges();
+        }
+        private int GetLeaderReserveRecordType(string Remark)
+        {
+            Dictionary<int, string> data = new Dictionary<int, string>();
+            data.Add(11, "兑换机具券,机具券兑换,系统增加(盟主储蓄金),系统扣减(盟主储蓄金),储备金购买");
+            data.Add(12, "系统增加(可提现余额),系统扣减(可提现余额)");
+            data.Add(13, "推荐大盟主,推荐小盟主,商城购机,购机奖励");
+            var item = data.FirstOrDefault(m => m.Value.Contains(Remark));
+            if(item.Key > 0)
+            {
+                return item.Key;
+            }
+            return 0;
+        }
+
+        /// <summary>
+        /// 操作盟主可提现余额
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="order"></param>
+        /// <param name="UserId"></param>
+        /// <param name="Money"></param>
+        /// <param name="Count"></param>
+        /// <param name="Kind"></param>
+        public void OpLeaderAccount(WebCMSEntities db, Orders order, int UserId, decimal Money, int Count = 1)
+        {
+            UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
+            if (account == null)
+            {
+                account = db.UserAccount.Add(new UserAccount()
+                {
+                    Id = UserId,
+                    UserId = UserId,
+                }).Entity;
+                db.SaveChanges();
+            }
+            int ChangeType = 0;
+            if(Money == 400)
+            {
+                ChangeType = 117;
+            }
+            decimal BeforeLeaderBalanceAmount = account.LeaderBalanceAmount; //变更前余额
+            account.LeaderBalanceAmount += Money * Count;
+            decimal AfterLeaderBalanceAmount = account.LeaderBalanceAmount; //变更后余额
+            LeaderAccountRecord leaderAccountRecord = db.LeaderAccountRecord.Add(new LeaderAccountRecord()
+            {
+                CreateDate = DateTime.Now,
+                UpdateDate = DateTime.Now,
+                UserId = UserId, //创客
+                ChangeType = ChangeType, //变动类型
+                ChangeAmount = Money * Count, //变更金额
+                BeforeBalanceAmount = BeforeLeaderBalanceAmount, //变更前余额
+                AfterBalanceAmount = AfterLeaderBalanceAmount, //变更后余额
+                QueryCount = order.Id,
+                Sort = order.UserId,
+            }).Entity;
+            db.SaveChanges();
+        }
+
+        /// <summary>
+        /// 操作余额
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="order"></param>
+        /// <param name="UserId"></param>
+        /// <param name="Money"></param>
+        /// <param name="Count"></param>
+        public void OpAccount(WebCMSEntities db, int OrderId, int UserId, decimal Money, int Count = 1)
+        {
+            UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
+            if (account == null)
+            {
+                account = db.UserAccount.Add(new UserAccount()
+                {
+                    Id = UserId,
+                    UserId = UserId,
+                }).Entity;
+                db.SaveChanges();
+            }
+            int ChangeType = 0;
+            if(Money == 600)
+            {
+                ChangeType = 117;
+            }
+            else if(Money == 100)
+            {
+                ChangeType = 118;
+            }
+            decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
+            decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
+            decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
+            account.BalanceAmount += Money * Count;
+            account.TotalAmount += Money * Count;
+            decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
+            decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
+            decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
+            UserAccountRecord userAccountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
+            {
+                CreateDate = DateTime.Now,
+                UpdateDate = DateTime.Now,
+                UserId = UserId, //创客
+                ChangeType = ChangeType, //变动类型
+                ChangeAmount = Money * Count, //变更金额
+                BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
+                AfterTotalAmount = AfterTotalAmount, //变更后总金额
+                BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
+                AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
+                BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
+                AfterBalanceAmount = AfterBalanceAmount, //变更后余额
+                QueryCount = OrderId,
+            }).Entity;
+            db.SaveChanges();
+        }
+
+        /// <summary>
+        /// 操作运营中心/合伙人额度(TotalAmt未使用额度,ValidForGetAmount可提现额度)
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="UserId"></param>
+        /// <param name="Money"></param>
+        /// <param name="OperateType">(1增加,2减少)</param>
+        /// <param name="AmountType">(1未使用额度,2可提现额度)</param>
+        /// <param name="Remark"></param>
+        /// <param name="record"></param>
+        public void OperateAmountChange(OpModels.WebCMSEntities db, int UserId, decimal Money, int OperateType, int AmountType, string Remark = "", bool record = false)
+        {
+            OpModels.UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == UserId);
+            if (account == null)
+            {
+                account = db.UserAccount.Add(new OpModels.UserAccount()
+                {
+                    Id = UserId,
+                    UserId = UserId,
+                }).Entity;
+                db.SaveChanges();
+            }
+            decimal BeforeAmount = account.ValidAmount + account.TotalAmt + account.ValidForGetAmount; //变更前总金额
+            if(OperateType == 1)
+            {
+                if(AmountType == 1)
+                {
+                    account.TotalAmt += Money;
+                }
+                else if(AmountType == 2)
+                {
+                    account.ValidForGetAmount += Money;
+                }
+                else
+                {
+                    account.ValidAmount += Money;
+                }
+            }
+            else
+            {
+                if(AmountType == 1)
+                {
+                    account.TotalAmt -= Money;
+                }
+                else if(AmountType == 2)
+                {
+                    account.ValidForGetAmount -= Money;
+                }
+                else
+                {
+                    account.ValidAmount -= Money;
+                }
+            }
+            decimal AfterAmount = account.ValidAmount + account.TotalAmt + account.ValidForGetAmount; //变更后总金额
+            if(record)
+            {
+                OpModels.AmountRecord add = db.AmountRecord.Add(new OpModels.AmountRecord()
+                {
+                    CreateDate = DateTime.Now,
+                    UpdateDate = DateTime.Now,
+                    OperateType = OperateType,
+                    AfterAmount = AfterAmount,
+                    BeforeAmount = BeforeAmount,
+                    UseAmount = Money,
+                    UserId = UserId,
+                    SeoDescription = Remark,
+                    Version = AmountType,
+                }).Entity;
+            }
+            db.SaveChanges();
+        }
+
+        /// <summary>
+        /// 给券设置大盟主标记
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="LeaderUserId"></param>
+        /// <param name="Count"></param>
+        /// <param name="couponIds"></param>
+        public void SetPosCouponLeaderFlag(WebCMSEntities db, int LeaderUserId, int Count, List<int> couponIds)
+        {
+            UserAccount pacccount = db.UserAccount.FirstOrDefault(m => m.Id == LeaderUserId) ?? new UserAccount();
+            foreach(int couponId in couponIds)
+            {
+                PosCoupons coupon = db.PosCoupons.FirstOrDefault(m => m.Id == couponId);
+                if(coupon != null && pacccount.LeaderReserve >= 400 * Count)
+                {
+                    coupon.LeaderUserId = LeaderUserId;
+                }
+            }
+            db.SaveChanges();
+        }
+
+        /// <summary>
+        /// 获取购机奖金额
+        /// </summary>
+        /// <param name="user"></param>
+        /// <returns></returns>
+        public decimal GetBuyPrize(UserRankItem user)
+        {
+            if(user.OperateLevel == 1) return 100;
+            if(user.OperateLevel == 2) return 160;
+            if(user.OperateLevel == 3) return 180;
+            if(user.OperateLevel == 4) return 200;
+            if(user.LeaderLevel > 0) return 100;
+            return 0;
+        }
+
+        /// <summary>
+        /// 获取可提现金额
+        /// </summary>
+        /// <param name="user"></param>
+        /// <returns></returns>
+        public decimal GetWithdrawMoney(UserRankItem user)
+        {
+            if(user.OperateLevel == 1) return 400;
+            if(user.OperateLevel == 2) return 340;
+            if(user.OperateLevel == 3) return 320;
+            if(user.OperateLevel == 4) return 300;
+            if(user.LeaderLevel > 0) return 400;
+            return 0;
+        }
+    }
+}

+ 21 - 0
AppStart/Helper/PosCouponPrize/UserRankItem.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Data;
+using System.Threading;
+using MySystem.PxcModels;
+using Library;
+using LitJson;
+
+namespace MySystem
+{
+    public class UserRankItem
+    {
+        public int UserLevel { set; get; }
+        public int LeaderLevel { set; get; }
+        public int OperateLevel { set; get; }
+        public int Id { set; get; }
+        public int ParentUserId { set; get; }
+        public string ParentNav { set; get; }
+    }
+}

+ 52 - 52
Startup.cs

@@ -163,67 +163,67 @@ namespace MySystem
             //必须打开的
             if(Library.ConfigurationManager.EnvironmentFlag == 1)
             {
-                // LeaderCompPrizeHelper.Instance.Ready("202310"); //领导人达标奖
+                LeaderCompPrizeHelper.Instance.Ready("202312"); //领导人达标奖
                 // StatService.Instance.StatUserLevelStartNew();
             }
             if(Library.ConfigurationManager.EnvironmentFlag == 2)
             {
-                SycnSpBindService.Instance.Start(); //同步SP绑定数据
-                SycnSpBindService.Instance.StartSim(); //同步SP广电卡绑定数据
-                SycnSpMerchantService.Instance.Start(); //同步SP商户数据
-                SycnSpActiveService.Instance.Start(); //同步SP激活数据
-                SycnSpTradeService.Instance.Start(); //同步SP交易数据
-                SycnSpChangeBindService.Instance.Start(); //同步SP换绑数据
-                SycnSpUnBindService.Instance.Start(); //同步SP解绑数据
-                SycnSpMerchantRecordService.Instance.Start(); //同步SP商户记录数据
+                // SycnSpBindService.Instance.Start(); //同步SP绑定数据
+                // SycnSpBindService.Instance.StartSim(); //同步SP广电卡绑定数据
+                // SycnSpMerchantService.Instance.Start(); //同步SP商户数据
+                // SycnSpActiveService.Instance.Start(); //同步SP激活数据
+                // SycnSpTradeService.Instance.Start(); //同步SP交易数据
+                // SycnSpChangeBindService.Instance.Start(); //同步SP换绑数据
+                // SycnSpUnBindService.Instance.Start(); //同步SP解绑数据
+                // SycnSpMerchantRecordService.Instance.Start(); //同步SP商户记录数据
 
-                StatService.Instance.StartActiveReward(); //实时处理激活奖励
-                StatService.Instance.StartActiveReward1(); //实时处理0押激活奖励
-                StatService.Instance.StartActiveReward2(); //实时处理盒易付0押激活奖励
-                StatService.Instance.StartSimActive(); //实时广电卡激活奖励
-                StatService.Instance.StartOpenReward(); //实时获取开机奖励
-                LeaderPrizeService.Instance.Start(); //大盟主奖励发奖
-                OperatePrizeService.Instance.Start(); //运营中心奖励发奖
-                ActRewardService.Instance.Start(); //发放激活奖励
-                HelpProfitPreMerchantHelper.Instance.Start(); //助利宝每天增加指定数量商机
-                AddActService.Instance.Start(); //划拨后检查机具激活状态,并自动补录
-                PrePosRingService.Instance.Start(); //预发未申请提醒
-                PrePosWithholdService.Instance.Start(); //预发机过期未申请提交到预扣款
-                PrePosWithholdService.Instance.StartPre(); //预发机申请成功,处理预扣款
-                SycnMerchantTradeService.Instance.Start(); //同步商户交易额
+                // StatService.Instance.StartActiveReward(); //实时处理激活奖励
+                // StatService.Instance.StartActiveReward1(); //实时处理0押激活奖励
+                // StatService.Instance.StartActiveReward2(); //实时处理盒易付0押激活奖励
+                // StatService.Instance.StartSimActive(); //实时广电卡激活奖励
+                // StatService.Instance.StartOpenReward(); //实时获取开机奖励
+                // LeaderPrizeService.Instance.Start(); //大盟主奖励发奖
+                // OperatePrizeService.Instance.Start(); //运营中心奖励发奖
+                // ActRewardService.Instance.Start(); //发放激活奖励
+                // HelpProfitPreMerchantHelper.Instance.Start(); //助利宝每天增加指定数量商机
+                // AddActService.Instance.Start(); //划拨后检查机具激活状态,并自动补录
+                // PrePosRingService.Instance.Start(); //预发未申请提醒
+                // PrePosWithholdService.Instance.Start(); //预发机过期未申请提交到预扣款
+                // PrePosWithholdService.Instance.StartPre(); //预发机申请成功,处理预扣款
+                // SycnMerchantTradeService.Instance.Start(); //同步商户交易额
 
-                MessageCenterService.Instance.Start(); // 消息队列
-                LeaderTimeoutSendMessageService.Instance.Start(); //盟主过期消息提醒
+                // MessageCenterService.Instance.Start(); // 消息队列
+                // LeaderTimeoutSendMessageService.Instance.Start(); //盟主过期消息提醒
 
-                AlipayPayBack2Service.Instance.Start(); //支付宝回调处理
-                BalancePayBackService.Instance.Start(); //余额支付队列
-                ReservePayBackService.Instance.Start(); //储备金支付队列
-                OrderRefundService.Instance.Start(); //商城订单退款
+                // AlipayPayBack2Service.Instance.Start(); //支付宝回调处理
+                // BalancePayBackService.Instance.Start(); //余额支付队列
+                // ReservePayBackService.Instance.Start(); //储备金支付队列
+                // OrderRefundService.Instance.Start(); //商城订单退款
 
-                StatService.Instance.Start(); //每日重置交易额
-                StoreApplyHelper.Instance.Start(); // 每月1号重置仓库额度
-                DepositReturnStatService.Instance.Start(); //每月1号统计达标商户(退押需要的)
-                DepositReturnStatService.Instance.StartEverTime(); //统计单个商户达标数据(退押需要的)
-                AutoOpOrderService.Instance.StartOrderCancel(); //自动取消超时订单(15分钟)
-                OperateStockService.Instance.Start(); //运营中心库存实时更新
-                ResetSmallStoreHelper.Instance.Start(); //每月重置小分仓额度
-                ResetSmallStoreHelper.Instance.Listen(); //监听每月1号重置小分仓额度
-                OperateService.Instance.Start(); //运营中心每天统计一次发货量、库存
-                TimeOutPosChargeService.Instance.StartDoChargeAmount(); //实时监听待扣款记录,并扣费
-                InstallmentDeductionService.Instance.Start(); //分期扣款(每月20号执行)
-                LeaderAmountMonthChangeQueue.Instance.Start(); //每月一号记录上月盟主储蓄金和可提现余额
-                LeaderCompPrizeHelper.Instance.Start(); //领导人达标奖
-                ResetPosFirstFlagAndIsExecuteService.Instance.Start(); //每月1号计算商户首台机具标记
+                // StatService.Instance.Start(); //每日重置交易额
+                // StoreApplyHelper.Instance.Start(); // 每月1号重置仓库额度
+                // DepositReturnStatService.Instance.Start(); //每月1号统计达标商户(退押需要的)
+                // DepositReturnStatService.Instance.StartEverTime(); //统计单个商户达标数据(退押需要的)
+                // AutoOpOrderService.Instance.StartOrderCancel(); //自动取消超时订单(15分钟)
+                // OperateStockService.Instance.Start(); //运营中心库存实时更新
+                // ResetSmallStoreHelper.Instance.Start(); //每月重置小分仓额度
+                // ResetSmallStoreHelper.Instance.Listen(); //监听每月1号重置小分仓额度
+                // OperateService.Instance.Start(); //运营中心每天统计一次发货量、库存
+                // TimeOutPosChargeService.Instance.StartDoChargeAmount(); //实时监听待扣款记录,并扣费
+                // InstallmentDeductionService.Instance.Start(); //分期扣款(每月20号执行)
+                // LeaderAmountMonthChangeQueue.Instance.Start(); //每月一号记录上月盟主储蓄金和可提现余额
+                // LeaderCompPrizeHelper.Instance.Start(); //领导人达标奖
+                // ResetPosFirstFlagAndIsExecuteService.Instance.Start(); //每月1号计算商户首台机具标记
 
-                ChangePosTimer.Instance.Start(); //售后换新执行机具数据转移
-                RecommendActStatService.Instance.Start(); //推荐王奖励数据统计
-                StoreApplyHelper.Instance.StartEverTime(); //分仓临时额度变更
-                PreStoreApplyHelper.Instance.StartEverTime(); //小分仓临时额度变更
-                OperateAmountService.Instance.Start(); //运营中心额度变更
-                LeaderApplyCouponsHelper.Instance.Start(); //盟主储蓄金申请机具券打标记
-                DepositReturnService.Instance.Start(); //退押金到支付宝余额
-                StoreApplyHelper.Instance.ResetStoreReserve(); //重置分仓额度
-                AddPosCouponPrizeHelper.Instance.Start(); //补机具券奖励
+                // ChangePosTimer.Instance.Start(); //售后换新执行机具数据转移
+                // RecommendActStatService.Instance.Start(); //推荐王奖励数据统计
+                // StoreApplyHelper.Instance.StartEverTime(); //分仓临时额度变更
+                // PreStoreApplyHelper.Instance.StartEverTime(); //小分仓临时额度变更
+                // OperateAmountService.Instance.Start(); //运营中心额度变更
+                // LeaderApplyCouponsHelper.Instance.Start(); //盟主储蓄金申请机具券打标记
+                // DepositReturnService.Instance.Start(); //退押金到支付宝余额
+                // StoreApplyHelper.Instance.ResetStoreReserve(); //重置分仓额度
+                // AddPosCouponPrizeHelper.Instance.Start(); //补机具券奖励
 
                 // TestHelper.Instance.Start();
             }

+ 3 - 2
appsettings.Development.json

@@ -17,14 +17,15 @@
     "Host": "http://localhost:5047/",
     "SourceHost": "http://bs.kexiaoshuang.com/",
     "Database": "KxsMainServer",
-    "SqlConnStr": "server=47.109.31.237;port=3306;user=KxsMainServer;password=FrW8ZfxlcaVdm1r0;database=KxsMainServer;charset=utf8;",
-    "Pxc1SqlConnStr": "server=47.109.31.237;port=3306;user=KxsMainServer;password=FrW8ZfxlcaVdm1r0;database=KxsMainServer;charset=utf8;",
+    "SqlConnStr": "server=47.109.31.237;port=3306;user=KxsMainServer;password=FrW8ZfxlcaVdm1r0;database=KxsMainServer;charset=utf8;ConnectionTimeout=600;DefaultCommandTimeout=600;",
+    "Pxc1SqlConnStr": "server=47.109.31.237;port=3306;user=KxsMainServer;password=FrW8ZfxlcaVdm1r0;database=KxsMainServer;charset=utf8;ConnectionTimeout=600;DefaultCommandTimeout=600;",
     "ReadSqlConnStr": "server=47.109.31.237;port=3306;user=KxsMainServer;password=FrW8ZfxlcaVdm1r0;database=KxsMainServer;charset=utf8;",
     "MainSqlConnStr": "server=47.109.31.237;port=3306;user=KxsMainServer;password=FrW8ZfxlcaVdm1r0;database=KxsStatServer;charset=utf8;",
     "SpSqlConnStr": "server=47.109.31.237;port=3306;user=KxsSpServer;password=jJ9qKsvwWgQA9xWG;database=KxsSpServer;charset=utf8;",
     "OpSqlConnStr": "server=47.109.31.237;port=3306;user=KxsOpServer;password=r7jwZ8ydLoeswDR4;database=KxsOpServer;charset=utf8;",
     "MpSqlConnStr": "server=47.109.31.237;port=3306;user=QrCodePlateMainServer;password=ll4DFaALMu9YIooM;database=QrCodePlateMainServer;charset=utf8;",
     "MpSqlConnStr2": "server=47.109.31.237;port=3306;user=QrCodePlateMainServer;password=ll4DFaALMu9YIooM;database=QrCodePlateMainServer2;charset=utf8;",
+    "RdsStatSqlConnStr": "server=47.109.31.237;port=3306;user=KxsStatServer;password=mzeqjriUWore0dwT;database=KxsStatServer;charset=utf8;",
     "RedisConnStr": "47.109.31.237:6379,password=klm@redis,DefaultDatabase=1,poolsize=500,preheat=50,asyncPipeline=true",
     "IOSAppVersion": "1.0.0",
     "AndroidAppVersion": "1.0.0",