From d563f44d3648ef50aeaf34a08509b6d2b456dce5 Mon Sep 17 00:00:00 2001 From: qinoy Date: Wed, 31 May 2023 15:30:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=AF=E5=88=B0=E7=AB=AF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20=E8=8A=82=E7=82=B9=E5=B1=95=E5=BC=80=E8=BF=9E=E7=BA=BF?= =?UTF-8?q?=E5=A4=84=E7=90=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 49449 -> 50572 bytes .../subprocess/SubProcessController.java | 6 +- .../subprocess/graph/GraphLinkerRender.java | 18 +-- .../graph/GraphNodeExpandHandle.java | 134 ++++++++++-------- .../process/subprocess/web/SubProcessWeb.java | 31 ++-- 5 files changed, 98 insertions(+), 91 deletions(-) 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 b6d36d70ab41a5c54e60567045cff5d5180c48d9..fd4535085f6868789a4c33155d1fdfcc162313ab 100644 GIT binary patch delta 25677 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 NvmY0&w)XGne*w_bI9&h$ 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 ca4a35d2..a776663e 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 @@ -130,9 +130,9 @@ public class SubProcessController { } @Mapping("com.actionsoft.apps.coe.method.process.subprocess.shape_expand") - public String shapeExpand(UserContext uc, String repositoryId, String shapeId){ - - return ResponseObject.newOkResponse("展开成功").toString(); + public String shapeExpand(UserContext uc, String repositoryId, String shapeId, String direction){ + SubProcessWeb processWeb = new SubProcessWeb(uc); + return processWeb.shapeNodeExpand(repositoryId, shapeId, direction); } } 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 index db09bc02..c1e5b7d0 100644 --- 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 @@ -3,6 +3,7 @@ package com.actionsoft.apps.coe.method.process.subprocess.graph; import com.actionsoft.apps.coe.method.process.subprocess.constant.LinkerDefConstant; import com.actionsoft.apps.coe.method.process.subprocess.constant.SubProcessConst; import com.actionsoft.apps.coe.method.process.subprocess.mode.Node; +import com.actionsoft.bpms.util.ConsolePrinter; import com.actionsoft.bpms.util.UUIDGener; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -180,15 +181,6 @@ public class GraphLinkerRender { {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, endPoint }; - }else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 - double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H}; - double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; - return new double[][]{ - startPoint, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - endPoint - }; }else if (fromX < toX && fromY < toY){ // 目标节点在第四象限 double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; if (fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL == toX){ // 相邻节点 存在两个折点 @@ -201,15 +193,17 @@ public class GraphLinkerRender { endPoint }; }else { // 不相邻节点 存在三个折点 - double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY + SubProcessConst.SUB_PROCESS_SHAPE_H}; + double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; return new double[][]{ startPoint, {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY + SubProcessConst.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, endPoint }; } + }else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 横向布局的情况下 应该不会出现目标节点在第三象限的情况 + ConsolePrinter.warn("[端到端功能][总图生成模块]处理连线时目标节点在[横向布局]的情况下出现在了第三象限"); } } return new double[2][2]; diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java index bdb6b085..b44c0f1f 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphNodeExpandHandle.java @@ -8,6 +8,7 @@ import com.actionsoft.apps.coe.pal.pal.repository.designer.model.BaseModel; import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.cache.DesignerShapeRelationCache; import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapeRelationModel; import com.actionsoft.apps.coe.pal.pal.repository.designer.util.ShapeUtil; +import com.actionsoft.bpms.util.ConsolePrinter; import com.actionsoft.bpms.util.UUIDGener; import com.actionsoft.bpms.util.UtilString; import com.actionsoft.exception.AWSException; @@ -15,6 +16,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.concurrent.locks.ReentrantLock; @@ -82,9 +84,32 @@ public class GraphNodeExpandHandle { private void toAssembleScopeLimitationShape() throws AWSException{ JSONObject scopeLimitationShape = ShapeUtil.getProcessShapeDefinition(SubProcessConst.SUB_PROCESS_METHOD_ID, "展开范围标注"); JSONObject childProcessPage = childProcessDefine.getJSONObject("page"); + JSONObject childProcessElements = childProcessDefine.getJSONObject("elements"); + Double childProcessEleMaxX = childProcessElements.keySet() + .stream() + .filter(key -> !"linker".equals(childProcessElements.getJSONObject(key).getString("name"))) + .map(key -> childProcessElements.getJSONObject(key).getJSONObject("props").getDoubleValue("x")) + .max(Comparator.comparing(Double::doubleValue)).get(); + Double childProcessEleMinX = childProcessElements.keySet() + .stream() + .filter(key -> !"linker".equals(childProcessElements.getJSONObject(key).getString("name"))) + .map(key -> childProcessElements.getJSONObject(key).getJSONObject("props").getDoubleValue("x")) + .min(Comparator.comparing(Double::doubleValue)).get(); + Double childProcessEleMaxY = childProcessElements.keySet() + .stream() + .filter(key -> !"linker".equals(childProcessElements.getJSONObject(key).getString("name"))) + .map(key -> childProcessElements.getJSONObject(key).getJSONObject("props").getDoubleValue("y")) + .max(Comparator.comparing(Double::doubleValue)).get(); + Double childProcessEleMinY = childProcessElements.keySet() + .stream() + .filter(key -> !"linker".equals(childProcessElements.getJSONObject(key).getString("name"))) + .map(key -> childProcessElements.getJSONObject(key).getJSONObject("props").getDoubleValue("y")) + .min(Comparator.comparing(Double::doubleValue)).get(); // 当前节点所标识的子流程文件的 画布宽度与高度 减去边距 - double childProcessPageWidth = childProcessPage.getDoubleValue("width") - childProcessPage.getDoubleValue("padding") * 2; - double childProcessPageHeight = childProcessPage.getDoubleValue("height") - childProcessPage.getDoubleValue("padding") * 2; + // double childProcessPageWidth = childProcessPage.getDoubleValue("width") - childProcessPage.getDoubleValue("padding") * 2; + // double childProcessPageHeight = childProcessPage.getDoubleValue("height") - childProcessPage.getDoubleValue("padding") * 2; + double scopeShapeW = childProcessEleMaxX.doubleValue() - childProcessEleMinX + childProcessPage.getDoubleValue("padding") * 2; + double scopeShapeH = childProcessEleMaxY.doubleValue() - childProcessEleMinY + childProcessPage.getDoubleValue("padding") * 2; JSONObject elements = endToEndProcessDefine.getJSONObject("elements"); // 找到当前要展开的子流程节点 @@ -99,8 +124,8 @@ public class GraphNodeExpandHandle { JSONObject scopeShapeProps = scopeLimitationShape.getJSONObject("props"); scopeShapeProps.put("x", x); scopeShapeProps.put("y", y); - scopeShapeProps.put("w", childProcessPageWidth); - scopeShapeProps.put("h", childProcessPageHeight); + scopeShapeProps.put("w", scopeShapeW); + scopeShapeProps.put("h", scopeShapeH); scopeShapeProps.put("zindex", 1); this.scopeLimitationShape = scopeLimitationShape; } @@ -109,8 +134,9 @@ public class GraphNodeExpandHandle { * 节点展开 * @param direction 排布方向 * @throws Exception + * @return 节点展开后的模型存储信息 */ - public void handleNodeExpand(String direction) throws Exception{ + public String handleNodeExpand(String direction) throws Exception{ Thread t1 = new Thread(() -> { // 1、总图节点以及连线处理 @@ -128,11 +154,11 @@ public class GraphNodeExpandHandle { t2.join(); // 6、保存总图模型信息 以及 子流程模型信息备份 - BaseModel baseModel = apiManager.getDefinition(repositoryId, 0); - baseModel.setDefinition(endToEndProcessDefine.toJSONString()); - apiManager.storeDefinition(baseModel); - - apiManager.storeChildProcessDefine(baseModel, relationFileId, childProcessDefine.toJSONString()); + // BaseModel baseModel = apiManager.getDefinition(repositoryId, 0); + // baseModel.setDefinition(endToEndProcessDefine.toJSONString()); + // apiManager.storeDefinition(baseModel); + // apiManager.storeChildProcessDefine(baseModel, relationFileId, childProcessDefine.toJSONString()); + return endToEndProcessDefine.toJSONString(); } /** @@ -555,89 +581,83 @@ class NodeExpandLinkerRender{ private double[][] calculationLinkerPointInHorizLayOut(double[] fromPoi, double[] toPoi, boolean currentExpandNodeIsStart, boolean currentExpandNodeIsEnd) { double fromX = fromPoi[0],fromY = fromPoi[1],toX = toPoi[0],toY = toPoi[1]; + double scopeShapeW = scopeLimitationShape.getDoubleValue("w"), scopeShapeH = scopeLimitationShape.getDoubleValue("h"); if (fromY == toY) { // 水平 方向上 存在从左向右直连的情况 但不存在从右向左直连的情况 水平方向上 从左向右 应是 右出 向上 左折 向下 return fromX < toX ? new double[][] { - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2} + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {toX - SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY + (currentExpandNodeIsEnd ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {toX, toY + (currentExpandNodeIsEnd ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2} } : new double[][] { - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY} + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY} }; }else if (fromX == toX) { // 垂直 // 节点横向分布 连线按照大原则 垂直 不存在 fromY < toY 的情况 也就是不存在 连线从上到下直连的情况 - double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + double[] startPoint = new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + double[] endPoint = new double[]{toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY}; return new double[][]{startPoint, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, endPoint}; }else { if (fromX < toX && fromY > toY){ // 目标节点在第一象限 - double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - double turnPointX = fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2; - if (fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL == toX){ // 相邻节点 存在两个折点 - double[] endPoint = new double[]{toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - return new double[][]{startPoint,{turnPointX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2},{turnPointX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, endPoint}; + double[] startPoint = new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + double turnPointX = fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2; + if (fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL == toX){ // 相邻节点 存在两个折点 + double[] endPoint = new double[]{toX, toY + (currentExpandNodeIsEnd ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + return new double[][]{startPoint,{turnPointX, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2},{turnPointX, toY + (currentExpandNodeIsEnd ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, endPoint}; }else { // 不相邻节点 存在三个折点 - double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + double[] endPoint = new double[]{toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY}; return new double[][]{ startPoint, - {turnPointX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {turnPointX, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, {turnPointX, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, endPoint }; } - }else if (fromX > toX && fromY > toY){ // 目标节点在第二象限 无论节点是否相邻 都按照三个折点走 - double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; + }else if (fromX > toX && fromY > toY) { // 目标节点在第二象限 无论节点是否相邻 都按照三个折点走 + double[] startPoint = new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + double[] endPoint = new double[]{toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY}; return new double[][]{ startPoint, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - endPoint - }; - }else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 - double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H}; - double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; - return new double[][]{ - startPoint, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, endPoint }; }else if (fromX < toX && fromY < toY){ // 目标节点在第四象限 - double[] startPoint = new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - if (fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL == toX){ // 相邻节点 存在两个折点 - double turnPointX = fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2; - double[] endPoint = new double[]{toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + double[] startPoint = new double[]{fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W), fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; + if (fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL == toX){ // 相邻节点 存在两个折点 + double turnPointX = fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2; + double[] endPoint = new double[]{toX, toY + (currentExpandNodeIsEnd ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}; return new double[][]{ startPoint, - {turnPointX, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {turnPointX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, + {turnPointX, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {turnPointX, toY + (currentExpandNodeIsEnd ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, endPoint }; }else { // 不相邻节点 存在三个折点 - double[] endPoint = new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY + SubProcessConst.SUB_PROCESS_SHAPE_H}; + double[] endPoint = new double[]{toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY}; return new double[][]{ startPoint, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}, - {fromX + SubProcessConst.SUB_PROCESS_SHAPE_W + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, - {toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY + SubProcessConst.SUB_PROCESS_SHAPE_H + SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + (currentExpandNodeIsStart ? scopeShapeH : SubProcessConst.SUB_PROCESS_SHAPE_H) / 2}, + {fromX + (currentExpandNodeIsStart ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, + {toX + (currentExpandNodeIsEnd ? scopeShapeW : SubProcessConst.SUB_PROCESS_SHAPE_W) / 2, toY - SubProcessConst.SHAPE_VERT_INTERVAL / 2}, endPoint }; } + }else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 横向布局的情况下 应该不会出现目标节点在第三象限的情况 + ConsolePrinter.warn("[端到端功能][节点展开模块]处理连线时目标节点在[横向布局]的情况下出现在了第三象限"); } } return new double[2][2]; 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 cbc7dbc2..012d1798 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 @@ -303,29 +303,22 @@ public class SubProcessWeb extends ActionWeb { } - public void shapeNodeExpand(String repositoryId, String shapeId, String direction){ - - /* - * 以当前节点展开涉及到动作拆分: - * - * 0、判断当前节点是否展开过了,初次展开的话去源文件中找,否则去备份的文件中找 - * - * 1、准备范围限制框元素,该元素坐标与当前被展开的节点坐标一致,宽度与高度与子流程标识的模型画布-边距的宽度、高度一致 - * 同时,子流程标识的模型内的所有元素 以当前被展开的节点坐标为准,下移、右移 被展开节点坐标距离原点的距离 - * - * 2、找到x大于等于、y大于等于当前被展开节点的所有子流程节点,将这些节点下移、右移到范围框之外 - * - * 3、根据与当前节点的连线,找到总图中所有与当前被展开节点的相连的前置节点与后置节点 - * - * 4、将子流程模型备份一份,为后续对展开后的节点做删除等操作 - * - * */ + /** + * 节点展开操作 + * @param repositoryId 当前总图ID + * @param shapeId 待展开的子流程节点ID + * @param direction 布局方向 + */ + public String shapeNodeExpand(String repositoryId, String shapeId, String direction){ GraphNodeExpandHandle nodeExpandHandle = new GraphNodeExpandHandle(repositoryId, shapeId); try { - nodeExpandHandle.handleNodeExpand(direction); + String define = nodeExpandHandle.handleNodeExpand(direction); + ResponseObject ro = ResponseObject.newOkResponse("展开成功"); + ro.setData(define); + return ro.toString(); } catch (Exception e) { - throw new RuntimeException(e); + return ResponseObject.newErrResponse(e.getMessage()).toString(); } }