////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public void Start()
        {
            m_startTicks = Environment.TickCount;

            m_lastOutputTimestamp = m_startTicks;

            m_exitMutex = new ManualResetEvent(false);

            m_process = new SyncProcess();

            m_process.StartInfo = StartInfo;

            m_process.OutputDataReceived += new DataReceivedEventHandler(ProcessStdout);

            m_process.ErrorDataReceived += new DataReceivedEventHandler(ProcessStderr);

            m_process.Exited += new EventHandler(ProcessExited);

            m_process.EnableRaisingEvents = true;

            LoggingUtils.Print(string.Format("[SyncRedirectProcess] Start: {0} (Args=\"{1}\" Pwd=\"{2}\")", m_process.StartInfo.FileName, m_process.StartInfo.Arguments, m_process.StartInfo.WorkingDirectory));

            m_process.Start();

            m_process.BeginOutputReadLine();

            m_process.BeginErrorReadLine();
        }
Пример #2
0
        public ActionResult CheckWarehouse()
        {
            try
            {
                TaskFactory factory    = System.Web.HttpContext.Current.Application.Get("TaskFactory") as TaskFactory;
                ThreadTask  threadTask = new ThreadTask("出貨倉資料同步工作");
                MyHelp.Log("Warehouses", null, "出貨倉資料同步");

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

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

                        try
                        {
                            SyncProcess Sync = new SyncProcess(session);
                            message          = Sync.Sync_Warehouse();
                        }
                        catch (Exception e)
                        {
                            message = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message;
                        }

                        return(message);
                    }, HttpContext.Session));
                }
            }
            finally { }

            return(Content(JsonConvert.SerializeObject(new { status = true, message = "Sync starting!" }), "appllication/json"));
        }
Пример #3
0
        private void UpdatePurchaseOrder(Packages package, int reTry = 0)
        {
            try
            {
                TaskFactory factory    = System.Web.HttpContext.Current.Application.Get("TaskFactory") as TaskFactory;
                ThreadTask  threadTask = new ThreadTask(string.Format("直發商待出貨區 - 更新訂單【{0}】以及PO【{1}】資料至SC", package.OrderID, package.POId));

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

                        string error = "";

                        try
                        {
                            HttpSessionStateBase Session = (HttpSessionStateBase)session;
                            SyncProcess Sync             = new SyncProcess(Session);
                            error = Sync.Update_PurchaseOrder(package.ID);
                        }
                        catch (Exception e)
                        {
                            error = e.InnerException != null && !string.IsNullOrEmpty(e.InnerException.Message) ? e.InnerException.Message : e.Message;
                        }

                        return(error);
                    }, HttpContext.Session));
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
Пример #4
0
        static void StartNewGame()
        {
            StartTasksProcess   = null;
            StartThreadsProcess = null;
            PrintResultEvent    = null;
            StartNewGameEvent   = null;

            var duration       = 10;
            var numberOfTreads = 10;
            var input          = "";

            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("********************* Welcome to Threads War!!! May the best win **************************");
            Console.WriteLine();

            //Number of Interactions
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("Enter number of interactions");
            Console.ForegroundColor = ConsoleColor.Yellow;
            input = Console.ReadLine();
            while (!int.TryParse(input, out duration))
            {
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine("Please enter correct number");
                Console.ForegroundColor = ConsoleColor.Yellow;
                input = Console.ReadLine();
            }

            //Number of Threads
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("Enter number of threads");
            Console.ForegroundColor = ConsoleColor.Yellow;
            input = Console.ReadLine();
            while (!int.TryParse(input, out numberOfTreads))
            {
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine("Please enter correct number");
                Console.ForegroundColor = ConsoleColor.Yellow;
                input = Console.ReadLine();
            }
            Console.ForegroundColor = ConsoleColor.White;

            var      dataArray      = GetRandomNumberArray(duration);
            IProcess syncProcess    = new SyncProcess(dataArray);
            IProcess tasksProcess   = new AsyncTaskProcess(dataArray);
            IProcess threadsProcess = new MultyThreadProcess(dataArray, numberOfTreads);

            StartTasksProcess             += new EventHandler(tasksProcess.Start);
            StartThreadsProcess           += new EventHandler(threadsProcess.Start);
            PrintResultEvent              += new EventHandler(() => PrintResult(syncProcess.ResultTime, tasksProcess.ResultTime, threadsProcess.ResultTime));
            StartNewGameEvent             += new EventHandler(StartNewGame);
            syncProcess.AfterFinishEvent   = StartTasksProcess;
            tasksProcess.AfterFinishEvent  = StartThreadsProcess;
            threadsProcess.TimeResultEvent = PrintResultEvent;
            //threadsProcess.StartNewGameEvent = StartNewGameEvent;
            syncProcess.Start();
        }
