示例#1
0
        public BoxManage(HttpSessionStateBase session)
        {
            db = new QDLogisticsEntities();

            TimeZoneConvert = new TimeZoneConvert();
            Session         = session;
        }
示例#2
0
        public ActionResult AjaxWaitingData(DataFilter filter, int page = 1, int rows = 100)
        {
            int           warehouseID = 0, total = 0;
            List <object> dataList = new List <object>();

            if (int.TryParse(Session["warehouseId"].ToString(), out warehouseID))
            {
                Warehouses = new GenericRepository <Warehouses>(db);
                Warehouses warehouse = Warehouses.Get(warehouseID);
                if (warehouse != null && warehouse.WarehouseType.Equals((int)WarehouseTypeType.DropShip))
                {
                    /** Order Filter **/
                    var OrderFilter = db.Orders.AsNoTracking().Where(o => !o.StatusCode.Value.Equals((int)OrderStatusCode.Completed) && o.PaymentStatus.Value.Equals((int)OrderPaymentStatus2.Charged));
                    /** Shipping Method Filter **/
                    var MethodFilter             = db.ShippingMethod.AsNoTracking().Where(m => m.IsEnable && !m.IsDirectLine);
                    List <OrderJoinData> results = DataFilter(filter, OrderFilter, MethodFilter, EnumData.ProcessStatus.待出貨, warehouseID);
                    if (results.Any())
                    {
                        TimeZoneConvert   timeZoneConvert = new TimeZoneConvert();
                        EnumData.TimeZone TimeZone        = MyHelp.GetTimeZone((int)Session["TimeZone"]);

                        int length = rows;
                        int start  = (page - 1) * length;
                        total   = results.Count();
                        results = results.OrderByDescending(oData => oData.order.TimeOfOrder).Skip(start).Take(length).ToList();

                        string[] skus = results.SelectMany(oData => oData.items.Select(i => i.ProductID)).Distinct().ToArray();
                        Dictionary <string, string> skuNameList = db.Skus.AsNoTracking().Where(s => s.IsEnable.Value && skus.Contains(s.Sku)).ToDictionary(s => s.Sku, s => s.ProductName);

                        int[] itemIDs = results.SelectMany(oData => oData.items.Select(i => i.ID)).ToArray();
                        Dictionary <int, string[]> serialOfItem = db.SerialNumbers.AsNoTracking().Where(s => itemIDs.Contains(s.OrderItemID)).GroupBy(s => s.OrderItemID).ToDictionary(s => s.Key, s => s.Select(ss => ss.SerialNumber).ToArray());

                        dataList.AddRange(results.Select(oData => new
                        {
                            OrderID         = oData.order.OrderID,
                            POId            = oData.package.POId,
                            PackageID       = oData.package.ID,
                            ItemID          = oData.item.ID,
                            PaymentDate     = oData.payment != null ? timeZoneConvert.InitDateTime(oData.payment.AuditDate.Value, EnumData.TimeZone.EST).ConvertDateTime(TimeZone).ToString("MM/dd/yyyy<br />hh:mm tt") : "",
                            Sku             = oData.itemCount == 1 ? oData.item.ProductID : "Multi",
                            DisplayName     = oData.itemCount == 1 ? skuNameList[oData.item.ProductID] : "Multi",
                            ItemCount       = oData.itemCount,
                            OrderQtyTotal   = oData.items.Sum(i => i.Qty),
                            ShippingCountry = oData.address.CountryName,
                            ShippingMethod  = oData.package.ShippingMethod.Value,
                            StatusCode      = Enum.GetName(typeof(OrderStatusCode), oData.order.StatusCode.Value),
                            Comment         = oData.package.Comment,
                            SupplierComment = string.IsNullOrEmpty(oData.package.SupplierComment) ? "" : oData.package.SupplierComment,
                            Serials         = oData.items.Where(i => serialOfItem.ContainsKey(i.ID)).ToDictionary(i => i.ID, i => serialOfItem[i.ID]),
                            SerialNumber    = oData.itemCount + oData.item.Qty == 2 ? (serialOfItem.ContainsKey(oData.item.ID) ? serialOfItem[oData.item.ID].First() : "") : "Multi",
                            TrackingNumber  = string.IsNullOrEmpty(oData.package.TrackingNumber) ? "" : oData.package.TrackingNumber,
                            POInvoice       = string.IsNullOrEmpty(oData.package.POInvoice) ? "" : oData.package.POInvoice
                        }));
                    }
                }
            }

            return(Content(JsonConvert.SerializeObject(new { total, rows = dataList }), "appllication/json"));
        }
示例#3
0
        internal PageList <OutboundOrderData> GetOutboundOrderDatas(string pageNum = "1", string pageSize = "100", int days = 7)
        {
            TimeZoneConvert timeZone  = new TimeZoneConvert();
            DateTime        endDate   = timeZone.ConvertDateTime(QDLogistics.Commons.EnumData.TimeZone.TST);
            DateTime        startDate = endDate.AddDays(-days);

            var data = new
            {
                dateOrderedStartDate = startDate.ToString("yyyy-MM-dd"),
                dateOrderedEndDate   = endDate.ToString("yyyy-MM-dd"),
                status = "valid",
                pageSize,
                pageNum
            };

            return(GetAPI <PageList <OutboundOrderData> >("queryOutboundOrderList", data));
        }
