Exemple #1
0
        public void WfBranchProcessTemplateDescriptorConverterTest()
        {
            WfConverterHelper.RegisterConverters();

            WfBranchProcessTemplateDescriptor branchProcessTempDesp = new WfBranchProcessTemplateDescriptor(Guid.NewGuid().ToString());

            branchProcessTempDesp.BlockingType    = WfBranchProcessBlockingType.WaitAnyoneBranchProcessComplete;
            branchProcessTempDesp.ExecuteSequence = WfBranchProcessExecuteSequence.Serial;


            string result = JSONSerializerExecute.Serialize(branchProcessTempDesp);

            Console.WriteLine(result);

            WfBranchProcessTemplateDescriptor deserializedBranchProcTempDesp = JSONSerializerExecute.Deserialize <WfBranchProcessTemplateDescriptor>(result);
            string reSerialized = JSONSerializerExecute.Serialize(deserializedBranchProcTempDesp);

            Assert.AreEqual(result, reSerialized);

            WfProcessDescriptor processDesp = (WfProcessDescriptor)WfProcessTestCommon.CreateSimpleProcessDescriptor();

            processDesp.InitialActivity.BranchProcessTemplates.Add(branchProcessTempDesp);

            string procResult = JSONSerializerExecute.Serialize(processDesp);

            Console.WriteLine(procResult);

            WfProcessDescriptor deserializedProcDesp = JSONSerializerExecute.Deserialize <WfProcessDescriptor>(procResult);
            string procReSerialized = JSONSerializerExecute.Serialize(deserializedProcDesp);

            Assert.AreEqual(procResult, procReSerialized);
        }
Exemple #2
0
        public void WfVariabledOfPrecessDescriptorConverterTest()
        {
            WfConverterHelper.RegisterConverters();

            WfProcessDescriptor processDesp = (WfProcessDescriptor)WfProcessTestCommon.CreateSimpleProcessDescriptor();

            //给流程中变量描述赋值
            string guid = Guid.NewGuid().ToString();
            WfVariableDescriptor variDesc = new WfVariableDescriptor(guid);

            variDesc.Name          = "yo";
            variDesc.Description   = "流程中变量的赋值";
            variDesc.Enabled       = true;
            variDesc.OriginalType  = DataType.String;
            variDesc.OriginalValue = "原来的变量值";
            processDesp.Variables.Add(variDesc);

            string result = JSONSerializerExecute.Serialize(processDesp);

            Console.WriteLine(result);

            WfProcessDescriptor reProcessDesp = JSONSerializerExecute.Deserialize <WfProcessDescriptor>(result);

            string reSerialized = JSONSerializerExecute.Serialize(reProcessDesp);

            Assert.AreEqual(result, reSerialized);

            Assert.AreEqual(processDesp.Variables[0].Name, reProcessDesp.Variables[0].Name);
            Assert.AreEqual("流程中变量的赋值", reProcessDesp.Variables[0].Description);
            Assert.AreEqual(true, reProcessDesp.Variables[0].Enabled);
            Assert.AreEqual(processDesp.Variables[0].OriginalType, reProcessDesp.Variables[0].OriginalType);
        }
        /// <summary>
        /// 创建一个有多个节点的流程
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor CreateProcessDescriptor()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key             = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name            = "测试流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName     = "TEST_PROGRAM_NAME";
            processDesp.Url             = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initAct = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);

            initAct.Name     = "Initial";
            initAct.CodeName = "Initial Activity";

            processDesp.Activities.Add(initAct);

            WfActivityDescriptor normalAct = new WfActivityDescriptor("NormalActivity", WfActivityType.NormalActivity);

            normalAct.Name     = "Normal";
            normalAct.CodeName = "Normal Activity";

            processDesp.Activities.Add(normalAct);

            WfActivityDescriptor normalAct1 = new WfActivityDescriptor("NormalActivity1", WfActivityType.NormalActivity);

            normalAct1.Name     = "Normal";
            normalAct1.CodeName = "Normal Activity1";

            processDesp.Activities.Add(normalAct1);

            WfActivityDescriptor normalAct2 = new WfActivityDescriptor("NormalActivity2", WfActivityType.NormalActivity);

            normalAct2.Name     = "Normal";
            normalAct2.CodeName = "Normal Activity2";

            processDesp.Activities.Add(normalAct2);

            WfActivityDescriptor normalAct3 = new WfActivityDescriptor("NormalActivity3", WfActivityType.NormalActivity);

            normalAct3.Name     = "Normal";
            normalAct3.CodeName = "Normal Activity3";

            processDesp.Activities.Add(normalAct3);

            WfActivityDescriptor completedAct = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);

            completedAct.Name     = "Completed";
            completedAct.CodeName = "Completed Activity";

            processDesp.Activities.Add(completedAct);

            initAct.ToTransitions.AddForwardTransition(normalAct);
            normalAct.ToTransitions.AddForwardTransition(normalAct1);
            normalAct1.ToTransitions.AddForwardTransition(normalAct2);
            normalAct2.ToTransitions.AddForwardTransition(normalAct3);
            normalAct3.ToTransitions.AddForwardTransition(completedAct);

            return(processDesp);
        }
        /// <summary>
        /// 创建一个只有开始和结束点的流程描述
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor CreateInitAndCompletedProcessDescriptor()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key             = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name            = "测试流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName     = "TEST_PROGRAM_NAME";
            processDesp.Url             = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initAct = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);

            initAct.Name     = "Initial";
            initAct.CodeName = "Initial Activity";

            processDesp.Activities.Add(initAct);

            WfActivityDescriptor completedAct = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);

            completedAct.Name     = "Completed";
            completedAct.CodeName = "Completed Activity";

            completedAct.RelativeLinks.Add(new WfRelativeLinkDescriptor("TestLink")
            {
                Name = "测试链接", Url = "/MCSWebApp/Sample.htm"
            });

            processDesp.Activities.Add(completedAct);

            initAct.ToTransitions.AddForwardTransition(completedAct);

            return(processDesp);
        }
Exemple #5
0
        public void WfExternalUserTest()
        {
            WfConverterHelper.RegisterConverters();

            WfExternalUser externalUser = new WfExternalUser();

            externalUser.Key         = "user0";
            externalUser.Name        = "zLing";
            externalUser.Gender      = Gender.Female;
            externalUser.Email       = "*****@*****.**";
            externalUser.MobilePhone = "13552630000";
            externalUser.Phone       = "0409987";
            externalUser.Title       = "programer";

            string         result           = JSONSerializerExecute.Serialize(externalUser);
            WfExternalUser deserializedUser = JSONSerializerExecute.Deserialize <WfExternalUser>(result);
            string         reSerialized     = JSONSerializerExecute.Serialize(deserializedUser);

            Assert.AreEqual(result, reSerialized);


            //创建流程描述
            IWfProcessDescriptor processDesp = WfProcessTestCommon.CreateSimpleProcessDescriptor();

            processDesp.ExternalUsers.Add(externalUser);                 //作用于流程
            processDesp.InitialActivity.ExternalUsers.Add(externalUser); //作用于节点

            string procDesp = JSONSerializerExecute.Serialize(processDesp);
            WfProcessDescriptor reProcessDesp = JSONSerializerExecute.Deserialize <WfProcessDescriptor>(procDesp);
            string reuslt = JSONSerializerExecute.Serialize(reProcessDesp);

            Assert.AreEqual(procDesp, reuslt);
            Assert.AreEqual(processDesp.ExternalUsers[0].Name, processDesp.InitialActivity.ExternalUsers[0].Name);
        }
