Exemplo n.º 1
0
        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 }));
        }