/// <summary> /// 保存工作流程信息 /// </summary> /// <param name="model">工作流程信息</param> /// <returns>是否成功</returns> private ActionResult SavePackage(WorkflowPackageViewModel model) { ActionResult result = new ActionResult(); FunctionNode functionNode = new FunctionNode(); if (string.IsNullOrEmpty(model.ObjectID)) { if (!ValidateExist(model.Code, out result)) { return(result); } functionNode.ParentCode = model.Folder; functionNode.Code = model.Code.Trim(); functionNode.NodeType = FunctionNodeType.BizWorkflowPackage; int sortKey; if (Int32.TryParse(model.SortKey, out sortKey)) { functionNode.SortKey = sortKey; } functionNode.DisplayName = model.DisplayName.Trim(); result.Extend = model.Folder; //添加流程包里的数据 result.Success = this.Engine.AppPackageManager.AddAppPackage(functionNode, (StorageType)int.Parse(model.StorageType), model.IsShared, model.IsQuotePacket, model.BindPacket); //使用了共享包,复制共享包的流程模型 if (model.IsQuotePacket) { //复制流程包的流程模板 OThinker.H3.WorkflowTemplate.WorkflowClause[] WorkflowClauses = this.Engine.WorkflowManager.GetClausesBySchemaCode(model.BindPacket); if (null != WorkflowClauses && WorkflowClauses.Length != 0) { //复制所有的父流程模板 WorkflowClauses = WorkflowClauses.Where(s => s.IsShared).ToArray(); for (int i = 0; i < WorkflowClauses.Length; i++) { string workflowClauseCode = i == 0 ? model.Code : model.Code + i; //使用共享包的,用共享包的模型创建 WorkflowTemplate.DraftWorkflowTemplate template = this.Engine.WorkflowManager.GetDraftTemplate(WorkflowClauses[i].WorkflowCode); if (template == null) { continue; } template.WorkflowCode = workflowClauseCode; this.Engine.WorkflowManager.SaveDraftTemplate(this.UserValidator.UserID, template); //添加流程包时已经默认增加了一个流程模板 if (i > 0) { WorkflowTemplate.WorkflowClause wClause = new WorkflowTemplate.WorkflowClause(model.BindPacket, workflowClauseCode, model.DisplayName, WorkflowClauses[i].SortKey); wClause.OwnSchemaCode = model.Code; this.Engine.WorkflowManager.AddClause(wClause); } } } } } else { functionNode = this.Engine.FunctionAclManager.GetFunctionNode(model.ObjectID); int sortKey; if (Int32.TryParse(model.SortKey, out sortKey)) { functionNode.SortKey = sortKey; } functionNode.DisplayName = model.DisplayName.Trim(); string nodeParentId = this.Engine.FunctionAclManager.GetFunctionNodeByCode(functionNode.ParentCode).ObjectID; functionNode.ParentCode = model.Folder; result.Success = this.Engine.FunctionAclManager.UpdateFunctionNode(functionNode) == ErrorCode.SUCCESS; result.Extend = nodeParentId; } return(result); }
/// <summary> /// 导出流程包 /// </summary> /// <param name="PackageCode"></param> /// <returns></returns> public object Export(string PackageCode) { return(ExecuteFileResultFunctionRun(() => { Acl.FunctionNode PackageNode = this.Engine.FunctionAclManager.GetFunctionNodeByCode(PackageCode); //流程包 XmlElement BizWorkflowPackage = XmlDoc.CreateElement(FunctionNodeType.BizWorkflowPackage.ToString()); BizWorkflowPackage.AppendChild(CreateXmlElement("PackageCode", PackageNode.Code)); BizWorkflowPackage.AppendChild(CreateXmlElement("PackageName", PackageNode.DisplayName)); XmlDoc.AppendChild(BizWorkflowPackage); BizWorkflowPackage.InnerXml += Convertor.ObjectToXml(PackageNode); //数据模型 BizObjectSchema Schema = this.Engine.BizObjectManager.GetDraftSchema(PackageCode); if (Schema != null) { BizWorkflowPackage.InnerXml += Convertor.ObjectToXml(Schema); //监听实例 BizListenerPolicy policy = this.Engine.BizObjectManager.GetListenerPolicy(Schema.SchemaCode); if (policy != null) { BizWorkflowPackage.InnerXml += Convertor.ObjectToXml(policy); } //定时作业 ScheduleInvoker[] scheduleInvokers = this.Engine.BizObjectManager.GetScheduleInvokerList(Schema.SchemaCode); if (scheduleInvokers != null && scheduleInvokers.Length > 0) { XmlElement invokers = XmlDoc.CreateElement("ScheduleInvokers"); foreach (ScheduleInvoker item in scheduleInvokers) { invokers.InnerXml += Convertor.ObjectToXml(item); } BizWorkflowPackage.AppendChild(invokers); } //查询列表 BizQuery[] queries = this.Engine.BizObjectManager.GetBizQueries(Schema.SchemaCode); if (queries != null && queries.Length > 0) { XmlElement bizQueries = XmlDoc.CreateElement("BizQueries"); foreach (BizQuery query in queries) { bizQueries.InnerXml += Convertor.ObjectToXml(query); } BizWorkflowPackage.AppendChild(bizQueries); } } //表单 BizSheet[] Sheets = this.Engine.BizSheetManager.GetBizSheetBySchemaCode(PackageCode); XmlElement workflowSheets = XmlDoc.CreateElement("BizSheets"); if (Sheets != null) { foreach (BizSheet s in Sheets) { workflowSheets.InnerXml += Convertor.ObjectToXml(s); } } BizWorkflowPackage.AppendChild(workflowSheets); //流程 WorkflowTemplate.WorkflowClause[] WorkflowClauses = this.Engine.WorkflowManager.GetClausesBySchemaCode(PackageCode); XmlElement workflowTemps = XmlDoc.CreateElement("WorkflowTemplates"); if (WorkflowClauses != null) { foreach (WorkflowTemplate.WorkflowClause WorkflowClause in WorkflowClauses) { WorkflowTemplate.DraftWorkflowTemplate workflowTemplate = this.Engine.WorkflowManager.GetDraftTemplate(WorkflowClause.WorkflowCode); //发布后才能导出 if (workflowTemplate == null) { continue; } XmlElement workflowTempElement = XmlDoc.CreateElement("WorkflowTemplate"); //流程名称 workflowTempElement.AppendChild(this.CreateXmlElement("WorkflowTemplateName", WorkflowClause.WorkflowName)); //流程图 XmlElement workflowDocument = XmlDoc.CreateElement("WorkflowDocument"); workflowTemplate.SaveAsXml(XmlDoc, workflowDocument); workflowTempElement.AppendChild(workflowDocument); //流程模拟 XmlElement simulationElement = XmlDoc.CreateElement("Simulations"); InstanceSimulation[] simulations = this.Engine.SimulationManager.GetSimulationByWorkflow(workflowTemplate.WorkflowCode); if (simulations != null && simulations.Length > 0) { foreach (InstanceSimulation simulation in simulations) { simulationElement.InnerXml += Convertor.ObjectToXml(simulation); } } workflowTempElement.AppendChild(simulationElement); //流程模板簇 workflowTempElement.InnerXml += Convertor.ObjectToXml(WorkflowClause); //添加流程模板 workflowTemps.AppendChild(workflowTempElement); } } BizWorkflowPackage.AppendChild(workflowTemps); //导出文件 string path = Server.MapPath("~/TempImages/"); string fileName = PackageCode + ".xml"; XmlDoc.Save(path + fileName); return File(path + fileName, "application/octect-stream", fileName); })); }