Пример #1
0
        public ActionResult GetOrder(List <string> orderIDs)
        {
            SyncResult result = new SyncResult();

            if (!orderIDs.Any())
            {
                return(Content(JsonConvert.SerializeObject(result.set_error("沒有取得訂單號碼!")), "appllication/json"));
            }

            try
            {
                TaskFactory factory = System.Web.HttpContext.Current.Application.Get("TaskFactory") as TaskFactory;

                foreach (string orderID in orderIDs)
                {
                    ThreadTask threadTask = new ThreadTask(string.Format("訂單管理區 - 訂單【{0}】資料同步", orderID));

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

                            string message = "";
                            HttpSessionStateBase session = (HttpSessionStateBase)Session;

                            try
                            {
                                SyncProcess Sync = new SyncProcess(session);
                                message          = Sync.Sync_Order(int.Parse(orderID));
                            }
                            catch (DbEntityValidationException ex)
                            {
                                var errorMessages = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                                message           = string.Join("; ", errorMessages);
                            }
                            catch (Exception e)
                            {
                                message = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message;
                            }

                            return(message);
                        }, HttpContext.Session));
                    }
                }
            }
            catch (Exception e)
            {
                return(Content(JsonConvert.SerializeObject(result.set_error(e.Message)), "appllication/json"));
            }

            return(Content(JsonConvert.SerializeObject(result), "appllication/json"));
        }
Пример #2
0
        public void Receive()
        {
            try
            {
                using (LinkReceive receive = new LinkReceive(HttpContext.Request.Url.Query))
                {
                    CaseEvent eventData = db.CaseEvent.AsNoTracking().FirstOrDefault(c => c.ID.Equals(receive.CaseID));
                    if (eventData == null)
                    {
                        throw new Exception("找不到Case Event!");
                    }
                    if (!eventData.Status.Equals((byte)EnumData.CaseEventStatus.Open))
                    {
                        throw new Exception("執行動作無效!");
                    }

                    Packages package = db.Packages.AsNoTracking().FirstOrDefault(p => p.IsEnable.Value && p.ID.Equals(eventData.PackageID));
                    if (package == null)
                    {
                        throw new Exception("找不到訂單!");
                    }

                    using (CaseLog CaseLog = new CaseLog(package, Session))
                    {
                        Label = new GenericRepository <DirectLineLabel>(db);

                        TaskFactory factory = System.Web.HttpContext.Current.Application.Get("TaskFactory") as TaskFactory;

                        switch (receive.Type)
                        {
                        case (byte)EnumData.CaseEventType.CancelShipment:
                            if (!receive.Request.Equals((byte)EnumData.CaseEventRequest.Failed) && !receive.ReturnWarehouseID.HasValue)
                            {
                                throw new Exception("沒有選擇退貨倉!");
                            }

                            CaseLog.CancelShipmentResponse(receive.Request, receive.ReturnWarehouseID);

                            eventData = CaseLog.GetCaseEvent(EnumData.CaseEventType.CancelShipment);
                            if (eventData.Request.Equals((byte)EnumData.CaseEventRequest.Successful) && eventData.Status.Equals((byte)EnumData.CaseEventStatus.Locked))
                            {
                                ThreadTask threadTask = new ThreadTask(string.Format("Direct Line 訂單【{0}】同步資料", package.OrderID));
                                threadTask.AddWork(factory.StartNew(() =>
                                {
                                    threadTask.Start();
                                    SyncProcess sync = new SyncProcess(Session);
                                    return(sync.Sync_Order(package.OrderID.Value));
                                }));

                                DirectLineLabel label = db.DirectLineLabel.AsNoTracking().First(l => l.IsEnable && l.LabelID.Equals(eventData.LabelID));
                                label.Status = (byte)EnumData.LabelStatus.作廢;
                                Label.Update(label, label.LabelID);
                                Label.SaveChanges();
                            }
                            break;

                        case (byte)EnumData.CaseEventType.UpdateShipment:
                            CaseLog.UpdateShipmentResponse(receive.Request);
                            break;

                        case (byte)EnumData.CaseEventType.ChangeShippingMethod:
                            eventData = CaseLog.ChangeShippingMethodResponse(receive.Request);
                            if (eventData.Request.Equals((byte)EnumData.CaseEventRequest.Successful) && eventData.Status.Equals((byte)EnumData.CaseEventStatus.Close))
                            {
                                package = db.Packages.Find(eventData.PackageID);
                                if (!string.IsNullOrEmpty(package.TrackingNumber))
                                {
                                    ThreadTask threadTask = new ThreadTask(string.Format("Direct Line 訂單【{0}】SC更新", package.OrderID));
                                    threadTask.AddWork(factory.StartNew(() =>
                                    {
                                        threadTask.Start();
                                        SyncProcess sync = new SyncProcess(Session);
                                        return(sync.Update_Tracking(package));
                                    }));
                                }
                            }
                            break;

                        case (byte)EnumData.CaseEventType.ResendShipment:
                            eventData = CaseLog.ResendShipmentResponse(receive.Request);
                            if (eventData.Request.Equals((byte)EnumData.CaseEventRequest.Successful) && eventData.Status.Equals((byte)EnumData.CaseEventStatus.Close))
                            {
                                DirectLineLabel label = db.DirectLineLabel.AsNoTracking().First(l => l.IsEnable && l.LabelID.Equals(eventData.NewLabelID));
                                package = db.Packages.AsNoTracking().First(p => p.ID.Equals(label.PackageID));
                                if (!string.IsNullOrEmpty(package.TrackingNumber))
                                {
                                    label.Status = (byte)EnumData.LabelStatus.完成;

                                    ThreadTask threadTask = new ThreadTask(string.Format("Direct Line 訂單【{0}】SC更新", package.OrderID));
                                    threadTask.AddWork(factory.StartNew(() =>
                                    {
                                        threadTask.Start();
                                        SyncProcess sync = new SyncProcess(Session);
                                        return(sync.Update_Tracking(package));
                                    }));
                                }

                                Label.Update(label, label.LabelID);
                                Label.SaveChanges();
                            }
                            break;

                        case (byte)EnumData.CaseEventType.ReturnPackage:
                            CaseLog.ReturnPackageResponse(receive.Request);
                            break;
                        }
                    }
                }

                Response.Write("Success!");
            }
            catch (Exception e)
            {
                Response.Write(e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message);
            }
        }