Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }