From 057c4762b8de07bfb88d594a8a659c4fa7efc4f6 Mon Sep 17 00:00:00 2001 From: qinoy Date: Thu, 18 May 2023 17:45:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=AF=E5=88=B0=E7=AB=AF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...oft.apps.coe.method.process.subprocess.jar | Bin 37686 -> 35664 bytes .../manifest.xml | 2 +- .../subprocess/SubProcessController.java | 9 +- .../subprocess/graph/GraphAdjMatrix.java | 19 ++- .../process/subprocess/graph/GraphLayout.java | 24 ++-- .../subprocess/graph/GraphLinkerRender.java | 38 ++++++ .../subprocess/graph/VertexPreHandle.java | 115 ++++++++++++------ .../method/process/subprocess/mode/Node.java | 97 ++++----------- .../subprocess/mode/vo/IndependentNodeVo.java | 37 ++++++ .../process/subprocess/web/SubProcessWeb.java | 33 ++--- .../action.xml | 1 + 11 files changed, 222 insertions(+), 153 deletions(-) create mode 100644 com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java diff --git a/com.actionsoft.apps.coe.method.process.subprocess/lib/com.actionsoft.apps.coe.method.process.subprocess.jar b/com.actionsoft.apps.coe.method.process.subprocess/lib/com.actionsoft.apps.coe.method.process.subprocess.jar index 9b7bac39e802c643a72748fcae19ff776830a0cc..bb2ed9c0c25ac4031e468c22e549b0d7aedf8883 100644 GIT binary patch delta 20687 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 diff --git a/com.actionsoft.apps.coe.method.process.subprocess/manifest.xml b/com.actionsoft.apps.coe.method.process.subprocess/manifest.xml index 06b6e944..311922e5 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/manifest.xml +++ b/com.actionsoft.apps.coe.method.process.subprocess/manifest.xml @@ -25,6 +25,6 @@ {"process.epc":{"code": "&#xe605;","color": "#4E7FF9"}} - 伊利/流程制度/专门存放端到端总图 + 伊利/流程制度/端到端流程 diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/SubProcessController.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/SubProcessController.java index eb83400f..107ceb96 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/SubProcessController.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/SubProcessController.java @@ -8,6 +8,7 @@ import com.actionsoft.bpms.server.bind.annotation.Controller; import com.actionsoft.bpms.server.bind.annotation.Mapping; import com.actionsoft.exception.AWSException; import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import java.util.List; @@ -103,9 +104,9 @@ public class SubProcessController { public String vertexPreHandleIndependentNode(UserContext uc, String processIdJsonArr){ try { SubProcessWeb processWeb = new SubProcessWeb(uc); - List independentNodeVos = processWeb.vertexPreHandleIndependentNode(processIdJsonArr); + JSONObject data = processWeb.vertexPreHandleIndependentNode(processIdJsonArr); ResponseObject ro = ResponseObject.newOkResponse(); - ro.put("independentNodeVos",independentNodeVos); + ro.setData(data); return ro.toString(); } catch (AWSException e) { return ResponseObject.newErrResponse(e.getMessage()).toString(); @@ -136,9 +137,9 @@ public class SubProcessController { * @return */ @Mapping("com.actionsoft.apps.coe.method.process.subprocess.generator_end_to_end_model") - public String generatorEndToEndModel(UserContext uc, String processIdJsonArr, String locationId, String direction, String modelName){ + public String generatorEndToEndModel(UserContext uc, String processIdJsonArr, String locationId, String direction, String modelName, String excludeProcessIdArr){ SubProcessWeb processWeb = new SubProcessWeb(uc); - processWeb.generatorEndToEndModel(processIdJsonArr, locationId, direction, modelName); + processWeb.generatorEndToEndModel(processIdJsonArr, locationId, direction, modelName, excludeProcessIdArr); return ResponseObject.newOkResponse().toString(); } diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphAdjMatrix.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphAdjMatrix.java index 88709782..843b87ad 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphAdjMatrix.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphAdjMatrix.java @@ -75,23 +75,22 @@ public class GraphAdjMatrix { /** * 构建邻接矩阵 - * @param nodeIndexMap 索引映射 节点ID与节点在列表中索引的映射关系 */ - public void buildAdjMatrix(Map nodeIndexMap){ + public void buildAdjMatrix(){ for (int i = 0; i < vertexList.size(); i++) { Node currentNode = vertexList.get(i); // 处理当前节点到后置节点的边 - if (currentNode.getRearModeList() != null && currentNode.getRearModeList().size() > 0){ - List rearModeList = currentNode.getRearModeList(); - for (DesignerShapeRelationModel rearModel : rearModeList) { - addEdge(i, nodeIndexMap.get(rearModel.getRelationFileId()).intValue()); + if (currentNode.getRearNodeList() != null && currentNode.getRearNodeList().size() > 0){ + List rearNodeList = currentNode.getRearNodeList(); + for (Node rearNode : rearNodeList) { + addEdge(i, vertexList.indexOf(rearNode)); } } // 处理当前节点与前置节点的边 - if (currentNode.getLearModeList() != null && currentNode.getLearModeList().size() > 0){ - List learModeList = currentNode.getLearModeList(); - for (DesignerShapeRelationModel learModel : learModeList) { - addEdge(nodeIndexMap.get(learModel.getRelationFileId()).intValue(), i); + if (currentNode.getLeadNodeList() != null && currentNode.getLeadNodeList().size() > 0){ + List leadNodeList = currentNode.getLeadNodeList(); + for (Node leadNode : leadNodeList) { + addEdge(vertexList.indexOf(leadNode), i); } } } diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java index b4a6672a..59bfe92a 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLayout.java @@ -96,32 +96,32 @@ public class GraphLayout { * 节点布局 */ public double[][] layOut(){ - double tempY = 0.0; // 记录第一列的高度 + double realTimeY = 0.0; // 实时记录图形最高的Y for (int i = 0; i < nodeList.size(); i++) { // 第一个节点直接放到画布的左上角 if (i == 0) { position[i][0] = 100.0; position[i][1] = 100.0; - tempY = 100.0; // 更新第一列的高度 + realTimeY = 100.0; isPosition[i] = true; if (existOutLink(i)){ // 如果存在后置节点 并且后置节点还未渲染 - calculationRearNodePosition(i); + realTimeY = calculationRearNodePosition(i, realTimeY); } continue; } if (!isPosition[i]){ position[i][0] = 100.0; - position[i][1] = tempY + shapeH + vertInterval; - tempY = position[i][1]; // 更新第一列的高度 + position[i][1] = realTimeY + shapeH + vertInterval; + realTimeY = position[i][1]; // 存在后置节点 if (existOutLink(i)){ - calculationRearNodePosition(i); + realTimeY = calculationRearNodePosition(i, realTimeY); } } } // 确定画布的宽度与高度 - double w = Arrays.stream(position).mapToDouble(position -> position[0]).max().getAsDouble(); - double h = Arrays.stream(position).mapToDouble(position -> position[1]).max().getAsDouble(); + double w = Arrays.stream(position).mapToDouble(position -> position[0]).max().orElse(0.0); + double h = Arrays.stream(position).mapToDouble(position -> position[1]).max().orElse(0.0); this.canvasWidth = w + 200.0; this.canvasHeight = h + 200.0; @@ -139,7 +139,7 @@ public class GraphLayout { * 计算当前节点所有后置节点的位置 * @param nodeIndex */ - private void calculationRearNodePosition(int nodeIndex){ + private double calculationRearNodePosition(int nodeIndex, double realTimeY){ // 获取后置节点的索引 List rearNodeIndexSet = getRearNodeIndex(nodeIndex); for (int i = 0; i < rearNodeIndexSet.size(); i++) { @@ -149,15 +149,17 @@ public class GraphLayout { if (i == 0) { position[rearNodeIndex][1] = position[nodeIndex][1]; // 上一个节点的y坐标 与 第一个后置节点的y坐标一致 }else { - position[rearNodeIndex][1] = position[nodeIndex][1] + shapeH + i * vertInterval; // 非第一个后置节点的y坐标 = 上一个节点的y坐标 + 后置节点索引 * 垂直间隔 + position[rearNodeIndex][1] = realTimeY + shapeH + i * vertInterval; // 非第一个后置节点的y坐标 = 上一个节点的y坐标 + 图形高度 + 后置节点索引 * 垂直间隔 + realTimeY = position[rearNodeIndex][1]; } isPosition[rearNodeIndex] = true; if (existOutLink(rearNodeIndex)) { - calculationRearNodePosition(rearNodeIndex); + realTimeY = calculationRearNodePosition(rearNodeIndex, realTimeY); } } } + return realTimeY; } diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java new file mode 100644 index 00000000..dcaee95b --- /dev/null +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphLinkerRender.java @@ -0,0 +1,38 @@ +package com.actionsoft.apps.coe.method.process.subprocess.graph; + +import com.actionsoft.apps.coe.method.process.subprocess.mode.Node; + +/** + * 图形节点连线渲染 + */ +public class GraphLinkerRender { + + private String linkerId; + private Node fromNode; + private Node toNode; + private double[] fromPoi; + private double[] toPoi; + private double[][] vertexPosition; // 所有节点的坐标 + private String linkerDefine; + + public GraphLinkerRender(double[][] vertexPosition) { + this.vertexPosition = vertexPosition; + } + + /** + * 计算两个坐标之间的折点 + * @param fromPoi + * @param toPoi + * @return + */ + private double[][] calculationTurningPoint(double[] fromPoi, double[] toPoi){ + double fromX = fromPoi[0]; + double fromY = fromPoi[1]; + + double toX = toPoi[0]; + double toY = toPoi[1]; + + + return new double[2][2]; + } +} diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/VertexPreHandle.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/VertexPreHandle.java index b43656aa..cc239c93 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/VertexPreHandle.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/VertexPreHandle.java @@ -11,9 +11,8 @@ import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.Design import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; import com.actionsoft.exception.AWSException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 模型节点预处理 @@ -31,78 +30,124 @@ public class VertexPreHandle { /** * 收集独立子流程 + * 既没有前置也没有后置 同时也未被引用 * @param processIdList * @return * @throws AWSException */ - public List collectIndependentNode(List processIdList) throws AWSException{ + public Map> collectIndependentNode(List processIdList) throws AWSException{ - List independentNodeVos = new ArrayList<>(); + List nodeVoList = new ArrayList<>(); List attrIdList = new ArrayList<>(); attrIdList.add(SubProcessConst.LEAD_PROCESS_ATTR_ID); attrIdList.add(SubProcessConst.REAR_PROCESS_ATTR_ID); for (String processId : processIdList) { + PALRepositoryModel repositoryModel = PALRepositoryCache.getCache().get(processId); + IndependentNodeVo independentNodeVo = new IndependentNodeVo(processId, repositoryModel.getName(), false); // 1. 该子流程是否存在前置或后置流程 List leadProcessList = DesignerShapeRelationCache.getByFileId(processId, SubProcessConst.LEAD_PROCESS_ATTR_ID); - if (leadProcessList != null && leadProcessList.size() > 0) continue; + if (leadProcessList != null && leadProcessList.size() > 0) { + List nodeVos = leadProcessList.stream().map(relationModel -> { + PALRepositoryModel model = PALRepositoryCache.getCache().get(relationModel.getRelationFileId()); + IndependentNodeVo nodeVo = new IndependentNodeVo(relationModel.getRelationFileId(), model.getName()); + return nodeVo; + }).collect(Collectors.toList()); + independentNodeVo.setLeadNodeVo(nodeVos); + }; List rearProcessList = DesignerShapeRelationCache.getByFileId(processId, SubProcessConst.REAR_PROCESS_ATTR_ID); - if (rearProcessList != null && rearProcessList.size() > 0) continue; + if (rearProcessList != null && rearProcessList.size() > 0) { + List nodeVos = rearProcessList.stream().map(relationModel -> { + PALRepositoryModel model = PALRepositoryCache.getCache().get(relationModel.getRelationFileId()); + IndependentNodeVo nodeVo = new IndependentNodeVo(relationModel.getRelationFileId(), model.getName()); + return nodeVo; + }).collect(Collectors.toList()); + independentNodeVo.setRearNodeVo(nodeVos); + }; // 2. 该节点是否被别的节点 DesignerShapeRelationDao relationDao = new DesignerShapeRelationDao(); List relationModels = relationDao.getModelListByRelationFileIdAndAttrIds(processId, attrIdList); - if (relationModels != null && relationModels.size() > 0) continue; + if (relationModels != null && relationModels.size() > 0) { + independentNodeVo.setBeReference(true); + }; // 3. 收集独立节点信息返回给前台 - PALRepositoryModel repositoryModel = PALRepositoryCache.getCache().get(processId); - IndependentNodeVo independentNodeVo = new IndependentNodeVo(processId, repositoryModel.getName()); - independentNodeVos.add(independentNodeVo); + nodeVoList.add(independentNodeVo); } - return independentNodeVos; + Map> map = new HashMap<>(); + List independentNodeVos = new ArrayList<>(); + List leadAndRearNotInRange = new ArrayList<>(); + for (IndependentNodeVo nodeVo : nodeVoList) { + if (nodeVo.isBeReference()) continue; // 被引用了 不管有没有前置或后置 都保留 + if (nodeVo.getLeadNodeVo() == null && nodeVo.getRearNodeVo() == null && !nodeVo.isBeReference()){ // 完全独立 + independentNodeVos.add(nodeVo); + continue; + } + + List leadNodeVos = nodeVo.getLeadNodeVo(); + if (leadNodeVos != null && leadNodeVos.size() > 0){ + List nodeIds = leadNodeVos.stream().map(leadNodeVo -> leadNodeVo.getId()).collect(Collectors.toList()); + if (!processIdList.containsAll(nodeIds)){ + leadAndRearNotInRange.add(nodeVo); + continue; + } + } + List rearNodeVos = nodeVo.getRearNodeVo(); + if (rearNodeVos != null && rearNodeVos.size() > 0){ + List nodeIds = rearNodeVos.stream().map(rearNodeVo -> rearNodeVo.getId()).collect(Collectors.toList()); + if (!processIdList.containsAll(nodeIds)){ + leadAndRearNotInRange.add(nodeVo); + continue; + } + } + } + map.put("independentNodeVos", independentNodeVos); + map.put("leadAndRearNotInRange", leadAndRearNotInRange); + + return map; } - /** - * 包含进总图中 - * @param processIdList 选择的若干子流程ID - * @param nodeIndexMap 存放子流程在集合中的索引 - * @return + * 对于节点的前置或者后置流程 + * 如果未在选择的范围内 则忽略 + * + * 同时处理节点的前后置关系 + * @param processIdList + * @param nodeIndexMap + * @return 按照节点前置流程数量 从小到大排序 * @throws AWSException */ - public List includeLearAndRearNode(List processIdList, Map nodeIndexMap) throws AWSException { + public List excludeLearAndRearNode(List processIdList, Map nodeIndexMap) throws AWSException { List nodeList = new ArrayList<>(); - for (int i = 0; i < processIdList.size(); i++) { Node node = new Node(processIdList.get(i)); // 前置流程 - List learProcessList = DesignerShapeRelationCache.getByFileId(processIdList.get(i), SubProcessConst.LEAD_PROCESS_ATTR_ID); - learProcessList.stream().forEach(model -> { - if (!processIdList.contains(model.getRelationFileId())){ - Node learNode = new Node(model.getRelationFileId()); - nodeList.add(learNode); - nodeIndexMap.put(model.getRelationFileId(), nodeList.size() - 1); + List leadProcessList = DesignerShapeRelationCache.getByFileId(processIdList.get(i), SubProcessConst.LEAD_PROCESS_ATTR_ID); + List leadNodeList = new ArrayList<>(); + leadProcessList.stream().forEach(model -> { + if (processIdList.contains(model.getRelationFileId())){ + Node leadNode = new Node(model.getRelationFileId()); + leadNodeList.add(leadNode); } }); - node.setLearModeList(learProcessList); + node.setLeadNodeList(leadNodeList); // 后置流程 List rearProcessList = DesignerShapeRelationCache.getByFileId(processIdList.get(i), SubProcessConst.REAR_PROCESS_ATTR_ID); + List rearNodeList = new ArrayList<>(); rearProcessList.stream().forEach(model -> { - if (!processIdList.contains(model.getRelationFileId())){ + if (processIdList.contains(model.getRelationFileId())){ Node rearNode = new Node(model.getRelationFileId()); - nodeList.add(rearNode); - nodeIndexMap.put(model.getRelationFileId(), nodeList.size() - 1); + rearNodeList.add(rearNode); } }); - node.setRearModeList(rearProcessList); + node.setRearNodeList(rearNodeList); + nodeList.add(node); nodeIndexMap.put(node.getId(), nodeList.size() - 1); } + + Collections.sort(nodeList); return nodeList; } - - @Deprecated - public void excludeLearAndRearNode(List processIdList) throws AWSException { - - } } diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/Node.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/Node.java index 753f8e91..b870a4b4 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/Node.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/Node.java @@ -1,42 +1,23 @@ package com.actionsoft.apps.coe.method.process.subprocess.mode; -import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapeRelationModel; - import java.util.List; +import java.util.Objects; /** * @author oYang * @create 2023-05-11 17:21 */ -public class Node { +public class Node implements Comparable { private String id; - private double x; - private double y; - private double vx; - private double vy; - private List learModeList; - private List rearModeList; + private List leadNodeList; + private List rearNodeList; public Node(String id) { this.id = id; } - public Node(String id, double x, double y) { - this.id = id; - this.x = x; - this.y = y; - } - - public Node(String id, double x, double y, double vx, double vy) { - this.id = id; - this.x = x; - this.y = y; - this.vx = vx; - this.vy = vy; - } - public String getId() { return id; } @@ -45,61 +26,37 @@ public class Node { this.id = id; } - public double getX() { - return x; + public List getLeadNodeList() { + return leadNodeList; } - public void setX(double x) { - this.x = x; + public void setLeadNodeList(List leadNodeList) { + this.leadNodeList = leadNodeList; } - public double getY() { - return y; + public List getRearNodeList() { + return rearNodeList; } - public void setY(double y) { - this.y = y; - } - - public List getLearModeList() { - return learModeList; - } - - public void setLearModeList(List learModeList) { - this.learModeList = learModeList; - } - - public List getRearModeList() { - return rearModeList; - } - - public void setRearModeList(List rearModeList) { - this.rearModeList = rearModeList; - } - - - public double getVx() { - return vx; - } - - public void setVx(double vx) { - this.vx = vx; - } - - public double getVy() { - return vy; - } - - public void setVy(double vy) { - this.vy = vy; + public void setRearNodeList(List rearNodeList) { + this.rearNodeList = rearNodeList; } @Override - public String toString() { - return "Node{" + - "id='" + id + '\'' + - ", x=" + x + - ", y=" + y + - '}'; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Node node = (Node) o; + return Objects.equals(id, node.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @Override + public int compareTo(Node node) { + return Integer.compare(this.leadNodeList.size(), node.getLeadNodeList().size()); } } diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/vo/IndependentNodeVo.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/vo/IndependentNodeVo.java index c5fabd37..3fae9606 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/vo/IndependentNodeVo.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/mode/vo/IndependentNodeVo.java @@ -1,5 +1,7 @@ package com.actionsoft.apps.coe.method.process.subprocess.mode.vo; +import java.util.List; + /** * @author oYang * @create 2023-05-17 15:13 @@ -8,12 +10,23 @@ public class IndependentNodeVo { private String id; private String name; + private List leadNodeVo; + private List rearNodeVo; + private boolean isBeReference; + private String leadNodeNames; + private String rearNodeNames; public IndependentNodeVo(String id, String name) { this.id = id; this.name = name; } + public IndependentNodeVo(String id, String name, boolean isBeReference) { + this.id = id; + this.name = name; + this.isBeReference = isBeReference; + } + public String getId() { return id; } @@ -29,4 +42,28 @@ public class IndependentNodeVo { public void setName(String name) { this.name = name; } + + public List getLeadNodeVo() { + return leadNodeVo; + } + + public void setLeadNodeVo(List leadNodeVo) { + this.leadNodeVo = leadNodeVo; + } + + public List getRearNodeVo() { + return rearNodeVo; + } + + public void setRearNodeVo(List rearNodeVo) { + this.rearNodeVo = rearNodeVo; + } + + public boolean isBeReference() { + return isBeReference; + } + + public void setBeReference(boolean beReference) { + isBeReference = beReference; + } } diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java index e35d34e3..14fd695a 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/web/SubProcessWeb.java @@ -31,6 +31,7 @@ import com.actionsoft.bpms.util.UtilString; import com.actionsoft.exception.AWSException; import com.actionsoft.i18n.I18nRes; import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.commons.collections4.IteratorUtils; @@ -234,44 +235,32 @@ public class SubProcessWeb extends ActionWeb { * @param processIdJsonArr * @return */ - public List vertexPreHandleIndependentNode(String processIdJsonArr) throws AWSException{ + public JSONObject vertexPreHandleIndependentNode(String processIdJsonArr) throws AWSException{ List processIdList = JSONArray.parseArray(processIdJsonArr, String.class); // 节点预处理 VertexPreHandle vertexPreHandle = new VertexPreHandle(); - return vertexPreHandle.collectIndependentNode(processIdList); + return (JSONObject) JSON.toJSON(vertexPreHandle.collectIndependentNode(processIdList)); } - /** - * 生成图->前置处理 - * 前置流程或后置流程是否在所选的范围内 - * @param uc - * @param processIdJsonArr - * @param excludeProcessIdJsonArr - * @return - */ - public void vertexPreHandle2(String processIdJsonArr, String excludeProcessIdJsonArr){ - - List processIdList = JSONArray.parseArray(processIdJsonArr, String.class); - - List excludeProcessIdList = JSONArray.parseArray(excludeProcessIdJsonArr, String.class); - - } - - public void generatorEndToEndModel(String processIdJsonArr, String locationId, String direction, String modelName) throws AWSException{ + public void generatorEndToEndModel(String processIdJsonArr, String locationId, String direction, String modelName, String excludeProcessIdArr) throws AWSException{ + // 忽略独立的节点 List processIdList = JSONArray.parseArray(processIdJsonArr, String.class); + List excludeProcessIdList = JSONArray.parseArray(excludeProcessIdArr, String.class); + if (excludeProcessIdList != null && excludeProcessIdList.size() > 0) { + processIdList = processIdList.stream().filter(id -> !excludeProcessIdList.contains(id)).collect(Collectors.toList()); + } // 节点预处理 VertexPreHandle vertexPreHandle = new VertexPreHandle(); - Map nodeIndexMap = new HashMap<>(); - List nodeList = vertexPreHandle.includeLearAndRearNode(processIdList, nodeIndexMap); + List nodeList = vertexPreHandle.excludeLearAndRearNode(processIdList, nodeIndexMap); // 构建有向图邻接矩阵 GraphAdjMatrix graphAdjMatrix = new GraphAdjMatrix(nodeList); - graphAdjMatrix.buildAdjMatrix(nodeIndexMap); + graphAdjMatrix.buildAdjMatrix(); graphAdjMatrix.printAdjMatrix(); // 获取节点分布 diff --git a/com.actionsoft.apps.coe.method.process.subprocess/web/com.actionsoft.apps.coe.method.process.subprocess/action.xml b/com.actionsoft.apps.coe.method.process.subprocess/web/com.actionsoft.apps.coe.method.process.subprocess/action.xml index 1444ac1c..5afc1f7f 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/web/com.actionsoft.apps.coe.method.process.subprocess/action.xml +++ b/com.actionsoft.apps.coe.method.process.subprocess/web/com.actionsoft.apps.coe.method.process.subprocess/action.xml @@ -25,5 +25,6 @@ + \ No newline at end of file