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); DoOrderV2(db, OrderId); } } db.Dispose(); } #region 新订单流程 public void DoOrderV2(WebCMSEntities db, int OrderId) { 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; if(order.ParentOrderId > 0) { int total = db.Orders.Count(m => m.ParentOrderId == order.ParentOrderId); int paycount = db.Orders.Count(m => m.ParentOrderId == order.ParentOrderId && m.Status > 0); if(paycount + 1 >= total) { order = db.Orders.FirstOrDefault(m => m.Id == order.ParentOrderId && m.Status == 0); if (order != null) { order.Status = 2; order.PayDate = DateTime.Now; order.PayStatus = 1; OrderId = order.Id; } } } db.SaveChanges(); if(order.ParentOrderId > 0) { return; } OrderProduct pro = db.OrderProduct.FirstOrDefault(m => m.OrderId == OrderId); if (pro != null) { if(order.ErpMode > 0) { pro.ProductId = order.ProductId; } List couponIds = new List(); if (pro.ProductId == 10 || pro.ProductId == 11 || pro.ProductId == 27 || pro.ProductId == 28) { order.Status = 2; int BuyCount = pro.ProductCount; int Kind = 0; if (pro.ProductId == 10) { Kind = 1; } else if (pro.ProductId == 11) { Kind = 2; } else if (pro.ProductId == 28) { Users user = db.Users.FirstOrDefault(m => m.Id == order.UserId && m.LeaderLevel == 0); if(user != null) { user.LeaderLevel = 1; } } else if (pro.ProductId == 27) { Users user = db.Users.FirstOrDefault(m => m.Id == order.UserId && m.LeaderLevel < 2); if(user != null) { user.LeaderLevel = 2; } } if(Kind <= 2 && pro.ProductId == 10 || pro.ProductId == 11) { // 购买600一组机具券,返券 int CouponCount = 0; if(Kind == 1) { CouponCount = 3 * pro.ProductCount; } else if(Kind == 2) { CouponCount = 2 * pro.ProductCount; } 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(CouponCount).ToList(); foreach (var coupon in coupons) // TODO: 数量多的话,会慢 { 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 + ","; couponIds.Add(coupon.Id); } } order.SnNos = Codes.TrimEnd(','); } db.SaveChanges(); if (pro.ProductId == 27 || pro.ProductId == 28) { //充值盟主储备金 OpReserve(db, order, order.UserId, order.TotalPrice, 1); } } //推荐下单奖励 if (pro.ProductId == 10 || pro.ProductId == 11) { bool checkPrize = db.UserAccountRecord.Any(m => m.QueryCount == OrderId); function.WriteLog("OrderId:" + OrderId, "推荐下单奖励监控日志"); function.WriteLog("checkPrize:" + checkPrize, "推荐下单奖励监控日志"); if (!checkPrize) { Users user = db.Users.FirstOrDefault(m => m.Id == order.UserId); if (user != null) { bool directPrize = false; //直推奖标记 bool bigLeaderPrize = false; //大盟主券标记 bool buyPrize = false; //返100购机奖励标记 int leaderFlag = 0; //返600备用金标记 if(user.LeaderLevel > 0) { UserAccount acccount = db.UserAccount.FirstOrDefault(m => m.Id == order.UserId) ?? new UserAccount(); if(acccount.LeaderReserve >= order.TotalPrice) { if(order.PayMode == 4) { //扣减备用金 OpReserve(db, order, order.UserId, order.TotalPrice, 2, 0, "商城购机"); //返回到余额 // OpAccount(db, order, order.UserId, order.TotalPrice / pro.ProductCount, pro.ProductCount); } } //获得100元奖励 OpAccount(db, order, order.UserId, 100, pro.ProductCount); //推荐奖励 DirectPrize(db, order.Id, order.UserId, pro.ProductCount); //推荐下单上级获得30天的机具循环天数 var posList = db.PosMachinesTwo.Select(m => new { m.Id, m.UserId, m.BindingState, m.RecycEndDate }).Where(m => m.UserId == order.UserId && 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(); if(user.LeaderLevel == 2) { if(couponIds.Count > 0) { foreach(int couponId in couponIds) { PosCoupons coupon = db.PosCoupons.FirstOrDefault(m => m.Id == couponId); if(coupon != null) { coupon.LeaderUserId = user.Id; } } db.SaveChanges(); } } else { int PUserId = user.ParentUserId; while(PUserId > 0) { Users puser = db.Users.FirstOrDefault(m => m.Id == PUserId) ?? new Users(); if(puser.LeaderLevel == 2) { UserAccount acc = db.UserAccount.FirstOrDefault(m => m.Id == puser.Id) ?? new UserAccount(); if(acc.LeaderReserve >= order.TotalPrice) { //扣减备用金 OpReserve(db, order, puser.Id, order.TotalPrice, 2, order.UserId, "购机奖励"); //返回到余额 OpAccount(db, order, puser.Id, order.TotalPrice / pro.ProductCount, pro.ProductCount); } PUserId = 0; } else { PUserId = puser.ParentUserId; } } } return; } int ParentUserId = user.ParentUserId; List proids = new List(); proids.Add(10); proids.Add(11); while(ParentUserId > 0) { Users puser = db.Users.FirstOrDefault(m => m.Id == ParentUserId) ?? new Users(); 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:" + puser.MakerCode, "推荐下单奖励监控日志"); function.WriteLog("machineCount:" + machineCount, "推荐下单奖励监控日志"); function.WriteLog("ActiveCount:" + ActiveCount, "推荐下单奖励监控日志"); if ((machineCount + ActiveCount + couponCount >= 3 || puser.LeaderLevel > 0) && !directPrize) { function.WriteLog("满足条件", "推荐下单奖励监控日志"); if(puser.LeaderLevel == 0) // 非盟主直推奖励,每个创客第一次下单,上级可得 { List oids = new List(); var orderpros = db.OrderProduct.Select(m => new { m.OrderId,m.UserId,m.ProductId }).Where(m => m.UserId == order.UserId && proids.Contains(m.ProductId)).ToList(); foreach(var orderpro in orderpros) { oids.Add(orderpro.OrderId); } bool check = db.Orders.Any(m => oids.Contains(m.Id) && m.Status > 0); if(!check) { DirectPrize(db, order.Id, ParentUserId, pro.ProductCount); directPrize = true; } } else { // 盟主直推奖励,可以每次下单获得 DirectPrize(db, order.Id, ParentUserId, pro.ProductCount); directPrize = true; } //推荐下单上级获得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(); } if(puser.LeaderLevel > 0) { UserAccount acccount = db.UserAccount.FirstOrDefault(m => m.Id == puser.Id) ?? new UserAccount(); if(acccount.LeaderReserve >= order.TotalPrice && !buyPrize) { //购机奖励 OpAccount(db, order, puser.Id, 100, pro.ProductCount); buyPrize = true; } if(acccount.LeaderReserve >= order.TotalPrice && puser.LeaderLevel > leaderFlag) { //扣减备用金 OpReserve(db, order, puser.Id, order.TotalPrice, 2, order.UserId, "购机奖励"); //返回到余额 OpAccount(db, order, puser.Id, order.TotalPrice / pro.ProductCount, pro.ProductCount); leaderFlag = puser.LeaderLevel; } //如果是大盟主,则标记大盟主标签 if(couponIds.Count > 0 && puser.LeaderLevel == 2 && acccount.LeaderReserve >= order.TotalPrice && !bigLeaderPrize) { foreach(int couponId in couponIds) { PosCoupons coupon = db.PosCoupons.FirstOrDefault(m => m.Id == couponId); if(coupon != null) { coupon.LeaderUserId = puser.Id; } } db.SaveChanges(); bigLeaderPrize = true; } } ParentUserId = puser.ParentUserId; } } } function.WriteLog("\r\n\r\n", "推荐下单奖励监控日志"); } //推荐王 if(pro.ProductId == 29) { RecommendMethod(order.UserId, order.CreateDate.Value.ToString("yyyyMM")); } //分仓向总仓申请机具额度 if(pro.ProductId == 24 || pro.ProductId == 25 || pro.ProductId == 26) { string SendData = "{\"Kind\":\"1\",\"Data\":{\"OrderId\":\"" + order.Id + "\"}}"; RedisDbconn.Instance.AddList("StoreApplyQueue", SendData); } } else { if(order.ProductId > 0 && order.ErpMode > 0) { //盟主储备金-升级/购买 ErpMode:1-升级,2-购买 if(order.ErpMode > 0) { Users user = db.Users.FirstOrDefault(m => m.Id == order.UserId); if(user != null) { if(order.ErpMode == 1) { user.LeaderLevel = 2; db.SaveChanges(); } OpReserve(db, order, order.UserId, order.TotalPrice, 1); } } } } } } //操作储备金 public void OpReserve(WebCMSEntities db, Orders order, 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 = order.Id, Remark = Remark, AfterAmt = AfterAmount, BeforeAmt = BeforeAmount, ChangeAmt = Money, TradeDate = DateTime.Now.ToString("yyyyMMdd"), TradeMonth = DateTime.Now.ToString("yyyyMM"), UserId = UserId, SourceUserId = SourceUserId, }).Entity; db.SaveChanges(); } //操作余额 public void OpAccount(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 == 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 = order.Id, }).Entity; db.SaveChanges(); } 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(); } // 推荐王逻辑(下单) public void RecommendMethod(int UserId, string TradeMonth) { string SendData = "{\"Kind\":\"1\",\"Data\":{\"UserId\":\"" + UserId + "\",\"TradeMonth\":\"" + TradeMonth + "\"}}"; RedisDbconn.Instance.AddList("RecommendActStatQueue", SendData); } #endregion } }