Exemple #6
0
        /// <summary>
        /// 基类中构造开始点和结束点,不包含两个点的连线
        /// </summary>
        /// <param name="processKey"></param>
        /// <param name="processName"></param>
        /// <returns></returns>
        public virtual IWfProcessDescriptor Build(string processKey, string processName)
        {
            processKey.CheckStringIsNullOrEmpty("processKey");
            processName.CheckStringIsNullOrEmpty("processName");

            WfProcessDescriptor processDesp = new WfProcessDescriptor(processKey);

            processDesp.ApplicationName = this.applicationName;
            processDesp.ProgramName     = this.programName;
            processDesp.Name            = processName;

            processDesp.Variables.Add(new WfVariableDescriptor(AutoBuiltProcessVariableName, "True", DataType.Boolean));

            processDesp.Activities.Add(new WfActivityDescriptor("Start", WfActivityType.InitialActivity)
            {
                Name = "起草"
            });
            processDesp.Activities.Add(new WfActivityDescriptor("End", WfActivityType.CompletedActivity)
            {
                Name = "办结"
            });

            processDesp.InitialActivity.Variables.Add(new WfVariableDescriptor(AutoBuiltActivityVariableName, "True", DataType.Boolean));
            processDesp.CompletedActivity.Variables.Add(new WfVariableDescriptor(AutoBuiltActivityVariableName, "True", DataType.Boolean));

            if (processDesp.Properties.ContainsKey("ProbeParentProcessParams"))
            {
                processDesp.Properties.SetValue("ProbeParentProcessParams", true);
            }

            return(processDesp);
        }
		private static void ExportMatrixPart(Package package, WfProcessDescriptor processDesp, WfExportProcessDescriptorContext context)
		{
			var matrix = WfMatrixAdapter.Instance.LoadByProcessKey(processDesp.Key, false);

			if (matrix == null)
				return;

			matrix.Loaded = true;

			Uri partUri = CreatePartUri(context.MatrixCounter.ToString(), WfProcessDescriptorPackagePartType.MatrixPart);

			if (context.ExistingParts.Contains(partUri.ToString()))
				return;

			context.MappingInfo.Add(new WfPackageRelationMapping()
			{
				MatrixPath = partUri.ToString(),
				MatrixDefID = matrix.Definition.Key,
				ProcessDescriptionID = processDesp.Key
			});

			ExportMatrixDefPart(package, matrix.Definition, context);

			PackagePart part = package.CreatePart(partUri, MediaTypeNames.Application.Octet, CompressionOption.Normal);
			using (MemoryStream bytes = matrix.ExportToExcel2007(context.ExportParams.MatrixRoleAsPerson))
			{
				using (Stream stream = part.GetStream())
				{
					bytes.CopyTo(stream);
				}
			}

			context.ExistingParts.Add(partUri.ToString());
			context.MatrixCounter++;
		}
Exemple #8
0
        /// <summary>
        /// 准备同意/不同意的退回流程。在B环节有两根出线BC和BA,BA是退回线,退回到A。其中BA默认是没有选择的
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareAgreeReturnProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key             = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name            = "专用退回流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName     = "TEST_PROGRAM_NAME";
            processDesp.Url             = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);

            initActivity.Name     = "A";
            initActivity.CodeName = "A";

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");

            processDesp.Activities.Add(activityC);

            IWfActivityDescriptor activityD = CreateNormalDescriptor("D", "D");

            processDesp.Activities.Add(activityD);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("F", WfActivityType.CompletedActivity);

            completedActivity.Name     = "F";
            completedActivity.CodeName = "F";

            processDesp.Activities.Add(completedActivity);

            //A->B
            initActivity.ToTransitions.AddForwardTransition(activityB);

            //B有两根出线,分别是C和A,A是退回线
            WfTransitionDescriptor transitionBC = (WfTransitionDescriptor)activityB.ToTransitions.AddForwardTransition(activityC);

            transitionBC.Enabled       = true;
            transitionBC.DefaultSelect = true;
            WfTransitionDescriptor transitionBA = (WfTransitionDescriptor)activityB.ToTransitions.AddBackwardTransition(initActivity);

            //transitionBA.Enabled = false;
            transitionBA.Enabled       = true;
            transitionBC.DefaultSelect = false;
            transitionBA.IsBackward    = true;

            //C->D
            activityC.ToTransitions.AddForwardTransition(activityD);

            //D到结束点
            activityD.ToTransitions.AddForwardTransition(completedActivity);

            return(processDesp);
        }
        /// <summary>
        /// 得到空流程定义的JSON串
        /// </summary>
        /// <returns></returns>
        public static string GetEmptyProcessDescriptorJsonString()
        {
            RegisterConverters();

            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            return JSONSerializerExecute.Serialize(processDesp);
        }
Exemple #10
0
        private static void ResourceConverterTest(WfResourceDescriptor resDesp)
        {
            IWfProcessDescriptor processDesp = WfProcessTestCommon.CreateSimpleProcessDescriptor();

            processDesp.Activities[1].Resources.Add(resDesp);
            string re = JSONSerializerExecute.Serialize(processDesp);
            WfProcessDescriptor reProcessDesp = JSONSerializerExecute.Deserialize <WfProcessDescriptor>(re);
        }
Exemple #11
0
        /// <summary>
        /// 生成用于复制退件活动的测试流程
        /// A为起点、两条分支,A、B、C、D和A、E、D,D为终点
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareCopyTestProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key             = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name            = "专用退回流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName     = "TEST_PROGRAM_NAME";
            processDesp.Url             = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);

            initActivity.Name     = "A";
            initActivity.CodeName = "A";

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");

            processDesp.Activities.Add(activityC);

            IWfActivityDescriptor activityE = CreateNormalDescriptor("E", "E");

            processDesp.Activities.Add(activityE);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("D", WfActivityType.CompletedActivity);

            completedActivity.Name     = "D";
            completedActivity.CodeName = "D";

            processDesp.Activities.Add(completedActivity);

            //A到B
            WfTransitionDescriptor transitionAB = (WfTransitionDescriptor)initActivity.ToTransitions.AddForwardTransition(activityB);

            transitionAB.Enabled = true;

            //A到E
            WfTransitionDescriptor transitionAE = (WfTransitionDescriptor)initActivity.ToTransitions.AddBackwardTransition(activityE);

            transitionAE.Enabled = false;

            //B到C
            activityB.ToTransitions.AddForwardTransition(activityC);

            //E到C
            activityE.ToTransitions.AddForwardTransition(activityC);

            //C到结束点
            activityC.ToTransitions.AddForwardTransition(completedActivity);

            return(processDesp);
        }
        /// <summary>
        /// 准备专用退件流程,B有BC和BE两条出线,IsCLine为True走BC,否则走BE
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareSpecialReturnProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name = "专用退回流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName = "TEST_PROGRAM_NAME";
            processDesp.Url = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);
            initActivity.Name = "A";
            initActivity.CodeName = "A";
            initActivity.Resources.Add(new WfUserResourceDescriptor((IUser)OguObjectSettings.GetConfig().Objects["requestor"].Object));

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            activityB.Resources.Add(new WfUserResourceDescriptor((IUser)OguObjectSettings.GetConfig().Objects["approver1"].Object));
            processDesp.Activities.Add(activityB);

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");
            processDesp.Activities.Add(activityC);

            IWfActivityDescriptor activityE = CreateNormalDescriptor("E", "E");
            processDesp.Activities.Add(activityE);

            IWfActivityDescriptor activityD = CreateNormalDescriptor("D", "D");
            processDesp.Activities.Add(activityD);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("F", WfActivityType.CompletedActivity);
            completedActivity.Name = "F";
            completedActivity.CodeName = "F";

            processDesp.Activities.Add(completedActivity);

            //A到B
            initActivity.ToTransitions.AddForwardTransition(activityB);

            //B有两根出线,分别是C和E
            WfTransitionDescriptor transitionBC = (WfTransitionDescriptor)activityB.ToTransitions.AddForwardTransition(activityC);
            transitionBC.Condition = new WfConditionDescriptor(transitionBC) { Expression = "IsCLine" };

            WfTransitionDescriptor transitionBE = (WfTransitionDescriptor)activityB.ToTransitions.AddForwardTransition(activityE);
            transitionBE.Condition = new WfConditionDescriptor(transitionBE) { Expression = "!IsCLine" };

            //C和E都汇聚到D
            activityC.ToTransitions.AddForwardTransition(activityD);
            activityE.ToTransitions.AddForwardTransition(activityD);

            //D到结束点
            activityD.ToTransitions.AddForwardTransition(completedActivity);

            return processDesp;
        }
        /// <summary>
        /// 创建一个有连线的Server端流程
        /// </summary>
        /// <returns></returns>
        public static WfProcessDescriptor CreateSimpleServerProcessWithLines()
        {
            WfProcessDescriptor processDesp = CreateSimpleServerProcessWithoutLines();

            WfForwardTransitionDescriptor transition = new WfForwardTransitionDescriptor("L1");

            transition.ConnectActivities(processDesp.InitialActivity, processDesp.CompletedActivity);

            return(processDesp);
        }
        public void ClientProcessWithWithActivityMatrixResourceDescriptorToServerTest()
        {
            WfClientProcessDescriptor client = ProcessDescriptorHelper.CreateClientProcessWithActivityMatrixResourceDescriptor();
            WfProcessDescriptor       server = null;

            WfClientProcessDescriptorConverter.Instance.ClientToServer(client, ref server);

            Assert.IsNotNull(server.Activities["N1"]);
            Assert.IsTrue(server.Activities["N1"].Resources.Count > 0);
            Assert.IsTrue(server.Activities["N1"].Resources[0] is WfActivityMatrixResourceDescriptor);
        }
        public Stream WfDynamicProcessToExcel(string processKey)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            WfProcessDescriptor       processDesp = (WfProcessDescriptor)WfProcessDescriptorManager.LoadDescriptor(processKey);
            WfClientProcessDescriptor client      = null;

            WfClientProcessDescriptorConverter.Instance.ServerToClient(processDesp, ref client);

            return(WfClientProcessDescriptorConverter.Instance.ClientDynamicProcessToExcelStream(client));
        }
