Пример #1
0
        private static void SetAbandon(int countdownSysNo)
        {
            //必须是Ready或者VerifyFaild状态
            SecKillEntity entity = SecKillDA.GetCountDownItemBySysno(countdownSysNo);

            if (entity.Status != (int)CountdownStatus.Ready && entity.Status != (int)CountdownStatus.VerifyFaild)
            {
                throw new BusinessException("the current status not allow such opertion");
            }

            int SysNo = SecKillDA.GetProductNotAutoSetVirtualKey(entity.ProductSysNo
                                                                 , (int)NotAutoSetVirtualType.CountDown, entity.SysNo);

            entity.Status = (int)CountdownStatus.Abandon;
            TransactionOptions transactionOptions = new TransactionOptions();

            transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
            {
                if (entity.IsReservedQty == 1)
                {
                    UpdateReservedQTY(entity);
                }
                SetVirtualQty_WhenCountDownAbandon(entity, SysNo);
                if (entity.IsPromotionSchedule == 1)
                {
                    SecKillDA.RollbackMaxPerOrder(entity.ProductSysNo);
                }
                SecKillDA.CountDownEndReleaseWithholdQty(entity.SysNo);
                SecKillDA.UpdateCountdownStatus(entity);
                SecKillDA.UpdateProduct_Ex(entity.ProductSysNo, string.Empty);
                ts.Complete();
            }
        }
Пример #2
0
        /// <summary>
        /// 运行完毕,归还总仓和分仓的虚拟仓库为活动前的虚拟仓库数量
        /// </summary>
        /// <param name="countDown"></param>
        private static void BatchUpdateStockVirtual_AfterRun(SecKillEntity countDown)
        {
            string snapShotCurrentVirtualQty = null;

            if ((!string.IsNullOrWhiteSpace(countDown.SnapShotCurrentVirtualQty)))
            {
                if (countDown.SnapShotCurrentVirtualQty.Trim().Length > 0)
                {
                    snapShotCurrentVirtualQty = countDown.SnapShotCurrentVirtualQty.Trim();
                }
                string[] InfoArray = snapShotCurrentVirtualQty.Substring(0, snapShotCurrentVirtualQty.Length - 1).Split(';');

                Hashtable InfoHt = new Hashtable(10);
                for (int i = 0; i < InfoArray.Length; i++)
                {
                    InfoHt.Add(InfoArray[i].Split(':')[0], string.IsNullOrWhiteSpace(InfoArray[i].Split(':')[1]) ? "0" : InfoArray[i].Split(':')[1]);//注:InfoHt(stocksysno,virtualQty)
                }
                foreach (string key in InfoHt.Keys)
                {
                    object VirtualQty = InfoHt[key];
                    SecKillDA.UpdateInventory_Stock(Convert.ToInt32(VirtualQty), countDown.ProductSysNo, int.Parse(key));
                }
            }
            SecKillDA.UpdateInventory(countDown.AffectedVirtualQty, countDown.ProductSysNo);
        }
