From f99c09f33f377b60f415a79bb1b6f83bf164b6a4 Mon Sep 17 00:00:00 2001 From: qinoy Date: Tue, 23 May 2023 16:14:01 +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=BF=9E=E7=BA=BF=E5=A4=84=E7=90=86=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=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 39610 -> 39975 bytes .../process.subprocess/diagram.attribute.xml | 3 +- .../subprocess/constant/SubProcessConst.java | 3 + .../subprocess/graph/GraphLinkerRender.java | 31 +++-- .../process/subprocess/graph/GraphRender.java | 129 +++++++++++++++--- .../process/subprocess/web/SubProcessWeb.java | 21 ++- 6 files changed, 141 insertions(+), 46 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 3b0df0f8fc141d96b5280c7d2d0a54086d21eb96..dfd27c4f056519b5562fb4561aa073960be82b11 100644 GIT binary patch delta 13690 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 HU%CGSH#9ay delta 13314 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 UkEc3{`fL20#|Sr`_^;;w0HYi+vj6}9 diff --git a/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.attribute.xml b/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.attribute.xml index bc9f8255..06aa21e8 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.attribute.xml +++ b/com.actionsoft.apps.coe.method.process.subprocess/method/process.subprocess/diagram.attribute.xml @@ -49,5 +49,6 @@ - + + diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/constant/SubProcessConst.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/constant/SubProcessConst.java index 3dc3e0b8..04c50359 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/constant/SubProcessConst.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/constant/SubProcessConst.java @@ -21,6 +21,9 @@ public interface SubProcessConst { // 后置流程属性key String REAR_PROCESS_ATTR_ID = "rear_process"; + // 形状属性 子流程模型节点 + String CHILD_PROCESS = "child_process"; + // 子流程图形宽度 double SUB_PROCESS_SHAPE_W = 100.0; // 子流程图形高度 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 2e012651..098d24e7 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.UUIDGener; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -31,11 +32,10 @@ public class GraphLinkerRender { } /** - * 渲染连线 - * @param linkerId + * 组装连线 * @return */ - public JSONArray renderLinker(String linkerId){ + public JSONArray toAssembleLinker(){ JSONArray linkers = new JSONArray(); for (int i = 0; i < vertexPosition.length; i++) { double[] fromPoi = vertexPosition[i]; @@ -47,14 +47,16 @@ public class GraphLinkerRender { double[] angleArr = calculationLinkerAngle(fromPoi, toPoi, turnPoi[1], turnPoi[turnPoi.length - 2]); // 构建连线 JSONObject linkerObj = JSONObject.parseObject(LinkerDefConstant.linker); - linkerObj.put("id", linkerId); + linkerObj.put("id", UUIDGener.getObjectId()); // 折点 JSONArray points = new JSONArray(); - for (double[] point : turnPoi) { - JSONObject pointObj = new JSONObject(); - pointObj.put("x", point[0]); - pointObj.put("y", point[1]); - points.add(pointObj); + for (int j = 0; j < turnPoi.length; j++) { + if (j > 0 && j < turnPoi.length - 1){ + JSONObject pointObj = new JSONObject(); + pointObj.put("x", turnPoi[j][0]); + pointObj.put("y", turnPoi[j][1]); + points.add(pointObj); + } } linkerObj.put("points", points); // 起点与终点 @@ -63,11 +65,13 @@ public class GraphLinkerRender { fromObj.put("y", turnPoi[0][1]); fromObj.put("angle", angleArr[0]); fromObj.put("id", nodeList.get(i).getId()); + linkerObj.put("from", fromObj); JSONObject toObj = new JSONObject(); toObj.put("x", turnPoi[turnPoi.length - 1][0]); toObj.put("y", turnPoi[turnPoi.length - 1][1]); toObj.put("angle", angleArr[1]); toObj.put("id", nodeList.get(nodeIndex.intValue()).getId()); + linkerObj.put("to", toObj); linkers.add(linkerObj); } @@ -112,7 +116,8 @@ public class GraphLinkerRender { } /** - * 计算两个坐标之间的折点 + * 横向排布 + * 计算两个坐标之间连线的起点、折点、终点 * @param fromPoi 起始图形节点坐标(左上角) * @param toPoi 终点图形节点坐标(左上角) * @return [0]: 连线起始点坐标、[1]: 连线第一个折点、[2]: 连线第二个折点、[3]: 连线第三个折点(如果存在)、[n]: 最后一个为连线终点 中间都为折点 @@ -129,17 +134,17 @@ public class GraphLinkerRender { double[] endPoint = (fromX < toX) ? new double[]{toX, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2} : new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; - return new double[][]{startPoint, {turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H / 2)},{turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H)}, endPoint}; + return new double[][]{startPoint, {turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H / 2)},{turnPointX, toY + (SubProcessConst.SUB_PROCESS_SHAPE_H / 2)}, endPoint}; }else if (fromX == toX) { // 垂直 double[] startPoint = (fromY < toY) ? new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H} - : new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, fromY}; + : new double[]{fromX + SubProcessConst.SUB_PROCESS_SHAPE_W, fromY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; double turnPointY = (fromY < toY) ? fromY + SubProcessConst.SUB_PROCESS_SHAPE_H + (toY - (fromY + SubProcessConst.SUB_PROCESS_SHAPE_H)) / 2 : toY + SubProcessConst.SUB_PROCESS_SHAPE_H + (fromY - (toY + SubProcessConst.SUB_PROCESS_SHAPE_H)) / 2; double[] endPoint = (fromY < toY) ? new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY} - : new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY + SubProcessConst.SUB_PROCESS_SHAPE_H / 2}; + : new double[]{toX + SubProcessConst.SUB_PROCESS_SHAPE_W / 2, toY}; return new double[][]{startPoint, {fromX + (SubProcessConst.SUB_PROCESS_SHAPE_W / 2), turnPointY},{fromX + (SubProcessConst.SUB_PROCESS_SHAPE_W / 2), turnPointY}, endPoint}; }else { if (fromX < toX && fromY > toY){ // 目标节点在第一象限 diff --git a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphRender.java b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphRender.java index 7d6804b4..3ea9b687 100644 --- a/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphRender.java +++ b/com.actionsoft.apps.coe.method.process.subprocess/src/com/actionsoft/apps/coe/method/process/subprocess/graph/GraphRender.java @@ -2,61 +2,148 @@ package com.actionsoft.apps.coe.method.process.subprocess.graph; import com.actionsoft.apps.coe.method.process.subprocess.constant.SubProcessConst; import com.actionsoft.apps.coe.method.process.subprocess.mode.Node; +import com.actionsoft.apps.coe.pal.pal.method.PALMethodManager; +import com.actionsoft.apps.coe.pal.pal.method.cache.PALMethodCache; +import com.actionsoft.apps.coe.pal.pal.method.model.PALMethodAttributeModel; import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; +import com.actionsoft.apps.coe.pal.pal.repository.designer.CoeDesignerShapeAPIManager; import com.actionsoft.apps.coe.pal.pal.repository.designer.manage.CoeDesignerAPIManager; import com.actionsoft.apps.coe.pal.pal.repository.designer.model.BaseModel; +import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.dao.DesignerShapeRelationDao; +import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapeRelationModel; import com.actionsoft.apps.coe.pal.pal.repository.designer.util.CoeDesignerUtil; import com.actionsoft.apps.coe.pal.pal.repository.designer.util.ShapeUtil; import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.exception.AWSException; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; public class GraphRender { private final List nodeList; - private final double width; // 画布宽度 - private final double height; // 画布高度 - private final double shapeInterval = 80.0; // 图形节点在画布上的间隔 - private final double nodeW = 100.0; // 图形节点默认宽度 - private final double nodeH = 70.0; // 图形节点默认高度 - private final String definition; - private final String modelId; + private PALRepositoryModel repositoryModel; + private BaseModel baseModel; + private Map idMap; - public GraphRender(List nodeList, String modelId, String definition, double width, double height) { + public GraphRender(PALRepositoryModel repositoryModel, List nodeList, double width, double height) { + this.repositoryModel = repositoryModel; this.nodeList = nodeList; - this.width = width; - this.height = height; + this.idMap = new HashMap<>(nodeList.size()); - this.definition = definition; - this.modelId = modelId; - } + this.baseModel = CoeDesignerAPIManager.getInstance().getDefinition(repositoryModel.getId(), 0); + if (this.baseModel == null) this.baseModel = CoeDesignerUtil.createModel(repositoryModel.getId(), 0); + //获取流程定义和排序 + CoeDesignerShapeAPIManager manager = CoeDesignerShapeAPIManager.getInstance(); + JSONObject object = manager.getCoeDefinitionAndSort(this.baseModel.getDefinition(), repositoryModel.getWsId(), SubProcessConst.SUB_PROCESS_METHOD_ID); + //处理流程节点形状的通用配置 + JSONObject obj = manager.getCoeProcessShapeConfig(object.getString("define"), repositoryModel.getWsId(), SubProcessConst.SUB_PROCESS_METHOD_ID, repositoryModel.getId()); - public void handleShapeNodeRender(double[][] position) { - JSONObject defineJsonObj = JSONObject.parseObject(definition); + // 初始画布大小 + JSONObject defineJsonObj = JSONObject.parseObject(obj.getString("define")); JSONObject page = defineJsonObj.getJSONObject("page"); page.put("width", width); page.put("height", height); + + this.baseModel.setDefinition(defineJsonObj.toJSONString()); + CoeDesignerAPIManager.getInstance().storeDefinition(this.baseModel); + } + + + /** + * 节点渲染 + * @param position 节点坐标 + */ + public void handleShapeNodeRender(double[][] position) { + JSONObject defineJsonObj = JSONObject.parseObject(this.baseModel.getDefinition()); JSONObject elements = defineJsonObj.getJSONObject("elements"); for (int i = 0; i < nodeList.size(); i++) { PALRepositoryModel repositoryModel = PALRepositoryCache.getCache().get(nodeList.get(i).getId()); JSONObject subProcessNode = ShapeUtil.getProcessShapeDefinition(SubProcessConst.SUB_PROCESS_METHOD_ID, "子流程"); String nodeId = UUIDGener.getObjectId(); subProcessNode.put("id", nodeId); + // 存储节点 业务ID与画布中ID的映射关系 方便后续连线使用 + idMap.put(nodeList.get(i).getId(), nodeId); JSONObject subProcessNodeProps = subProcessNode.getJSONObject("props"); subProcessNodeProps.put("x", position[i][0]); subProcessNodeProps.put("y", position[i][1]); subProcessNode.put("text", repositoryModel.getName()); + + // 处理子流程模型节点形状属性 + JSONArray dataAttributes = subProcessNode.getJSONArray("dataAttributes"); + for (Object o : dataAttributes) { + JSONObject dataAttr = (JSONObject) o; + if (dataAttr.containsKey("attributesJsonArray")){ + JSONArray attributesJsonArr = dataAttr.getJSONArray("attributesJsonArray"); + List attributes = PALMethodCache.getPALMethodModelById(SubProcessConst.SUB_PROCESS_METHOD_ID).getAttributes(); + Optional optional = attributes.stream().filter(attr -> attr.getKey().equals(SubProcessConst.CHILD_PROCESS)).findFirst(); + if (!optional.isPresent()) + throw new AWSException("端到端总图中子流程节点上需配置子流程标识属性"); + PALMethodAttributeModel attributeModel = optional.get(); + JSONObject data = new JSONObject(); + data.put("isRequired", attributeModel.getIsRequired()); + data.put("ref", attributeModel.getRef()); + data.put("readonly", attributeModel.getReadonly()); + data.put("scope", attributeModel.getScope()); + data.put("name", attributeModel.getNewTitle()); + data.put("id", attributeModel.getKey()); + data.put("type", attributeModel.getType()); + data.put("value", ""); + data.put("groupPath", attributeModel.getGroupPath()); + data.put("key", attributeModel.getKey()); + data.put("desc", attributeModel.getDesc()); + attributesJsonArr.add(data); + } + } + handleShapeAttrChildSubProcess(nodeId, repositoryModel.getName(), nodeList.get(i).getId()); + elements.put(nodeId, subProcessNode); } - defineJsonObj.put("elements",elements); - BaseModel model = CoeDesignerAPIManager.getInstance().getDefinition(modelId, 0); - if (model == null) { - model = CoeDesignerUtil.createModel(modelId, 0); + + this.baseModel.setDefinition(JSONObject.toJSONString(defineJsonObj)); + CoeDesignerAPIManager.getInstance().storeDefinition(this.baseModel); + } + + private void handleShapeAttrChildSubProcess(String shapeId, String shapeText, String relationFileId){ + DesignerShapeRelationDao shapeRelationDao = new DesignerShapeRelationDao(); + DesignerShapeRelationModel relationModel = new DesignerShapeRelationModel(); + relationModel.setId(UUIDGener.getUUID()); + relationModel.setFileId(repositoryModel.getId()); + relationModel.setShapeId(shapeId); + relationModel.setShapeText(shapeText); + relationModel.setAttrId(SubProcessConst.CHILD_PROCESS); + relationModel.setRelationFileId(relationFileId); + shapeRelationDao.insert(relationModel); + } + + /** + * 连线渲染 + * @param linkers 组装好的连线 + */ + public void handShapeLinkerRender(JSONArray linkers){ + JSONObject defineJsonObj = JSONObject.parseObject(this.baseModel.getDefinition()); + JSONObject elements = defineJsonObj.getJSONObject("elements"); + if (linkers != null && linkers.size() > 0){ + for (Object obj : linkers) { + JSONObject linker = (JSONObject) obj; + JSONObject fromObj = linker.getJSONObject("from"); + String fromId = idMap.get(fromObj.getString("id")); + fromObj.put("id", fromId); + JSONObject toObj = linker.getJSONObject("to"); + String toId = idMap.get(toObj.getString("id")); + toObj.put("id", toId); + String linkerId = linker.getString("id"); + elements.put(linkerId, linker); + } + + this.baseModel.setDefinition(defineJsonObj.toJSONString()); + CoeDesignerAPIManager.getInstance().storeDefinition(this.baseModel); } - model.setDefinition(JSONObject.toJSONString(defineJsonObj)); - CoeDesignerAPIManager.getInstance().storeDefinition(model); } } 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 14fd695a..7c2cb026 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 @@ -261,12 +261,16 @@ public class SubProcessWeb extends ActionWeb { // 构建有向图邻接矩阵 GraphAdjMatrix graphAdjMatrix = new GraphAdjMatrix(nodeList); graphAdjMatrix.buildAdjMatrix(); - graphAdjMatrix.printAdjMatrix(); + // graphAdjMatrix.printAdjMatrix(); // 获取节点分布 GraphLayout graphLayout = new GraphLayout(graphAdjMatrix.getAdjMatrix(), nodeList); double[][] position = graphLayout.layOut(); + // 组装连线 + GraphLinkerRender linkerRender = new GraphLinkerRender(nodeList, position, graphAdjMatrix); + JSONArray linkers = linkerRender.toAssembleLinker(); + // 新建模型 PALRepositoryModel parentModel = PALRepositoryCache.getCache().get(locationId); PALRepository coeProcessLevel = CoeProcessLevelDaoFacotory.createCoeProcessLevel(); @@ -280,18 +284,13 @@ public class SubProcessWeb extends ActionWeb { CoeProcessLevelDaoFacotory.createCoeProcessLevel().insert(model); - BaseModel baseModel = CoeDesignerAPIManager.getInstance().getDefinition(model.getId(), 0); - if (baseModel == null) baseModel = CoeDesignerUtil.createModel(model.getId(), 0); - //获取流程定义和排序 - CoeDesignerShapeAPIManager manager = CoeDesignerShapeAPIManager.getInstance(); - JSONObject object = manager.getCoeDefinitionAndSort(baseModel.getDefinition(), parentModel.getWsId(), SubProcessConst.SUB_PROCESS_METHOD_ID); - //处理流程节点形状的通用配置 - JSONObject obj = manager.getCoeProcessShapeConfig(object.getString("define"), parentModel.getWsId(), SubProcessConst.SUB_PROCESS_METHOD_ID, model.getId()); - baseModel.setDefinition(obj.getString("define")); - // 节点渲染 - GraphRender graphRender = new GraphRender(nodeList, model.getId(), baseModel.getDefinition(), graphLayout.getCanvasWidth(), graphLayout.getCanvasHeight()); + GraphRender graphRender = new GraphRender(model, nodeList, graphLayout.getCanvasWidth(), graphLayout.getCanvasHeight()); graphRender.handleShapeNodeRender(position); + + // 连线渲染 + graphRender.handShapeLinkerRender(linkers); + } }