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(); } }
/// <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); }
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>(); }
private static void UpdateReservedQTY(SecKillEntity countdownItem) { SecKillDA.UpdateInventoryAvailabeQty(countdownItem.ProductSysNo, countdownItem.CountDownQty); foreach (var item in countdownItem.WarehouseList) { SecKillDA.UpdateInventoryStockAvailabeQty(item); } }
public static SecKillEntity GetCountDownItemBySysno(int countdownSysNo) { DataCommand command = DataCommandManager.GetDataCommand("GetCountDownItem4SecKillbySysNo"); command.SetParameterValue("@SysNo", countdownSysNo); SecKillEntity entity = command.ExecuteEntity<SecKillEntity>(); return entity; }
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>(); }
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); }
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); } }
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); } }
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(); } }
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); } }
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 + ";"; } } } } }
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); }