/// <summary> /// 保存xml文件 /// </summary> /// <param name="package"></param> public void SaveProcessFile(package package) { var xmlDoc = Serialize(package); var processGUID = package.process.id; var pm = new ProcessManager(); var entity = pm.GetByGUID(processGUID); if (entity != null) { var serverPath = ConfigHelper.GetAppSettingString("WorkflowFileServer"); var physicalFileName = string.Format("{0}\\{1}", serverPath, entity.XmlFilePath); //判断目录是否存在,否则创建 var pathName = Path.GetDirectoryName(physicalFileName); if (!Directory.Exists(pathName)) Directory.CreateDirectory(pathName); xmlDoc.Save(physicalFileName); } else { throw new ApplicationException(string.Format("无法获取流程定义记录! ProcessGUID: {0}", processGUID)); } }
/// <summary> /// 实体序列化为XML对象 /// </summary> /// <param name="package"></param> /// <returns></returns> private XmlDocument Serialize(package package) { var xmlDoc = new XmlDocument(); var xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); var root = xmlDoc.CreateElement("Package"); xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement); xmlDoc.AppendChild(root); var participantsNode = xmlDoc.CreateElement("Participants"); root.AppendChild(participantsNode); var workflowProcessNode = xmlDoc.CreateElement("WorkflowProcess"); root.AppendChild(workflowProcessNode); var processNode = xmlDoc.CreateElement("Process"); workflowProcessNode.AppendChild(processNode); //added participants list package.participants.ForEach((a) => { var pNode = xmlDoc.CreateElement("Participant"); pNode.SetAttribute("type", a.type); pNode.SetAttribute("id", a.id); pNode.SetAttribute("name", a.name); pNode.SetAttribute("code", a.code); pNode.SetAttribute("outerId", a.outerId.ToString()); participantsNode.AppendChild(pNode); }); //added process node var process = package.process; processNode.SetAttribute("id", process.id); processNode.SetAttribute("name", process.name); //added snodes var activitiesNode = xmlDoc.CreateElement("Activities"); processNode.AppendChild(activitiesNode); process.snodes.ForEach((a) => { var aNode = xmlDoc.CreateElement("Activity"); aNode.SetAttribute("name", a.name); aNode.SetAttribute("id", a.id); if (!string.IsNullOrEmpty(a.code)) aNode.SetAttribute("code", a.code); var activityTypeNode = xmlDoc.CreateElement("ActivityType"); activityTypeNode.SetAttribute("type", a.type); aNode.AppendChild(activityTypeNode); //added performers node var performersNode = xmlDoc.CreateElement("Performers"); a.performers.ForEach((p) => { var pNode = xmlDoc.CreateElement("Performer"); pNode.SetAttribute("id", p.id); performersNode.AppendChild(pNode); }); aNode.AppendChild(performersNode); //added geography node var geographyNode = xmlDoc.CreateElement("Geography"); aNode.AppendChild(geographyNode); //added widget node var widgetNode = xmlDoc.CreateElement("Widget"); widgetNode.SetAttribute("nodeId", a.nodeId.ToString()); widgetNode.SetAttribute("left", a.x.ToString()); widgetNode.SetAttribute("top", a.y.ToString()); widgetNode.SetAttribute("width", a.width.ToString()); widgetNode.SetAttribute("height", a.height.ToString()); //added connectors node var connectorsNode = xmlDoc.CreateElement("Connectors"); a.inputConnectors.ForEach((c1) => { var cNode = xmlDoc.CreateElement("Connector"); cNode.SetAttribute("type", c1.type); cNode.SetAttribute("index", c1.index.ToString()); cNode.SetAttribute("name", c1.name); connectorsNode.AppendChild(cNode); }); a.outputConnectors.ForEach((c2) => { var cNode = xmlDoc.CreateElement("Connector"); cNode.SetAttribute("type", c2.type); cNode.SetAttribute("index", c2.index.ToString()); cNode.SetAttribute("name", c2.name); connectorsNode.AppendChild(cNode); }); widgetNode.AppendChild(connectorsNode); geographyNode.AppendChild(widgetNode); activitiesNode.AppendChild(aNode); }); //added slines var transitionsNode = xmlDoc.CreateElement("Transitions"); processNode.AppendChild(transitionsNode); process.slines.ForEach((t) => { var tNode = xmlDoc.CreateElement("Transition"); tNode.SetAttribute("name", t.name); tNode.SetAttribute("id", t.id); tNode.SetAttribute("from", t.from); tNode.SetAttribute("to", t.to); var dNode = xmlDoc.CreateElement("Description"); tNode.AppendChild(dNode); var dtext = xmlDoc.CreateTextNode(t.Description); tNode.AppendChild(dtext); var geographyNode = xmlDoc.CreateElement("Geography"); tNode.AppendChild(geographyNode); var lineNode = xmlDoc.CreateElement("Line"); geographyNode.AppendChild(lineNode); lineNode.SetAttribute("fromNode", t.source.nodeId.ToString()); lineNode.SetAttribute("fromConnector", t.source.connectorIndex.ToString()); lineNode.SetAttribute("toNode", t.dest.nodeId.ToString()); lineNode.SetAttribute("toConnector", t.dest.connectorIndex.ToString()); transitionsNode.AppendChild(tNode); }); return xmlDoc; }