예제 #1
0
        protected void Page_Load(object sender, EventArgs e)
        {
            string resourceID = Request.QueryString["resourceID"];

            WfProcessCurrentInfoCollection infos =
                WfProcessCurrentInfoAdapter.Instance.Load(false,
                                                          builder => builder.AppendItem("RESOURCE_ID", resourceID));

            string newUrl  = "";
            string signStr = "";
            string keyName = "";

            if (infos.Count > 0)
            {
                keyName = "appTrace";
            }
            else
            {
                keyName = "oldAppTrace";
            }
            if (ResourceUriSettings.GetConfig().Paths[keyName].Uri.ToString().IndexOf('?') != -1)
            {
                signStr = "{0}&{1}";
            }
            else
            {
                signStr = "{0}?{1}";
            }

            newUrl = string.Format(signStr
                                   , ResourceUriSettings.GetConfig().Paths[keyName].Uri.ToString()
                                   , Request.QueryString.ToString());
            Response.Redirect(newUrl);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="fillAssignees"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public WfProcessCurrentInfoCollection Load(bool fillAssignees, Action<WhereSqlClauseBuilder> action)
        {
            action.NullCheck("action");

            WfProcessCurrentInfoCollection result = new WfProcessCurrentInfoCollection();

            WhereSqlClauseBuilder whereBuilder = new WhereSqlClauseBuilder();

            action(whereBuilder);

            string fieldNames = ORMapping.GetSelectFieldsNameSql<WfProcessInstanceData>("Data");

            string sql = string.Format("SELECT {0} FROM WF.PROCESS_INSTANCES WHERE {1}",
                    fieldNames,
                    whereBuilder.ToSqlString(TSqlBuilder.Instance));

            DataTable table = DbHelper.RunSqlReturnDS(sql, GetConnectionName()).Tables[0];

            result.LoadFromDataView(table.DefaultView);

            if (fillAssignees)
                FillAssignees(result);

            return result;
        }
예제 #3
0
        protected override void AfterCreateProcessInstance(SysTaskProcess sysTaskProcess)
        {
            sysTaskProcess.Name = string.Format("作废ID为{0}的流程", this.ProcessID);

            int index = 0;

            sysTaskProcess.OwnerActivityID = this.OwnerSysActivityID;

            IWfProcess process = WfRuntime.GetProcessByProcessID(this.ProcessID);

            WfProcessCurrentInfoCollection branchProcessesStatus = WfRuntime.GetProcessStatusByOwnerActivityID(process.CurrentActivity.ID, string.Empty, false);

            if (branchProcessesStatus.Count > 0 && this.CancelAllBranchProcesses)
            {
                //作废子流程
                sysTaskProcess.Activities.Add(sysTaskProcess.CreateDispatchCancelBranchesProcessActivity(process.CurrentActivity.ID, this.CancelAllBranchProcesses, index++));
            }

            if (this.CancelSelf)
            {
                sysTaskProcess.Activities.Add(sysTaskProcess.CreateCancelProcessActivity(this.ProcessID, index++));
            }

            sysTaskProcess.Activities.Add(sysTaskProcess.CreateExitMaintainingActivity(this.ProcessID, index++));
        }
        /// <summary>
        /// 加载流程运行时的信息
        /// </summary>
        /// <param name="processIDs"></param>
        /// <returns></returns>
        public WfProcessCurrentInfoCollection Load(bool fillAssignees, params string[] processIDs)
        {
            processIDs.NullCheck("processIDs");

            WfProcessCurrentInfoCollection result = new WfProcessCurrentInfoCollection();

            InSqlClauseBuilder builder = new InSqlClauseBuilder();
            builder.AppendItem(processIDs);

            if (builder.Count > 0)
            {
                string fieldNames = ORMapping.GetSelectFieldsNameSql<WfProcessInstanceData>("Data");

                string sql = string.Format("SELECT {0} FROM WF.PROCESS_INSTANCES WHERE INSTANCE_ID {1}",
                    fieldNames,
                    builder.ToSqlStringWithInOperator(TSqlBuilder.Instance));

                DataTable table = DbHelper.RunSqlReturnDS(sql, GetConnectionName()).Tables[0];

                result.LoadFromDataView(table.DefaultView);

                if (fillAssignees)
                    FillAssignees(result);
            }

            return result;
        }
        protected override void OnAfterQuery(System.Data.DataView result)
        {
            base.OnAfterQuery(result);

            List <string> resourceIDList = new List <string>();
            List <string> processIDList  = new List <string>();

            foreach (DataRowView rowView in result)
            {
                if (!resourceIDList.Contains(rowView["RESOURCE_ID"].ToString()))
                {
                    resourceIDList.Add(rowView["RESOURCE_ID"].ToString());
                }

                if (!processIDList.Contains(rowView["PROCESS_ID"].ToString()))
                {
                    processIDList.Add(rowView["PROCESS_ID"].ToString());
                }
            }

            var atpc = new WfProcessCurrentInfoCollection();

            WfProcessCurrentInfoCollection resourceAtpc = WfProcessCurrentInfoAdapter.Instance.Load(resourceIDList.ToArray());
            WfProcessCurrentInfoCollection processAtpc  = WfProcessCurrentInfoAdapter.Instance.LoadByProcessID(processIDList.ToArray());

            resourceAtpc.ForEach(atp =>
            {
                if (atpc.Exists(p => p.InstanceID == atp.InstanceID) == false)
                {
                    atpc.Add(atp);
                }
            });

            processAtpc.ForEach(atp =>
            {
                if (atpc.Exists(p => p.InstanceID == atp.InstanceID) == false)
                {
                    atpc.Add(atp);
                }
            });

            result.Table.Columns.Add("Status");

            foreach (DataRowView rowView in result)
            {
                var processInfo = atpc.Find(p => p.InstanceID == rowView["PROCESS_ID"].ToString() || p.ResourceID == rowView["RESOURCE_ID"].ToString());

                rowView["Status"] = processInfo != null ? (int)processInfo.Status : 0;
            }
        }
        public void ServerToClient(WfProcessCurrentInfoCollection server, WfClientProcessCurrentInfoCollection client)
        {
            server.NullCheck("server");
            client.NullCheck("client");

            client.Clear();

            foreach (WfProcessCurrentInfo processInfo in server)
            {
                WfClientProcessCurrentInfo clientInfo = null;

                this.ServerToClient(processInfo, ref clientInfo);

                client.Add(clientInfo);
            }
        }
        private static WfClientProcessCurrentInfoPageQueryResult QueryProcessInfo(QueryCondition qc, int totalCount)
        {
            TSqlCommonAdapter adapter = new TSqlCommonAdapter(WfProcessCurrentInfoAdapter.Instance.ConnectionName);

            WfProcessCurrentInfoCollection processInfo = adapter.SplitPageQuery <WfProcessCurrentInfo, WfProcessCurrentInfoCollection>(qc, ref totalCount);

            WfClientProcessCurrentInfoCollection clientInfo = new WfClientProcessCurrentInfoCollection();

            WfClientProcessCurrentInfoConverter.Instance.ServerToClient(processInfo, clientInfo);

            WfClientProcessCurrentInfoPageQueryResult result = new WfClientProcessCurrentInfoPageQueryResult();

            result.TotalCount = totalCount;
            result.QueryResult.CopyFrom(clientInfo);

            return(result);
        }
예제 #8
0
        public int DispatchCancelBranchProcessesTasks(string ownerSysActivityID, string ownerActivityID, bool cancelAllBranchProcesses)
        {
            int result = 0;

            WfProcessCurrentInfoCollection branchProcessesStatus = WfRuntime.GetProcessStatusByOwnerActivityID(ownerActivityID, string.Empty, false);

            foreach (WfProcessCurrentInfo processInfo in branchProcessesStatus)
            {
                DispatchCancelProcessSysTaskProcessBuilder builder = new DispatchCancelProcessSysTaskProcessBuilder(ownerSysActivityID, processInfo.InstanceID, true, cancelAllBranchProcesses);

                SysTaskProcess sysTaskProcess = builder.Build();

                SysTaskProcessRuntime.StartProcess(sysTaskProcess);

                result += sysTaskProcess.Activities.Count;
            }

            return(result);
        }
예제 #9
0
        private static UserIMAddressCollection GetAllAssigneesExtendInfo(WfProcessCurrentInfoCollection atpc)
        {
            UserIMAddressCollection result = (UserIMAddressCollection)HttpContext.Current.Items[atpc];

            if (result == null)
            {
                List <string> userIDs = new List <string>();

                foreach (WfProcessCurrentInfo atp in atpc)
                {
                    atp.Assignees.ForEach(u => userIDs.Add(u.User.ID));
                }

                result = UserOUControlSettings.GetConfig().UserOUControlQuery.QueryUsersIMAddress(userIDs.ToArray());

                HttpContext.Current.Items[atpc] = result;
            }

            return(result);
        }
예제 #10
0
        private void RenderStatus(WfProcessCurrentInfoCollection atpc, UserIMAddressCollection extendInfo, HtmlTextWriter writer)
        {
            WfProcessCurrentInfo atp = null;

            if (this.ProcessID.IsNotEmpty())
            {
                atp = atpc.Find(a => string.Compare(a.InstanceID, this.ProcessID, true) == 0);
            }
            else
            {
                if (this.ResourceID.IsNotEmpty())
                {
                    atp = atpc.Find(a => string.Compare(a.ResourceID, this.ResourceID, true) == 0);
                }
            }

            if (atp != null)
            {
                writer.Write(WebControlUtility.GetControlHtml(CreateStatusDisplayControl(atp, extendInfo)));
            }
        }
		public void DeleteData(WfProcessCurrentInfoCollection processesInfo, Dictionary<object, object> context)
		{
			WfPersistQueueAdapter.Instance.DeletePersistQueue(processesInfo);
		}
		public void DeleteData(WfProcessCurrentInfoCollection processesInfo, Dictionary<object, object> context)
		{
			WfProcessCurrentInfoAdapter.Instance.DeleteProcessCurrentAssignees(processesInfo);
		}
예제 #13
0
        private static UserIMAddressCollection GetAllAssigneesExtendInfo(WfProcessCurrentInfoCollection atpc)
        {
            UserIMAddressCollection result = (UserIMAddressCollection)HttpContext.Current.Items[atpc];

            if (result == null)
            {
                List<string> userIDs = new List<string>();

                foreach (WfProcessCurrentInfo atp in atpc)
                {
                    atp.Assignees.ForEach(u => userIDs.Add(u.User.ID));
                }

                result = UserOUControlSettings.GetConfig().UserOUControlQuery.QueryUsersIMAddress(userIDs.ToArray());

                HttpContext.Current.Items[atpc] = result;
            }

            return result;
        }
 public void DeleteData(WfProcessCurrentInfoCollection processesInfo, Dictionary <object, object> context)
 {
     WfPersistQueueAdapter.Instance.DeletePersistQueue(processesInfo);
 }
		public void DeleteData(WfProcessCurrentInfoCollection processesInfo, Dictionary<object, object> context)
		{
			WfProcessDimensionAdapter.Instance.Delete(processesInfo);
		}
예제 #16
0
        private void RenderStatus(WfProcessCurrentInfoCollection atpc, UserIMAddressCollection extendInfo, HtmlTextWriter writer)
        {
            WfProcessCurrentInfo atp = null;

            if (this.ProcessID.IsNotEmpty())
            {
                atp = atpc.Find(a => string.Compare(a.InstanceID, this.ProcessID, true) == 0);
            }
            else
            {
                if (this.ResourceID.IsNotEmpty())
                    atp = atpc.Find(a => string.Compare(a.ResourceID, this.ResourceID, true) == 0);
            }

            if (atp != null)
                writer.Write(WebControlUtility.GetControlHtml(CreateStatusDisplayControl(atp, extendInfo)));
        }
        public void DeletePersistQueue(WfProcessCurrentInfoCollection processesInfo)
        {
            processesInfo.NullCheck("processesInfo");

            InSqlClauseBuilder builder = new InSqlClauseBuilder("PROCESS_ID");

            processesInfo.ForEach(pi => builder.AppendItem(pi.InstanceID));

            if (builder.IsEmpty == false)
            {
                ORMappingItemCollection mappingInfo = ORMapping.GetMappingInfo(typeof(WfPersistQueue));

                string sql = string.Format("DELETE {0} WHERE {0}",
                    mappingInfo.TableName, builder.ToSqlStringWithInOperator(TSqlBuilder.Instance));

                DbHelper.RunSql(sql, GetConnectionName());
            }
        }
예제 #18
0
 public void DeleteData(WfProcessCurrentInfoCollection processesInfo, Dictionary <object, object> context)
 {
     WfProcessCurrentInfoAdapter.Instance.DeleteProcessCurrentAssignees(processesInfo);
 }
        protected override void OnAfterQuery(System.Data.DataView result)
        {
            base.OnAfterQuery(result);

            List<string> resourceIDList = new List<string>();
            List<string> processIDList = new List<string>();

            foreach (DataRowView rowView in result)
            {
                if (!resourceIDList.Contains(rowView["RESOURCE_ID"].ToString()))
                    resourceIDList.Add(rowView["RESOURCE_ID"].ToString());

                if (!processIDList.Contains(rowView["PROCESS_ID"].ToString()))
                    processIDList.Add(rowView["PROCESS_ID"].ToString());
            }

            var atpc = new WfProcessCurrentInfoCollection();

            WfProcessCurrentInfoCollection resourceAtpc = WfProcessCurrentInfoAdapter.Instance.Load(resourceIDList.ToArray());
            WfProcessCurrentInfoCollection processAtpc = WfProcessCurrentInfoAdapter.Instance.LoadByProcessID(processIDList.ToArray());

            resourceAtpc.ForEach(atp =>
            {
                if (atpc.Exists(p => p.InstanceID == atp.InstanceID) == false)
                    atpc.Add(atp);
            });

            processAtpc.ForEach(atp =>
            {
                if (atpc.Exists(p => p.InstanceID == atp.InstanceID) == false)
                    atpc.Add(atp);
            });

            result.Table.Columns.Add("Status");

            foreach (DataRowView rowView in result)
            {
                var processInfo = atpc.Find(p => p.InstanceID == rowView["PROCESS_ID"].ToString() || p.ResourceID == rowView["RESOURCE_ID"].ToString());

                rowView["Status"] = processInfo != null ? (int)processInfo.Status : 0;
            }
        }
예제 #20
0
 public void DeleteData(WfProcessCurrentInfoCollection processesInfo, Dictionary <object, object> context)
 {
     WfProcessDimensionAdapter.Instance.Delete(processesInfo);
 }
		/// <summary>
		/// 删除流程已活动过的所有的节点
		/// </summary>
		/// <param name="process"></param>
		public void DeleteProcessActivities(WfProcessCurrentInfoCollection processes)
		{
			processes.NullCheck("processes");

			InSqlClauseBuilder builder = new InSqlClauseBuilder("PROCESS_ID");

			processes.ForEach(p => builder.AppendItem(p.InstanceID));

			if (builder.Count > 0)
			{
				string sql = string.Format("DELETE WF.PROCESS_CURRENT_ACTIVITIES WHERE PROCESS_ID {0}",
					builder.AppendTenantCodeSqlClause(typeof(WfProcessCurrentActivity)).ToSqlString(TSqlBuilder.Instance));

				DbHelper.RunSql(sql, GetConnectionName());
			}
		}
        /// <summary>
        /// 加载分支流程信息
        /// </summary>
        /// <param name="fillAssignees"></param>
        /// <param name="activityID"></param>
        /// <param name="templateKey"></param>
        /// <param name="includeAborted">是否包含已经作废的流程</param>
        /// <returns></returns>
        public WfProcessCurrentInfoCollection LoadByOwnerActivityID(bool fillAssignees, string activityID, string templateKey, bool includeAborted)
        {
            activityID.NullCheck("activityID");

            WfProcessCurrentInfoCollection result = new WfProcessCurrentInfoCollection();

            WhereSqlClauseBuilder builder = new WhereSqlClauseBuilder();
            builder.AppendItem("OWNER_ACTIVITY_ID", activityID);

            if (templateKey.IsNotEmpty())
                builder.AppendItem("OWNER_TEMPLATE_KEY", templateKey);

            if (includeAborted == false)
                builder.AppendItem("Status", WfProcessStatus.Aborted.ToString(), "<>");

            string fieldNames = ORMapping.GetSelectFieldsNameSql<WfProcessCurrentInfo>();

            string sql = string.Format("SELECT {0} FROM WF.PROCESS_INSTANCES WHERE {1}",
                fieldNames,
                builder.ToSqlString(TSqlBuilder.Instance));

            DataTable table = DbHelper.RunSqlReturnDS(sql, GetConnectionName()).Tables[0];

            result.LoadFromDataView(table.DefaultView);

            if (fillAssignees)
                FillAssignees(result);

            return result;
        }
        private static void FillAssignees(WfProcessCurrentInfoCollection result)
        {
            InSqlClauseBuilder inBuilder = new InSqlClauseBuilder();

            result.ForEach(currentInfo => inBuilder.AppendItem(currentInfo.CurrentActivityID));

            if (inBuilder.Count > 0)
            {
                string sql = string.Format("SELECT * FROM WF.PROCESS_CURRENT_ASSIGNEES WHERE ACTIVITY_ID {0} ORDER BY ID",
                inBuilder.ToSqlStringWithInOperator(TSqlBuilder.Instance));

                DataTable table = DbHelper.RunSqlReturnDS(sql, GetConnectionName()).Tables[0];

                DataView assigneeView = new DataView(table);

                assigneeView.Sort = "ACTIVITY_ID";

                foreach (var currentInfo in result)
                {
                    DataRowView[] rows = assigneeView.FindRows(currentInfo.CurrentActivityID);

                    Array.ForEach(rows, drv =>
                    {
                        currentInfo.Assignees.Add(DataRowToAssignee(drv.Row));
                    });
                }
            }
        }
        /// <summary>
        /// 删除流程运行时活动节点的Assignees
        /// </summary>
        /// <param name="activityID"></param>
        public void DeleteProcessCurrentAssignees(WfProcessCurrentInfoCollection processesInfo)
        {
            InSqlClauseBuilder builder = new InSqlClauseBuilder("ACTIVITY_ID");

            processesInfo.ForEach(p => builder.AppendItem(p.CurrentActivityID));

            if (builder.Count > 0)
            {
                string sql = string.Format("DELETE WF.PROCESS_CURRENT_ASSIGNEES WHERE {0}",
                    builder.ToSqlStringWithInOperator(TSqlBuilder.Instance));

                DbHelper.RunSql(sql, GetConnectionName());
            }
        }