Exemple #16
0
        public void WfRelativeLinkDespJSONTest()
        {
            WfConverterHelper.RegisterConverters();

            WfProcessDescriptor processDesp = (WfProcessDescriptor)WfProcessTestCommon.CreateSimpleProcessDescriptor();
            string result = JSONSerializerExecute.Serialize(processDesp);
            IWfProcessDescriptor procDesp = JSONSerializerExecute.Deserialize <WfProcessDescriptor>(result);

            Assert.AreEqual(processDesp.RelativeLinks[0].Name, procDesp.RelativeLinks[0].Name);
            Assert.AreEqual(processDesp.RelativeLinks[0].Url, procDesp.RelativeLinks[0].Url);
        }
        public void SaveDescriptor(WfClientProcessDescriptor clientProcessDesp)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            WfProcessDescriptor processDesp = null;

            WfClientProcessDescriptorConverter.Instance.ClientToServer(clientProcessDesp, ref processDesp);

            WfSaveTemplateExecutor executor = new WfSaveTemplateExecutor(processDesp);

            executor.Execute();
        }
Exemple #18
0
        /// <summary>
        /// 创建流程定义
        /// </summary>
        /// <param name="overrideInitActivity"></param>
        /// <returns></returns>
        public WfProcessDescriptor CreateProcess(bool overrideInitActivity)
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Properties.ReplaceExistedPropertyValues(this.Properties);

            CreateInitAndCompletedActivities(processDesp);

            processDesp.CreateActivities(this.ActivityTemplates, overrideInitActivity);

            return(processDesp);
        }
Exemple #19
0
        public static IWfProcess CreateProcessInstance(WfClientProcessDescriptor client)
        {
            WfProcessDescriptor processDesp = null;

            WfClientProcessDescriptorConverter.Instance.ClientToServer(client, ref processDesp);
            WfProcessStartupParams startupParams = GetInstanceOfWfProcessStartupParams(processDesp);

            startupParams.ApplicationRuntimeParameters["CostCenter"] = "1001";
            startupParams.ApplicationRuntimeParameters["PayMethod"]  = "1";
            startupParams.ApplicationRuntimeParameters["Age"]        = 30;

            return(WfRuntime.StartWorkflow(startupParams));
        }
        public void SimpleStandardServerProcessToClient()
        {
            WfProcessDescriptor processDesp = ProcessDescriptorHelper.CreateSimpleServerProcessWithLines();

            processDesp.Output();

            WfClientProcessDescriptor clientProcessDesp = null;

            WfClientProcessDescriptorConverter.Instance.ServerToClient(processDesp, ref clientProcessDesp);

            processDesp.Output();

            clientProcessDesp.AssertProcessDescriptor(processDesp);
        }
        public void ExcelToSaveDescriptor(string processKey, Stream stream)
        {
            OperationContext.Current.FillContextToOguServiceContext();

            WfCreateClientDynamicProcessParams processParams = ExcelToWfCreateClientDynamicProcessParams(processKey, stream);

            WfClientDynamicProcessBuilder builder = new WfClientDynamicProcessBuilder(processParams);
            WfClientProcessDescriptor     client  = builder.Build(processParams.Key, processParams.Name);

            WfProcessDescriptor processDesp = null;

            WfClientProcessDescriptorConverter.Instance.ClientToServer(client, ref processDesp);

            WfProcessDescriptorManager.SaveDescriptor(processDesp);
        }
Exemple #22
0
        /// <summary>
        /// 准备一条简单的直线流程,主要用于两次退回等场景
        /// 流程为A->B->C->D
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareStraightProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key             = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name            = "简单直线流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName     = "TEST_PROGRAM_NAME";
            processDesp.Url             = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);

            initActivity.Name     = "A";
            initActivity.CodeName = "A";
            initActivity.Resources.Add(new WfUserResourceDescriptor((IUser)OguObjectSettings.GetConfig().Objects["requestor"].Object));

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);
            activityB.Resources.Add(new WfUserResourceDescriptor((IUser)OguObjectSettings.GetConfig().Objects["approver1"].Object));

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");

            processDesp.Activities.Add(activityC);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("D", WfActivityType.CompletedActivity);

            completedActivity.Name     = "D";
            completedActivity.CodeName = "D";

            processDesp.Activities.Add(completedActivity);

            //A到B
            WfTransitionDescriptor transitionAB = (WfTransitionDescriptor)initActivity.ToTransitions.AddForwardTransition(activityB);

            transitionAB.Enabled = true;


            //B到C
            activityB.ToTransitions.AddForwardTransition(activityC);

            //C到结束点
            activityC.ToTransitions.AddForwardTransition(completedActivity);

            return(processDesp);
        }