示例#4
0
        public OrderResponse Create(Packages package)
        {
            Addresses address = package.Orders.Addresses;

            Dictionary <string, StockKeepingUnit.SkuData> SkuData;

            using (StockKeepingUnit stock = new StockKeepingUnit())
            {
                var IDs = package.Items.Where(i => i.IsEnable.Value).Select(i => i.ProductID).Distinct().ToArray();
                SkuData = stock.GetSkuData(IDs);
            }

            DateTime pickup_date = new TimeZoneConvert().ConvertDateTime(QDLogistics.Commons.EnumData.TimeZone.AEST);
            decimal  weight      = package.Items.Where(i => i.IsEnable.Value).Sum(i => (i.Qty.Value * (decimal)(SkuData[i.ProductID]?.Weight ?? i.Skus.ShippingWeight)) / 1000);

            OrderRequest request = new OrderRequest()
            {
                pickup_date        = MyHelp.SkipWeekend(pickup_date.AddDays(2)).ToString("yyyy-MM-dd"),
                description        = "Merchandise",
                kilogram_weight    = weight.ToString(),
                customer_reference = package.OrderID.Value.ToString(),
                sender             = SetSender(),
                receiver           = new AddressDetail()
                {
                    instructions = weight > 0.5M ? "Must have signature on delivery. Thank you!" : null,
                    contact      = new Contact()
                    {
                        name    = string.Join(" ", new string[] { address.FirstName, address.MiddleInitial, address.LastName }),
                        phone   = address.PhoneNumber,
                        company = address.CompanyName
                    },
                    address = new Address()
                    {
                        address_line1 = address.StreetLine1,
                        address_line2 = address.StreetLine2,
                        suburb        = address.City,
                        postcode      = address.PostalCode,
                        state_name    = address.StateName,
                        country       = address.CountryName
                    }
                }
            };

            return(Request <OrderResponse>("orders", "POST", request));
        }
示例#5
0
        protected virtual void Dispose(bool disposing)
        {
            if (Disposed)
            {
                return;
            }

            if (disposing)
            {
            }

            db.Dispose();
            db              = null;
            boxData         = null;
            TimeZoneConvert = null;
            Session         = null;
            Disposed        = true;
        }
示例#6
0
        public void CheckWorkDays(int OrderID)
        {
            int workDays    = 0;
            var order       = db.Orders.Find(OrderID);
            var paymentDate = new TimeZoneConvert(order.Payments.FirstOrDefault()?.AuditDate ?? order.TimeOfOrder.Value, EnumData.TimeZone.EST).Utc;
            var updateDate  = new DateTime(2019, 4, 24, 8, 1, 0, DateTimeKind.Utc);
            var checkPoint  = new DateTime(paymentDate.Year, paymentDate.Month, paymentDate.Day, 7, 0, 0, DateTimeKind.Utc);

            do
            {
                if (paymentDate.CompareTo(checkPoint) < 0)
                {
                    if (!checkPoint.DayOfWeek.Equals(DayOfWeek.Saturday) && !checkPoint.DayOfWeek.Equals(DayOfWeek.Sunday))
                    {
                        workDays++;
                    }
                }

                checkPoint = checkPoint.AddDays(1);
            } while (checkPoint.CompareTo(updateDate) < 0);
        }
示例#7
0
        private TrackResult DHL_Track(CarrierAPI api, string trackingNumber)
        {
            TrackResult result = new TrackResult();

            DHL_API          DHL        = new DHL_API(api);
            TrackingResponse DHL_Result = DHL.Tracking(trackingNumber);

            TimeZoneConvert timeZone = new TimeZoneConvert();

            if (DHL_Result != null && DHL_Result.AWBInfo.Any(awb => awb.ShipmentInfo != null && !string.IsNullOrEmpty(awb.ShipmentInfo.ConsigneeName)))
            {
                List <ShipmentEvent> DHL_EventList = DHL_Result.AWBInfo.First(awb => awb.ShipmentInfo != null && !string.IsNullOrEmpty(awb.ShipmentInfo.ConsigneeName)).ShipmentInfo.Items.Skip(1).Cast <ShipmentEvent>().ToList();

                if (DHL_EventList.Any())
                {
                    if (DHL_EventList.Any(e => e.ServiceEvent.EventCode == "PU"))
                    {
                        result.PickupDate     = DHL_EventList.Where(e => e.ServiceEvent.EventCode == "PU").Select(e => timeZone.InitDateTime(e.Date.Add(e.Time.TimeOfDay), EnumData.TimeZone.TST).Utc).First();
                        result.DeliveryStatus = (int)OrderService.DeliveryStatusType.Intransit;
                    }

                    result.DeliveryNote = DHL_EventList.Select(e => timeZone.InitDateTime(e.Date.Add(e.Time.TimeOfDay), EnumData.TimeZone.TST).Utc.ToString() + " " + e.ServiceEvent.Description).Last();

                    if (DHL_EventList.Any(e => e.ServiceEvent.EventCode == "OK"))
                    {
                        result.DeliveryDate   = DHL_EventList.Where(e => e.ServiceEvent.EventCode == "OK").Select(e => timeZone.InitDateTime(e.Date.Add(e.Time.TimeOfDay), EnumData.TimeZone.TST).Utc).First();
                        result.DeliveryStatus = (int)OrderService.DeliveryStatusType.Delivered;
                    }
                }
            }
            else
            {
                result.DeliveryNote = DHL_Result.AWBInfo.First().Status.ActionStatus;
                //result.DeliveryStatus = (int)OrderService.DeliveryStatusType.Delivered;
            }

            return(result);
        }
