/// <summary> 
        /// </summary>        
        protected internal override ActivityExecutionStatus DoExecute(ActivityExecutionContext executionContext)
        {
            var currentStation = default(string);

            currentStation = Station;

            IList<IProduct> prodList = new List<IProduct>();
            prodList = (IList<IProduct>)CurrentSession.GetValue(Session.SessionKeys.ProdList);

            foreach (IProduct currentProduct in prodList)
            {
                var newStatus = new ProductStatus();

                string line = default(string);
                if (string.IsNullOrEmpty(this.Line))
                {
                    line = currentProduct.Status.Line;
                }
                else
                {
                    line = this.Line;
                }

                newStatus.Status = StationStatus.Pass;
                newStatus.StationId = currentStation;
                newStatus.Editor = Editor;
                newStatus.Line = line;

                newStatus.TestFailCount = 0;
                
                IProductRepository productRepository = RepositoryFactory.GetInstance().GetRepository<IProductRepository, IProduct>();
                if (!string.IsNullOrEmpty(currentProduct.Status.ReworkCode) && productRepository.IsLastReworkStation(currentProduct.Status.ReworkCode, Station, (int)StationStatus.Pass))
                {
                    newStatus.ReworkCode = "";
                    IMES.DataModel.Rework r = new IMES.DataModel.Rework();
                    r.ReworkCode = currentProduct.Status.ReworkCode;
                    r.Editor = Editor;
                    r.Status = "3";
                    r.Udt = DateTime.Now;
                    productRepository.UpdateReworkConsideredProductStatusDefered(CurrentSession.UnitOfWork, r, currentProduct.ProId);
                }
                else
                {
                    newStatus.ReworkCode = currentProduct.Status.ReworkCode;
                }
                newStatus.ProId = currentProduct.ProId;


                currentProduct.UpdateStatus(newStatus);

                productRepository.Update(currentProduct, CurrentSession.UnitOfWork);
            }

            return base.DoExecute(executionContext);
        }
        /// <summary>
        /// Update Product Status
        /// </summary>
        /// <param name="executionContext"></param>
        /// <returns></returns>
        protected internal override ActivityExecutionStatus DoExecute(ActivityExecutionContext executionContext)
        {
            var currentStation = default(string);

            if (IsReturnStatoin)
            {
                currentStation = CurrentSession.GetValue(Session.SessionKeys.ReturnStation).ToString();
            }
            else
            {
                currentStation = Station;
            }
            var currentProduct = (IProduct)CurrentSession.GetValue(Session.SessionKeys.Product);
            var newStatus = new ProductStatus();

            string line = default(string);
            if (string.IsNullOrEmpty(this.Line))
            {
                line = currentProduct.Status.Line;
            }
            else
            {
                line = this.Line;
            }

            newStatus.Status = Status;
            newStatus.StationId = currentStation;
            newStatus.Editor = Editor;
            newStatus.Line = line;

            string AllowPass = "";

            if (CurrentSession.GetValue(ExtendSession.SessionKeys.AllowPass) != null)
            {
                AllowPass = (string)CurrentSession.GetValue(ExtendSession.SessionKeys.AllowPass);
            }

            if (AllowPass == "N" && Status == StationStatus.Fail)
            {
                newStatus.TestFailCount = currentProduct.Status.TestFailCount;  //999;
            }
            else if (currentProduct.Status.StationId == currentStation && Status == StationStatus.Fail)   //檢查相同測試站需累計測試次數
            {

                newStatus.TestFailCount = currentProduct.Status.TestFailCount + 1;
            }
            else if (Status == StationStatus.Fail)
            {
                newStatus.TestFailCount = 1;
            }
            else
            {
                newStatus.TestFailCount = 0;
            }

            IProductRepository productRepository = RepositoryFactory.GetInstance().GetRepository<IProductRepository, IProduct>();
            if ( !string.IsNullOrEmpty(currentProduct.Status.ReworkCode) && productRepository.IsLastReworkStation(currentProduct.Status.ReworkCode,Station,(int)Status))
            {
                newStatus.ReworkCode = "";
                IMES.DataModel.Rework r = new IMES.DataModel.Rework();
                r.ReworkCode = currentProduct.Status.ReworkCode;
                r.Editor = Editor;
                r.Status = "3";
                r.Udt = DateTime.Now;
                productRepository.UpdateReworkConsideredProductStatusDefered(CurrentSession.UnitOfWork,r,currentProduct.ProId);
            }
            else {
                newStatus.ReworkCode = currentProduct.Status.ReworkCode;
            }
            newStatus.ProId = currentProduct.ProId;

            #region record previous product Status
            //System.Data.DataTable preStatus = CreateDataTable.CreateProductStatusTb();
            //preStatus.Rows.Add(currentProduct.ProId,
            //                                   currentProduct.Status.StationId,
            //                                   currentProduct.Status.Status == StationStatus.Pass ? 1 : 0,
            //                                   currentProduct.Status.ReworkCode,
            //                                   currentProduct.Status.Line,
            //                                   currentProduct.Status.TestFailCount,
            //                                   currentProduct.Status.Editor,
            //                                   //currentProduct.Status.Udt.ToString("yyyy-MM-dd HH:mm:ss.fff")
            //                                   currentProduct.Status.Udt
            //                                   );



            //System.Data.DataTable curStatus = CreateDataTable.CreateProductStatusTb();
            //newStatus.Udt = DateTime.Now;
            //curStatus.Rows.Add(currentProduct.ProId,
            //                                   newStatus.StationId,
            //                                   newStatus.Status == StationStatus.Pass ? 1 : 0,
            //                                   currentProduct.Status.ReworkCode,
            //                                   newStatus.Line,
            //                                   newStatus.TestFailCount,
            //                                   newStatus.Editor,
            //                                   //newStatus.Udt.ToString("yyyy-MM-dd HH:mm:ss.fff")
            //                                   newStatus.Udt
            //                                   );

            //SqlParameter para1 =new SqlParameter("PreStatus", System.Data.SqlDbType.Structured);
            //para1.Direction = System.Data.ParameterDirection.Input;
            //para1.Value = preStatus;

            //SqlParameter para2 =new SqlParameter("Status", System.Data.SqlDbType.Structured);
            //para2.Direction = System.Data.ParameterDirection.Input;
            //para2.Value = curStatus;

            
            //productRepository.ExecSpForNonQueryDefered(CurrentSession.UnitOfWork,
            //                                                                                 IMES.Infrastructure.Repository._Schema.SqlHelper.ConnectionString_FA,
            //                                                                                 "IMES_UpdateProductStatus",
            //                                                                                para1,
            //                                                                                para2);

            IList<IMES.DataModel.TbProductStatus> stationList = productRepository.GetProductStatus(new List<string>{currentProduct.ProId});
            productRepository.UpdateProductPreStationDefered(CurrentSession.UnitOfWork, stationList);
                                                                                             
            #endregion

            currentProduct.UpdateStatus(newStatus);
            
            //070031 2012.09.18
            //Vincent disable 檢查重複BoxId功能,在分配時BoxId 已做檢查
            //0001649: [Activity]修改UpdateProductStatus activity 刪除檢查重複Boxd 問題
            //var ivkBdy = productRepository.CheckTheBoxIdDefered(CurrentSession.UnitOfWork, currentProduct);
            //070031 2012.09.18

            productRepository.Update(currentProduct, CurrentSession.UnitOfWork);

            //070031 2012.09.18
            //0001649: [Activity]修改UpdateProductStatus activity 刪除檢查重複Boxd 問題
            //var ivkBdy2 = productRepository.CheckTheBoxIdDefered(CurrentSession.UnitOfWork, currentProduct);
            //ivkBdy2.DependencyIvkbdy = ivkBdy;
            //ivkBdy2.ExpectRetVal = true;
            //070031 2012.09.18

            //Vincent Add Reset ForceNWC
            string isForceNWC = (string)CurrentSession.GetValue("IsForceNWC");
            if (isForceNWC == "Y")
            {
                IPartRepository partRep = RepositoryFactory.GetInstance().GetRepository<IPartRepository, IPart>();
                partRep.UpdateForceNWCByProductIDDefered(CurrentSession.UnitOfWork, "", "", currentProduct.ProId);
            }

            return base.DoExecute(executionContext);
        }
        /// <summary> 
        /// </summary>        
        protected internal override ActivityExecutionStatus DoExecute(ActivityExecutionContext executionContext)
        {
            var currentStation = default(string);

            currentStation = Station;
            

            IProductRepository productRepository = RepositoryFactory.GetInstance().GetRepository<IProductRepository, IProduct>();
            IList<IProduct> prodList = new List<IProduct>();
            prodList = (IList<IProduct>)CurrentSession.GetValue(Session.SessionKeys.ProdList);

            #region  record multi-productId product status
             
            //System.Data.DataTable productTb = CreateDataTable.CreateStringListTb();
            //foreach (IProduct currentProduct in prodList)
            //{
            //    productTb.Rows.Add(currentProduct.ProId);
            //}
            //SqlParameter para1 = new SqlParameter("ProductIDList", System.Data.SqlDbType.Structured);
            //para1.Direction = System.Data.ParameterDirection.Input;
            //para1.Value = productTb;

            //IProductRepository productRep = RepositoryFactory.GetInstance().GetRepository<IProductRepository, IProduct>();
               
            //productRep.ExecSpForNonQueryDefered(CurrentSession.UnitOfWork,
            //                                                                                IMES.Infrastructure.Repository._Schema.SqlHelper.ConnectionString_FA,
            //                                                                                "IMES_MultiUpdateProductStatus",
            //                                                                               para1,
            //                                                                               new SqlParameter("station", Station),
            //                                                                               new SqlParameter("status", 1),
            //                                                                               new SqlParameter("line", Line),
            //                                                                               new SqlParameter("editor", Editor),
            //                                                                               new SqlParameter("udt", DateTime.Now)
            //                                                                               );

            var productIDList = (from item in prodList
                                             select item.ProId).ToList();

            IList<IMES.DataModel.TbProductStatus> stationList = productRepository.GetProductStatus(productIDList);
            productRepository.UpdateProductPreStationDefered(CurrentSession.UnitOfWork, stationList);

  
            #endregion

            foreach (IProduct currentProduct in prodList)
            {
                var newStatus = new ProductStatus();

                string line = default(string);
                if (string.IsNullOrEmpty(this.Line))
                {
                    line = currentProduct.Status.Line;
                }
                else
                {
                    line = this.Line;
                }

                newStatus.Status = StationStatus.Pass;
                newStatus.StationId = currentStation;
                newStatus.Editor = Editor;
                newStatus.Line = line;

                newStatus.TestFailCount = 0;
                
                
               
                if (!string.IsNullOrEmpty(currentProduct.Status.ReworkCode) && productRepository.IsLastReworkStation(currentProduct.Status.ReworkCode, Station, (int)StationStatus.Pass))
                {
                    newStatus.ReworkCode = "";
                    IMES.DataModel.Rework r = new IMES.DataModel.Rework();
                    r.ReworkCode = currentProduct.Status.ReworkCode;
                    r.Editor = Editor;
                    r.Status = "3";
                    r.Udt = DateTime.Now;
                    productRepository.UpdateReworkConsideredProductStatusDefered(CurrentSession.UnitOfWork, r, currentProduct.ProId);
                }
                else
                {
                    newStatus.ReworkCode = currentProduct.Status.ReworkCode;
                }
                newStatus.ProId = currentProduct.ProId;


                currentProduct.UpdateStatus(newStatus);

                productRepository.Update(currentProduct, CurrentSession.UnitOfWork);
            }

            return base.DoExecute(executionContext);
        }