Пример #5
0
        public ActionResult CheckPurchaseItem()
        {
            SyncResult result = new SyncResult();

            try
            {
                IRepository <Packages> Packages = new GenericRepository <Packages>(db);
                IRepository <Items>    Items    = new GenericRepository <Items>(db);

                string[] productIDs = Packages.GetAll(true).Where(p => p.ProcessStatus == (int)EnumData.ProcessStatus.待出貨).Join(Items.GetAll(true), p => p.ID, i => i.PackageID, (p, i) => i.ProductID).Distinct().ToArray();

                if (productIDs.Length == 0)
                {
                    return(Content(JsonConvert.SerializeObject(result.set_error("沒有需要同步的產品!")), "appllication/json"));
                }

                TaskFactory factory    = System.Web.HttpContext.Current.Application.Get("TaskFactory") as TaskFactory;
                ThreadTask  threadTask = new ThreadTask("產品序號同步工作");

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

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

                        try
                        {
                            SyncProcess Sync = new SyncProcess(session);
                            message          = Sync.Sync_PurchaseItem(productIDs);
                        }
                        catch (DbEntityValidationException ex)
                        {
                            var errorMessages = ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                            message           = string.Join("; ", errorMessages);
                        }
                        catch (Exception e)
                        {
                            message = e.Message;
                        }

                        return(message);
                    }, HttpContext.Session));
                }

                result.taskID = threadTask.ID;
            }
            catch (Exception e)
            {
                return(Content(JsonConvert.SerializeObject(result.set_error(e.Message)), "appllication/json"));
            }

            return(Content(JsonConvert.SerializeObject(result), "appllication/json"));
        }
Пример #6
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"));
        }
Пример #7
0
        public ActionResult CheckOrder(int day)
        {
            SyncResult result = new SyncResult();

            try
            {
                TaskFactory factory    = System.Web.HttpContext.Current.Application.Get("TaskFactory") as TaskFactory;
                ThreadTask  threadTask = new ThreadTask(string.Format("同步{0}天訂單資料", day));

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

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

                        try
                        {
                            SyncProcess Sync = new SyncProcess(session, factory);
                            message          = Sync.Sync_Orders(day);
                        }
                        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);
                    }, Session));
                }
            }
            catch (Exception e)
            {
                return(Content(JsonConvert.SerializeObject(result.set_error(e.Message)), "appllication/json"));
            }

            return(Content(JsonConvert.SerializeObject(result), "appllication/json"));
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (m_process != null)
                {
                    m_process.Dispose();

                    m_process = null;
                }

                if (m_exitMutex != null)
                {
                    m_exitMutex.Dispose();

                    m_exitMutex = null;
                }
            }
        }
Пример #9
0
        private void Start()
        {
            SyncProcess _sync = new SyncProcess();

            //
            Register(new Random().Next(0, 32000), "");
            _sync.OnComplete += ImportComplete;
            //
            _thread = new Thread(() =>
            {
                try
                {
                    _sync.Run();
                }
                catch (Exception ex)
                {
                }
            });
            //
            _thread.Start();
        }
Пример #10
0
        public void UpdatePurchaseOrder(int PackageID)
        {
            SyncProcess Sync = new SyncProcess(Session);

            Sync.Update_PurchaseOrder(PackageID);
        }
Пример #11
0
 private void OnSyncProcess(Process process)
 {
     SyncProcess?.Invoke(this, new SyncProcessEventArgs(process));
 }