Exemple #23
0
        public void WfProcessDescriptorConverter()
        {
            WfConverterHelper.RegisterConverters();
            WfProcessDescriptor processDesp = (WfProcessDescriptor)WfProcessTestCommon.CreateSimpleProcessDescriptor();

            string result = JSONSerializerExecute.Serialize(processDesp);

            Console.WriteLine(result);

            WfProcessDescriptor deserializedProcessDesp = JSONSerializerExecute.Deserialize <WfProcessDescriptor>(result);

            //再次序列化时,字条串不相等,是因为创建流程时没有Key
            string reSerialized = JSONSerializerExecute.Serialize(deserializedProcessDesp);

            Console.WriteLine(reSerialized);
            Assert.AreEqual(result, reSerialized);
        }
        /// <summary>
        /// 创建一个没有连线的Server端流程对象
        /// </summary>
        /// <returns></returns>
        public static WfProcessDescriptor CreateSimpleServerProcessWithoutLines()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key  = UuidHelper.NewUuidString();
            processDesp.Name = "服务端测试流程";

            processDesp.Activities.Add(ActivityDescriptorHelper.CreateSimpleServerActivity("Start", "开始", WfActivityType.InitialActivity));
            processDesp.Activities.Add(ActivityDescriptorHelper.CreateSimpleServerActivity("End", "结束", WfActivityType.CompletedActivity));

            processDesp.RelativeLinks.Add(new WfRelativeLinkDescriptor("AR1")
            {
                Category = "Activity", Url = "http://www.ak47.com"
            });

            return(processDesp);
        }
        public void WfClientDynamicProcessBuilderTest()
        {
            WfCreateClientDynamicProcessParams createParams = ProcessDescriptorHelper.CreateClientDynamicProcessParams();

            WfClientDynamicProcessBuilder builder = new WfClientDynamicProcessBuilder(createParams);

            WfClientProcessDescriptor client = builder.Build(createParams.Key, createParams.Name);

            WfProcessDescriptor server = null;

            WfClientProcessDescriptorConverter.Instance.ClientToServer(client, ref server);

            Assert.IsTrue(server.Variables.GetValue("ClientDynamicProcess", false));
            Assert.IsNotNull(server.Activities["N1"]);
            Assert.IsTrue(server.Activities["N1"].Resources.Count > 0);
            Assert.IsTrue(server.Activities["N1"].Resources[0] is WfActivityMatrixResourceDescriptor);
        }
        public WfClientProcessDescriptor LoadDescriptor(string processKey)
        {
            if (processKey.IsNullOrEmpty())
            {
                throw new ApplicationException(Translator.Translate(Define.DefaultCulture, "流程描述的Key不能为空"));
            }

            OperationContext.Current.FillContextToOguServiceContext();

            WfProcessDescriptor processDesp = (WfProcessDescriptor)WfProcessDescriptorManager.LoadDescriptor(processKey);

            WfClientProcessDescriptor clientProcessDesp = null;

            WfClientProcessDescriptorConverter.Instance.ServerToClient(processDesp, ref clientProcessDesp);

            return(clientProcessDesp);
        }
		private static void ExportProcessPart(Package package, WfProcessDescriptor processDesc, WfExportProcessDescriptorContext context)
		{
			Uri partUri = CreatePartUri(processDesc.Key, WfProcessDescriptorPackagePartType.ProcessPart);

			if (context.ExistingParts.Contains(partUri.ToString()))
				return;

			XElement xeWfProcess = context.Formatter.Serialize(processDesc);
			XDocument xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), xeWfProcess);

			PackagePart part = package.CreatePart(partUri, MediaTypeNames.Text.Xml, CompressionOption.Normal);

			using (Stream stream = part.GetStream())
				xDoc.Save(stream);

			context.ExistingParts.Add(partUri.ToString());
		}
Exemple #28
0
        private static void CreateInitAndCompletedActivities(WfProcessDescriptor processDesp)
        {
            WfActivityDescriptor initAct = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);

            initAct.Name     = "开始";
            initAct.CodeName = "Initial Activity";

            processDesp.Activities.Add(initAct);

            WfActivityDescriptor completedAct = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);

            completedAct.Name     = "结束";
            completedAct.CodeName = "Completed Activity";

            processDesp.Activities.Add(completedAct);

            initAct.ToTransitions.AddForwardTransition(completedAct);
        }
Exemple #29
0
        /// <summary>
        /// 准备加签退件流程
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareAddApproverReturnProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key             = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name            = "加签退回流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName     = "TEST_PROGRAM_NAME";
            processDesp.Url             = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);

            initActivity.Name     = "A";
            initActivity.CodeName = "A";

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");

            processDesp.Activities.Add(activityC);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("D", WfActivityType.CompletedActivity);

            completedActivity.Name     = "D";
            completedActivity.CodeName = "D";

            processDesp.Activities.Add(completedActivity);

            //A到B
            initActivity.ToTransitions.AddForwardTransition(activityB);

            //B到C
            activityB.ToTransitions.AddForwardTransition(activityC);

            //C到结束点
            activityC.ToTransitions.AddForwardTransition(completedActivity);

            return(processDesp);
        }
Exemple #30
0
        private static void ExportProcessPart(Package package, WfProcessDescriptor processDesc, WfExportProcessDescriptorContext context)
        {
            Uri partUri = CreatePartUri(processDesc.Key, WfProcessDescriptorPackagePartType.ProcessPart);

            if (context.ExistingParts.Contains(partUri.ToString()))
            {
                return;
            }

            XElement  xeWfProcess = context.Formatter.Serialize(processDesc);
            XDocument xDoc        = new XDocument(new XDeclaration("1.0", "utf-8", "true"), xeWfProcess);

            PackagePart part = package.CreatePart(partUri, MediaTypeNames.Text.Xml, CompressionOption.Normal);

            using (Stream stream = part.GetStream())
                xDoc.Save(stream);

            context.ExistingParts.Add(partUri.ToString());
        }
Exemple #31
0
        private void ExportMatrixPart(Package package, WfProcessDescriptor processDesc)
        {
            var matrix = WfMatrixAdapter.Instance.LoadByProcessKey(processDesc.Key, false);

            if (matrix == null)
            {
                return;
            }
            matrix.Loaded = true;

            Uri partUri = CreatePartUri(this.MatrixCounter.ToString(), PackagePartType.MatrixPart);

            if (ExistingParts.Contains(partUri.ToString()))
            {
                return;
            }

            this.MappingInfo.Add(new PackageRelationMapping()
            {
                MatrixPath           = partUri.ToString(),
                MatrixDefID          = matrix.Definition.Key,
                ProcessDescriptionID = processDesc.Key
            });

            ExportMatrixDefPart(package, matrix.Definition);


            PackagePart part = package.CreatePart(partUri, MediaTypeNames.Application.Octet);

            using (MemoryStream bytes = matrix.ExportToExcel2007(this.IsRoleAsPerson))
            {
                using (var stream = part.GetStream())
                {
                    bytes.CopyTo(stream);
                    //stream.Write(bytes, 0, bytes.Length);
                    stream.Flush();
                }
            }

            ExistingParts.Add(partUri.ToString());
            this.MatrixCounter++;
        }
        public void CreateInstanceTest()
        {
            WfActivitySettings setting = WfActivitySettings.GetConfig();
            var process1 = new WfProcessDescriptor()
            {
                Key = "Process1"
            };

            IWfActivityDescriptor actDescriptor = new WfActivityDescriptor("Init", WfActivityType.InitialActivity)
            {
                CodeName    = "test",
                Description = "test",
                Enabled     = true
            };

            process1.Activities.Add(actDescriptor);

            IWfActivity initActivity = setting.GetActivityBuilder(actDescriptor).CreateActivity(actDescriptor);

            Assert.IsTrue(initActivity.EnterActions.Count > 0);
            Assert.IsTrue(initActivity.LeaveActions.Count > 0);

            initActivity.EnterActions.PrepareActions(null);
            initActivity.EnterActions.PersistActions(null);

            initActivity.LeaveActions.PrepareActions(null);
            initActivity.LeaveActions.PersistActions(null);

            actDescriptor = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity)
            {
                CodeName    = "test",
                Description = "test",
                Enabled     = true
            };

            process1.Activities.Add(actDescriptor);

            var completedActivity = setting.GetActivityBuilder(actDescriptor).CreateActivity(actDescriptor);

            Assert.IsTrue(completedActivity.EnterActions.Count > 0);
            Assert.IsTrue(completedActivity.LeaveActions.Count > 0);
        }