Пример #3
0
        public static SecKillEntity UpdateCountdown(SecKillEntity entity)
        {
            DataCommand command = DataCommandManager.GetDataCommand("UpdateCountdown");

            command.SetParameterValue("@SysNo", entity.SysNo);
            command.SetParameterValue("@ProductSysNo", entity.ProductSysNo);
            command.SetParameterValue("@StartTime", entity.StartTime);
            command.SetParameterValue("@EndTime", entity.EndTime);
            command.SetParameterValue("@CountDownCurrentPrice", entity.CountDownCurrentPrice);
            command.SetParameterValue("@CountDownCashRebate", entity.CountDownCashRebate);
            command.SetParameterValue("@CountDownPoint", entity.CountDownPoint);
            command.SetParameterValue("@CountDownQty", entity.CountDownQty);
            command.SetParameterValue("@SnapShotCurrentPrice", entity.SnapShotCurrentPrice);
            command.SetParameterValue("@SnapShotCashRebate", entity.SnapShotCashRebate);
            command.SetParameterValue("@SnapShotPoint", entity.SnapShotPoint);
            command.SetParameterValue("@AffectedVirtualQty", entity.AffectedVirtualQty);
            command.SetParameterValue("@Status", entity.Status);
            command.SetParameterValue("@AffectedStock", entity.AffectedStock);
            command.SetParameterValue("@Reasons", entity.Reasons);
            command.SetParameterValue("@SnapShotCurrentVirtualQty", entity.SnapShotCurrentVirtualQty);
            command.SetParameterValue("@IsCountDownAreaShow", entity.IsCountDownAreaShow);
            command.SetParameterValue("@PromotionType", entity.PromotionType);
            //command.SetParameterValue("@CompanyCode", entity.CompanyCode);        

            return command.ExecuteEntity<SecKillEntity>();
        }
Пример #4
0
 private static void UpdateReservedQTY(SecKillEntity countdownItem)
 {
     SecKillDA.UpdateInventoryAvailabeQty(countdownItem.ProductSysNo, countdownItem.CountDownQty);
     foreach (var item in countdownItem.WarehouseList)
     {
         SecKillDA.UpdateInventoryStockAvailabeQty(item);
     }
 }
Пример #5
0
        public static SecKillEntity GetCountDownItemBySysno(int countdownSysNo)
        {
            DataCommand command = DataCommandManager.GetDataCommand("GetCountDownItem4SecKillbySysNo");
            command.SetParameterValue("@SysNo", countdownSysNo);

            SecKillEntity entity = command.ExecuteEntity<SecKillEntity>();
            return entity;
        }
Пример #6
0
        public static SecKillEntity UpdateCountdownStatus(SecKillEntity entity)
        {
            DataCommand command = DataCommandManager.GetDataCommand("UpdateCountDownStatus");

            command.SetParameterValue("@SysNo", entity.SysNo);
            command.SetParameterValue("@Status", entity.Status);

            return command.ExecuteEntity<SecKillEntity>();
        }