示例#8
0
        public Received SearchOrder(string pageNum = "1", string pageSize = "100", int days = 7)
        {
            TimeZoneConvert timeZone  = new TimeZoneConvert();
            DateTime        endDate   = timeZone.ConvertDateTime(QDLogistics.Commons.EnumData.TimeZone.TST);
            DateTime        startDate = endDate.AddDays(-days);

            queryOutboundOrderList_data data = new queryOutboundOrderList_data()
            {
                dateOrderedStartDate = startDate.ToString("yyyy-MM-dd"),
                dateOrderedEndDate   = endDate.ToString("yyyy-MM-dd"),
                status   = "valid",
                pageSize = pageSize,
                pageNum  = pageNum
            };

            queryOutboundOrderList request = _RequestInit <queryOutboundOrderList>("queryOutboundOrderList", JsonConvert.SerializeObject(data));

            request.data = data;

            Received result = Resfun.funresult(request, api_url);

            return(result);
        }
示例#9
0
        public void RecordOrderSkuStatement(int OrderID, string State)
        {
            Orders   order = db.Orders.Find(OrderID);
            DateTime Date  = DateTime.UtcNow;

            if (State.Equals("New"))
            {
                var paymentDate = order.PaymentDate.HasValue && !order.PaymentDate.Equals(DateTime.MinValue) ? order.PaymentDate : order.Payments.FirstOrDefault(p => p.IsEnable.Value && p.PaymentStatus.Value.Equals((int)PaymentStatus.Cleared))?.AuditDate;
                Date = new TimeZoneConvert(paymentDate ?? order.TimeOfOrder.Value, EnumData.TimeZone.EST).Utc;
            }

            MyHelp.Log("SkuStatement", OrderID, string.Format("State: {0}, Date: {1}", State, Date.ToString("yyyy-MM-dd HH:mm:ss")));

            List <dynamic> data = new List <dynamic>();

            data.AddRange(order.Items.Where(i => i.IsEnable.Value).Select(i => new
            {
                OrderID,
                SCID  = i.ShipFromWarehouseID.Value,
                SkuNo = i.ProductID.Split(splitChar)[0],
                Qty   = i.Qty.Value,
                State,
                Date = Date.ToString("yyyy-MM-dd HH:mm:ss")
            }).ToList());

            if (!data.Any())
            {
                throw new Exception("沒有找到任何資料");
            }

            Response <object> response = Request <object>("Ajax/OrderLogList", "post", data);

            if (!response.status)
            {
                throw new Exception("PO Error: " + response.message);
            }
        }