Пример #12
0
        public void Load_ValidXml_CreateObjects()
        {
            SyncProcess sp = new SyncProcess();

            sp.Load(@"
<SyncProcess>
  <Endpoints>
    <Source>
      <ProviderFields>
        <ProviderField isKey=""true"" name=""FieldName1"" type=""System.Int32"" />
        <ProviderField name=""FieldName2"" type=""System.Int32"" />
      </ProviderFields>
      <IDataProvider>
        <SqlDataProvider connectionString=""some connection"" query=""select * from agents"" />
      </IDataProvider>
    </Source>
    <Destination templateId=""0"">
      <TemplateField id=""0"" guid=""f90a2ea5-6d48-4ea0-afa3-b7448e980ddf"" isKey=""true"" name=""double field"" type=""System.Double"" mappedTo=""FieldName1"" />
      <TemplateField id=""0"" guid=""504b52d5-5a1a-4405-a939-0c7deeafe0ee"" name=""int field"" type=""System.Int32"" />
      <TemplateField id=""0"" guid=""2ff7250d-d9d8-4125-b12d-82a57bfa4118"" name=""text field"" type=""System.String"" />
    </Destination>
  </Endpoints>
  <Map script=""&#xA;&#x9;result[&quot;double field&quot;].Value = @FieldName1;&#xA;&#x9;result[&quot;int field&quot;].Value = @FieldName2;&#xD;&#xA;&#x9;return result;"" version=""1"">
    <designer>
      <ExpressionContainer xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/Cebos.Veyron.Controls.MapPanel.Core.Persistance.Designer"">
        <Expression>
          <PersistentDesignerObjectBase i:type=""PersistentDesignerSourceFieldList"">
            <ExpressionName>source</ExpressionName>
            <FunctionName i:nil=""true"" />
            <Height>0</Height>
            <Id>c7014d11-2fee-4cf8-ace0-e8210f9f15fa</Id>
            <Left>20</Left>
            <Top>70</Top>
            <Type>SourceField</Type>
            <Width>0</Width>
            <Fields>
              <PersistentDesignerSourceField>
                <ConnectorOut>
                  <DataType>Int</DataType>
                  <Id>4f35dc35-a079-4b92-8dab-869cebd9f87f</Id>
                  <Name>FieldName1</Name>
                </ConnectorOut>
                <InnerName i:nil=""true"" />
                <Name>FieldName1</Name>
                <SetName>Item</SetName>
              </PersistentDesignerSourceField>
              <PersistentDesignerSourceField>
                <ConnectorOut>
                  <DataType>Int</DataType>
                  <Id>7542e863-fe56-4b55-b358-ae8473642b96</Id>
                  <Name>FieldName2</Name>
                </ConnectorOut>
                <InnerName i:nil=""true"" />
                <Name>FieldName2</Name>
                <SetName>Item</SetName>
              </PersistentDesignerSourceField>
            </Fields>
          </PersistentDesignerObjectBase>
          <PersistentDesignerObjectBase i:type=""PersistentDesignerDestinationFieldList"">
            <ExpressionName>destination</ExpressionName>
            <FunctionName i:nil=""true"" />
            <Height>0</Height>
            <Id>f90b2240-df82-4243-9707-a8c6eec829ad</Id>
            <Left>500</Left>
            <Top>70</Top>
            <Type>Destination</Type>
            <Width>0</Width>
            <Fields>
              <PersistentDesignerDestinationField>
                <ConnectorIn>
                  <DataType>Double</DataType>
                  <Id>740c9fb2-22ce-4241-9f20-c7949245b612</Id>
                  <Name>double field</Name>
                </ConnectorIn>
                <Name>double field</Name>
              </PersistentDesignerDestinationField>
              <PersistentDesignerDestinationField>
                <ConnectorIn>
                  <DataType>Int</DataType>
                  <Id>d3a1e978-1a5b-48d4-a41f-e221e39d1a48</Id>
                  <Name>int field</Name>
                </ConnectorIn>
                <Name>int field</Name>
              </PersistentDesignerDestinationField>
              <PersistentDesignerDestinationField>
                <ConnectorIn>
                  <DataType>String</DataType>
                  <Id>2e4ea46d-69f2-4b89-a4e6-4bd3c6a02b36</Id>
                  <Name>text field</Name>
                </ConnectorIn>
                <Name>text field</Name>
              </PersistentDesignerDestinationField>
            </Fields>
          </PersistentDesignerObjectBase>
          <PersistentDesignerObjectBase i:type=""PersistentDesignerConnection"">
            <ExpressionName i:nil=""true"" />
            <FunctionName i:nil=""true"" />
            <Height>0</Height>
            <Id>bff784a0-e890-4af3-be5c-26c1dfff8925</Id>
            <Left>0</Left>
            <Top>0</Top>
            <Type>Connection</Type>
            <Width>0</Width>
            <SinkConnectionId>4f35dc35-a079-4b92-8dab-869cebd9f87f</SinkConnectionId>
            <SinkId>c7014d11-2fee-4cf8-ace0-e8210f9f15fa</SinkId>
            <SourceConnectionId>740c9fb2-22ce-4241-9f20-c7949245b612</SourceConnectionId>
            <SourceId>f90b2240-df82-4243-9707-a8c6eec829ad</SourceId>
          </PersistentDesignerObjectBase>
          <PersistentDesignerObjectBase i:type=""PersistentDesignerConnection"">
            <ExpressionName i:nil=""true"" />
            <FunctionName i:nil=""true"" />
            <Height>0</Height>
            <Id>cd44b0da-77b6-4cd5-8d3e-c324f1f6492f</Id>
            <Left>0</Left>
            <Top>0</Top>
            <Type>Connection</Type>
            <Width>0</Width>
            <SinkConnectionId>7542e863-fe56-4b55-b358-ae8473642b96</SinkConnectionId>
            <SinkId>c7014d11-2fee-4cf8-ace0-e8210f9f15fa</SinkId>
            <SourceConnectionId>d3a1e978-1a5b-48d4-a41f-e221e39d1a48</SourceConnectionId>
            <SourceId>f90b2240-df82-4243-9707-a8c6eec829ad</SourceId>
          </PersistentDesignerObjectBase>
        </Expression>
        <ExpressionScript i:nil=""true"" />
        <Type>DesignerBased</Type>
      </ExpressionContainer>
    </designer>
  </Map>
  <SchedulerDescriptor>
    <Schedule name=""Schedule0"" isActive=""true"" description=""Description"" startOn=""2011-11-18T00:00:00+02:00"" endOn=""2011-11-18T00:00:00+02:00"">
      <DailyPattern repeatEveryWeekday=""false"" repeatEveryNDay=""1"" />
      <DailyFrecuencyOneTimePerDay timeOfDay=""0"" />
    </Schedule>
  </SchedulerDescriptor>
</SyncProcess>
");

        }
Пример #13
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));
        }