Пример #7
0
        private static bool BatchUpdateStockVirtual_Run(SecKillEntity countdownItem, string snapShotOnlineQty)
        {
            if (string.IsNullOrWhiteSpace(countdownItem.AffectedStock))
            {
                return(true);
            }
            string Info = null;

            if (countdownItem.AffectedStock.Trim().Length > 0)
            {
                Info = countdownItem.AffectedStock.Trim();
            }
            string[]  InfoArray = Info.Substring(0, Info.Length - 1).Split(';');
            Hashtable InfoHt    = new Hashtable(10);

            for (int i = 0; i < InfoArray.Length; i++)
            {
                InfoHt.Add(InfoArray[i].Split(':')[0], InfoArray[i].Split(':')[1]);
            }
            foreach (string key in InfoHt.Keys)
            {
                object item = InfoHt[key];
                InventoryStockEntity instocklist = SecKillDA.GetInventoryStock(countdownItem.ProductSysNo, int.Parse(key));

                int AffectedVirtualQty;
                if (countdownItem.IsLimitedQty == 1)
                {
                    AffectedVirtualQty = instocklist.AvailableQty + instocklist.ConsignQty
                                         + instocklist.VirtualQty - Util.TrimIntNull(item);
                    if (AffectedVirtualQty < 0)
                    {
                        AffectedVirtualQty = 0;
                    }
                }
                else
                {
                    AffectedVirtualQty = 0;
                }
                bool bSuccess = SetInventorStockVirtualQty(int.Parse(key), countdownItem.ProductSysNo
                                                           , (-1) * AffectedVirtualQty, snapShotOnlineQty, Util.TrimIntNull(item));
                if (!bSuccess)
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #8
0
        private static void ProductNotAutoSetVirtualUpdate(ProductNotAutoSetVirtualEntity entity
                                                           , SecKillEntity oCountdown)
        {
            int ProductSysNo = entity.ProductSysNo;

            //作废禁设虚库记录
            SecKillDA.ProductNotAuto_SetVirtualUpdate(entity);

            if (!IsExistsNotAutoSetVirtual(ProductSysNo))
            {
                //更新总仓,分仓虚库数量
                //自动设虚库 20091214和shadow确认:先进行自动设虚库,在更改inventory的虚拟库存
                //SecKillDA.AotuSetStockVirtualQty(ProductSysNo);

                //把51+配置里的分仓的虚拟库存之和更新到inventory表的虚拟库存上
                //SecKillDA.Update_Inventory_VirtualQty(ProductSysNo);
            }
        }
Пример #9
0
        public static void SetVirtualQty_CountDownFinish(SecKillEntity countDown, int SysNo)
        {
            if (SysNo != -999 && SysNo > 0)
            {
                ProductNotAutoSetVirtualEntity entity = new ProductNotAutoSetVirtualEntity();

                entity.SysNo            = SysNo;
                entity.ProductSysNo     = countDown.ProductSysNo;
                entity.Note             = "CountDown  Interupted/Finished";
                entity.Status           = -1;
                entity.AbandonTime      = DateTime.Now;
                entity.AbandonUserSysNo = 493;
                entity.CountDownSysNo   = countDown.SysNo;
                SecKillDA.ProductNotAuto_SetVirtualUpdate(entity);
                //BatchUpdateStockVirtual_AfterRun(countDown);
                //ProductNotAutoSetVirtualUpdate(entity, countDown);
            }
        }
Пример #10
0
        public static void SetFinish(int countdownSysNo)
        {
            //必须是Running
            SecKillEntity oCountdown = SecKillDA.GetCountDownItemBySysno(countdownSysNo);

            if (oCountdown.Status != (int)CountdownStatus.Running)
            {
                throw new BusinessException("the current status not allow such opertion");
            }

            oCountdown.Status = (int)CountdownStatus.Finish;
            //edit by kathy 2009-12-10
            //先更改限时抢购的状态为完成,在调整相应的虚拟库存。
            //SetInventoryVirtualQty_whenCountdownItemIsRun 此job每五分钟会检测运行态的countdownitem:
            //inventory的virtualQty和inventory_stock的virtualQty之和是否相等,如果不等,把inventory的virtualQty更改成inventory_stock的virtualQty之和)


            ItemEntity itemPrice = SecKillDA.LoadItemPrice(oCountdown.ProductSysNo);

            itemPrice.CurrentPrice = oCountdown.SnapShotCurrentPrice;
            itemPrice.CashRebate   = oCountdown.SnapShotCashRebate;
            itemPrice.Point        = oCountdown.SnapShotPoint;
            //限时抢购完成更改虚库信息
            int SysNo = SecKillDA.GetProductNotAutoSetVirtualKey(oCountdown.ProductSysNo
                                                                 , (int)NotAutoSetVirtualType.CountDown, oCountdown.SysNo);
            TransactionOptions transactionOptions = new TransactionOptions();

            transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
            {
                SecKillDA.UpdateCountdown(oCountdown);
                SetVirtualQty_CountDownFinish(oCountdown, SysNo);

                SecKillDA.CountDownEndReleaseWithholdQty(oCountdown.SysNo);
                SecKillDA.UpdateItemPrice(itemPrice);
                SecKillDA.UpdateProduct_Ex(oCountdown.ProductSysNo, string.Empty);
                if (oCountdown.IsPromotionSchedule == 1)
                {
                    SecKillDA.RollbackMaxPerOrder(oCountdown.ProductSysNo);
                }
                ts.Complete();
            }
        }
Пример #11
0
        public static void SetVirtualQty_WhenCountDownAbandon(SecKillEntity countDown, int SysNo)
        {
            if (SysNo != -999 && SysNo > 0)
            {
                ProductNotAutoSetVirtualEntity entity = new ProductNotAutoSetVirtualEntity();

                entity.SysNo            = SysNo;
                entity.ProductSysNo     = countDown.ProductSysNo;
                entity.Note             = "CountDown  Abandon";
                entity.Status           = -1;
                entity.AbandonTime      = DateTime.Now;
                entity.AbandonUserSysNo = 493;
                entity.CountDownSysNo   = countDown.SysNo;

                //作废禁设虚库记录
                SecKillDA.ProductNotAuto_SetVirtualUpdate(entity);
                //更新总仓,分仓虚库数量
                //SecKillDA.UpdateInventoryVirtualQty(countDown.ProductSysNo);
                //SecKillDA.AotuSetStockVirtualQty(countDown.ProductSysNo);
            }
        }
Пример #12
0
 private static void IsCanRunningCountDown(List <InventoryStockEntity> Invstocklist, SecKillEntity countdownItem, out string curVirtualQty)
 {
     if (string.IsNullOrWhiteSpace(countdownItem.AffectedStock))
     {
         curVirtualQty = null;
         return;
     }
     curVirtualQty = "";
     string[] stock = countdownItem.AffectedStock.Split(';');
     for (int i = 0; i < stock.Length; i++)
     {
         string _stock = "";
         int    _qty   = 0;
         if (stock[i] != "")
         {
             _stock = stock[i].Split(':')[0];
             int.TryParse(stock[i].Split(':')[1], out _qty);
             foreach (InventoryStockEntity stockitem in Invstocklist)
             {
                 if (stockitem.StockSysNo.ToString() == _stock)
                 {
                     curVirtualQty += _stock + ":" + stockitem.VirtualQty + ";";
                 }
             }
         }
     }
 }
Пример #13
0
        private static bool SetRunning(int countdownSysNo)
        {
            //必须是Ready状态,切换价格和库存
            SecKillEntity countdownItem = SecKillDA.GetCountDownItemBySysno(countdownSysNo);

            if (countdownItem.Status != (int)CountdownStatus.Ready)
            {
                throw new BusinessException("不是就绪状态");
            }
            TransactionOptions transactionOptions = new TransactionOptions();

            transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
            {
                //最前端修改,不会影响其他逻辑
                if (countdownItem.IsReservedQty == 1)
                {
                    //这里改,更新库存.
                    UpdateReservedQTY(countdownItem);
                }

                countdownItem.Status = (int)CountdownStatus.Running;
                #region 设置限时抢购为原始价格并记录抢购价格//获取商品价格
                ItemEntity itemPrice = SecKillDA.LoadItemPrice(countdownItem.ProductSysNo);

                countdownItem.SnapShotCurrentPrice = itemPrice.CurrentPrice;
                countdownItem.SnapShotCashRebate   = itemPrice.CashRebate;
                countdownItem.SnapShotPoint        = itemPrice.Point;

                itemPrice.CurrentPrice = countdownItem.CountDownCurrentPrice;
                itemPrice.CashRebate   = countdownItem.CountDownCashRebate;
                itemPrice.Point        = countdownItem.CountDownPoint;

                #endregion

                InventoryEntity inventory = SecKillDA.GetInventoryByProductSysNo(countdownItem.ProductSysNo);
                countdownItem.AffectedVirtualQty = inventory.VirtualQty;

                //获取当前的分仓的虚库数量
                List <InventoryStockEntity> Invstocklist = SecKillDA.GetInventoryStock(countdownItem.ProductSysNo);
                StringBuilder stockonlineqty             = new StringBuilder();
                foreach (InventoryStockEntity itemStock in Invstocklist)
                {
                    stockonlineqty.Append(string.Format("{0}:{1};", itemStock.StockSysNo
                                                        , itemStock.AvailableQty + itemStock.ConsignQty + itemStock.VirtualQty));
                }

                //判断是否满足各分仓的OnlineQty>=各分仓的限时抢购数量
                //--逻辑已经修改,不满足分仓数量也可以限时抢购
                string curVirtualQty = string.Empty;
                IsCanRunningCountDown(Invstocklist, countdownItem, out curVirtualQty);
                countdownItem.SnapShotCurrentVirtualQty = curVirtualQty;

                #region   设置记录为不自动设置虚拟库存
                ProductNotAutoSetVirtualEntity oEntity = new ProductNotAutoSetVirtualEntity();
                oEntity.CountDownSysNo        = countdownSysNo;
                oEntity.CreateTime            = DateTime.Now;
                oEntity.CreateUserSysNo       = 493;
                oEntity.NotAutoSetVirtualType = (int)NotAutoSetVirtualType.CountDown;
                oEntity.Note         = "CountDown Run";
                oEntity.ProductSysNo = countdownItem.ProductSysNo;
                oEntity.Status       = 0;
                ProductNotAutoSetVirtualInsert(oEntity);

                #endregion

                #region  通过虚库控制库存 注释此间代码
                if (1 == 2)
                {
                    #region 获取当前商品总库信息
                    string curStockQty = string.Empty;
                    if (!BatchUpdateStockVirtual_Run(countdownItem, stockonlineqty.ToString()))
                    {
                        return(false);
                    }

                    List <InventoryStockEntity> inventoryStocklist = SecKillDA.GetInventoryStock(countdownItem.ProductSysNo);
                    //处理库存差额, 库存差额是为计算可用库存做准备的。最小为0,为0代表实际库存就是可卖库存。
                    int AffectedVirtualQty = 0;
                    foreach (InventoryStockEntity stock in inventoryStocklist)
                    {
                        AffectedVirtualQty += stock.VirtualQty;
                        curStockQty        += stock.StockSysNo + ":" + (stock.AvailableQty + stock.ConsignQty + stock.VirtualQty).ToString() + ";";
                    }

                    if (!(countdownItem.IsLimitedQty == 1 && countdownItem.IsReservedQty == 1))
                    {
                        countdownItem.AffectedStock = curStockQty;
                    }

                    #endregion

                    ////更改总仓虚库
                    //if (!SetVirtualQty(countdownItem.ProductSysNo, AffectedVirtualQty))
                    //{
                    //    return false;
                    //}
                    InventoryEntity inventory2 = SecKillDA.GetInventoryByProductSysNo(countdownItem.ProductSysNo);
                    if (countdownItem.IsLimitedQty == 0 && countdownItem.IsReservedQty == 0)
                    {
                        countdownItem.CountDownQty = inventory2.AvailableQty + inventory2.ConsignQty;// +inventory2.VirtualQty;
                    }
                    else if (countdownItem.IsLimitedQty == 0 &&
                             inventory2.AvailableQty + inventory2.ConsignQty + inventory2.VirtualQty != countdownItem.CountDownQty)
                    {
                        countdownItem.CountDownQty = inventory2.AvailableQty + inventory2.ConsignQty;// +inventory2.VirtualQty;
                    }
                }
                #endregion
                SecKillDA.CountDownStartWithholdQty(countdownItem.SysNo);
                SecKillDA.UpdateCountdown(countdownItem);
                SecKillDA.UpdateItemPrice(itemPrice);
                if (countdownItem.IsPromotionSchedule == 1)
                {
                    SecKillDA.UpdateMaxPerOrder(countdownItem.ProductSysNo, countdownItem.MaxPerOrder);
                }
                if (!string.IsNullOrEmpty(countdownItem.PromotionType) && countdownItem.PromotionType.ToUpper() == "DC")
                {
                    SecKillDA.UpdateProduct_Ex(countdownItem.ProductSysNo, "DC");
                }
                ts.Complete();
            }
            return(true);
        }