Exemple #33
0
        public static void ExportProcessDescriptors(WfExportProcessDescriptorParams exportParams, Stream outputStream, params string[] processDespKeys)
        {
            exportParams.NullCheck("exportParams");
            processDespKeys.NullCheck("processDespKeys");

            WfExportProcessDescriptorContext context = new WfExportProcessDescriptorContext(exportParams);

            using (Package package = ZipPackage.Open(outputStream, FileMode.Create))
            {
                foreach (string key in processDespKeys)
                {
                    WfProcessDescriptor processDesp = (WfProcessDescriptor)WfProcessDescriptorManager.LoadDescriptor(key);

                    ExportProcessPart(package, processDesp, context);
                    ExportMatrixPart(package, processDesp, context);
                }

                ExportMappingPart(package, context);
            }
        }
Exemple #34
0
        private static void ExportMatrixPart(Package package, WfProcessDescriptor processDesp, WfExportProcessDescriptorContext context)
        {
            var matrix = WfMatrixAdapter.Instance.LoadByProcessKey(processDesp.Key, false);

            if (matrix == null)
            {
                return;
            }

            matrix.Loaded = true;

            Uri partUri = CreatePartUri(context.MatrixCounter.ToString(), WfProcessDescriptorPackagePartType.MatrixPart);

            if (context.ExistingParts.Contains(partUri.ToString()))
            {
                return;
            }

            context.MappingInfo.Add(new WfPackageRelationMapping()
            {
                MatrixPath           = partUri.ToString(),
                MatrixDefID          = matrix.Definition.Key,
                ProcessDescriptionID = processDesp.Key
            });

            ExportMatrixDefPart(package, matrix.Definition, context);

            PackagePart part = package.CreatePart(partUri, MediaTypeNames.Application.Octet, CompressionOption.Normal);

            using (MemoryStream bytes = matrix.ExportToExcel2007(context.ExportParams.MatrixRoleAsPerson))
            {
                using (Stream stream = part.GetStream())
                {
                    bytes.CopyTo(stream);
                }
            }

            context.ExistingParts.Add(partUri.ToString());
            context.MatrixCounter++;
        }
        /// <summary>
        /// 创建一个简单的流程定义
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor CreateSimpleProcessDescriptor()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name = "测试流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName = "TEST_PROGRAM_NAME";
            processDesp.Url = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initAct = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);
            initAct.Name = "Initial";
            initAct.CodeName = "Initial Activity";

            processDesp.Activities.Add(initAct);

            WfActivityDescriptor normalAct = new WfActivityDescriptor("NormalActivity", WfActivityType.NormalActivity);

            normalAct.Name = "Normal";
            normalAct.CodeName = "Normal Activity";

            normalAct.Properties.SetValue("AutoMoveAfterPending", true);

            processDesp.Activities.Add(normalAct);

            processDesp.RelativeLinks.Add(new WfRelativeLinkDescriptor("TestLink") { Name = "测试链接", Url = "/MCSWebApp/Sample.htm" });

            WfActivityDescriptor completedAct = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);
            completedAct.Name = "Completed";
            completedAct.CodeName = "Completed Activity";

            completedAct.RelativeLinks.Add(new WfRelativeLinkDescriptor("TestLink") { Name = "测试链接", Url = "/MCSWebApp/Sample.htm" });

            processDesp.Activities.Add(completedAct);

            initAct.ToTransitions.AddForwardTransition(normalAct);
            normalAct.ToTransitions.AddForwardTransition(completedAct);

            return processDesp;
        }
		public void CreateInstanceTest()
		{
			WfActivitySettings setting = WfActivitySettings.GetConfig();
			var process1 = new WfProcessDescriptor() { Key = "Process1" };

			IWfActivityDescriptor actDescriptor = new WfActivityDescriptor("Init", WfActivityType.InitialActivity)
			{
				CodeName = "test",
				Description = "test",
				Enabled = true
			};

			process1.Activities.Add(actDescriptor);

			IWfActivity initActivity = setting.GetActivityBuilder(actDescriptor).CreateActivity(actDescriptor);

			Assert.IsTrue(initActivity.EnterActions.Count > 0);
			Assert.IsTrue(initActivity.LeaveActions.Count > 0);

			initActivity.EnterActions.PrepareActions(null);
			initActivity.EnterActions.PersistActions(null);

			initActivity.LeaveActions.PrepareActions(null);
			initActivity.LeaveActions.PersistActions(null);

			actDescriptor = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity)
			{
				CodeName = "test",
				Description = "test",
				Enabled = true
			};

			process1.Activities.Add(actDescriptor);

			var completedActivity = setting.GetActivityBuilder(actDescriptor).CreateActivity(actDescriptor);

			Assert.IsTrue(completedActivity.EnterActions.Count > 0);
			Assert.IsTrue(completedActivity.LeaveActions.Count > 0);
		}
		/// <summary>
		/// 基类中构造开始点和结束点,不包含两个点的连线
		/// </summary>
		/// <param name="processKey"></param>
		/// <param name="processName"></param>
		/// <returns></returns>
		public virtual IWfProcessDescriptor Build(string processKey, string processName)
		{
			processKey.CheckStringIsNullOrEmpty("processKey");
			processName.CheckStringIsNullOrEmpty("processName");

			WfProcessDescriptor processDesp = new WfProcessDescriptor(processKey);

			processDesp.ApplicationName = this.applicationName;
			processDesp.ProgramName = this.programName;
			processDesp.Name = processName;

			processDesp.Variables.Add(new WfVariableDescriptor(AutoBuiltProcessVariableName, "True", DataType.Boolean));

			processDesp.Activities.Add(new WfActivityDescriptor("Start", WfActivityType.InitialActivity) { Name = "起草" });
			processDesp.Activities.Add(new WfActivityDescriptor("End", WfActivityType.CompletedActivity) { Name = "办结" });

			processDesp.InitialActivity.Variables.Add(new WfVariableDescriptor(AutoBuiltActivityVariableName, "True", DataType.Boolean));
			processDesp.CompletedActivity.Variables.Add(new WfVariableDescriptor(AutoBuiltActivityVariableName, "True", DataType.Boolean));

			if (processDesp.Properties.ContainsKey("ProbeParentProcessParams"))
				processDesp.Properties.SetValue("ProbeParentProcessParams", true);

			return processDesp;
		}
        /// <summary>
        /// 创建一个有多个节点的流程
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor CreateProcessDescriptor()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name = "测试流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName = "TEST_PROGRAM_NAME";
            processDesp.Url = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initAct = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);
            initAct.Name = "Initial";
            initAct.CodeName = "Initial Activity";

            processDesp.Activities.Add(initAct);

            WfActivityDescriptor normalAct = new WfActivityDescriptor("NormalActivity", WfActivityType.NormalActivity);
            normalAct.Name = "Normal";
            normalAct.CodeName = "Normal Activity";

            processDesp.Activities.Add(normalAct);

            WfActivityDescriptor normalAct1 = new WfActivityDescriptor("NormalActivity1", WfActivityType.NormalActivity);
            normalAct1.Name = "Normal";
            normalAct1.CodeName = "Normal Activity1";

            processDesp.Activities.Add(normalAct1);

            WfActivityDescriptor normalAct2 = new WfActivityDescriptor("NormalActivity2", WfActivityType.NormalActivity);
            normalAct2.Name = "Normal";
            normalAct2.CodeName = "Normal Activity2";

            processDesp.Activities.Add(normalAct2);

            WfActivityDescriptor normalAct3 = new WfActivityDescriptor("NormalActivity3", WfActivityType.NormalActivity);
            normalAct3.Name = "Normal";
            normalAct3.CodeName = "Normal Activity3";

            processDesp.Activities.Add(normalAct3);

            WfActivityDescriptor completedAct = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);
            completedAct.Name = "Completed";
            completedAct.CodeName = "Completed Activity";

            processDesp.Activities.Add(completedAct);

            initAct.ToTransitions.AddForwardTransition(normalAct);
            normalAct.ToTransitions.AddForwardTransition(normalAct1);
            normalAct1.ToTransitions.AddForwardTransition(normalAct2);
            normalAct2.ToTransitions.AddForwardTransition(normalAct3);
            normalAct3.ToTransitions.AddForwardTransition(completedAct);

            return processDesp;
        }
		private void SetProcessProperties(WfProcessDescriptor processDesp, Dictionary<string, object> processProperties, IDictionary<string, object> dictionary)
		{
			if (processProperties.ContainsKey("RelativeLinks"))
			{
				processDesp.RelativeLinks.CopyFrom((WfRelativeLinkDescriptorCollection)processProperties["RelativeLinks"]);
			}
			else if (dictionary.ContainsKey("RelativeLinks"))
			{
				WfRelativeLinkDescriptorCollection relativeLinks = JSONSerializerExecute.Deserialize<WfRelativeLinkDescriptorCollection>(dictionary["Variables"]);
				processDesp.RelativeLinks.CopyFrom(relativeLinks);
			}

			if (processProperties.ContainsKey("CancelEventReceivers"))
			{
				processDesp.CancelEventReceivers.CopyFrom((WfResourceDescriptorCollection)processProperties["CancelEventReceivers"]);
			}
			else if (dictionary.ContainsKey("CancelEventReceivers"))
			{
				WfResourceDescriptorCollection cancelEventReceivers = JSONSerializerExecute.Deserialize<WfResourceDescriptorCollection>(dictionary["CancelEventReceivers"]);
				processDesp.CancelEventReceivers.CopyFrom(cancelEventReceivers);
			}

            if (processProperties.ContainsKey("CompleteEventReceivers"))
            {
                processDesp.CompleteEventReceivers.CopyFrom((WfResourceDescriptorCollection)processProperties["CompleteEventReceivers"]);
            }
            else if (dictionary.ContainsKey("CompleteEventReceivers"))
            {
                WfResourceDescriptorCollection completeEventReceivers = JSONSerializerExecute.Deserialize<WfResourceDescriptorCollection>(dictionary["CompleteEventReceivers"]);
                processDesp.CompleteEventReceivers.CopyFrom(completeEventReceivers);
            }

			if (processProperties.ContainsKey("CancelBeforeExecuteServices"))
			{
				processDesp.CancelBeforeExecuteServices.CopyFrom((WfServiceOperationDefinitionCollection)processProperties["CancelBeforeExecuteServices"]);
			}
			else if (dictionary.ContainsKey("CancelBeforeExecuteServices"))
			{
				WfServiceOperationDefinitionCollection cancelBeforeExecuteServices = JSONSerializerExecute.Deserialize<WfServiceOperationDefinitionCollection>(dictionary["CancelBeforeExecuteServices"]);
				processDesp.CancelBeforeExecuteServices.CopyFrom(cancelBeforeExecuteServices);
			}

			if (processProperties.ContainsKey("CancelAfterExecuteServices"))
			{
				processDesp.CancelAfterExecuteServices.CopyFrom((WfServiceOperationDefinitionCollection)processProperties["CancelAfterExecuteServices"]);
			}
			else if (dictionary.ContainsKey("CancelAfterExecuteServices"))
			{
				WfServiceOperationDefinitionCollection canceAfterExecuteServices = JSONSerializerExecute.Deserialize<WfServiceOperationDefinitionCollection>(dictionary["CancelAfterExecuteServices"]);
				processDesp.CancelAfterExecuteServices.CopyFrom(canceAfterExecuteServices);
			}

			if (processProperties.ContainsKey("InternalRelativeUsers"))
			{
				processDesp.InternalRelativeUsers.CopyFrom((WfResourceDescriptorCollection)processProperties["InternalRelativeUsers"]);
			}
			else if (dictionary.ContainsKey("InternalRelativeUsers"))
			{
				WfResourceDescriptorCollection interRelUser = JSONSerializerExecute.Deserialize<WfResourceDescriptorCollection>(dictionary["InternalRelativeUsers"]);
				processDesp.InternalRelativeUsers.CopyFrom(interRelUser);
			}

			if (processProperties.ContainsKey("ExternalUsers"))
			{
				processDesp.ExternalUsers.CopyFrom((WfExternalUserCollection)processProperties["ExternalUsers"]);
			}
			else if (dictionary.ContainsKey("ExternalUsers"))
			{
				WfExternalUserCollection externalUser = JSONSerializerExecute.Deserialize<WfExternalUserCollection>(dictionary["ExternalUsers"]);
				processDesp.ExternalUsers.CopyFrom(externalUser);
			}

			if (processProperties.ContainsKey("Variables"))
			{
				processDesp.Variables.CopyFrom((WfVariableDescriptorCollection)processProperties["Variables"]);
			}
			else if (dictionary.ContainsKey("Variables"))
			{
				WfVariableDescriptorCollection externalUser = JSONSerializerExecute.Deserialize<WfVariableDescriptorCollection>(dictionary["Variables"]);
				processDesp.Variables.CopyFrom(externalUser);
			}

			if (processProperties.ContainsKey("ParametersNeedToBeCollected"))
			{
				processDesp.ParametersNeedToBeCollected.CopyFrom((WfParameterNeedToBeCollected)processProperties["ParametersNeedToBeCollected"]);
			}
			else if (dictionary.ContainsKey("ParametersNeedToBeCollected"))
			{
				WfParameterNeedToBeCollected parametersNeedToBeCollected = JSONSerializerExecute.Deserialize<WfParameterNeedToBeCollected>(dictionary["ParametersNeedToBeCollected"]);
				processDesp.ParametersNeedToBeCollected.CopyFrom(parametersNeedToBeCollected);
			}
		}
        /// <summary>
        /// 准备加签退件流程
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareAddApproverReturnProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name = "加签退回流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName = "TEST_PROGRAM_NAME";
            processDesp.Url = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);
            initActivity.Name = "A";
            initActivity.CodeName = "A";

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");
            processDesp.Activities.Add(activityC);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("D", WfActivityType.CompletedActivity);
            completedActivity.Name = "D";
            completedActivity.CodeName = "D";

            processDesp.Activities.Add(completedActivity);

            //A到B
            initActivity.ToTransitions.AddForwardTransition(activityB);

            //B到C
            activityB.ToTransitions.AddForwardTransition(activityC);

            //C到结束点
            activityC.ToTransitions.AddForwardTransition(completedActivity);

            return processDesp;
        }
        /// <summary>
        /// 准备同意/不同意的退回流程。在B环节有两根出线BC和BA,BA是退回线,退回到A。其中BA默认是没有选择的
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareAgreeReturnProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name = "专用退回流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName = "TEST_PROGRAM_NAME";
            processDesp.Url = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);
            initActivity.Name = "A";
            initActivity.CodeName = "A";

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");
            processDesp.Activities.Add(activityC);

            IWfActivityDescriptor activityD = CreateNormalDescriptor("D", "D");
            processDesp.Activities.Add(activityD);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("F", WfActivityType.CompletedActivity);
            completedActivity.Name = "F";
            completedActivity.CodeName = "F";

            processDesp.Activities.Add(completedActivity);

            //A->B
            initActivity.ToTransitions.AddForwardTransition(activityB);

            //B有两根出线,分别是C和A,A是退回线
            WfTransitionDescriptor transitionBC = (WfTransitionDescriptor)activityB.ToTransitions.AddForwardTransition(activityC);
            transitionBC.Enabled = true;
            transitionBC.DefaultSelect = true;
            WfTransitionDescriptor transitionBA = (WfTransitionDescriptor)activityB.ToTransitions.AddBackwardTransition(initActivity);
            //transitionBA.Enabled = false;
            transitionBA.Enabled = true;
            transitionBC.DefaultSelect = false;
            transitionBA.IsBackward = true;

            //C->D
            activityC.ToTransitions.AddForwardTransition(activityD);

            //D到结束点
            activityD.ToTransitions.AddForwardTransition(completedActivity);

            return processDesp;
        }
        /// <summary>
        /// 生成用于复制退件活动的测试流程
        /// A为起点、两条分支,A、B、C、D和A、E、D,D为终点
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareCopyTestProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name = "专用退回流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName = "TEST_PROGRAM_NAME";
            processDesp.Url = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);
            initActivity.Name = "A";
            initActivity.CodeName = "A";

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");
            processDesp.Activities.Add(activityC);

            IWfActivityDescriptor activityE = CreateNormalDescriptor("E", "E");
            processDesp.Activities.Add(activityE);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("D", WfActivityType.CompletedActivity);
            completedActivity.Name = "D";
            completedActivity.CodeName = "D";

            processDesp.Activities.Add(completedActivity);

            //A到B
            WfTransitionDescriptor transitionAB = (WfTransitionDescriptor)initActivity.ToTransitions.AddForwardTransition(activityB);
            transitionAB.Enabled = true;

            //A到E
            WfTransitionDescriptor transitionAE = (WfTransitionDescriptor)initActivity.ToTransitions.AddBackwardTransition(activityE);
            transitionAE.Enabled = false;

            //B到C
            activityB.ToTransitions.AddForwardTransition(activityC);

            //E到C
            activityE.ToTransitions.AddForwardTransition(activityC);

            //C到结束点
            activityC.ToTransitions.AddForwardTransition(completedActivity);

            return processDesp;
        }
        /// <summary>
        /// 准备一条简单的直线流程,主要用于两次退回等场景
        /// 流程为A->B->C->D
        /// </summary>
        /// <returns></returns>
        public static IWfProcessDescriptor PrepareStraightProcessDesp()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = "TestProcess" + UuidHelper.NewUuidString().Substring(0, 8);
            processDesp.Name = "简单直线流程";
            processDesp.ApplicationName = "TEST_APP_NAME";
            processDesp.ProgramName = "TEST_PROGRAM_NAME";
            processDesp.Url = "/MCS_Framework/WebTestProject/defaultHandler.aspx";

            WfActivityDescriptor initActivity = new WfActivityDescriptor("A", WfActivityType.InitialActivity);
            initActivity.Name = "A";
            initActivity.CodeName = "A";
            initActivity.Resources.Add(new WfUserResourceDescriptor((IUser)OguObjectSettings.GetConfig().Objects["requestor"].Object));

            processDesp.Activities.Add(initActivity);

            IWfActivityDescriptor activityB = CreateNormalDescriptor("B", "B");

            processDesp.Activities.Add(activityB);
            activityB.Resources.Add(new WfUserResourceDescriptor((IUser)OguObjectSettings.GetConfig().Objects["approver1"].Object));

            IWfActivityDescriptor activityC = CreateNormalDescriptor("C", "C");
            processDesp.Activities.Add(activityC);

            WfActivityDescriptor completedActivity = new WfActivityDescriptor("D", WfActivityType.CompletedActivity);
            completedActivity.Name = "D";
            completedActivity.CodeName = "D";

            processDesp.Activities.Add(completedActivity);

            //A到B
            WfTransitionDescriptor transitionAB = (WfTransitionDescriptor)initActivity.ToTransitions.AddForwardTransition(activityB);
            transitionAB.Enabled = true;


            //B到C
            activityB.ToTransitions.AddForwardTransition(activityC);

            //C到结束点
            activityC.ToTransitions.AddForwardTransition(completedActivity);

            return processDesp;
        }
		private void ExportProcessPart(Package package, WfProcessDescriptor processDesc)
		{
			Uri partUri = CreatePartUri(processDesc.Key, PackagePartType.ProcessPart);

			if (ExistingParts.Contains(partUri.ToString()))
			{
				return;
			}

			XElement xeWfProcess = this.XmlFormatter.Serialize(processDesc);
			var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), xeWfProcess);

			PackagePart part = package.CreatePart(partUri, MediaTypeNames.Text.Xml);
			using (var stream = part.GetStream())
			{
				xDoc.Save(stream);
				stream.Flush();
			}

			ExistingParts.Add(partUri.ToString());
		}
		private void ExportMatrixPart(Package package, WfProcessDescriptor processDesc)
		{
			var matrix = WfMatrixAdapter.Instance.LoadByProcessKey(processDesc.Key, false);
			if (matrix == null)
			{
				return;
			}
			matrix.Loaded = true;

			Uri partUri = CreatePartUri(this.MatrixCounter.ToString(), PackagePartType.MatrixPart);
			if (ExistingParts.Contains(partUri.ToString()))
			{
				return;
			}

			this.MappingInfo.Add(new PackageRelationMapping()
			{
				MatrixPath = partUri.ToString(),
				MatrixDefID = matrix.Definition.Key,
				ProcessDescriptionID = processDesc.Key
			});

			ExportMatrixDefPart(package, matrix.Definition);

		
			PackagePart part = package.CreatePart(partUri, MediaTypeNames.Application.Octet);
			using (MemoryStream bytes = matrix.ExportToExcel2007(this.IsRoleAsPerson))
			{
				using (var stream = part.GetStream())
				{
					bytes.CopyTo(stream);
					//stream.Write(bytes, 0, bytes.Length);
					stream.Flush();
				}
			}

			ExistingParts.Add(partUri.ToString());
			this.MatrixCounter++;
		}
		private void SetPropertiesValue(WfProcessDescriptor processDesp, string propertyName, object input)
		{
			if (processDesp.Properties.ContainsKey(propertyName))
			{
				string itemvalue = JSONSerializerExecute.Serialize(input);
				processDesp.Properties.SetValue<string>(propertyName, itemvalue);
			}
		}
        public static void AssertProcessDescriptor(this WfClientProcessDescriptor cpd, WfProcessDescriptor spd)
        {
            cpd.AreSame(spd);

            cpd.Activities.AssertActivityDescriptorCollection(spd.Activities);

            if (cpd.InitialActivity != null)
                Assert.AreEqual(cpd.InitialActivity.Key, spd.InitialActivity.Key);

            if (cpd.CompletedActivity != null)
                Assert.AreEqual(cpd.CompletedActivity.Key, spd.CompletedActivity.Key);

            cpd.RelativeLinks.AssertRelativeLinks(spd.RelativeLinks);

            cpd.CancelEventReceivers.AssertResources(spd.CancelEventReceivers);
        }
        /// <summary>
        /// 创建一个没有连线的Server端流程对象
        /// </summary>
        /// <returns></returns>
        public static WfProcessDescriptor CreateSimpleServerProcessWithoutLines()
        {
            WfProcessDescriptor processDesp = new WfProcessDescriptor();

            processDesp.Key = UuidHelper.NewUuidString();
            processDesp.Name = "服务端测试流程";

            processDesp.Activities.Add(ActivityDescriptorHelper.CreateSimpleServerActivity("Start", "开始", WfActivityType.InitialActivity));
            processDesp.Activities.Add(ActivityDescriptorHelper.CreateSimpleServerActivity("End", "结束", WfActivityType.CompletedActivity));

            processDesp.RelativeLinks.Add(new WfRelativeLinkDescriptor("AR1") { Category = "Activity", Url = "http://www.ak47.com" });

            return processDesp;
        }
		protected void btnOK_Click(object sender, EventArgs e)
		{
			string returnUrl = Request.QueryString.GetValue("ru", string.Empty);

			WfProcessDescriptor processDesc = new WfProcessDescriptor();

			processDesc.Key = UuidHelper.NewUuidString();
			processDesc.Name = "自由流程";
			processDesc.ApplicationName = "秘书服务";
			processDesc.ProgramName = "部门通知";
			processDesc.Url = returnUrl;
			processDesc.DefaultTaskTitle = "${Subject}$";

			WfActivityDescriptor initAct = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);
			initAct.Name = "起草";
			initAct.CodeName = "Initial Activity";
			initAct.Properties.SetValue("AutoSendUserTask", false);
			initAct.Properties.TrySetValue("AllowWithdraw", true);

			processDesc.Activities.Add(initAct);

			foreach (IUser user in processUsers.SelectedOuUserData)
			{
				string key = processDesc.FindNotUsedActivityKey();
				WfActivityDescriptor normalAct = new WfActivityDescriptor(key, WfActivityType.NormalActivity);
				normalAct.Name = user.DisplayName;
				normalAct.CodeName = key;
				normalAct.Properties.SetValue("AutoAppendSecretary", true);
				//normalAct.ActivityType = WfActivityType.NormalActivity;

				WfUserResourceDescriptor userResourceDesc = new WfUserResourceDescriptor(user);
				normalAct.Resources.Add(userResourceDesc);

				processDesc.Activities.Add(normalAct);
			}

			WfActivityDescriptor completedAct = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);
			completedAct.Name = "完成";
			completedAct.CodeName = "Completed Activity";

			processDesc.Activities.Add(completedAct);

			for (int j = 0; j < processDesc.Activities.Count - 1; j++)
			{
				processDesc.Activities[j].ToTransitions.AddForwardTransition(processDesc.Activities[j + 1]);
			}

			WfProcessStartupParams startupParams = new WfProcessStartupParams();
			startupParams.ProcessDescriptor = processDesc;
			startupParams.Creator = DeluxeIdentity.CurrentUser;
			startupParams.Assignees.Add(DeluxeIdentity.CurrentUser);
			startupParams.DefaultTaskTitle = "${Subject}$";
			startupParams.RuntimeProcessName = "${Subject}$";
			startupParams.ResourceID = UuidHelper.NewUuidString();
			startupParams.Department = DeluxeIdentity.CurrentUser.Parent;

			string relativeParams = Request.QueryString["relativeParams"];

			if (relativeParams.IsNotEmpty())
				startupParams.RelativeParams.CopyFrom(UriHelper.GetUriParamsCollection(relativeParams));

			WfStartWorkflowExecutor executor = new WfStartWorkflowExecutor(WfClientContext.Current.OriginalActivity, startupParams);

			executor.AfterModifyWorkflow += new ExecutorEventHandler(executor_AfterModifyWorkflow);
			executor.Execute();

			IWfProcess process = WfClientContext.Current.OriginalActivity.Process;

			returnUrl = UriHelper.RemoveUriParams(returnUrl, "relativeParams");

			Response.Redirect(string.Format("{0}?resourceID={1}&activityID={2}",
				returnUrl, process.ResourceID, process.CurrentActivity.ID));
		}
		/// <summary>
		/// 创建流程定义
		/// </summary>
		/// <param name="overrideInitActivity"></param>
		/// <returns></returns>
		public WfProcessDescriptor CreateProcess(bool overrideInitActivity)
		{
			WfProcessDescriptor processDesp = new WfProcessDescriptor();

			processDesp.Properties.ReplaceExistedPropertyValues(this.Properties);

			CreateInitAndCompletedActivities(processDesp);

			processDesp.CreateActivities(this.ActivityTemplates, overrideInitActivity);

			return processDesp;
		}
		private static void CreateInitAndCompletedActivities(WfProcessDescriptor processDesp)
		{
			WfActivityDescriptor initAct = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);
			initAct.Name = "开始";
			initAct.CodeName = "Initial Activity";

			processDesp.Activities.Add(initAct);

			WfActivityDescriptor completedAct = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);
			completedAct.Name = "结束";
			completedAct.CodeName = "Completed Activity";

			processDesp.Activities.Add(completedAct);

			initAct.ToTransitions.AddForwardTransition(completedAct);
		}
		/// <summary>
		/// 准备流程
		/// </summary>
		private void PrepareProcess()
		{
			string returnUrl = Request.QueryString.GetValue("ru", string.Empty);

			WfProcessDescriptor processDesp = new WfProcessDescriptor();

			processDesp.Key = UuidHelper.NewUuidString();
			processDesp.Name = "自由流程";
			processDesp.ApplicationName = "秘书服务";
			processDesp.ProgramName = "部门通知";
			processDesp.Url = returnUrl;
			processDesp.DefaultTaskTitle = "${Subject}$";

			WfActivityDescriptor initDesp = new WfActivityDescriptor("Initial", WfActivityType.InitialActivity);
			initDesp.Name = "起草";
			initDesp.CodeName = "Initial Activity";
			initDesp.Properties.SetValue("AutoSendUserTask", false);

			processDesp.Activities.Add(initDesp);

			processDesp.Activities.Add(PrepareAURelativeActivityDescriptor(processDesp.FindNotUsedActivityKey()));

			WfActivityDescriptor completedActDesp = new WfActivityDescriptor("Completed", WfActivityType.CompletedActivity);
			completedActDesp.Name = "完成";
			completedActDesp.CodeName = "Completed Activity";

			processDesp.Activities.Add(completedActDesp);

			for (int i = 0; i < processDesp.Activities.Count - 1; i++)
			{
				processDesp.Activities[i].ToTransitions.AddForwardTransition(processDesp.Activities[i + 1]);
			}

			WfProcessStartupParams startupParams = new WfProcessStartupParams();

			startupParams.ApplicationRuntimeParameters["AdministrativeUnit"] = "Group";
			startupParams.ApplicationRuntimeParameters["Amount"] = "";
			startupParams.ApplicationRuntimeParameters["CostCenter"] = "1001";
			startupParams.ProcessDescriptor = processDesp;
			startupParams.Creator = DeluxeIdentity.CurrentUser;
			startupParams.Assignees.Add(DeluxeIdentity.CurrentUser);
			startupParams.DefaultTaskTitle = "${Subject}$";
			startupParams.ResourceID = UuidHelper.NewUuidString();
			startupParams.Department = DeluxeIdentity.CurrentUser.Parent;

			string relativeParams = Request.QueryString["relativeParams"];

			if (relativeParams.IsNotEmpty())
				startupParams.RelativeParams.CopyFrom(UriHelper.GetUriParamsCollection(relativeParams));

			WfStartWorkflowExecutor executor = new WfStartWorkflowExecutor(WfClientContext.Current.OriginalActivity, startupParams);

			executor.AfterModifyWorkflow += new ExecutorEventHandler(executor_AfterModifyWorkflow);
			executor.Execute();

			IWfProcess process = WfClientContext.Current.OriginalActivity.Process;

			returnUrl = UriHelper.RemoveUriParams(returnUrl, "relativeParams");

			HttpContext.Current.Response.Redirect(string.Format("{0}?resourceID={1}&activityID={2}",
				returnUrl, process.ResourceID, process.CurrentActivity.ID));
		}
		private void ClearAllProperties(WfProcessDescriptor processDesp)
		{
			processDesp.Variables.Clear();
			processDesp.Variables.Clear();
			processDesp.RelativeLinks.Clear();
			processDesp.CancelEventReceivers.Clear();
			processDesp.InternalRelativeUsers.Clear();
			processDesp.ExternalUsers.Clear();
			processDesp.ParametersNeedToBeCollected.Clear();
			processDesp.CancelAfterExecuteServices.Clear();
			processDesp.CancelBeforeExecuteServices.Clear();
		}
		public WfCreateProcessParam()
		{
			WfProcessDescriptor processDesp = new WfProcessDescriptor();

			this.Properties.CopyFrom(processDesp.Properties);
		}