public ActionResult Detail(string id, string submitType) { bool buy = false; DateTime start = DateTime.Parse(DateTime.Today.ToString("yyyy-MM-dd 0:0:0")); DateTime end = DateTime.Parse(DateTime.Today.ToString("yyyy-MM-dd 23:59:59")); switch (submitType) { case "BUY": { buy = true; int count = int.Parse(Request.Form["BuyCount"]); int pid = int.Parse(Request.Form["pid"]); decimal price = decimal.Parse(Request.Form["BuyPrice"]); var entrust = new Entrust() { IsBuy = buy, Price = price, Count = count, DealedCount = 0, UserId = CurrentUser.Id, ProductId = pid, CreateTime = DateTime.Now }; int eid = mr.CreateEntrust(entrust); decimal dealedAmount = 0M; //冻结用户委托金额 CurrentUser.FrozenScore += (count * price); #region 处理交易 var saleEntrusts = mr.GetEntrusts(new MarketCriteria { IsBuy = 0, ProductId = pid, Cancelled = 0, StartDate = start, EndDate = end }) .Where(e => e.Price <= price).OrderBy(e => e.Price).ThenByDescending(e => e.Id); if (saleEntrusts != null && saleEntrusts.Any()) { bool dealed = false; foreach (var e in saleEntrusts) { if (dealed) { break; } decimal amount = 0M; Guid tid = Guid.NewGuid(); int acutalCount = 0; // 80, 100 - 30 or 0 if ((e.Count - e.DealedCount) >= (entrust.Count - entrust.DealedCount)) //此笔交易可完成 { acutalCount = entrust.Count - entrust.DealedCount; amount = (acutalCount) * e.Price; e.DealedAmount += (acutalCount) * e.Price; dealedAmount += e.DealedAmount; e.DealedCount += (acutalCount); entrust.DealedAmount += (acutalCount) * e.Price; entrust.DealedCount = entrust.Count; entrust.Status = 1; if (e.DealedCount == e.Count) { e.Status = 1; } else { e.Status = 2; } mr.UpdateEntrust(e); dealed = true; // break; } else //需更多笔交易 { acutalCount = e.Count - e.DealedCount; amount = (acutalCount) * e.Price; entrust.DealedAmount += acutalCount * e.Price; dealedAmount += acutalCount * e.Price; entrust.DealedCount += acutalCount; e.DealedAmount += acutalCount * e.Price; e.DealedCount = e.Count; e.Status = 1; entrust.Status = 2; mr.UpdateEntrust(e); } var user = ur.Get(e.UserId); if (user != null) { user.TotalScore += amount; ur.Update(user); var uup = ur.GetProductByUser(e.ProductId, e.UserId); uup.FrozenCount -= acutalCount; uup.TotalCount -= acutalCount; ur.UpdateUserProduct(uup); var score = new UserScore { TypeId = (int)ScoreType.出售, UserId = user.Id, ChargeFee = 0, Score = amount, CreateTime = DateTime.Now, Status = 1, UserPath = user.RefUserPath }; new UserScoreRepository().Create(score); } var tbuy = new Transaction { Count = acutalCount, IsBuy = true, UserId = entrust.UserId, CreateTime = DateTime.Now, Date = DateTime.Today, Price = e.Price, ProductId = e.ProductId, ChargeFee = 0, TransactionId = tid }; var tsell = new Transaction { Count = acutalCount, IsBuy = false, UserId = e.UserId, CreateTime = DateTime.Now, Date = DateTime.Today, Price = e.Price, ProductId = e.ProductId, ChargeFee = 0, TransactionId = tid }; mr.CreateTransaction(tbuy); mr.CreateTransaction(tsell); } mr.UpdateEntrust(entrust); } if (entrust.Status == 1) { CurrentUser.FrozenScore -= (count * price); } else { CurrentUser.FrozenScore -= dealedAmount; } var up = ur.GetProductByUser(entrust.ProductId, CurrentUser.Id); if (up == null) { up = new UserProduct { ProductId = entrust.ProductId, FrozenCount = 0, UserId = CurrentUser.Id, TotalCount = entrust.DealedCount, CreateTime = DateTime.Now, UpdateTime = DateTime.Now }; ur.CreateUserProduct(up); } else { up.TotalCount += entrust.DealedCount; up.UpdateTime = DateTime.Now; ur.UpdateUserProduct(up); } #endregion CurrentUser.TotalScore -= dealedAmount; ur.Update(CurrentUser); RefreshCurrentUser(); if (dealedAmount > 0) { var score = new UserScore { TypeId = (int)ScoreType.购买, UserId = CurrentUser.Id, ChargeFee = 0, Score = dealedAmount, CreateTime = DateTime.Now, Status = 1, UserPath = CurrentUser.RefUserPath }; new UserScoreRepository().Create(score); } } break; case "SALE": { int count = int.Parse(Request.Form["SaleCount"]); int pid = int.Parse(Request.Form["pid"]); decimal price = decimal.Parse(Request.Form["SalePrice"]); int dealedCount = 0; decimal dealedAmount = 0M; var entrust = new Entrust() { IsBuy = buy, Price = price, Count = count, DealedCount = 0, UserId = CurrentUser.Id, ProductId = pid, CreateTime = DateTime.Now }; //冻结用户委托产品 var up = ur.GetProductsByUser(CurrentUser.Id).First(p => p.Product.ProductCode == id); up.FrozenCount += count; int eid = mr.CreateEntrust(entrust); #region 处理交易 var buyEntrusts = mr.GetEntrusts(new MarketCriteria { IsBuy = 1, ProductId = pid, Cancelled = 0, StartDate = start, EndDate = end }) .Where(e => e.Price >= price).OrderByDescending(e => e.Price).ThenByDescending(e => e.Id); if (buyEntrusts != null && buyEntrusts.Any()) { bool dealed = false; foreach (var e in buyEntrusts) { if (dealed) { break; } decimal amount = 0M; Guid tid = Guid.NewGuid(); int acutalCount = 0; // 80, 100 - 30 or 0 if ((e.Count - e.DealedCount) >= (entrust.Count - entrust.DealedCount)) //此笔交易可完成 { acutalCount = entrust.Count - entrust.DealedCount; amount = (acutalCount) * e.Price; e.DealedAmount += (acutalCount) * e.Price; dealedCount += acutalCount; e.DealedCount += (acutalCount); entrust.DealedAmount += (acutalCount) * e.Price; entrust.DealedCount = entrust.Count; entrust.Status = 1; if (e.DealedCount == e.Count) { e.Status = 1; } else { e.Status = 2; } dealedAmount += amount; mr.UpdateEntrust(e); dealed = true; //break; } else //需更多笔交易 { acutalCount = e.Count - e.DealedCount; amount = (acutalCount) * e.Price; entrust.DealedAmount += acutalCount * e.Price; dealedCount += acutalCount; entrust.DealedCount += acutalCount; e.DealedAmount += acutalCount * e.Price; e.DealedCount = e.Count; e.Status = 1; entrust.Status = 2; mr.UpdateEntrust(e); dealedAmount += amount; } var user = ur.Get(e.UserId); if (user != null) { user.FrozenScore -= amount; user.TotalScore -= amount; ur.Update(user); var uup = ur.GetProductByUser(e.ProductId, e.UserId); //uup.FrozenCount -= acutalCount; uup.TotalCount += acutalCount; ur.UpdateUserProduct(uup); var score = new UserScore { TypeId = (int)ScoreType.购买, UserId = user.Id, ChargeFee = 0, Score = amount, CreateTime = DateTime.Now, Status = 1, UserPath = user.RefUserPath }; new UserScoreRepository().Create(score); } var tbuy = new Transaction { Count = acutalCount, IsBuy = true, UserId = e.UserId, CreateTime = DateTime.Now, Date = DateTime.Today, Price = e.Price, ProductId = e.ProductId, ChargeFee = 0, TransactionId = tid }; var tsell = new Transaction { Count = acutalCount, IsBuy = false, UserId = entrust.UserId, CreateTime = DateTime.Now, Date = DateTime.Today, Price = e.Price, ProductId = e.ProductId, ChargeFee = 0, TransactionId = tid }; mr.CreateTransaction(tbuy); mr.CreateTransaction(tsell); } mr.UpdateEntrust(entrust); } #endregion if (dealedCount > 0) { var score = new UserScore { TypeId = (int)ScoreType.出售, UserId = CurrentUser.Id, ChargeFee = 0, Score = dealedAmount, CreateTime = DateTime.Now, Status = 1, UserPath = CurrentUser.RefUserPath }; new UserScoreRepository().Create(score); up.FrozenCount -= dealedCount; up.TotalCount -= dealedCount; ur.UpdateUserProduct(up); ur.Update(CurrentUser); RefreshCurrentUser(); } } break; case "REVOKE": { int eid = int.Parse(Request.Form["eid"]); var e = mr.GetEntrustById(eid); //解冻用户委托金额 if (e.IsBuy) { CurrentUser.FrozenScore -= (e.Count - e.DealedCount) * e.Price; ur.Update(CurrentUser); RefreshCurrentUser(); } //冻结用户委托产品 else { var up = ur.GetProductsByUser(CurrentUser.Id).First(p => p.ProductId == e.ProductId); up.FrozenCount += (e.Count - e.DealedCount); ur.UpdateUserProduct(up); } mr.CancelEntrust(e); if (Request.IsAjaxRequest()) { return(Content("1")); } } break; default: break; } return(RedirectToAction("Detail", new { id = id })); }