Пример #14
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);
            }
        }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    protected virtual void Dispose (bool disposing)
    {
      if (disposing)
      {
        if (m_process != null)
        {
          m_process.Dispose ();

          m_process = null;
        }

        if (m_exitMutex != null)
        {
          m_exitMutex.Dispose ();

          m_exitMutex = null;
        }
      }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    public void Start ()
    {
      m_startTicks = Environment.TickCount;

      m_lastOutputTimestamp = m_startTicks;

      m_exitMutex = new ManualResetEvent (false);

      m_process = new SyncProcess ();

      m_process.StartInfo = StartInfo;

      m_process.OutputDataReceived += new DataReceivedEventHandler (ProcessStdout);

      m_process.ErrorDataReceived += new DataReceivedEventHandler (ProcessStderr);

      m_process.Exited += new EventHandler (ProcessExited);

      m_process.EnableRaisingEvents = true;

      LoggingUtils.Print (string.Format ("[SyncRedirectProcess] Start: {0} (Args=\"{1}\" Pwd=\"{2}\")", m_process.StartInfo.FileName, m_process.StartInfo.Arguments, m_process.StartInfo.WorkingDirectory));

      m_process.Start ();

      m_process.BeginOutputReadLine ();

      m_process.BeginErrorReadLine ();
    }