예제 #1
0
 /// <summary>
 /// override Dispose .
 /// </summary>
 /// <param name="disposing"></param>
 protected override void Dispose(bool disposing)
 {
     Logger.Trace("WaitOne - before waitone");
     _pool.WaitOne();
     Logger.Trace("WaitOne - after waitone");
     if (disposing)
     {
         TransactionScopeManager.UnregisterResource(this);
         if (IsTransactionActive())
         {
             Logger.Trace("Dispose - _shouldClose = true");
             _shouldClose = true;
         }
         else
         {
             if (!_disposed)
             {
                 Logger.Trace("Dispose - base.Dispose(true)");
                 _disposed = true;
                 base.Dispose(true);
             }
             else
             {
                 Logger.Trace("Dispose - already disposed");
             }
         }
     }
     Logger.Trace("Release - before release");
     _pool.Release();
     Logger.Trace("Release - after release");
 }
        /// <summary>
        /// Logic launched after the step. Will launch the postprocessor.
        /// @see IStepExecutionListener#AfterStep
        /// </summary>
        /// <param name="stepExecution"></param>
        /// <returns></returns>
        public virtual ExitStatus AfterStep(StepExecution stepExecution)
        {
            ExitStatus returnStatus = stepExecution.ExitStatus;

            if (!"FAILED".Equals(returnStatus.ExitCode))
            {
                MethodInfo post = this.GetType().GetMethod("Postprocess", BindingFlags.Instance | BindingFlags.NonPublic);
                if (post.DeclaringType != typeof(AbstractExecutionListener))
                {
                    using (var scope = TransactionScopeManager.CreateScope())
                    {
                        try
                        {
                            returnStatus = Postprocess();
                        }
                        catch (Exception e)
                        {
                            // Need to catch exception to log and set status to FAILED, while
                            // Spring batch would only log and keep the status COMPLETED
                            Logger.Error(e, "Exception during postprocessor");
                            stepExecution.UpgradeStatus(BatchStatus.Failed);
                            throw;
                        }
                        scope.Complete();
                    }
                }
            }
            return(returnStatus);
        }