示例#10
0
        public ActionResult GetOrderData(DataFilter filter, int page = 1, int rows = 100)
        {
            int           total    = 0;
            List <object> dataList = new List <object>();

            /** Order Filter **/
            var OrderFilter = db.Orders.AsNoTracking().AsQueryable();

            if (!filter.StatusCode.Equals(null))
            {
                OrderFilter = OrderFilter.Where(o => o.StatusCode.Value.Equals(filter.StatusCode.Value));
            }
            if (!string.IsNullOrWhiteSpace(filter.OrderID))
            {
                OrderFilter = OrderFilter.Where(o => o.OrderID.ToString().Equals(filter.OrderID) || (o.OrderSource.Value.Equals(1) && (o.eBaySalesRecordNumber.Equals(filter.OrderID) || o.OrderSourceOrderId.Contains(filter.OrderID))) || (!o.OrderSource.Value.Equals(1) && o.OrderSourceOrderId.Contains(filter.OrderID)));
            }
            if (!string.IsNullOrWhiteSpace(filter.UserID))
            {
                OrderFilter = OrderFilter.Where(o => o.eBayUserID.Contains(filter.UserID));
            }
            if (!filter.CurrencyCode.Equals(null))
            {
                OrderFilter = OrderFilter.Where(o => o.OrderCurrencyCode.Value.Equals(filter.CurrencyCode.Value));
            }

            /** Package Filter **/
            var PackageFilter = db.Packages.AsNoTracking().Where(p => p.IsEnable.Value);

            if (!filter.ProccessStatus.Equals(null))
            {
                PackageFilter = PackageFilter.Where(p => p.ProcessStatus.Equals(filter.ProccessStatus.Value));
            }
            if (!filter.DeclaredTotal.Equals(0))
            {
                PackageFilter = PackageFilter.Where(p => p.DeclaredTotal.Equals(filter.DeclaredTotal));
            }

            /** Item Filter **/
            var ItemFilter = db.Items.AsNoTracking().Where(i => i.IsEnable.Value);

            if (!string.IsNullOrWhiteSpace(filter.Sku))
            {
                ItemFilter = ItemFilter.Where(i => i.ProductID.ToLower().Contains(filter.Sku.ToLower()));
            }
            if (!string.IsNullOrWhiteSpace(filter.ItemName))
            {
                ItemFilter = ItemFilter.Where(i => i.DisplayName.ToLower().Contains(filter.ItemName.ToLower()));
            }

            /** Address Filter **/
            var AddressFilter = db.Addresses.AsNoTracking().Where(a => a.IsEnable.Value);

            if (!string.IsNullOrWhiteSpace(filter.CountryCode))
            {
                AddressFilter = AddressFilter.Where(a => a.CountryCode.Equals(filter.CountryCode));
            }

            var results = OrderFilter.ToList()
                          .Join(PackageFilter, o => o.OrderID, p => p.OrderID, (o, p) => new OrderJoinData()
            {
                order = o, package = p
            })
                          .Join(ItemFilter.GroupBy(i => i.PackageID.Value), oData => oData.package.ID, i => i.Key, (oData, i) => new OrderJoinData(oData)
            {
                item = i.First(), items = i.ToList(), itemCount = i.Sum(ii => 1 + ii.KitItemCount).Value
            })
                          .Join(AddressFilter, oData => oData.order.ShippingAddress, a => a.Id, (oData, a) => new OrderJoinData(oData)
            {
                address = a
            });

            /** Payment Filter **/
            var PaymentFilter = db.Payments.AsNoTracking().Where(p => p.IsEnable.Value);

            if (!filter.PaymentDate.Equals(new DateTime()))
            {
                DateTime dateFrom = new DateTime(filter.PaymentDate.Year, filter.PaymentDate.Month, filter.PaymentDate.Day, 0, 0, 0);
                dateFrom = new TimeZoneConvert(dateFrom, MyHelp.GetTimeZone((int)Session["TimeZone"])).ConvertDateTime(EnumData.TimeZone.EST);
                DateTime dateTo = new DateTime(filter.PaymentDate.Year, filter.PaymentDate.Month, filter.PaymentDate.Day + 1, 0, 0, 0);
                dateTo        = new TimeZoneConvert(dateTo, MyHelp.GetTimeZone((int)Session["TimeZone"])).ConvertDateTime(EnumData.TimeZone.EST);
                PaymentFilter = PaymentFilter.Where(p => DateTime.Compare(p.AuditDate.Value, dateFrom) >= 0 && DateTime.Compare(p.AuditDate.Value, dateTo) < 0);

                results = results.Join(PaymentFilter, oData => oData.order.OrderID, p => p.OrderID, (oData, p) => new OrderJoinData(oData)
                {
                    payment = p
                }).ToList();
            }
            else
            {
                results = results.GroupJoin(PaymentFilter, oData => oData.order.OrderID, p => p.OrderID.Value, (oData, pg) => new { orderJoinData = oData, payment = pg.OrderBy(p => p.PaymentStatus).OrderByDescending(p => p.AuditDate.Value).Take(1) })
                          .SelectMany(o => o.payment.DefaultIfEmpty(), (o, p) => new OrderJoinData(o.orderJoinData)
                {
                    payment = p
                }).ToList();
            }

            if (results.Any())
            {
                int length = rows;
                int start  = (page - 1) * length;
                total   = results.Count();
                results = results.OrderByDescending(data => data.order.TimeOfOrder).Skip(start).Take(length).ToList();

                TimeZoneConvert   TimeZoneConvert = new TimeZoneConvert();
                EnumData.TimeZone TimeZone        = MyHelp.GetTimeZone((int)Session["TimeZone"]);

                Dictionary <int, bool> isDirectLine = db.ShippingMethod.AsNoTracking().Where(m => m.IsEnable).ToDictionary(m => m.ID, m => m.IsDirectLine);

                dataList.AddRange(results.Select(data => new
                {
                    PackageID          = data.package.ID,
                    OrderID            = data.package.OrderID.Value,
                    ParentOrderID      = data.order.ParentOrderID.Value,
                    OrderSourceOrderId = data.order.OrderSourceOrderId,
                    eBayUserID         = data.order.eBayUserID,
                    ItemCount          = data.itemCount,
                    PaymentDate        = data.payment != null ? TimeZoneConvert.InitDateTime(data.payment.AuditDate.Value, EnumData.TimeZone.EST).ConvertDateTime(TimeZone).ToString("MM/dd/yyyy<br />hh:mm tt") : "",
                    Sku               = data.itemCount == 1 ? data.item.ProductID : "Multi",
                    DisplayName       = data.itemCount == 1 ? data.item.DisplayName : "Multi",
                    ShippingCountry   = data.address.CountryName,
                    SubTotal          = data.items.Sum(i => i.Qty * i.UnitPrice).Value.ToString("N"),
                    DeclaredTotal     = data.package.DeclaredTotal != 0 ? data.package.DeclaredTotal.ToString("N") : "",
                    OrderCurrencyCode = Enum.GetName(typeof(CurrencyCodeType2), data.order.OrderCurrencyCode),
                    PaymentStatus     = Enum.GetName(typeof(OrderPaymentStatus2), data.order.PaymentStatus),
                    StatusCode        = Enum.GetName(typeof(OrderStatusCode), data.order.StatusCode),
                    Comment           = data.package.Comment ?? "",
                    ProccessStatus    = GetOrderLink(data),
                    HasCaseAction     = data.package.ProcessStatus.Equals((byte)EnumData.ProcessStatus.已出貨) && data.package.ShippingMethod.HasValue && isDirectLine.ContainsKey(data.package.ShippingMethod.Value) && isDirectLine[data.package.ShippingMethod.Value]
                }));
            }

            return(Json(new { total, rows = dataList }, JsonRequestBehavior.AllowGet));
        }
