public static void RunTask() { var pg = DataAccessor.GetPurchasingGoodsList(TaskType.All); var goodsIdList = pg.Select(w => w.GoodsId).Distinct().ToList(); IList <GoodsInfo> goodsList = _goodsCenterSao.GetGoodsListByGoodsIds(goodsIdList).ToList(); var warehouses = WMSSao.GetAllCanUseWarehouseDics(); foreach (var p in pg) { bool isRun; TaskType taskType; bool hasSaveLastPurchasingDate; int avgStockDays; DateTime nextStockDate; DateTime nextPurchasingDate; int step; GoodsInfo goodsInfo = goodsList.FirstOrDefault(w => w.GoodsId == p.GoodsId); if (goodsInfo == null) { continue; } p.GoodsName = goodsInfo.GoodsName; p.GoodsCode = goodsInfo.GoodsCode; p.Units = goodsInfo.Units; if (goodsInfo.ExpandInfo != null) { p.PackQuantity = goodsInfo.ExpandInfo.PackCount; } //计算报备日期是否匹配 CalculateStockDay(p, p.LastPurchasingDate, p.FilingDay, p.StockingDays, out isRun, out taskType, out avgStockDays, out nextStockDate, out step, out hasSaveLastPurchasingDate, out nextPurchasingDate); if (isRun) { Routine.DoPurchasing(p, goodsInfo, avgStockDays, nextStockDate, taskType, step, nextPurchasingDate, warehouses); } if (hasSaveLastPurchasingDate) { //记录最后的采购运行时间 DataAccessor.UpdateLastPurchasingDate(p.WarehouseId, p.HostingFilialeId, p.GoodsId, DateTime.Now); } } }
private static void PurchasingPromotion(Dictionary <PurchasingInfo, List <PurchasingDetailInfo> > dictPurchase, Dictionary <Guid, GoodsInfo> dicGoods, IList <PurchasingGoods> pg) { if (dictPurchase.Count > 0) { //IList<PurchaseSetInfo> purchaseSetList = _purchaseSetBll.GetPurchaseSetList(); foreach (KeyValuePair <PurchasingInfo, List <PurchasingDetailInfo> > keyValuePair in dictPurchase) { keyValuePair.Key.PurchasingNo = DataAccessor.GetCode(BaseInfo.CodeType.PH); var pInfo = keyValuePair.Key; IList <PurchasingDetailInfo> plist = keyValuePair.Value; //pInfo.IsOut = true; _purchasing.PurchasingInsert(pInfo); //非赠品采购商品 IList <PurchasingDetailInfo> plist2 = plist.Where(w => w.PurchasingGoodsType != (int)PurchasingGoodsType.Gift).ToList(); #region [现返] //如果赠送方式为总数量赠送时使用 key 主商品ID value 额外赠送 var dics = new Dictionary <string, int>(); //需赠送 var debitExtraDics = new Dictionary <string, int>(); //借计单已送 var addDetailsList = new List <PurchasingDetailInfo>(); //添加赠品 //处理原理: //赠品数量=原采购数量/(买几个+送几个)*送几个 //购买数量=原采购数量-赠品数量 foreach (var pdInfo in plist2) { var goodsBaseInfo = new GoodsInfo(); if (dicGoods != null) { bool hasKey = dicGoods.ContainsKey(pdInfo.GoodsID); if (hasKey) { goodsBaseInfo = dicGoods.FirstOrDefault(w => w.Key == pdInfo.GoodsID).Value; } } PurchasingGoods purchaseSetInfo = pg.FirstOrDefault(w => w.GoodsId == goodsBaseInfo.GoodsId && w.WarehouseId == pInfo.WarehouseID); if (purchaseSetInfo == null) { continue; } IList <PurchasePromotionInfo> ppList = _purchasePromotionBll.GetPurchasePromotionList(purchaseSetInfo.PromotionId, purchaseSetInfo.GoodsId, purchaseSetInfo.WarehouseId, pInfo.PurchasingFilialeId, (int)PurchasePromotionType.Back); PurchasePromotionInfo ppInfo = ppList.FirstOrDefault(w => w.GivingCount > 0 && w.StartDate <= DateTime.Now && w.EndDate >= DateTime.Now); if (ppInfo != null) { #region 新增 if (!ppInfo.IsSingle) //按商品总数量进行赠送 { if (!dics.ContainsKey(goodsBaseInfo.GoodsName)) { var dataList = plist2.Where(act => act.GoodsName == goodsBaseInfo.GoodsName).OrderByDescending(act => act.PlanQuantity).ToList(); //余数 var extra = dataList.Sum(act => Convert.ToInt32(act.PlanQuantity)) % (ppInfo.BuyCount + ppInfo.GivingCount); if (extra == ppInfo.BuyCount) { dataList[0].PlanQuantity += ppInfo.GivingCount; } else { //应赠送次数 int actquantity = extra % (ppInfo.BuyCount + ppInfo.GivingCount); if (actquantity >= (ppInfo.BuyCount / float.Parse("2.0"))) { dataList[0].PlanQuantity = dataList[0].PlanQuantity + (ppInfo.BuyCount + ppInfo.GivingCount) - actquantity; } } //总商品赠送商品总数 var sumTotal = dataList.Sum(act => Convert.ToInt32(act.PlanQuantity)) / (ppInfo.BuyCount + ppInfo.GivingCount); dics.Add(goodsBaseInfo.GoodsName, sumTotal); if (dics[goodsBaseInfo.GoodsName] > 0) { foreach (var item in dataList.OrderByDescending(act => act.PlanQuantity)) { var count = dics[item.GoodsName] - Convert.ToInt32(item.PlanQuantity); if (count > 0) //赠品数>购买数 { item.Price = 0; item.PurchasingGoodsType = (int)PurchasingGoodsType.Gift; item.RealityQuantity = 0; dics[item.GoodsName] = count; } else if (count < 0) { addDetailsList.Add(new PurchasingDetailInfo { PurchasingGoodsID = Guid.NewGuid(), PurchasingID = item.PurchasingID, GoodsID = item.GoodsID, GoodsName = item.GoodsName, GoodsCode = item.GoodsCode, Specification = item.Specification, CompanyID = item.CompanyID, Price = 0, PlanQuantity = dics[item.GoodsName], PurchasingGoodsType = (int)PurchasingGoodsType.Gift, RealityQuantity = 0, State = item.State, Description = "", Units = item.Units, SixtyDaySales = item.SixtyDaySales, ThirtyDaySales = item.ThirtyDaySales, ElevenDaySales = item.ElevenDaySales, CPrice = 0 }); item.RealityQuantity = 0; item.PlanQuantity = Math.Abs(count); dics[item.GoodsName] = 0; } else { item.Price = 0; item.PurchasingGoodsType = (int)PurchasingGoodsType.Gift; item.RealityQuantity = 0; item.CPrice = 0; dics[item.GoodsName] = 0; } if (dics[item.GoodsName] == 0) { break; } } } } } else //按单光度 { //应赠余数 var actquantity = pdInfo.PlanQuantity % (ppInfo.BuyCount + ppInfo.GivingCount); if (actquantity > 0) { if (actquantity >= ((ppInfo.BuyCount + ppInfo.GivingCount) / float.Parse("2.0"))) { pdInfo.PlanQuantity = pdInfo.PlanQuantity + (ppInfo.BuyCount + ppInfo.GivingCount) - actquantity; } } int pQuantity = int.Parse(pdInfo.PlanQuantity.ToString(CultureInfo.InvariantCulture)); //赠品数量=原采购数量/(买几个+送几个)*送几个 int quantity = pQuantity / (ppInfo.BuyCount + ppInfo.GivingCount) * ppInfo.GivingCount; if (quantity > 0) { var oldPurchasingDetailInfo = plist.FirstOrDefault(w => w.PurchasingGoodsID == pdInfo.PurchasingGoodsID); if (oldPurchasingDetailInfo != null) { //购买数量=原采购数量-赠品数量 oldPurchasingDetailInfo.PlanQuantity -= (quantity); } var purchasingDetailInfo = plist.FirstOrDefault(w => w.GoodsID == pdInfo.GoodsID && w.PurchasingGoodsType == (int)PurchasingGoodsType.Gift); if (purchasingDetailInfo != null) { //在原赠品数量累加 purchasingDetailInfo.PlanQuantity += (quantity); } else { purchasingDetailInfo = new PurchasingDetailInfo { PurchasingGoodsID = Guid.NewGuid(), PurchasingID = pInfo.PurchasingID, GoodsID = pdInfo.GoodsID, GoodsName = pdInfo.GoodsName, GoodsCode = pdInfo.GoodsCode, Specification = pdInfo.Specification, CompanyID = pdInfo.CompanyID, Price = 0, PlanQuantity = (quantity), PurchasingGoodsType = (int)PurchasingGoodsType.Gift, RealityQuantity = 0, State = 0, Description = "", Units = pdInfo.Units, SixtyDaySales = pdInfo.SixtyDaySales, ThirtyDaySales = pdInfo.ThirtyDaySales, ElevenDaySales = pdInfo.ElevenDaySales }; addDetailsList.Add(purchasingDetailInfo); } } } #endregion } } #endregion #region [非现返生成借记单] var debitNoteDetailList = new List <DebitNoteDetailInfo>(); foreach (var pdInfo in plist2) { var goodsBaseInfo = new GoodsInfo(); if (dicGoods != null) { bool hasKey = dicGoods.ContainsKey(pdInfo.GoodsID); if (hasKey) { goodsBaseInfo = dicGoods.FirstOrDefault(w => w.Key == pdInfo.GoodsID).Value; } } PurchasingGoods purchaseSetInfo = pg.FirstOrDefault(w => w.GoodsId == goodsBaseInfo.GoodsId && w.WarehouseId == pInfo.WarehouseID); if (purchaseSetInfo != null) { IList <PurchasePromotionInfo> ppList = _purchasePromotionBll.GetPurchasePromotionList(purchaseSetInfo.PromotionId, purchaseSetInfo.GoodsId, purchaseSetInfo.WarehouseId, pInfo.PurchasingFilialeId, (int)PurchasePromotionType.NoBack); PurchasePromotionInfo ppInfo = ppList.FirstOrDefault(w => w.GivingCount > 0 && w.StartDate <= DateTime.Now && w.EndDate >= DateTime.Now); if (ppInfo != null) { int pQuantity = Convert.ToInt32(pdInfo.PlanQuantity); //赠品数量=原采购数量/买几个*送几个 #region 新增 //按商品总数量进行赠送 if (!ppInfo.IsSingle && dicGoods != null) { if (!dics.ContainsKey(goodsBaseInfo.GoodsName)) { var dataList = plist2.Where(act => act.GoodsName == goodsBaseInfo.GoodsName).ToList(); //单光度赠送商品总数 var total = dataList.Sum(act => (Convert.ToInt32(act.PlanQuantity) / (ppInfo.BuyCount + ppInfo.GivingCount))); //总商品赠送商品总数 var sumTotal = dataList.Sum(act => Convert.ToInt32(act.PlanQuantity)) / (ppInfo.BuyCount + ppInfo.GivingCount); if (sumTotal > total) { dics.Add(goodsBaseInfo.GoodsName, sumTotal); } } } #endregion int quantity = pQuantity / ppInfo.BuyCount * ppInfo.GivingCount; if (quantity > 0) { var debitNoteDetailInfo = new DebitNoteDetailInfo { PurchasingId = pInfo.PurchasingID, GoodsId = pdInfo.GoodsID, GoodsName = pdInfo.GoodsName, Specification = pdInfo.Specification, GivingCount = quantity, ArrivalCount = 0, Price = pdInfo.Price, State = 0, Amount = quantity * pdInfo.Price, Memo = "", Id = Guid.NewGuid() }; debitNoteDetailList.Add(debitNoteDetailInfo); } } } } if (addDetailsList.Count > 0) { foreach (var purchasingDetailInfo in addDetailsList) { purchasingDetailInfo.Price = 0; plist.Add(purchasingDetailInfo); } } #endregion #region 处理额外赠送商品 foreach (var dic in dics) { KeyValuePair <string, int> dic1 = dic; if (debitExtraDics.ContainsKey(dic.Key)) { var total = dic1.Value - debitExtraDics[dic.Key]; if (total > 0) { var data = debitNoteDetailList.Where(act => act.GoodsName == dic1.Key).OrderByDescending(act => act.GivingCount).ToList(); for (int i = 0; i < total; i++) { data[i].GivingCount += 1; data[i].Amount = data[i].Price * data[i].GivingCount; } } } } #endregion foreach (var item in plist.Where(act => act.Price == 0 && act.PurchasingGoodsType != (int)PurchasingGoodsType.Gift)) { var info = plist.FirstOrDefault(act => act.GoodsName == item.GoodsName && act.Price > 0); item.Price = info != null ? info.Price : 0; } //保存采购单明细 _purchasingDetailBll.Save(plist); //添加借记单 if (debitNoteDetailList.Count > 0) { var debitNoteInfo = new DebitNoteInfo { PurchasingId = pInfo.PurchasingID, PurchaseGroupId = pInfo.PurchaseGroupId, PurchasingNo = pInfo.PurchasingNo, CompanyId = pInfo.CompanyID, PresentAmount = debitNoteDetailList.Sum(w => w.Amount), CreateDate = DateTime.Now, FinishDate = DateTime.MinValue, State = (int)DebitNoteState.ToPurchase, WarehouseId = pInfo.WarehouseID, Memo = "", PersonResponsible = pInfo.PersonResponsible, NewPurchasingId = Guid.Empty }; _debitNoteBll.AddPurchaseSetAndDetail(debitNoteInfo, debitNoteDetailList); } } if (dicGoods != null && dicGoods.Count > 0) { var completeGoodsIds = dicGoods.Select(keyValuePair => keyValuePair.Value.GoodsId).ToList(); foreach (var item in pg.Where(ent => completeGoodsIds.Contains(ent.GoodsId))) { DataAccessor.UpdateLastPurchasingDate(item.WarehouseId, item.HostingFilialeId, item.GoodsId, DateTime.Now); } } } }
private static void CalculateStockDay(PurchasingGoods p, DateTime lastPurchasingDate, int filingDay, int stockDays, out bool isRun, out TaskType taskType, out int avgStockDays, out DateTime nextStockDate, out int step, out bool saveLastPurchasingDate, out DateTime nextPurchasingDate) { nextPurchasingDate = DateTime.MinValue; step = 0; isRun = false; taskType = TaskType.Routine; saveLastPurchasingDate = false; var addMonths = 3; if (stockDays == 30) { addMonths = 1; } else if (stockDays == 60) { addMonths = 2; } int nowDay = DateTime.Now.Day; avgStockDays = Convert.ToInt32(Math.Ceiling((double)stockDays / 4)); //计算出上一次虚拟的报备时间 if (lastPurchasingDate == DateTime.MinValue) { if (nowDay > filingDay) { lastPurchasingDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-") + filingDay); } else if (nowDay <= filingDay) { lastPurchasingDate = DateTime.Parse(DateTime.Now.AddMonths(-addMonths).ToString("yyyy-MM-") + filingDay); } //记录最后的采购运行时间 DataAccessor.UpdateLastPurchasingDate(p.WarehouseId, p.HostingFilialeId, p.GoodsId, lastPurchasingDate.Date); } //计算报备周期的天数间隔,并平均四等分 nextStockDate = lastPurchasingDate.AddMonths(addMonths); //开始匹配四次备货的时间 if (DateTime.Now.ToShortDateString() == lastPurchasingDate.AddDays(avgStockDays).ToShortDateString()) { nextPurchasingDate = DateTime.Now.AddDays(avgStockDays); taskType = TaskType.Warning; isRun = true; step = 2; } else if (DateTime.Now.ToShortDateString() == lastPurchasingDate.AddDays(avgStockDays * 2).ToShortDateString()) { nextPurchasingDate = DateTime.Now.AddDays(avgStockDays * 2); taskType = TaskType.Routine; isRun = true; step = 3; } else if (DateTime.Now.ToShortDateString() == lastPurchasingDate.AddDays(avgStockDays * 3).ToShortDateString()) { nextPurchasingDate = nextStockDate; taskType = TaskType.Warning; isRun = true; step = 4; } else if ((DateTime.Now - nextStockDate).Days == 0) { nextPurchasingDate = DateTime.Now.AddDays(avgStockDays); taskType = TaskType.Routine; isRun = true; saveLastPurchasingDate = true; nextStockDate = DateTime.Now.AddMonths(addMonths); step = 1; } //else if ((DateTime.Now - nextStockDate).Days > 0) //{ // var tempDay = p.FilingDay; // while (DateTime.Now.Day > tempDay) // { // tempDay += avgStockDays; // } // var tempDate = DateTime.Parse(DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + tempDay); // nextPurchasingDate = tempDate; // taskType = TaskType.Routine; // isRun = true; // saveLastPurchasingDate = true; // nextStockDate = DateTime.Now.AddMonths(addMonths); // step = 1; //} }