private bool Valid(Packages package, Preset preset) { List <Items> itemList = package.Items.Where(i => i.IsEnable.Value).ToList(); List <Skus> skuList = itemList.Select(i => i.Skus).ToList(); int zipCode; Dictionary <string, StockKeepingUnit.SkuData> SkuData = new Dictionary <string, StockKeepingUnit.SkuData>(); if (!preset.Weight.Equals(0)) { using (StockKeepingUnit stock = new StockKeepingUnit()) { var IDs = itemList.Select(i => i.ProductID).Distinct().ToArray(); SkuData = stock.GetSkuData(IDs); } } bool total = preset.Total.Equals(0) || Compare(preset.TotalType, preset.Total, itemList.Sum(i => i.Qty * i.UnitPrice).Value); bool country = string.IsNullOrEmpty(preset.Country) || preset.Country.Equals(Order.Addresses.CountryCode); bool state = string.IsNullOrEmpty(preset.State) || preset.State.Equals(Order.Addresses.StateCode); bool zipCodeFrom = preset.ZipCodeFrom.Equals(0) || (int.TryParse(Order.Addresses.PostalCode, out zipCode) && preset.ZipCodeFrom <= int.Parse(Order.Addresses.PostalCode)); bool zipCodeTo = preset.ZipCodeTo.Equals(0) || (int.TryParse(Order.Addresses.PostalCode, out zipCode) && preset.ZipCodeTo >= int.Parse(Order.Addresses.PostalCode)); bool company = preset.CompanyID.Equals(0) || preset.CompanyID.Equals(Order.CompanyID.Value); bool source = preset.SourceID.Equals(0) || preset.SourceID.Equals(Order.OrderSource.Value + 1); bool qty = preset.Amount.Equals(0) || Compare(preset.AmountType, preset.Amount, itemList.Sum(i => i.Qty).Value); bool method = string.IsNullOrEmpty(preset.ShippingMethod) || preset.ShippingMethod.Equals(Order.ShippingServiceSelected); bool sku = string.IsNullOrEmpty(preset.Sku) || itemList.Any(i => i.ProductID.Equals(preset.Sku)); bool suffix = string.IsNullOrEmpty(preset.Suffix) || itemList.Any(i => i.ProductID.Substring(i.ProductID.Length - preset.Suffix.Length).Equals(preset.Suffix)); bool productType = preset.ProductType.Equals(0) || skuList.Any(s => s.ProductTypeID.Value.Equals(preset.ProductType)); bool brand = preset.ProductType.Equals(0) || skuList.Any(s => s.Brand.Value.Equals(preset.Brand)); bool battery = !preset.Battery.HasValue || skuList.Any(s => s.Battery.Value.Equals(preset.Battery.Value)); bool weight = preset.Weight.Equals(0) || Compare(preset.WeightType, preset.Weight, itemList.Sum(i => i.Qty * (SkuData.ContainsKey(i.ProductID) ? SkuData[i.ProductID].Weight : i.Skus.ShippingWeight)).Value); bool checkStock = !(preset.CheckSkuStock ?? false); if (!checkStock) { checkStock = true; using (StockKeepingUnit stock = new StockKeepingUnit()) { foreach (Items item in itemList) { stock.SetItemData(item.ID); checkStock &= (stock.CheckInventory() >= item.Qty); } } } return(total && country && state && zipCodeFrom && zipCodeTo && company && source && method && sku && suffix && productType && brand && battery && weight && checkStock); }
public string Update_PurchaseOrder(int PackageID, bool needUpload = true) { string Message = ""; Packages package = db.Packages.Find(PackageID); try { MyHelp.Log("Orders", package.OrderID, string.Format("訂單包裹 - PO【{0}】更新", package.POId), Session); try { using (StockKeepingUnit stock = new StockKeepingUnit()) { if (package.POId.HasValue) { stock.CreatePO(package.ID); } stock.RecordShippedOrder(package.ID); MyHelp.Log("Inventory", package.OrderID, string.Format("訂單【{0}】傳送出貨資料至PO系統", package.OrderID), Session); } } catch (Exception e) { string errorMsg = string.Format("傳送出貨資料至PO系統失敗,請通知處理人員:{0}", e.InnerException != null ? e.InnerException.Message.Trim() : e.Message.Trim()); MyHelp.Log("Inventory", package.OrderID, string.Format("訂單【{0}】{1}", package.OrderID, errorMsg), Session); } MyHelp.Log("Orders", package.OrderID, string.Format("訂單包裹 - PO【{0}】更新完成", package.POId), Session); if (needUpload) { Message = Update_Tracking(package); } } catch (Exception e) { MyHelp.ErrorLog(e, string.Format("PO【{0}】更新失敗", package.POId), package.OrderID.ToString()); Message = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message; } return(Message); }
public string Sync_Orders(int day) { string Message = ""; try { MyHelp.Log("Orders", null, string.Format("同步{0}天訂單資料", day), Session); if (!SCWS.Is_login) { throw new Exception("SC is not logged in!"); } OrderStateInfo[] SC_OrderStateInfoList = SCWS.Search_Order(Today.AddDays(-day), Today); if (!SC_OrderStateInfoList.Any()) { throw new Exception("Not found order!"); } List <Orders> orderList = Orders.GetAll(true).Where(o => SC_OrderStateInfoList.Select(info => info.ID).ToArray().Contains(o.OrderID)).ToList(); List <Order> SC_Orders = new List <Order>(); List <int> presetList = new List <int>(); int[] dropshipWarehouse = db.Warehouses.Where(w => w.IsEnable.Value && w.WarehouseType.Value.Equals((int)WarehouseTypeType.DropShip)).Select(w => w.ID).ToArray(); List <OrderSerialNumber> SC_SerialNumbers = new List <OrderSerialNumber>(); int[] ignoreOrderIDs = new int[] { }; foreach (OrderStateInfo orderStateInfo in SC_OrderStateInfoList.Where(o => o.DropShipStatus == DropShipStatusType2.None && !ignoreOrderIDs.Contains(o.ID))) { OrderData order = SCWS.Get_OrderData(orderStateInfo.ID); SC_Orders.Add(order.Order); if (!orderList.Any(o => o.OrderID.Equals(orderStateInfo.ID))) { Addresses address = new Addresses() { IsEnable = true }; Addresses.Create(address); Addresses.SaveChanges(); orderData = new Orders() { OrderID = orderStateInfo.ID, ShippingAddress = address.Id, eBayUserID = order.User.eBayUserID }; Orders.Create(orderData); Orders.SaveChanges(); orderList.Add(orderData); SC_SerialNumbers.AddRange(order.Serials); presetList.Add(orderData.OrderID); } else { if (orderList.Any(o => o.OrderID.Equals(orderStateInfo.ID) && (!o.StatusCode.Equals((int)OrderStatusCode.InProcess) || !o.PaymentStatus.Equals((int)OrderPaymentStatus1.Charged)))) { if (orderStateInfo.StatusCode.Equals(OrderStatusCode.InProcess) && orderStateInfo.PaymentStatus.Equals(OrderPaymentStatus1.Charged)) { presetList.Add(order.Order.ID); } } if (db.Packages.AsNoTracking().Any(p => p.IsEnable.Value && p.OrderID.Value.Equals(orderStateInfo.ID) && !p.ProcessStatus.Equals((byte)EnumData.ProcessStatus.待出貨) && !p.ProcessStatus.Equals((byte)EnumData.ProcessStatus.保留中))) { if (db.Items.AsNoTracking().Any(i => i.IsEnable.Value && i.OrderID.Value.Equals(orderStateInfo.ID) && !(dropshipWarehouse.Contains(i.ShipFromWarehouseID.Value) && i.SerialNumbers.Any()))) { SC_SerialNumbers.AddRange(order.Serials); } } } } List <Orders> orderDatas = orderList.Where(o => SC_Orders.Select(order => order.ID).Contains(o.OrderID)).ToList(); Check_Order(orderDatas, SC_Orders); Orders.SaveChanges(); List <Payments> paymentDatas = orderDatas.SelectMany(o => o.Payments.Where(p => p.IsEnable.Equals(true))).ToList(); Check_Payment(paymentDatas, SC_Orders.SelectMany(o => o.Payments).ToList()); Orders.SaveChanges(); int[] PackageIDs = SC_Orders.SelectMany(o => o.Items).Select(i => i.PackageID).Distinct().ToArray(); List <Packages> packageDatas = orderDatas.SelectMany(o => o.Packages.Where(p => p.IsEnable.Equals(true))).ToList(); Check_Package(packageDatas, SC_Orders.SelectMany(o => o.Packages).Where(p => PackageIDs.Contains(p.ID)).ToList()); Orders.SaveChanges(); List <Items> itemDatas = packageDatas.SelectMany(p => p.Items.Where(i => i.IsEnable.Equals(true))).ToList(); Check_Item(itemDatas, SC_Orders.SelectMany(o => o.Items).ToList()); Orders.SaveChanges(); int[] OrderIDs = packageDatas.Where(p => !p.ProcessStatus.Equals((byte)EnumData.ProcessStatus.待出貨) && !p.ProcessStatus.Equals((byte)EnumData.ProcessStatus.保留中)) .SelectMany(p => p.Items.Where(i => !dropshipWarehouse.Contains(i.ShipFromWarehouseID.Value))).Select(i => i.OrderID.Value).ToArray(); List <SerialNumbers> serialNumberDatas = SerialNumbers.GetAll().Where(serial => OrderIDs.Contains(serial.OrderID.Value)).ToList(); Check_Serial(serialNumberDatas, SC_SerialNumbers); Orders.SaveChanges(); foreach (OrderStateInfo orderStateInfo in SC_OrderStateInfoList.Where(o => o.DropShipStatus != DropShipStatusType2.None)) { if (orderList.Any(o => o.OrderID.Equals(orderStateInfo.ID))) { orderStateInfo.StatusCode = OrderStatusCode.Completed; orderData = orderList.First(o => o.OrderID.Equals(orderStateInfo.ID)); Update_OrderState(orderData, orderStateInfo); Orders.Update(orderData); } } Orders.SaveChanges(); MyHelp.Log("Orders", null, "訂單資料同步完成", Session); if (presetList.Any()) { using (OrderPreset preset = new OrderPreset(Session)) { preset.Factory = this.Factory; using (StockKeepingUnit Stock = new StockKeepingUnit()) { foreach (int OrderID in presetList) { preset.Init(OrderID); preset.Save(); try { Stock.RecordOrderSkuStatement(OrderID, "New"); Stock.OrderSyncPush(OrderID); } catch (Exception e) { string errorMsg = string.Format("傳送訂單狀態至PO系統失敗,請通知處理人員:{0}", e.InnerException != null ? e.InnerException.Message.Trim() : e.Message.Trim()); MyHelp.Log("SkuStatement", OrderID, string.Format("訂單【{0}】{1}", OrderID, errorMsg), Session); } } } } } } catch (DbEntityValidationException ex) { var errorMessages = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage); Message = string.Join("; ", errorMessages); } catch (Exception e) { MyHelp.ErrorLog(e, string.Format("同步{0}天訂單資料失敗", day)); Message = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message; } return(Message); }