示例#11
0
        public string Update_Tracking(Packages package)
        {
            string Message = "";

            try
            {
                MyHelp.Log("Packages", package.ID, string.Format("訂單【{0}】包裹SC更新", package.OrderID), Session);

                if (!SCWS.Is_login)
                {
                    throw new Exception("SC is not logged in!");
                }

                OrderData orderData  = SCWS.Get_OrderData(package.OrderID.Value);
                Order     SC_order   = orderData.Order;
                Package   SC_package = SC_order.Packages.FirstOrDefault(p => p.ID.Equals(package.ID));

                if (SC_package == null)
                {
                    MyHelp.Log("Packages", package.ID, "Not find package on SC website!", Session);

                    package.IsEnable = false;
                    SC_package       = SC_order.Packages.First(p => p.ID.Equals(SC_order.Items.First(i => i.ID.Equals(package.Items.First(ii => ii.IsEnable.Value).ID)).PackageID));
                    var newPackage = db.Packages.AsNoTracking().First(p => p.ID.Equals(package.ID));
                    newPackage.ID = SC_package.ID;
                    db.Packages.Add(newPackage);
                    foreach (var item in package.Items)
                    {
                        item.PackageID = newPackage.ID;
                    }
                    foreach (var pick in db.PickProduct.Where(pick => pick.PackageID.Value.Equals(package.ID)))
                    {
                        pick.PackageID = newPackage.ID;
                    }
                    if (package.Label != null)
                    {
                        package.Label.PackageID = newPackage.ID;
                    }
                    db.SaveChanges();

                    MyHelp.Log("Packages", package.ID, string.Format("Change package {0} to {1}", package.ID, newPackage.ID), Session);
                    package = newPackage;
                }

                string carrier = "";
                try
                {
                    if (package.Method == null)
                    {
                        throw new Exception("Not find method!");
                    }
                    if (package.Method.Carriers == null)
                    {
                        throw new Exception("Not find carrir");
                    }
                    carrier = package.Method.Carriers.Name;
                }
                catch (Exception e)
                {
                    MyHelp.Log("Packages", package.ID, e.Message, Session);
                    carrier = db.ShippingMethod.Find(package.ShippingMethod.Value).Carriers.Name;
                }
                SCWS.Update_PackageShippingStatus(SC_package, (package.UploadTracking ? package.TrackingNumber : ""), carrier);

                if (db.Packages.AsNoTracking().Where(p => p.IsEnable.Value && p.OrderID.Value.Equals(package.OrderID.Value)).All(p => p.ProcessStatus.Equals((byte)EnumData.ProcessStatus.已出貨)))
                {
                    if (SCWS.Update_OrderShippingStatus(SC_order, carrier))
                    {
                        var updatePackage = db.Packages.Find(package.ID);
                        updatePackage.WorkDays = 0;
                        var paymentDate = new TimeZoneConvert(package.Orders.Payments.FirstOrDefault()?.AuditDate ?? package.Orders.TimeOfOrder.Value, EnumData.TimeZone.EST).Utc;
                        var updateDate  = DateTime.UtcNow;
                        var checkPoint  = new DateTime(paymentDate.Year, paymentDate.Month, paymentDate.Day, 7, 0, 0, DateTimeKind.Utc);
                        do
                        {
                            if (paymentDate.CompareTo(checkPoint) < 0)
                            {
                                if (!checkPoint.DayOfWeek.Equals(DayOfWeek.Saturday) && !checkPoint.DayOfWeek.Equals(DayOfWeek.Sunday))
                                {
                                    updatePackage.WorkDays++;
                                }
                            }

                            checkPoint = checkPoint.AddDays(1);
                        } while (checkPoint.CompareTo(updateDate) < 0);
                        db.SaveChanges();

                        MyHelp.Log("Packages", package.ID, string.Format("訂單【{0}】SC完成出貨", package.OrderID), Session);
                    }
                }

                foreach (Items item in package.Items.Where(i => i.IsEnable.Value).ToList())
                {
                    if (item.SerialNumbers.Any())
                    {
                        SCWS.Update_ItemSerialNumber(item.ID, item.SerialNumbers.Select(s => s.SerialNumber).ToArray());
                    }
                }

                Message = Sync_Order(package.OrderID.Value);
            }
            catch (Exception e)
            {
                string[] serials = package.Items.Where(i => i.IsEnable.Value).SelectMany(i => i.SerialNumbers.Select(s => s.SerialNumber)).ToArray();
                MyHelp.ErrorLog(e, string.Format("訂單包裹【{0}】更新失敗: #serials {1}", package.OrderID, string.Join(",", serials)), package.OrderID.ToString());
                Message = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message;
            }

            return(Message);
        }