예제 #3
0
        public void FlatFileTestTransactionalTest()
        {
            var writer = new FlatFileItemWriter <Person>
            {
                Resource       = new FileSystemResource(_testPath2),
                LineAggregator = new LineAggregator(),
                HeaderWriter   = new HeaderWriter()
            };
            var reader = new FlatFileItemReader <Person>
            {
                Resource    = new FileSystemResource(_testPath2),
                LinesToSkip = 2,
                LineMapper  = new LineMapper()
            };

            var executionContext = new ExecutionContext();

            writer.Open(executionContext);
            try
            {
                for (int i = 0; i < CountTransactions; i++)
                {
                    using (TransactionScope scope = TransactionScopeManager.CreateScope())
                    {
                        writer.Write(GetPersons(i));
                        if (i == CountTransactions - 1) //SIMULATE FAILURE
                        {
                            throw new Exception("Bailing out ... should rollback ...");
                        }
                        scope.Complete();
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Error(e, "An unexpected exception occured :");
            }
            writer.Close();

            var persons = new List <Person>();

            reader.Open(executionContext);
            Person person;

            while ((person = reader.Read()) != null)
            {
                persons.Add(person);
            }
            reader.Close();

            Assert.AreEqual((CountTransactions - 1) * CountObjects, persons.Count);

            for (var i = 0; i < persons.Count; i++)
            {
                Assert.AreEqual(i % CountObjects, persons[i].Id);
                Assert.IsTrue(persons[i].Name.StartsWith("Person" + i % CountObjects));
            }
        }
예제 #4
0
 /// <summary>
 /// override Dispose .
 /// </summary>
 /// <param name="disposing"></param>
 protected override void Dispose(bool disposing)
 {
     if (disposing)
     {
         TransactionScopeManager.UnregisterResource(this);
         if (IsTransactionActive())
         {
             _shouldClose = true;
         }
         else
         {
             base.Dispose(true);
         }
     }
 }
예제 #5
0
        /// <summary>
        /// Actual taskletstep execution.
        /// </summary>
        /// <param name="stepExecution"></param>
        /// <exception cref="Exception">&nbsp;</exception>
        protected override void DoExecute(StepExecution stepExecution)
        {
            stepExecution.ExecutionContext.Put(TaskletTypeKey, _tasklet.GetType().Name);
            stepExecution.ExecutionContext.Put(StepConstants.StepTypeKey, GetType().Name);

            _stream.Update(stepExecution.ExecutionContext);

            JobRepository.UpdateExecutionContext(stepExecution);
            JobRepository.UpdateExecutionContext(stepExecution.JobExecution);
            // Shared semaphore per step execution, so other step executions can run
            // in parallel without needing the lock
            Semaphore semaphore = CreateSemaphore();

            _stepOperations.Iterate(StepContextRepeatCallback.GetRepeatCallback(stepExecution,
                                                                                (context, chunkContext) =>
            {
                StepExecution lStepExecution = chunkContext.StepContext.StepExecution;
                _interruptionPolicy.CheckInterrupted(lStepExecution);

                ChunkTransactionCallback callback =
                    new ChunkTransactionCallback(chunkContext, semaphore, this);

                RepeatStatus result;

                using (var scope = TransactionScopeManager.CreateScope())
                {
                    TransactionScopeManager.RegisterTransactionSynchronization(scope, callback);
                    try
                    {
                        result = callback.DoInTransaction();
                    }
                    catch (Exception e)
                    {
                        //Log and rethrow
                        Logger.Error(e, "Transaction will be rollbacked because of an unexpected exception.");
                        throw;     // throw to ensure rollback will occur (no complete)
                    }
                    scope.Complete();
                }
                // Release connections since the transaction has ended
                ConnectionUtil.ReleaseConnections();
                Thread.Sleep(stepExecution.DelayConfig);

                _interruptionPolicy.CheckInterrupted(stepExecution);
                return(result);
            }
                                                                                ));
        }
        //任务输送到某一位置后,通知更新状态。【入库口任务到位,密集存储道穿过到位】
        public override void Execute()
        {
            int[] data = null; 
            try
            {
                string positionName = string.Empty;
                int taskID = 0;

                object state = AutomationContext.Read(memoryServiceName, memoryItemName);
                object obj = ObjectUtil.GetObjects(state);
                if (obj is Array)
                {
                    Array arrayObj = (Array)obj;
                    if (arrayObj.Length == 2)
                    {
                        positionName = arrayObj.GetValue(0).ToString();
                        taskID = Convert.ToInt32(arrayObj.GetValue(1));
                    }
                }

                if (positionName == string.Empty || positionName == "0" || taskID == 0) return;

                data = new int[] { Convert.ToInt32(positionName), taskID };

                using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                {
                    positionDal.TransactionScopeManager = TM;
                    taskDal.TransactionScopeManager = TM;

                    int positionID = positionDal.GetPositionIDByPositionName(positionName);
                    int currentPositionID = taskDal.GetCurrentPositionID(taskID);
                    int nextPositionID = taskDal.GetNextPositionID(taskID);
                    int endPositionID = taskDal.GetEndPositionID(taskID);
                    if (positionID != 0 && currentPositionID != endPositionID && positionID == nextPositionID)
                    {
                        positionDal.UpdateHasGoodsToTrue(positionID);
                        taskDal.UpdateTaskPosition(taskID, positionID);
                        taskDal.UpdateTaskPositionStateToArrived(taskID);

                        if (positionID == endPositionID)
                        {
                            string orderType = taskDal.GetOrderType(taskID);
                            if (orderType == "03")//出库单
                            {
                                if (!AutomationContext.Write(memoryServiceName1, memoryItemName1, new int[] { taskID, positionID }))
                                {
                                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID));
                                    return;
                                }
                            }
                            else if (orderType == "04")//盘点单
                            {
                                if (!AutomationContext.Write(memoryServiceName1, memoryItemName2, new int[] { taskID, positionID }))
                                {
                                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID));
                                    return;
                                }
                            }
                            else
                            {
                                if (!AutomationContext.Write(memoryServiceName, memoryItemName3, taskID))
                                {
                                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID));
                                    return;
                                }
                            }
                        }
                        TM.Commit();
                    }
                    else
                    {
                        Logger.Error(string.Format("{0} 处理[{1}]任务到达失败,到达位置{2}与任务不符!", Name, taskID,positionName));
                    }
                }
            }
            catch (Exception ex)
            {
                if (data != null)
                {
                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                }
                Logger.Error("TaskArriveDataProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }
        //任务输送到某一位置后,通知更新状态。【入库口任务到位,密集存储道穿过到位】
        public override void Execute()
        {
            int[] data = null;
            try
            {
                string positionName = string.Empty;
                int    taskID       = 0;

                object state = AutomationContext.Read(memoryServiceName, memoryItemName);
                object obj   = ObjectUtil.GetObjects(state);
                if (obj is Array)
                {
                    Array arrayObj = (Array)obj;
                    if (arrayObj.Length == 2)
                    {
                        positionName = arrayObj.GetValue(0).ToString();
                        taskID       = Convert.ToInt32(arrayObj.GetValue(1));
                    }
                }

                if (positionName == string.Empty || positionName == "0" || taskID == 0)
                {
                    return;
                }

                data = new int[] { Convert.ToInt32(positionName), taskID };

                using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                {
                    positionDal.TransactionScopeManager = TM;
                    taskDal.TransactionScopeManager     = TM;

                    int positionID        = positionDal.GetPositionIDByPositionName(positionName);
                    int currentPositionID = taskDal.GetCurrentPositionID(taskID);
                    int nextPositionID    = taskDal.GetNextPositionID(taskID);
                    int endPositionID     = taskDal.GetEndPositionID(taskID);
                    if (positionID != 0 && currentPositionID != endPositionID && positionID == nextPositionID)
                    {
                        positionDal.UpdateHasGoodsToTrue(positionID);
                        taskDal.UpdateTaskPosition(taskID, positionID);
                        taskDal.UpdateTaskPositionStateToArrived(taskID);

                        if (positionID == endPositionID)
                        {
                            string orderType = taskDal.GetOrderType(taskID);
                            if (orderType == "03")//出库单
                            {
                                if (!AutomationContext.Write(memoryServiceName1, memoryItemName1, new int[] { taskID, positionID }))
                                {
                                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID));
                                    return;
                                }
                            }
                            else if (orderType == "04")//盘点单
                            {
                                if (!AutomationContext.Write(memoryServiceName1, memoryItemName2, new int[] { taskID, positionID }))
                                {
                                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID));
                                    return;
                                }
                            }
                            else
                            {
                                if (!AutomationContext.Write(memoryServiceName, memoryItemName3, taskID))
                                {
                                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, taskID));
                                    return;
                                }
                            }
                        }
                        TM.Commit();
                    }
                    else
                    {
                        Logger.Error(string.Format("{0} 处理[{1}]任务到达失败,到达位置{2}与任务不符!", Name, taskID, positionName));
                    }
                }
            }
            catch (Exception ex)
            {
                if (data != null)
                {
                    AutomationContext.Write(memoryServiceName, memoryItemName, data);
                }
                Logger.Error("TaskArriveDataProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }
예제 #8
0
        private void DownloadData()
        {
            try
            {
                using (TransactionScopeManager TM = new TransactionScopeManager())
                {

                    OrderDal orderDal = new OrderDal();
                    orderDal.TransactionScopeManager = TM;

                    if (orderDal.FindUnsortCount() == true)
                        if (DialogResult.Cancel == MessageBox.Show("还有未分拣的数据,您确定要重新下载数据吗?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
                            return;

                    ChannelDal channelDal = new ChannelDal();
                    ServerDal serverDal = new ServerDal();

                    DataTable table = serverDal.FindBatch();
                    if (table.Rows.Count != 0)
                    {
                        string batchsortid = table.Rows[0]["batch_no"].ToString();
                        orderDal.DeleteExportData();//删除贴标机数据(未实现删除哪些表)

                       
                        //AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data);
                        //下载烟道表                          
                        table = serverDal.FindChannel(batchsortid);
                        channelDal.InsertChannel(table);
                        System.Threading.Thread.Sleep(100);
                        //下载订单主表                         
                        table = serverDal.FindOrderMaster(batchsortid);
                        orderDal.InsertMaster(table);
                        System.Threading.Thread.Sleep(100);
                        //下载订单明细表                          
                        table = serverDal.FindOrderDetail(batchsortid);
                        orderDal.InsertOrderDetail(table);


                        //下载手工补货订单明细表
                        table = serverDal.FindHandleSupply(batchsortid);
                        orderDal.InsertHandleSupply(table);


                        //更新批次状态(下载完成)
                        serverDal.UpdateBatchStatus(batchsortid);
                        MessageBox.Show("数据下载完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                      
                        //Context.ProcessDispatcher.WriteToProcess("LEDProcess", "NewData", null);
                        //Context.ProcessDispatcher.WriteToProcess("CreatePackAndPrintDataProcess", "NewData", null);
                        //Context.ProcessDispatcher.WriteToProcess("CurrentOrderProcess", "CurrentOrderA", new int[] { -1 });
                        //Context.ProcessDispatcher.WriteToProcess("monitorView", "ProgressState", new ProgressState());
                    }
                    else
                        MessageBox.Show("没有需要分拣的订单数据。", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
            }
            catch (Exception e)
            {
                Logger.Error("下载数据失败!原因:" + e.Message);
            }
        }
        /// <summary>
        /// Logic launched after the step. Will launch the postprocessor.
        /// @see IStepExecutionListener#AfterStep
        /// </summary>
        /// <param name="stepExecution"></param>
        /// <returns></returns>
        public virtual ExitStatus AfterStep(StepExecution stepExecution)
        {
            ExitStatus returnStatus = stepExecution.ExitStatus;

            if (!"FAILED".Equals(returnStatus.ExitCode))
            {
                MethodInfo post = GetType().GetMethod("Postprocess", BindingFlags.Instance | BindingFlags.NonPublic);
                // determine worker / master mode for step
                if (stepExecution.remoteChunking != null)
                {
                    TimeSpan RemoteChunkingTimoutSecond = stepExecution.remoteChunking.RemoteChunkingTimoutSecond;
                    // master part
                    if (stepExecution.remoteChunking._master)
                    {
                        // wait for Master method send back signal
                        if (!stepExecution.remoteChunking.threadWait.WaitOne(-1))
                        {
                            Exception e = new JobExecutionException("Master step failed");
                            Logger.Error(e, "Clean message in the Queue.");
                            throw e;
                        }
                        // some worker failed master need to fail
                        if ("FAILED".Equals(stepExecution.ExitStatus.ExitCode))
                        {
                            Exception e = new JobExecutionException("Master step failed");
                            Logger.Error(e, "Clean message in the Queue.");
                            throw e;
                        }

                        // clean all message queues when master completed
                        Logger.Info("Master is completed.");
                        Logger.Info("Clean message in the Queue.");
                        stepExecution.remoteChunking.CleanAllQueue();
                    }
                    else
                    {
                        if (!stepExecution.remoteChunking.threadWait.WaitOne(-1))
                        {
                            returnStatus = stepExecution.ExitStatus;
                            throw new JobExecutionException("Worker step failed");
                        }

                        Logger.Info("Worker is completed.");
                    }
                }


                if (post.DeclaringType != typeof(AbstractExecutionListener))
                {
                    using (var scope = TransactionScopeManager.CreateScope())
                    {
                        try
                        {
                            returnStatus = Postprocess();
                        }
                        catch (Exception e)
                        {
                            // Need to catch exception to log and set status to FAILED, while
                            // Spring batch would only log and keep the status COMPLETED
                            Logger.Error(e, "Exception during postprocessor");
                            stepExecution.UpgradeStatus(BatchStatus.Failed);
                            throw;
                        }
                        scope.Complete();
                    }
                }
            }
            // batch failed need to join the thread
            else if (stepExecution.remoteChunking != null)
            {
                stepExecution.remoteChunking.controlThread.Join();
            }

            return(returnStatus);
        }
예제 #10
0
        private void FinishTask()
        {
            try
            {
                if (CurrentTask != null)
                {
                    using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                    {
                        TaskDal taskDal = new TaskDal();
                        PositionDal positionDal = new PositionDal();

                        taskDal.TransactionScopeManager = TM;
                        positionDal.TransactionScopeManager = TM;

                        positionDal.UpdateHasGoodsToFalse(CurrentTask.CurrentPositionID);
                        positionDal.UpdateHasGoodsToTrue(CurrentTask.NextPositionID);

                        taskDal.UpdateTaskPosition(CurrentTask.ID, CurrentTask.NextPositionID);
                        taskDal.UpdateTaskPositionStateToArrived(CurrentTask.ID);
                        taskDal.UpdateTaskStateToWaiting(CurrentTask.ID);                        

                        if (CurrentTask.NextPositionID == CurrentTask.EndPositionID
                            && (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "03")
                            && (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "04"))//小品种,异型烟,由手持PDA完成;
                        {
                            if (CurrentTask.TaskType == "02")
                            {
                                string orderType = taskDal.GetOrderType(CurrentTask.ID);
                                string orderID = taskDal.GetOrderID(CurrentTask.ID);
                                int allotID = taskDal.GetAllotID(CurrentTask.ID);
                                string originCellCode = taskDal.GetOriginCellCode(CurrentTask.ID);
                                string targetCellCode = taskDal.GetTargetCellCode(CurrentTask.ID);
                                string originStorageCode = taskDal.GetOriginStorageCode(CurrentTask.ID);
                                string targetStorageCode = taskDal.GetTargetStorageCode(CurrentTask.ID);

                                RestClient rest = new RestClient();
                                if (!rest.FinishTask(CurrentTask.ID, orderType, orderID, allotID,originCellCode,targetCellCode, originStorageCode, targetStorageCode))
                                {
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID));
                                    return;
                                }
                                else
                                {
                                    taskDal.UpdateTaskStateToExecuted(CurrentTask.ID);
                                }
                            }
                            else
                            {
                                if (!Ops.Write(memoryServiceName, memoryItemName, CurrentTask.ID))
                                {
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID));
                                    return;
                                }
                            }
                        }
                        TM.Commit();

                        CurrentTask = null;
                        CurrentTaskFactory = null;                        
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("SRM.FinishTask 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }
        public override void Execute()
        {
            try
            {
                int productID = 0, quantity = 0;
                object state = AutomationContext.Read(memoryServiceName, memoryItemName);               
                object obj = ObjectUtil.GetObjects(state);
                if (obj is Array)
                {
                    Array arrayObj = (Array)obj;
                    if (arrayObj.Length == 2)
                    {
                        productID = Convert.ToInt32(arrayObj.GetValue(0));
                        quantity = Convert.ToInt32(arrayObj.GetValue(1));
                    }
                }
                if (productID == 0 || quantity == 0) return;

                state = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Scan_Request);
                state = ObjectUtil.GetObject(state);
                if (state == null || !Convert.ToBoolean(state)) return;

                if (!ScanManagerView.InitCigaretteScanInfoStack()) return;
                var scanInfo = CigaretteScanInfoStack
                    .Where(c => c.Value.ProductNo == productID
                            && c.Value.State == "0")
                    .Select(c=> c.Value)
                    .FirstOrDefault();
                if (scanInfo == null)
                {
                    Logger.Info("当前整托盘入库品牌已经由件烟扫码开始进行扫码或没有扫码任务!");
                    return;
                }

                using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                {
                    taskDal.TransactionScopeManager = TM;
                    int taskID = taskDal.GetTask(productID, quantity);
                    if (taskID != 0)
                    {
                        string positionName = taskDal.GetTaskNextPosition(taskID);
                        if (positionName != string.Empty)
                        {
                            int[] data = new int[] { taskID, Convert.ToInt32(positionName), 1 };
                            AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info, data);
                            Thread.Sleep(sleepTime);
                            obj = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Task_Info);
                            obj = ObjectUtil.GetObjects(obj);
                            if (obj is Array)
                            {
                                Array arrayObj = (Array)obj;
                                if (arrayObj.Length == 3
                                   && data[0] == Convert.ToInt32(arrayObj.GetValue(0))
                                   && data[1] == Convert.ToInt32(arrayObj.GetValue(1))
                                   && data[2] == Convert.ToInt32(arrayObj.GetValue(2)))
                                {
                                    //更新任务状态为,到达当前位置;
                                    taskDal.UpdateTaskPositionStateToArrived(taskID);
                                    AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info_Complete, 1);
                                    TM.Commit();
                                    scanInfo.ScanQuantity += quantity;
                                    AutomationContext.Write(memoryServiceName1, memoryItemName1, CigaretteScanInfoStack);
                                    Logger.Info(string.Format("任务号[{0}]整托盘入库成功!",taskID));
                                    return;
                                }
                            }
                        }
                    }
                    Logger.Info(string.Format("整托盘入库失败,简码:[{0}],数量: [{0}]", productID, quantity));
                }
            }
            catch (Exception ex)
            {
                Logger.Error("WholePalletTaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }
        //码垛完成后申请分配入库任务;
        public override void Execute()
        {
            try
            {
                int productID = 0, quantity = 0, taskID = 0;
                object state = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info_Request);
                object obj = ObjectUtil.GetObjects(state);
                if (obj is Array)
                {
                    Array arrayObj = (Array)obj;
                    if (arrayObj.Length == 2)
                    {
                        productID = Convert.ToInt32(arrayObj.GetValue(0));
                        quantity = Convert.ToInt32(arrayObj.GetValue(1));
                    }
                }

                if (productID == 0 || quantity == 0)
                {
                    return;
                }

                int[] data = new int[] { productID, quantity };
                string msg = "TaskRequest : ";
                for (int i = 0; i < data.Length; i++)
                    msg += string.Format("[{0}]", data[i]);
                Logger.Info(msg);

                using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                {
                    taskDal.TransactionScopeManager = TM;
                    taskID = taskDal.GetTask(productID, quantity);
                    if (taskID != 0)
                    {
                        string positionName = taskDal.GetTaskNextPosition(taskID);
                        if (positionName != string.Empty)
                        {
                            data = new int[] { taskID, Convert.ToInt32(positionName), 1 };
                            AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data);
                            Thread.Sleep(sleepTime);
                            obj = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info);
                            obj = ObjectUtil.GetObjects(obj);
                            if (obj is Array)
                            {
                                Array arrayObj = (Array)obj;
                                if (arrayObj.Length == 3
                                   && data[0] == Convert.ToInt32(arrayObj.GetValue(0))
                                   && data[1] == Convert.ToInt32(arrayObj.GetValue(1))
                                   && data[2] == Convert.ToInt32(arrayObj.GetValue(2)))
                                {
                                    //更新任务状态为,到达当前位置;
                                    taskDal.UpdateTaskPositionStateToArrived(taskID);
                                    AutomationContext.Write(plcServiceName, O_StockIn_Task_Info_Complete, 1);
                                    TM.Commit();
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("TaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }
예제 #13
0
        private void FinishTask()
        {
            try
            {
                if (CurrentTask != null)
                {
                    using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                    {
                        TaskDal     taskDal     = new TaskDal();
                        PositionDal positionDal = new PositionDal();

                        taskDal.TransactionScopeManager     = TM;
                        positionDal.TransactionScopeManager = TM;

                        positionDal.UpdateHasGoodsToFalse(CurrentTask.CurrentPositionID);
                        positionDal.UpdateHasGoodsToTrue(CurrentTask.NextPositionID);

                        taskDal.UpdateTaskPosition(CurrentTask.ID, CurrentTask.NextPositionID);
                        taskDal.UpdateTaskPositionStateToArrived(CurrentTask.ID);
                        taskDal.UpdateTaskStateToWaiting(CurrentTask.ID);

                        if (CurrentTask.NextPositionID == CurrentTask.EndPositionID &&
                            (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "03") &&
                            (CurrentTask.TaskType == "03" || CurrentTask.EndPositionType != "04"))   //小品种,异型烟,由手持PDA完成;
                        {
                            if (CurrentTask.TaskType == "02")
                            {
                                string orderType         = taskDal.GetOrderType(CurrentTask.ID);
                                string orderID           = taskDal.GetOrderID(CurrentTask.ID);
                                int    allotID           = taskDal.GetAllotID(CurrentTask.ID);
                                string originCellCode    = taskDal.GetOriginCellCode(CurrentTask.ID);
                                string targetCellCode    = taskDal.GetTargetCellCode(CurrentTask.ID);
                                string originStorageCode = taskDal.GetOriginStorageCode(CurrentTask.ID);
                                string targetStorageCode = taskDal.GetTargetStorageCode(CurrentTask.ID);

                                RestClient rest = new RestClient();
                                if (!rest.FinishTask(CurrentTask.ID, orderType, orderID, allotID, originCellCode, targetCellCode, originStorageCode, targetStorageCode))
                                {
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID));
                                    return;
                                }
                                else
                                {
                                    taskDal.UpdateTaskStateToExecuted(CurrentTask.ID);
                                }
                            }
                            else
                            {
                                if (!Ops.Write(memoryServiceName, memoryItemName, CurrentTask.ID))
                                {
                                    Logger.Error(string.Format("{0} 完成[{1}]任务失败!", Name, CurrentTask.ID));
                                    return;
                                }
                            }
                        }
                        TM.Commit();

                        CurrentTask        = null;
                        CurrentTaskFactory = null;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("SRM.FinishTask 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }
        //码垛完成后申请分配入库任务;
        public override void Execute()
        {
            try
            {
                int    productID = 0, quantity = 0, taskID = 0;
                object state = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info_Request);
                object obj   = ObjectUtil.GetObjects(state);
                if (obj is Array)
                {
                    Array arrayObj = (Array)obj;
                    if (arrayObj.Length == 2)
                    {
                        productID = Convert.ToInt32(arrayObj.GetValue(0));
                        quantity  = Convert.ToInt32(arrayObj.GetValue(1));
                    }
                }

                if (productID == 0 || quantity == 0)
                {
                    return;
                }

                int[]  data = new int[] { productID, quantity };
                string msg  = "TaskRequest : ";
                for (int i = 0; i < data.Length; i++)
                {
                    msg += string.Format("[{0}]", data[i]);
                }
                Logger.Info(msg);

                using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                {
                    taskDal.TransactionScopeManager = TM;
                    taskID = taskDal.GetTask(productID, quantity);
                    if (taskID != 0)
                    {
                        string positionName = taskDal.GetTaskNextPosition(taskID);
                        if (positionName != string.Empty)
                        {
                            data = new int[] { taskID, Convert.ToInt32(positionName), 1 };
                            AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data);
                            Thread.Sleep(sleepTime);
                            obj = AutomationContext.Read(plcServiceName, I_StockIn_Task_Info);
                            obj = ObjectUtil.GetObjects(obj);
                            if (obj is Array)
                            {
                                Array arrayObj = (Array)obj;
                                if (arrayObj.Length == 3 &&
                                    data[0] == Convert.ToInt32(arrayObj.GetValue(0)) &&
                                    data[1] == Convert.ToInt32(arrayObj.GetValue(1)) &&
                                    data[2] == Convert.ToInt32(arrayObj.GetValue(2)))
                                {
                                    //更新任务状态为,到达当前位置;
                                    taskDal.UpdateTaskPositionStateToArrived(taskID);
                                    AutomationContext.Write(plcServiceName, O_StockIn_Task_Info_Complete, 1);
                                    TM.Commit();
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("TaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }
예제 #15
0
        public void EbcdicFileTestTransactionalWrite()
        {
            // local resources
            IResource fileResource     = new FileSystemResource(new FileInfo("C:/temp/outputs/PersonWritten.txt"));
            var       executionContext = new ExecutionContext();
            FileInfo  fileInfo         = new FileInfo("Ebcdic/Resources/copybooks/Person.fileformat");

            IResource copybookResource = new FileSystemResource(fileInfo);

            //1. WRITE
            EbcdicWriterMapper writerMapper = new EbcdicWriterMapper();

            writerMapper.AfterPropertiesSet();

            var writer = new EbcdicFileWriter <Ebcdic.Test.Person>
            {
                AppendAllowed      = false,
                WriteRdw           = false,
                Name               = "PersonWriter",
                Resource           = fileResource,
                EbcdicWriterMapper = writerMapper,
                DefaultValue       = EbcdicEncoder.DefaultValue.LowValue,
                Copybooks          = new List <IResource> {
                    new FileSystemResource(fileInfo)
                }
            };

            writer.AfterPropertiesSet();
            writer.Open(executionContext);

            try
            {
                for (int i = 0; i < CountTransactions; i++)
                {
                    using (TransactionScope scope = TransactionScopeManager.CreateScope())
                    {
                        writer.Write(GetPersons(i));
                        if (i == CountTransactions - 1) //SIMULATE FAILURE
                        {
                            throw new Exception("Bailing out ... should rollback ...");
                        }
                        scope.Complete();
                    }
                }
            }
            catch (Exception)
            {
                // DISCARDED (JUST TO AVOID UNIT TEST FAILURE ...)
            }
            writer.Close();

            Assert.IsTrue(System.IO.File.Exists("C:/temp/outputs/PersonWritten.txt"));
            Assert.IsTrue(new FileInfo("C:/temp/outputs/PersonWritten.txt").Length > 0);

            //2.READ WHAT WAS WRITTEN
            var reader = new EbcdicFileReader <Ebcdic.Test.Person>
            {
                EbcdicReaderMapper = new PersonMapper(),
                Rdw       = false,
                Resource  = fileResource,
                Name      = "PersonReader",
                SaveState = false,
                Copybook  = copybookResource
            };

            reader.AfterPropertiesSet();

            var persons = new List <Ebcdic.Test.Person>();

            reader.Open(executionContext);
            Ebcdic.Test.Person person;
            while ((person = reader.Read()) != null)
            {
                persons.Add(person);
            }
            reader.Close();

            Assert.AreEqual(CountObject * (CountTransactions - 1), persons.Count);
            foreach (Ebcdic.Test.Person p in persons)
            {
                Assert.AreEqual(p.Id, p.Value);
                Assert.IsTrue(p.Name.StartsWith("Name_" + p.Id));
            }
        }
예제 #16
0
 /// <summary>
 /// Custom constructor with path and FileMode.
 /// </summary>
 /// <param name="path"></param>
 /// <param name="fileMode"></param>
 public TransactionAwareFileStream(string path, FileMode fileMode) : base(path, fileMode)
 {
     _internalBuffer = new List <byte>();
     TransactionScopeManager.RegisterResource(this);
 }
예제 #17
0
        private void DownloadData()
        {
            try
            {
                using (TransactionScopeManager TM = new TransactionScopeManager())
                {
                    OrderDal orderDal = new OrderDal();
                    orderDal.TransactionScopeManager = TM;

                    if (orderDal.FindUnsortCount() == true)
                    {
                        if (DialogResult.Cancel == MessageBox.Show("还有未分拣的数据,您确定要重新下载数据吗?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
                        {
                            return;
                        }
                    }

                    ChannelDal channelDal = new ChannelDal();
                    ServerDal  serverDal  = new ServerDal();

                    DataTable table = serverDal.FindBatch();
                    if (table.Rows.Count != 0)
                    {
                        string batchsortid = table.Rows[0]["batch_no"].ToString();
                        orderDal.DeleteExportData();//删除贴标机数据(未实现删除哪些表)


                        //AutomationContext.Write(plcServiceName, O_StockIn_Task_Info, data);
                        //下载烟道表
                        table = serverDal.FindChannel(batchsortid);
                        channelDal.InsertChannel(table);
                        System.Threading.Thread.Sleep(100);
                        //下载订单主表
                        table = serverDal.FindOrderMaster(batchsortid);
                        orderDal.InsertMaster(table);
                        System.Threading.Thread.Sleep(100);
                        //下载订单明细表
                        table = serverDal.FindOrderDetail(batchsortid);
                        orderDal.InsertOrderDetail(table);


                        //下载手工补货订单明细表
                        table = serverDal.FindHandleSupply(batchsortid);
                        orderDal.InsertHandleSupply(table);


                        //更新批次状态(下载完成)
                        serverDal.UpdateBatchStatus(batchsortid);
                        MessageBox.Show("数据下载完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);


                        //Context.ProcessDispatcher.WriteToProcess("LEDProcess", "NewData", null);
                        //Context.ProcessDispatcher.WriteToProcess("CreatePackAndPrintDataProcess", "NewData", null);
                        //Context.ProcessDispatcher.WriteToProcess("CurrentOrderProcess", "CurrentOrderA", new int[] { -1 });
                        //Context.ProcessDispatcher.WriteToProcess("monitorView", "ProgressState", new ProgressState());
                    }
                    else
                    {
                        MessageBox.Show("没有需要分拣的订单数据。", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Error("下载数据失败!原因:" + e.Message);
            }
        }
        public override void Execute()
        {
            try
            {
                int    productID = 0, quantity = 0;
                object state = AutomationContext.Read(memoryServiceName, memoryItemName);
                object obj   = ObjectUtil.GetObjects(state);
                if (obj is Array)
                {
                    Array arrayObj = (Array)obj;
                    if (arrayObj.Length == 2)
                    {
                        productID = Convert.ToInt32(arrayObj.GetValue(0));
                        quantity  = Convert.ToInt32(arrayObj.GetValue(1));
                    }
                }
                if (productID == 0 || quantity == 0)
                {
                    return;
                }

                state = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Scan_Request);
                state = ObjectUtil.GetObject(state);
                if (state == null || !Convert.ToBoolean(state))
                {
                    return;
                }

                if (!ScanManagerView.InitCigaretteScanInfoStack())
                {
                    return;
                }
                var scanInfo = CigaretteScanInfoStack
                               .Where(c => c.Value.ProductNo == productID &&
                                      c.Value.State == "0")
                               .Select(c => c.Value)
                               .FirstOrDefault();
                if (scanInfo == null)
                {
                    Logger.Info("当前整托盘入库品牌已经由件烟扫码开始进行扫码或没有扫码任务!");
                    return;
                }

                using (TransactionScopeManager TM = new TransactionScopeManager(true, IsolationLevel.Serializable))
                {
                    taskDal.TransactionScopeManager = TM;
                    int taskID = taskDal.GetTask(productID, quantity);
                    if (taskID != 0)
                    {
                        string positionName = taskDal.GetTaskNextPosition(taskID);
                        if (positionName != string.Empty)
                        {
                            int[] data = new int[] { taskID, Convert.ToInt32(positionName), 1 };
                            AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info, data);
                            Thread.Sleep(sleepTime);
                            obj = AutomationContext.Read(plcServiceName, I_Whole_Pallet_StockIn_Task_Info);
                            obj = ObjectUtil.GetObjects(obj);
                            if (obj is Array)
                            {
                                Array arrayObj = (Array)obj;
                                if (arrayObj.Length == 3 &&
                                    data[0] == Convert.ToInt32(arrayObj.GetValue(0)) &&
                                    data[1] == Convert.ToInt32(arrayObj.GetValue(1)) &&
                                    data[2] == Convert.ToInt32(arrayObj.GetValue(2)))
                                {
                                    //更新任务状态为,到达当前位置;
                                    taskDal.UpdateTaskPositionStateToArrived(taskID);
                                    AutomationContext.Write(plcServiceName, O_Whole_Pallet_StockIn_Task_Info_Complete, 1);
                                    TM.Commit();
                                    scanInfo.ScanQuantity += quantity;
                                    AutomationContext.Write(memoryServiceName1, memoryItemName1, CigaretteScanInfoStack);
                                    Logger.Info(string.Format("任务号[{0}]整托盘入库成功!", taskID));
                                    return;
                                }
                            }
                        }
                    }
                    Logger.Info(string.Format("整托盘入库失败,简码:[{0}],数量: [{0}]", productID, quantity));
                }
            }
            catch (Exception ex)
            {
                Logger.Error("WholePalletTaskRequestProcess 出错,原因:" + ex.Message + "/n" + ex.StackTrace);
            }
        }