|
@@ -1,13 +1,23 @@
|
|
|
package com.ruoyi.common.utils.bpm;
|
|
|
|
|
|
import cn.hutool.core.util.XmlUtil;
|
|
|
-import org.w3c.dom.Document;
|
|
|
-import org.w3c.dom.Element;
|
|
|
-import org.w3c.dom.NodeList;
|
|
|
+import com.ruoyi.common.utils.uuid.IdUtils;
|
|
|
+import org.w3c.dom.*;
|
|
|
|
|
|
+import javax.xml.transform.Transformer;
|
|
|
+import javax.xml.transform.TransformerConfigurationException;
|
|
|
+import javax.xml.transform.TransformerException;
|
|
|
+import javax.xml.transform.TransformerFactory;
|
|
|
+import javax.xml.transform.dom.DOMSource;
|
|
|
+import javax.xml.transform.stream.StreamResult;
|
|
|
+import java.io.StringWriter;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
+import java.util.UUID;
|
|
|
|
|
|
+/**
|
|
|
+ * 解析处理xml文件内容工具类
|
|
|
+ */
|
|
|
public class XmlDataParserUtils {
|
|
|
|
|
|
/**
|
|
@@ -37,4 +47,89 @@ public class XmlDataParserUtils {
|
|
|
}
|
|
|
return map;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增用户任务节点
|
|
|
+ * @param userTaskTagName 新增节点名称
|
|
|
+ * @param nextTagId 新增节点下一节点ID
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String addUserTaskTag(String xmlData,String userTaskTagName,String nextTagId) throws Exception {
|
|
|
+ //新增节点标签ID
|
|
|
+ String newUserTaskTagId = "Flow_" + IdUtils.fastSimpleUUID().substring(0,7);
|
|
|
+ //新增序列流ID
|
|
|
+ String newSequenceFlowId = "Flow_" + IdUtils.fastSimpleUUID().substring(0,7);
|
|
|
+ //新增节点下一节点序列流ID
|
|
|
+ String sequenceFlowId = null;
|
|
|
+ //上一节点标签ID
|
|
|
+ String previousId = null;
|
|
|
+ Document document= XmlUtil.parseXml(xmlData);
|
|
|
+ //获得XML文档根节点
|
|
|
+ Element elementG=XmlUtil.getRootElement(document);
|
|
|
+ //获取所有序列流(顺序),循环得到新增节点下一节点序列流ID、上一节点标签ID,修改新增节点下一节点序列流sourceRef为新增节点标签ID
|
|
|
+ NodeList elementsByTagName = elementG.getElementsByTagName("bpmn:sequenceFlow");
|
|
|
+ for (int i = 0; i < elementsByTagName.getLength(); i++) {
|
|
|
+ if (nextTagId.equals(elementsByTagName.item(i).getAttributes().getNamedItem("targetRef").getNodeValue())) {
|
|
|
+ sequenceFlowId = elementsByTagName.item(i).getAttributes().getNamedItem("id").getNodeValue();
|
|
|
+ previousId = elementsByTagName.item(i).getAttributes().getNamedItem("sourceRef").getNodeValue();
|
|
|
+ //获取当前元素
|
|
|
+ Node node = elementsByTagName.item(i);
|
|
|
+ //创建一个新的Attr对象,并设置新的属性值
|
|
|
+ Attr newAttr = document.createAttribute("sourceRef");
|
|
|
+ newAttr.setValue(newUserTaskTagId);
|
|
|
+ node.getAttributes().setNamedItem(newAttr);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //创建新用户任务节点标签
|
|
|
+ Element userTaskTag = document.createElement("bpmn:userTask");
|
|
|
+ userTaskTag.setAttribute("id",newUserTaskTagId);
|
|
|
+ userTaskTag.setAttribute("name",userTaskTagName);
|
|
|
+ Element userTaskTagChild1 = document.createElement("bpmn:incoming");
|
|
|
+ userTaskTagChild1.setTextContent(newSequenceFlowId);
|
|
|
+ userTaskTag.appendChild(userTaskTagChild1);
|
|
|
+ Element userTaskTagChild2 = document.createElement("bpmn:outgoing");
|
|
|
+ userTaskTagChild2.setTextContent(sequenceFlowId);
|
|
|
+ userTaskTag.appendChild(userTaskTagChild2);
|
|
|
+ //创建新序列流标签
|
|
|
+ Element sequenceFlowTag = document.createElement("bpmn:sequenceFlow");
|
|
|
+ sequenceFlowTag.setAttribute("id",newSequenceFlowId);
|
|
|
+ sequenceFlowTag.setAttribute("sourceRef",previousId);
|
|
|
+ sequenceFlowTag.setAttribute("targetRef",newUserTaskTagId);
|
|
|
+
|
|
|
+ //修改上一节点bpmn:outgoing和下一节点bpmn:incoming
|
|
|
+ //获取bpmn:process节点
|
|
|
+ Element bpmnProcessEvent = XmlUtil.getElement(elementG,"bpmn:process");
|
|
|
+ NodeList bpmnProcessNextLevelEventList = bpmnProcessEvent.getChildNodes();
|
|
|
+ for (int i = 0; i < bpmnProcessNextLevelEventList.getLength(); i++) {
|
|
|
+ Node node = bpmnProcessNextLevelEventList.item(i);
|
|
|
+ //判断node是元素节点,并且是Element实例
|
|
|
+ if (node.getNodeType() == Node.ELEMENT_NODE && node instanceof Element) {
|
|
|
+ Element element = (Element) node;
|
|
|
+ String id = element.getAttribute("id");
|
|
|
+ if(id.equals(previousId)){
|
|
|
+ Element elementOutgoing = XmlUtil.getElement(element,"bpmn:outgoing");
|
|
|
+ elementOutgoing.setTextContent(newSequenceFlowId);
|
|
|
+ }
|
|
|
+ if(id.equals(nextTagId)){
|
|
|
+ Element elementOutgoing = XmlUtil.getElement(element,"bpmn:incoming");
|
|
|
+ elementOutgoing.setTextContent(sequenceFlowId);
|
|
|
+
|
|
|
+ //插入标签
|
|
|
+ Node parentNode = element.getParentNode();
|
|
|
+ parentNode.insertBefore(userTaskTag,element);
|
|
|
+ parentNode.insertBefore(sequenceFlowTag,element);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //将document对象转成字符串
|
|
|
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
|
|
+ Transformer transformer = transformerFactory.newTransformer();
|
|
|
+ DOMSource source = new DOMSource(document);
|
|
|
+ StreamResult result = new StreamResult(new StringWriter()); // 使用StringWriter来将结果输出为字符串
|
|
|
+ transformer.transform(source, result);
|
|
|
+ String data = result.getWriter().toString();
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
}
|