示例#12
0
        public ActionResult Dispatch(int[] packageIDs, int?method, string tracking)
        {
            AjaxResult result = new AjaxResult();

            try
            {
                if (!packageIDs.Any())
                {
                    throw new Exception("沒有給訂單!");
                }

                int warehouseID = 0;
                if (!int.TryParse(Session["warehouseId"].ToString(), out warehouseID))
                {
                    throw new Exception("找不到出貨倉!");
                }

                SC_WebService SCWS = new SC_WebService(Session["ApiUserName"].ToString(), Session["ApiPassword"].ToString());

                if (!SCWS.Is_login)
                {
                    throw new Exception("SC is not login");
                }

                Packages = new GenericRepository <Packages>(db);
                IRepository <Box>             Box   = new GenericRepository <Box>(db);
                IRepository <DirectLineLabel> Label = new GenericRepository <DirectLineLabel>(db);

                TaskFactory factory    = System.Web.HttpContext.Current.Application.Get("TaskFactory") as TaskFactory;
                ThreadTask  threadTask = new ThreadTask("Dropship DL 訂單 Dispatch");

                lock (factory)
                {
                    threadTask.AddWork(factory.StartNew(Session =>
                    {
                        threadTask.Start();

                        string message = "";

                        HttpSessionStateBase session = (HttpSessionStateBase)Session;

                        try
                        {
                            TimeZoneConvert timeZoneConvert = new TimeZoneConvert();

                            List <Packages> dispatchList = new List <Packages>();
                            List <string> errorList      = new List <string>();

                            List <Packages> packageList = db.Packages.AsNoTracking().Where(p => p.IsEnable.Value && packageIDs.Contains(p.ID)).ToList();
                            DirectLine directLine       = db.DirectLine.Find(packageList[0].Method.DirectLine);
                            string boxID = string.Format("{0}-{1}", directLine.Abbreviation, timeZoneConvert.Utc.ToString("yyyyMMdd"));
                            int count    = db.Box.Where(b => b.IsEnable && b.DirectLine.Equals(directLine.ID) && b.BoxID.Contains(boxID)).Select(b => b.MainBox).Distinct().Count() + 1;
                            byte[] Byte  = BitConverter.GetBytes(count);
                            Byte[0]     += 64;
                            boxID        = string.Format("{0}-{1}", boxID, System.Text.Encoding.ASCII.GetString(Byte.Take(1).ToArray()));

                            foreach (Packages package in packageList)
                            {
                                DirectLineLabel label = package.Label;
                                OrderData order       = SCWS.Get_OrderData(package.OrderID.Value);
                                if (CheckOrderStatus(package, order.Order))
                                {
                                    ThreadTask uploadPOTask = new ThreadTask(string.Format("直發商待出貨區 - 更新訂單【{0}】以及PO【{1}】資料至SC", package.OrderID, package.POId), session);

                                    lock (factory)
                                    {
                                        uploadPOTask.AddWork(factory.StartNew(() =>
                                        {
                                            uploadPOTask.Start();

                                            string error = "";

                                            try
                                            {
                                                SyncProcess Sync = new SyncProcess(session, factory);
                                                error            = Sync.Update_PurchaseOrder(package.ID, false);

                                                if (string.IsNullOrEmpty(error))
                                                {
                                                    //if (directLine.Abbreviation.Equals("ECOF"))
                                                    //{
                                                    //    ThreadTask SyncTask = new ThreadTask(string.Format("Direct Line 訂單【{0}】SC更新", package.OrderID));
                                                    //    SyncTask.AddWork(factory.StartNew(() =>
                                                    //    {
                                                    //        SyncTask.Start();
                                                    //        SyncProcess sync = new SyncProcess(session);
                                                    //        return sync.Update_Tracking(package);
                                                    //    }));
                                                    //}
                                                    //else
                                                    //{
                                                    //    foreach (Items item in package.Items.Where(i => i.IsEnable.Value).ToList())
                                                    //    {
                                                    //        if (item.SerialNumbers.Any()) SCWS.Update_ItemSerialNumber(item.ID, item.SerialNumbers.Select(s => s.SerialNumber).ToArray());
                                                    //    }
                                                    //}

                                                    foreach (Items item in package.Items.Where(i => i.IsEnable.Value).ToList())
                                                    {
                                                        if (item.SerialNumbers.Any())
                                                        {
                                                            SCWS.Update_ItemSerialNumber(item.ID, item.SerialNumbers.Select(s => s.SerialNumber).ToArray());
                                                        }
                                                    }
                                                }
                                            }
                                            catch (Exception e)
                                            {
                                                error = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message;
                                            }

                                            return(error);
                                        }));
                                    }

                                    package.ProcessStatus = (int)EnumData.ProcessStatus.已出貨;
                                    package.BoxID         = label.BoxID = boxID;
                                    label.Status          = (byte)EnumData.LabelStatus.正常;
                                    dispatchList.Add(package);
                                }
                                else
                                {
                                    MyHelp.Log("DirectLineLabel", label.LabelID, string.Format("標籤【{0}】狀態異常", label.LabelID), session);

                                    package.Orders.StatusCode    = (int)order.Order.StatusCode;
                                    package.Orders.PaymentStatus = (int)order.Order.PaymentStatus;
                                    label.Status = (byte)EnumData.LabelStatus.鎖定中;

                                    if (order.Order.StatusCode.Equals((int)OrderStatusCode.Canceled))
                                    {
                                        label.Status = (byte)EnumData.LabelStatus.作廢;

                                        SerialNumbers = new GenericRepository <SerialNumbers>(db);
                                        foreach (var ss in SerialNumbers.GetAll().Where(s => s.OrderID.Equals(package.OrderID)))
                                        {
                                            SerialNumbers.Delete(ss);
                                        }
                                        ;
                                    }

                                    errorList.Add(string.Format("標籤【{0}】狀態異常,請重新取出!", package.OrderID.Value));
                                }
                                Packages.Update(package, package.ID);
                                Label.Update(label, label.LabelID);
                            }

                            if (dispatchList.Any())
                            {
                                Box box = new Box()
                                {
                                    IsEnable        = true,
                                    BoxID           = boxID,
                                    MainBox         = boxID,
                                    DirectLine      = directLine.ID,
                                    FirstMileMethod = method ?? 0,
                                    WarehouseFrom   = warehouseID,
                                    ShippingStatus  = method.HasValue ? (byte)EnumData.DirectLineStatus.運輸中 : (byte)EnumData.DirectLineStatus.已到貨,
                                    BoxType         = (byte)EnumData.DirectLineBoxType.DirectLine,
                                    TrackingNumber  = tracking,
                                    Create_at       = timeZoneConvert.Utc
                                };
                                db.Entry(box).State = System.Data.Entity.EntityState.Added;

                                db.SaveChanges();
                                MyHelp.Log("Box", boxID, string.Format("Box【{0}】建立成功", boxID), session);

                                MyHelp.Log("Box", box.BoxID, string.Format("寄送 Box【{0}】DL資料", box.BoxID), session);
                                SendMailToCarrier(box, db.DirectLine.AsNoTracking().First(d => d.ID.Equals(box.DirectLine)));

                                MyHelp.Log("Box", box.BoxID, string.Format("Box【{0}】完成出貨", box.BoxID), session);
                            }

                            Packages.SaveChanges();

                            if (errorList.Any())
                            {
                                message = string.Join("\n", errorList.ToArray());
                            }
                        }
                        catch (Exception e)
                        {
                            message = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message;
                        }

                        return(message);
                    }, HttpContext.Session));
                }
            }
            catch (Exception e)
            {
                result.status  = false;
                result.message = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message;
            }

            return(Json(result, JsonRequestBehavior.AllowGet));
        }
