using System; using System.Collections.Generic; using System.Linq; using System.Data; using MySystem.PxcModels; using Library; using LitJson; namespace MySystem { public class AlipayPayBack2Service { public readonly static AlipayPayBack2Service Instance = new AlipayPayBack2Service(); private AlipayPayBack2Service() { } public void Start(JobMqMsg jobInfo) { string content = ""; try { dosomething(); string Msg = "success"; jobInfo.Status = Msg == "success" ? 1 : 0; jobInfo.Msg = Msg == "success" ? "执行完成" : Msg; RabbitMQClient.Instance.SendMsg(Newtonsoft.Json.JsonConvert.SerializeObject(jobInfo), "PublicBack"); } catch (Exception ex) { if (!string.IsNullOrEmpty(content)) { Dictionary data = new Dictionary(); 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(), "商城订单支付回调异常"); } } } private void dosomething() { bool op = true; while (op) { string content = RedisDbconn.Instance.RPop("PayCallBack2"); if (!string.IsNullOrEmpty(content)) { sloveAlipayCallBack(content); } else { op = false; } } } public void sloveAlipayCallBack(string content) { JsonData jsonObj = JsonMapper.ToObject(content); string OrderNo = jsonObj["out_trade_no"].ToString(); string TradeNo = jsonObj["transaction_id"].ToString(); decimal TotalFee = decimal.Parse(function.CheckNum(jsonObj["total_fee"].ToString())); WebCMSEntities db = new WebCMSEntities(); OrderForNo forNo = db.OrderForNo.FirstOrDefault(m => m.OrderNo == OrderNo); if (forNo != null) { string[] ids = forNo.OrderIds.Split(','); foreach (string idString in ids) { int OrderId = int.Parse(idString); Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId && m.Status == 0); if (order != null) { order.Status = 1; order.PayDate = DateTime.Now; order.PayStatus = 1; db.SaveChanges(); RedisDbconn.Instance.Set("Orders:" + order.Id, order); //机具券逻辑 OrderProduct pro = db.OrderProduct.FirstOrDefault(m => m.OrderId == OrderId); if (pro != null) { if (pro.ProductId == 10 || pro.ProductId == 11 || pro.ProductId == 12 || pro.ProductId == 13) { order.Status = 2; db.SaveChanges(); int BuyCount = pro.ProductCount; int Kind = 0; if (pro.ProductId == 10) { Kind = 1; } else if (pro.ProductId == 11) { Kind = 2; } else if (pro.ProductId == 12) { if (pro.NormDetail == "电签POS") { Kind = 1; } else if (pro.NormDetail == "大POS") { Kind = 2; } } else if (pro.ProductId == 13) { if (pro.NormDetail == "电签POS") { Kind = 1; } else if (pro.NormDetail == "大POS") { Kind = 2; } } string Codes = ""; var coupons = db.PosCoupons.Where(m => m.IsLock == 0 && m.IsUse == 0 && m.UserId == 0 && m.QueryCount == Kind).OrderBy(m => m.Id).Take(BuyCount).ToList(); foreach (var coupon in coupons) { PosCoupons item = db.PosCoupons.FirstOrDefault(m => m.Id == coupon.Id); if (item != null) { item.CreateDate = DateTime.Now; item.UserId = order.UserId; item.UpdateDate = DateTime.Now.AddDays(180); Codes += item.ExchangeCode + ","; } } order.SnNos = Codes.TrimEnd(','); string ChangeRecordNo = "SC" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8); PosCouponForUser forUser = db.PosCouponForUser.FirstOrDefault(m => m.Id == order.UserId); if (forUser == null) { forUser = db.PosCouponForUser.Add(new PosCouponForUser() { Id = order.UserId, }).Entity; db.SaveChanges(); } int BeforeOut = forUser.OutNum; int BeforeTotal = forUser.TotalNum; int BeforeStock = forUser.StockNum; forUser.TotalNum += BuyCount; forUser.StockNum += BuyCount; int AfterOut = forUser.OutNum; int AfterTotal = forUser.TotalNum; int AfterStock = forUser.StockNum; PosCouponOrders stat = db.PosCouponOrders.Add(new PosCouponOrders() { QueryCount = Kind, CreateDate = DateTime.Now, ChangeKind = 1, ChangeCount = BuyCount, AfterOut = AfterOut, AfterTotal = AfterTotal, AfterStock = AfterStock, BeforeOut = BeforeOut, BeforeTotal = BeforeTotal, BeforeStock = BeforeStock, OrderNo = ChangeRecordNo, ToUserId = order.UserId, FromUserId = 0, }).Entity; db.SaveChanges(); RedisDbconn.Instance.Clear("Orders:" + order.Id); } //推荐下单奖励 if (pro.ProductId == 10 || pro.ProductId == 11) { bool checkPrize = db.UserAccountRecord.Any(m => m.QueryCount == OrderId); int SelfBuy = 0; OtherMySqlConn.connstr = Library.ConfigurationManager.AppSettings["Pxc1SqlConnStr"].ToString(); DataTable stat = OtherMySqlConn.dtable("select count(Id) from Orders where Id in (select OrderId from OrderProduct where UserId=" + order.UserId + " and (ProductId=10 or ProductId=11)) and Status>0 and TotalPrice>0"); if (stat.Rows.Count > 0) { SelfBuy = int.Parse(function.CheckInt(stat.Rows[0][0].ToString())); } OtherMySqlConn.connstr = ""; function.WriteLog("OrderId:" + OrderId, "推荐下单奖励监控日志"); function.WriteLog("checkPrize:" + checkPrize, "推荐下单奖励监控日志"); function.WriteLog("SelfBuy:" + SelfBuy, "推荐下单奖励监控日志"); if (SelfBuy == 1 && !checkPrize) { Users user = db.Users.FirstOrDefault(m => m.Id == order.UserId); if (user != null) { int ParentUserId = user.ParentUserId; while(ParentUserId > 0) { int machineCount = db.PosMachinesTwo.Count(m => m.UserId == ParentUserId && m.PosSnType == 0); //判断是否拥有3台购买机 int ActiveCount = db.PosMachinesTwo.Count(m => m.UserId == ParentUserId && m.ActivationState == 1); //判断是否拥有3台激活机(不限购买或赠送) int couponCount = db.PosCoupons.Count(m => m.UserId == ParentUserId && m.IsUse == 0); //判断是否拥有3张券 function.WriteLog("MakerCode:" + user.MakerCode, "推荐下单奖励监控日志"); function.WriteLog("machineCount:" + machineCount, "推荐下单奖励监控日志"); function.WriteLog("ActiveCount:" + ActiveCount, "推荐下单奖励监控日志"); if (machineCount + ActiveCount + couponCount >= 3) { function.WriteLog("满足条件", "推荐下单奖励监控日志"); UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == ParentUserId); if (account == null) { account = db.UserAccount.Add(new UserAccount() { Id = ParentUserId, UserId = ParentUserId, }).Entity; db.SaveChanges(); } decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额 decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额 decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额 account.BalanceAmount += 100; account.TotalAmount += 100; 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 = ParentUserId, //创客 ChangeType = 112, //变动类型 ChangeAmount = 100, //变更金额 BeforeTotalAmount = BeforeTotalAmount, //变更前总金额 AfterTotalAmount = AfterTotalAmount, //变更后总金额 BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额 AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额 BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额 AfterBalanceAmount = AfterBalanceAmount, //变更后余额 QueryCount = OrderId, }).Entity; db.SaveChanges(); RedisDbconn.Instance.Set("UserAccount:" + ParentUserId, account); //推荐下单上级获得30天的机具循环天数 var posList = db.PosMachinesTwo.Select(m => new { m.Id, m.UserId, m.BindingState, m.RecycEndDate }).Where(m => m.UserId == ParentUserId && m.BindingState == 0 && m.RecycEndDate != null).ToList(); foreach (var subPos in posList) { PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == subPos.Id); if (pos != null) { pos.RecycEndDate = pos.RecycEndDate.Value.AddDays(30); } } db.SaveChanges(); ParentUserId = 0; } else { Users puser = db.Users.FirstOrDefault(m => m.Id == ParentUserId) ?? new Users(); ParentUserId = puser.ParentUserId; } } } } function.WriteLog("\r\n\r\n", "推荐下单奖励监控日志"); } } } } } db.Dispose(); } public void checkOrder(int OrderId) { WebCMSEntities db = new WebCMSEntities(); Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId); if (order != null) { if (order.Status == 0) { order.Status = 1; order.PayDate = DateTime.Now; order.PayStatus = 1; db.SaveChanges(); RedisDbconn.Instance.Set("Orders:" + order.Id, order); } //机具券逻辑 OrderProduct pro = db.OrderProduct.FirstOrDefault(m => m.OrderId == OrderId); if (pro != null) { if (pro.ProductId == 10 || pro.ProductId == 11 || pro.ProductId == 12 || pro.ProductId == 13) { if (order.Status == 1) { order.Status = 2; db.SaveChanges(); } int BuyCount = pro.ProductCount; int Kind = 0; if (pro.ProductId == 10) { Kind = 1; } else if (pro.ProductId == 11) { Kind = 2; } else if (pro.ProductId == 12) { if (pro.NormDetail == "电签POS") { Kind = 1; } else if (pro.NormDetail == "大POS") { Kind = 2; } } else if (pro.ProductId == 13) { if (pro.NormDetail == "电签POS") { Kind = 1; } else if (pro.NormDetail == "大POS") { Kind = 2; } } string Codes = ""; var coupons = db.PosCoupons.Where(m => m.IsLock == 0 && m.IsUse == 0 && m.UserId == 0 && m.QueryCount == Kind).OrderBy(m => m.Id).Take(BuyCount).ToList(); foreach (var coupon in coupons) { PosCoupons item = db.PosCoupons.FirstOrDefault(m => m.Id == coupon.Id); if (item != null) { item.CreateDate = DateTime.Now; item.UserId = order.UserId; item.UpdateDate = DateTime.Now.AddDays(180); Codes += item.ExchangeCode + ","; } } order.SnNos = Codes.TrimEnd(','); string ChangeRecordNo = "SC" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8); PosCouponForUser forUser = db.PosCouponForUser.FirstOrDefault(m => m.Id == order.UserId); if (forUser == null) { forUser = db.PosCouponForUser.Add(new PosCouponForUser() { Id = order.UserId, }).Entity; db.SaveChanges(); } int BeforeOut = forUser.OutNum; int BeforeTotal = forUser.TotalNum; int BeforeStock = forUser.StockNum; forUser.TotalNum += BuyCount; forUser.StockNum += BuyCount; int AfterOut = forUser.OutNum; int AfterTotal = forUser.TotalNum; int AfterStock = forUser.StockNum; PosCouponOrders stat = db.PosCouponOrders.Add(new PosCouponOrders() { QueryCount = Kind, CreateDate = DateTime.Now, ChangeKind = 1, ChangeCount = BuyCount, AfterOut = AfterOut, AfterTotal = AfterTotal, AfterStock = AfterStock, BeforeOut = BeforeOut, BeforeTotal = BeforeTotal, BeforeStock = BeforeStock, OrderNo = ChangeRecordNo, ToUserId = order.UserId, FromUserId = 0, }).Entity; db.SaveChanges(); RedisDbconn.Instance.Clear("Orders:" + order.Id); } //推荐下单奖励 if (pro.ProductId == 10 || pro.ProductId == 11) { int SelfBuy = db.OrderProduct.Count(m => m.UserId == order.UserId && m.OrderId != OrderId && (m.ProductId == 10 || m.ProductId == 11)); if (SelfBuy == 1) { Users user = db.Users.FirstOrDefault(m => m.Id == order.UserId); if (user != null) { int ParentUserId = user.ParentUserId; int machineCount = db.PosMachinesTwo.Count(m => m.UserId == ParentUserId && m.PosSnType == 0); //判断是否拥有3台购买机 int ActiveCount = db.PosMachinesTwo.Count(m => m.UserId == ParentUserId && m.ActivationState == 1); //判断是否拥有3台激活机(不限购买或赠送) int couponCount = db.PosCoupons.Count(m => m.UserId == ParentUserId && m.IsUse == 0); //判断是否拥有3张券 if (machineCount + ActiveCount + couponCount >= 3) { UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == ParentUserId); if (account == null) { account = db.UserAccount.Add(new UserAccount() { Id = ParentUserId, UserId = ParentUserId, }).Entity; db.SaveChanges(); } decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额 decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额 decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额 account.BalanceAmount += 100; account.TotalAmount += 100; 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 = ParentUserId, //创客 ChangeType = 112, //变动类型 ChangeAmount = 100, //变更金额 BeforeTotalAmount = BeforeTotalAmount, //变更前总金额 AfterTotalAmount = AfterTotalAmount, //变更后总金额 BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额 AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额 BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额 AfterBalanceAmount = AfterBalanceAmount, //变更后余额 }).Entity; db.SaveChanges(); RedisDbconn.Instance.Set("UserAccount:" + ParentUserId, account); //推荐下单上级获得30天的机具循环天数 var posList = db.PosMachinesTwo.Select(m => new { m.Id, m.UserId, m.BindingState, m.RecycEndDate }).Where(m => m.UserId == ParentUserId && m.BindingState == 0 && m.RecycEndDate != null); foreach (var subPos in posList) { PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == subPos.Id); if (pos != null) { pos.RecycEndDate = pos.RecycEndDate.Value.AddDays(30); } } db.SaveChanges(); } } } } } } db.Dispose(); } public void addcoupon(int OrderId) { WebCMSEntities db = new WebCMSEntities(); Orders order = db.Orders.FirstOrDefault(m => m.Id == OrderId); if (order != null) { //机具券逻辑 OrderProduct pro = db.OrderProduct.FirstOrDefault(m => m.OrderId == OrderId); if (pro != null) { if (pro.ProductId == 10 || pro.ProductId == 11 || pro.ProductId == 12 || pro.ProductId == 13) { int BuyCount = pro.ProductCount; int Kind = 0; if (pro.ProductId == 10) { Kind = 1; } else if (pro.ProductId == 11) { Kind = 2; } else if (pro.ProductId == 12) { if (pro.NormDetail == "电签POS") { Kind = 1; } else if (pro.NormDetail == "大POS") { Kind = 2; } } else if (pro.ProductId == 13) { if (pro.NormDetail == "电签POS") { Kind = 1; } else if (pro.NormDetail == "大POS") { Kind = 2; } } string Codes = ""; var coupons = db.PosCoupons.Where(m => m.IsLock == 0 && m.IsUse == 0 && m.UserId == 0 && m.QueryCount == Kind).OrderBy(m => m.Id).Take(BuyCount).ToList(); foreach (var coupon in coupons) { PosCoupons item = db.PosCoupons.FirstOrDefault(m => m.Id == coupon.Id); if (item != null) { item.CreateDate = DateTime.Now; item.UserId = order.UserId; item.UpdateDate = DateTime.Now.AddDays(180); Codes += item.ExchangeCode + ","; } } order.SnNos = Codes.TrimEnd(','); string ChangeRecordNo = "SC" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8); PosCouponForUser forUser = db.PosCouponForUser.FirstOrDefault(m => m.Id == order.UserId); if (forUser == null) { forUser = db.PosCouponForUser.Add(new PosCouponForUser() { Id = order.UserId, }).Entity; db.SaveChanges(); } int BeforeOut = forUser.OutNum; int BeforeTotal = forUser.TotalNum; int BeforeStock = forUser.StockNum; forUser.TotalNum += BuyCount; forUser.StockNum += BuyCount; int AfterOut = forUser.OutNum; int AfterTotal = forUser.TotalNum; int AfterStock = forUser.StockNum; PosCouponOrders stat = db.PosCouponOrders.Add(new PosCouponOrders() { QueryCount = Kind, CreateDate = DateTime.Now, ChangeKind = 1, ChangeCount = BuyCount, AfterOut = AfterOut, AfterTotal = AfterTotal, AfterStock = AfterStock, BeforeOut = BeforeOut, BeforeTotal = BeforeTotal, BeforeStock = BeforeStock, OrderNo = ChangeRecordNo, ToUserId = order.UserId, FromUserId = 0, }).Entity; db.SaveChanges(); RedisDbconn.Instance.Clear("Orders:" + order.Id); } //推荐下单奖励 if (pro.ProductId == 10 || pro.ProductId == 11) { int SelfBuy = db.OrderProduct.Count(m => m.UserId == order.UserId && m.OrderId != OrderId && (m.ProductId == 10 || m.ProductId == 11)); if (SelfBuy == 1) { Users user = db.Users.FirstOrDefault(m => m.Id == order.UserId); if (user != null) { int ParentUserId = user.ParentUserId; int machineCount = db.PosMachinesTwo.Count(m => m.UserId == ParentUserId && m.PosSnType == 0); //判断是否拥有3台购买机 int ActiveCount = db.PosMachinesTwo.Count(m => m.UserId == ParentUserId && m.ActivationState == 1); //判断是否拥有3台激活机(不限购买或赠送) int couponCount = db.PosCoupons.Count(m => m.UserId == ParentUserId && m.IsUse == 0); //判断是否拥有3张券 if (machineCount + ActiveCount + couponCount >= 3) { UserAccount account = db.UserAccount.FirstOrDefault(m => m.Id == ParentUserId); if (account == null) { account = db.UserAccount.Add(new UserAccount() { Id = ParentUserId, UserId = ParentUserId, }).Entity; db.SaveChanges(); } decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额 decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额 decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额 account.BalanceAmount += 100; account.TotalAmount += 100; 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 = ParentUserId, //创客 ChangeType = 112, //变动类型 ChangeAmount = 100, //变更金额 BeforeTotalAmount = BeforeTotalAmount, //变更前总金额 AfterTotalAmount = AfterTotalAmount, //变更后总金额 BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额 AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额 BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额 AfterBalanceAmount = AfterBalanceAmount, //变更后余额 }).Entity; db.SaveChanges(); RedisDbconn.Instance.Set("UserAccount:" + ParentUserId, account); //推荐下单上级获得30天的机具循环天数 var posList = db.PosMachinesTwo.Select(m => new { m.Id, m.UserId, m.BindingState, m.RecycEndDate }).Where(m => m.UserId == ParentUserId && m.BindingState == 0 && m.RecycEndDate != null); foreach (var subPos in posList) { PosMachinesTwo pos = db.PosMachinesTwo.FirstOrDefault(m => m.Id == subPos.Id); if (pos != null) { pos.RecycEndDate = pos.RecycEndDate.Value.AddDays(30); } } db.SaveChanges(); } } } } } } db.Dispose(); } } }