示例#13
0
        private List <OrderJoinData> DataFilter(DataFilter filter, IQueryable <Orders> OrderFilter, IQueryable <ShippingMethod> MethodFilter, EnumData.ProcessStatus processStatus, int warehouseID)
        {
            /** Order Filter **/
            if (!filter.StatusCode.Equals(null))
            {
                OrderFilter = OrderFilter.Where(o => o.StatusCode.Value.Equals(filter.StatusCode.Value));
            }
            if (!filter.ShippingStatus.Equals(null))
            {
                OrderFilter = OrderFilter.Where(o => o.ShippingStatus.Equals(filter.ShippingStatus));
            }
            if (!filter.Source.Equals(null))
            {
                OrderFilter = OrderFilter.Where(o => o.OrderSource.Equals(filter.Source));
            }
            if (!string.IsNullOrWhiteSpace(filter.OrderID))
            {
                OrderFilter = OrderFilter.Where(o => o.OrderID.ToString().Equals(filter.OrderID));
            }
            if (!string.IsNullOrWhiteSpace(filter.UserID))
            {
                OrderFilter = OrderFilter.Where(o => !string.IsNullOrWhiteSpace(o.eBayUserID) && o.eBayUserID.Contains(filter.UserID));
            }
            if (!string.IsNullOrWhiteSpace(filter.SourceID))
            {
                OrderFilter = OrderFilter.Where(o => (o.OrderSource.Equals(1) && (o.eBaySalesRecordNumber.Equals(filter.SourceID) || o.OrderSourceOrderId.Contains(filter.SourceID))) || (o.OrderSource.Equals(4) && o.OrderSourceOrderId.Equals(filter.SourceID)));
            }

            /** Package Filter **/
            var PackageFilter = db.Packages.AsNoTracking().Where(p => p.IsEnable.Value && p.ProcessStatus.Equals((byte)processStatus));

            if (!filter.MethodID.Equals(null))
            {
                PackageFilter = PackageFilter.Where(p => p.ShippingMethod.Value.Equals(filter.MethodID.Value));
            }
            if (!string.IsNullOrWhiteSpace(filter.Tracking))
            {
                PackageFilter = PackageFilter.Where(p => p.TrackingNumber.ToLower().Contains(filter.Tracking.ToLower()));
            }

            /** Item Filter **/
            var ItemFilter = db.Items.AsNoTracking().Where(i => i.IsEnable.Value && i.ShipFromWarehouseID.Value.Equals(warehouseID));

            if (!string.IsNullOrWhiteSpace(filter.ItemName))
            {
                ItemFilter = ItemFilter.Where(i => i.DisplayName.ToLower().Contains(filter.ItemName.ToLower()) || i.ProductID.Equals(filter.ItemName));
            }

            /** Address Filter **/
            var AddressFilter = db.Addresses.AsNoTracking().Where(a => a.IsEnable.Value);

            if (!string.IsNullOrWhiteSpace(filter.Country))
            {
                AddressFilter = AddressFilter.Where(a => a.CountryCode.Equals(filter.Country));
            }

            /** Payment Filter **/
            var PaymentFilter = db.Payments.AsNoTracking().Where(p => p.IsEnable.Value && p.PaymentType.Value.Equals((int)PaymentRecordType.Payment));

            if (!filter.DateFrom.Equals(new DateTime()))
            {
                DateTime dateFrom = new DateTime(filter.DateFrom.Year, filter.DateFrom.Month, filter.DateFrom.Day, 0, 0, 0);
                dateFrom      = new TimeZoneConvert(dateFrom, MyHelp.GetTimeZone((int)Session["TimeZone"])).ConvertDateTime(EnumData.TimeZone.EST);
                PaymentFilter = PaymentFilter.Where(p => DateTime.Compare(p.AuditDate.Value, dateFrom) >= 0);
            }
            if (!filter.DateTo.Equals(new DateTime()))
            {
                DateTime dateTo = new DateTime(filter.DateTo.Year, filter.DateTo.Month, filter.DateTo.Day + 1, 0, 0, 0);
                dateTo        = new TimeZoneConvert(dateTo, MyHelp.GetTimeZone((int)Session["TimeZone"])).ConvertDateTime(EnumData.TimeZone.EST);
                PaymentFilter = PaymentFilter.Where(p => DateTime.Compare(p.AuditDate.Value, dateTo) < 0);
            }

            return(OrderFilter.ToList()
                   .Join(PackageFilter, o => o.OrderID, p => p.OrderID, (o, p) => new OrderJoinData()
            {
                order = o, package = p
            })
                   .Join(ItemFilter.GroupBy(i => i.PackageID.Value), oData => oData.package.ID, i => i.Key, (oData, i) => new OrderJoinData(oData)
            {
                item = i.First(), items = i.ToList(), itemCount = i.Sum(ii => ii.Qty + ii.KitItemCount).Value
            })
                   .Join(AddressFilter, oData => oData.order.ShippingAddress, a => a.Id, (oData, a) => new OrderJoinData(oData)
            {
                address = a
            })
                   .Join(MethodFilter, oData => oData.package.ShippingMethod, m => m.ID, (oData, m) => new OrderJoinData(oData)
            {
                method = m
            })
                   .GroupJoin(PaymentFilter, oData => oData.order.OrderID, p => p.OrderID.Value, (oData, p) => new { orderJoinData = oData, payment = p.Take(1) })
                   .SelectMany(o => o.payment.DefaultIfEmpty(), (o, p) => new OrderJoinData(o.orderJoinData)
            {
                payment = p
            }).ToList());
        }
示例#14
0
        public ActionResult GetCaseEventData(CaseFilter filter, int page = 1, int rows = 100)
        {
            int           total    = 0;
            List <object> dataList = new List <object>();

            TimeZoneConvert timeZoneConvert = new TimeZoneConvert();

            EnumData.TimeZone TimeZone = MyHelp.GetTimeZone((int)Session["TimeZone"]);

            var CaseFilter = db.CaseEvent.AsNoTracking().AsQueryable();

            if (!string.IsNullOrEmpty(filter.OrderID))
            {
                CaseFilter = CaseFilter.Where(c => c.OrderID.ToString().Equals(filter.OrderID));
            }
            if (!string.IsNullOrEmpty(filter.LabelID))
            {
                CaseFilter = CaseFilter.Where(c => c.LabelID.ToString().Equals(filter.LabelID));
            }
            if (filter.CreateDate.HasValue)
            {
                DateTime dateFrom = timeZoneConvert.InitDateTime(filter.CreateDate.Value, TimeZone).Utc;
                DateTime dateTO   = timeZoneConvert.Utc.AddDays(1);
                CaseFilter = CaseFilter.Where(c => c.Create_at.CompareTo(dateFrom) >= 0 && c.Create_at.CompareTo(dateTO) < 0);
            }
            if (filter.RequestDate.HasValue)
            {
                DateTime dateFrom = timeZoneConvert.InitDateTime(filter.RequestDate.Value, TimeZone).Utc;
                DateTime dateTO   = timeZoneConvert.Utc.AddDays(1);
                CaseFilter = CaseFilter.Where(c => c.Request_at.HasValue && c.Request_at.Value.CompareTo(dateFrom) >= 0 && c.Request_at.Value.CompareTo(dateTO) < 0);
            }
            if (filter.ResponseDate.HasValue)
            {
                DateTime dateFrom = timeZoneConvert.InitDateTime(filter.ResponseDate.Value, TimeZone).Utc;
                DateTime dateTO   = timeZoneConvert.Utc.AddDays(1);
                CaseFilter = CaseFilter.Where(c => c.Response_at.HasValue && c.Response_at.Value.CompareTo(dateFrom) >= 0 && c.Response_at.Value.CompareTo(dateTO) < 0);
            }
            if (filter.CaseType.HasValue)
            {
                CaseFilter = CaseFilter.Where(c => c.Type.Equals(filter.CaseType.Value));
            }
            if (filter.CaseRequest.HasValue)
            {
                CaseFilter = CaseFilter.Where(c => c.Request.Equals(filter.CaseRequest.Value));
            }
            if (filter.CaseStatus.HasValue)
            {
                CaseFilter = CaseFilter.Where(c => c.Status.Equals(filter.CaseStatus.Value));
            }

            List <CaseEvent> results = CaseFilter.ToList();

            if (results.Any())
            {
                int length = rows;
                int start  = (page - 1) * length;
                total = results.Count();

                if (!string.IsNullOrEmpty(filter.Sort) && filter.Sort.Equals("RequestDate"))
                {
                    results = filter.Order.Equals("asc") ? results.OrderBy(c => c.Request_at).ToList() : results.OrderByDescending(c => c.Request_at).ToList();
                }

                Dictionary <int, string> DirectLine = db.DirectLine.Where(d => d.IsEnable).ToDictionary(d => d.ID, d => d.Abbreviation);
                Dictionary <int, string> AdminName  = db.AdminUsers.AsNoTracking().Where(u => u.IsEnable).ToDictionary(u => u.Id, u => u.Name);

                dataList.AddRange(results.Skip(start).Take(length).Select(c => new
                {
                    CaseID = c.ID,
                    c.OrderID,
                    LabelID      = DirectLine[c.Packages.Method.DirectLine].Equals("Sendle") ? string.Format("{0}-{1}-{2}", c.Packages.Items.First(i => i.IsEnable.Value).ProductID, c.OrderID, c.Packages.TrackingNumber) : c.LabelID,
                    CreateDate   = timeZoneConvert.InitDateTime(c.Create_at, EnumData.TimeZone.UTC).ConvertDateTime(TimeZone).ToString("MM/dd/yyyy tt hh:mm"),
                    RequestDate  = c.Request_at.HasValue ? timeZoneConvert.InitDateTime(c.Request_at.Value, EnumData.TimeZone.UTC).ConvertDateTime(TimeZone).ToString("MM/dd/yyyy tt hh:mm") : "",
                    ResponseDate = c.Response_at.HasValue ? timeZoneConvert.InitDateTime(c.Response_at.Value, EnumData.TimeZone.UTC).ConvertDateTime(TimeZone).ToString("MM/dd/yyyy tt hh:mm") : "",
                    CaseType     = EnumData.CaseEventTypeList()[(EnumData.CaseEventType)c.Type],
                    CaseRequest  = Enum.GetName(typeof(EnumData.CaseEventRequest), c.Request),
                    CaseStatus   = c.Status,
                    UpdateBy     = AdminName.ContainsKey(c.Update_by) ? string.Format("{0}﹙{1}﹚", AdminName[c.Update_by], DirectLine[c.Packages.Method.DirectLine]) : DirectLine[c.Packages.Method.DirectLine]
                }));
            }

            return(Json(new { total, rows = dataList }, JsonRequestBehavior.AllowGet));
        }