diff --git a/com.actionsoft.apps.coe.pal.modelconvert/lib/com.actionsoft.apps.coe.pal.modelconvert.jar b/com.actionsoft.apps.coe.pal.modelconvert/lib/com.actionsoft.apps.coe.pal.modelconvert.jar index c81af08e..dbe3c075 100644 Binary files a/com.actionsoft.apps.coe.pal.modelconvert/lib/com.actionsoft.apps.coe.pal.modelconvert.jar and b/com.actionsoft.apps.coe.pal.modelconvert/lib/com.actionsoft.apps.coe.pal.modelconvert.jar differ diff --git a/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/constant/ShapeConstant.java b/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/constant/ShapeConstant.java index 33ef2901..3d8c8ebe 100644 --- a/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/constant/ShapeConstant.java +++ b/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/constant/ShapeConstant.java @@ -6,4 +6,10 @@ public class ShapeConstant { public static final double DECISION_NODE_WIDTH = 90; // 判定图形的初始高 public static final double DECISION_NODE_HEIGHT = 46; + + // epc转bpmn的图形间隔 + public static final int EPC_TO_BPMN_SHAPE_SPACE = 180; + + public static final String LINKER_FROM_DIRECTION_KEY = "fromDirection"; + public static final String LINKER_TO_DIRECTION_KEY = "toDirection"; } diff --git a/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/strategy/impl/EpcToBPMN.java b/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/strategy/impl/EpcToBPMN.java index 5fc5219f..7f2346bc 100644 --- a/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/strategy/impl/EpcToBPMN.java +++ b/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/strategy/impl/EpcToBPMN.java @@ -5,6 +5,7 @@ import com.actionsoft.apps.coe.pal.modelconvert.cache.ConvertShapeIdMapping; import com.actionsoft.apps.coe.pal.modelconvert.cache.ConvertShapeNameMapping; import com.actionsoft.apps.coe.pal.modelconvert.constant.ConvertType; import com.actionsoft.apps.coe.pal.modelconvert.constant.LinkerDefConstant; +import com.actionsoft.apps.coe.pal.modelconvert.constant.ShapeConstant; import com.actionsoft.apps.coe.pal.modelconvert.dao.HistoryRecordDao; import com.actionsoft.apps.coe.pal.modelconvert.dao.HistoryRecordDetailDao; import com.actionsoft.apps.coe.pal.modelconvert.model.*; @@ -192,636 +193,24 @@ public class EpcToBPMN implements ModelConvertStrategy { JSONObject bpmnElements = new JSONObject(); // 1.1 第一次循环 根据图形匹配规则生成新图形 位置不变 - elements.keySet().stream().forEach(key -> { - JSONObject epcElement = elements.getJSONObject(key); - String shapeName = epcElement.getString("name"); - JSONObject props = epcElement.getJSONObject("props"); - // 处理图形 - if (!"linker".equals(shapeName)){ - // 记录当前EPC图形的中心点坐标 - double shapeCenterPoiX = props.getDoubleValue("x") + (props.getDoubleValue("w") / 2); - double shapeCenterPoiY = props.getDoubleValue("y") + (props.getDoubleValue("h") / 2); - Position epcShapePoi = new Position(shapeCenterPoiX, shapeCenterPoiY); - // 构建BPMN图形的中心点坐标 相当于向右旋转90度的效果 - Position bpmnShapeCenterPoi = new Position(shapeCenterPoiY, epcPageWidth - shapeCenterPoiX); - // 根据映射关系构建转换后的BPMN图形 - JSONObject shapeDefinition = CoeDesignerUtil.getShapeDefinition(targetMethod, ConvertUtil.epcToBPMNShapeMapping(shapeName)); - // 如果为空shapeDefinition可能是需求要求的图形映射关系不包含当前图形 - if (shapeDefinition != null){ - // 计算转后BPMN图形的起始坐标 - JSONObject propsObj = shapeDefinition.getJSONObject("props"); - double w = propsObj.getDoubleValue("w"); - double h = propsObj.getDoubleValue("h"); - double x = bpmnShapeCenterPoi.getX() - w / 2; - double y = bpmnShapeCenterPoi.getY() - h / 2; - propsObj.put("x",x); - propsObj.put("y",y); - int zindex = zIndexMap.get("zindex").intValue(); - zIndexMap.put("zindex",zindex++); - propsObj.put("zindex",zindex++); - propsObj.put("angle",props.getIntValue("angle")); - shapeDefinition.put("props",propsObj); - shapeDefinition.put("text",epcElement.getString("text")); - // 补充图形初始化结构的默认属性 - this.handleDefaultProperty(shapeDefinition); - // 记录下图形ID的映射关系 - String newShapeId = UUIDGener.getObjectId(); - shapeDefinition.put("id",newShapeId); + this.handleShapeConvert(elements,bpmnElements,zIndexMap,epcPageWidth,targetMethod); + // 1.2 根据原本的连线关系处理转换后的图形间距 返回画布最新宽度 + double maxX = this.handleShapeSpace(elements,bpmnElements); - ConvertShapeIdMapping.getInstance().load(ConvertType.EPC_BPMN,key,newShapeId); - - bpmnElements.put(newShapeId,shapeDefinition); - } - } - }); - - // 1.2 第二次循环 根据连线关系生成新的连线 - elements.keySet().stream() - .filter(key -> "linker".equals(elements.getJSONObject(key).getString("name"))) - .filter(key -> { - // 过滤掉既没有图形链接的线 - boolean flag = false; - JSONObject epcLinkerObj = elements.getJSONObject(key); - JSONObject epcLinkerFromObj = epcLinkerObj.getJSONObject("from"); - JSONObject epcLinkerToObj = epcLinkerObj.getJSONObject("to"); - String epcLinkerFromId = epcLinkerFromObj.getString("id"); - String epcLinkerToId = epcLinkerToObj.getString("id"); - if (UtilString.isNotEmpty(epcLinkerFromId) && UtilString.isNotEmpty(epcLinkerToId)){ - flag = true; - } - return flag; - }) - .forEach(key -> { - JSONObject epcLinkerObj = elements.getJSONObject(key); - JSONObject epcLinkerFromObj = epcLinkerObj.getJSONObject("from"); - JSONObject epcLinkerToObj = epcLinkerObj.getJSONObject("to"); - String epcLinkerFromId = epcLinkerFromObj.getString("id"); - Position epcLinkerFromPoi = new Position(epcLinkerFromObj.getDoubleValue("x"),epcLinkerFromObj.getDoubleValue("y")); - String epcLinkerToId = epcLinkerToObj.getString("id"); - Position epcLinkerToPoi = new Position(epcLinkerToObj.getDoubleValue("x"),epcLinkerToObj.getDoubleValue("y")); - JSONObject epcLinkerProps = epcLinkerObj.getJSONObject("props"); - JSONArray epcLinkerPoints = epcLinkerObj.getJSONArray("points"); - // System.out.println("=======>>> " + epcLinkerObj.getString("text")); - Position epcLinkerPoint1 = new Position(((JSONObject)epcLinkerPoints.get(0)).getDoubleValue("x"),((JSONObject)epcLinkerPoints.get(0)).getDoubleValue("y")); - Position epcLinkerPoint2 = null; - if (epcLinkerPoints.size() > 1){ - epcLinkerPoint2 = new Position(((JSONObject)epcLinkerPoints.get(1)).getDoubleValue("x"),((JSONObject)epcLinkerPoints.get(1)).getDoubleValue("y")); - } - - JSONObject bpmnLinkerObj = JSONObject.parseObject(LinkerDefConstant.linker); - String bpmnLinkerDefId = UUIDGener.getObjectId(); - String bpmnShapeFromId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN,epcLinkerFromId); - String bpmnShapeToId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN,epcLinkerToId); - bpmnLinkerObj.put("id",bpmnLinkerDefId); - bpmnLinkerObj.put("text",epcLinkerObj.getString("text")); - - JSONObject bpmnLinkerFromObj = new JSONObject(); - bpmnLinkerFromObj.put("id",bpmnShapeFromId); - JSONObject bpmnLinkerToObj = new JSONObject(); - bpmnLinkerToObj.put("id",bpmnShapeToId); - - JSONObject bpmnShapeFromObj = bpmnElements.getJSONObject(bpmnShapeFromId); - JSONObject bpmnShapeToObj = bpmnElements.getJSONObject(bpmnShapeToId); - - JSONObject bpmnShapeFromProps = bpmnShapeFromObj.getJSONObject("props"); - JSONObject bpmnShapeToProps = bpmnShapeToObj.getJSONObject("props"); - - JSONArray points = new JSONArray(); - if (epcLinkerFromPoi.getX() == epcLinkerToPoi.getX() - && epcLinkerFromPoi.getY() != epcLinkerToPoi.getY() - && epcLinkerPoints.size() == 2 - && epcLinkerPoint1.equals(epcLinkerPoint2)){ // 说明是连线原本是垂直方向的 转换后连线方向应为水平方向 - if (epcLinkerFromPoi.getY() < epcLinkerToPoi.getY()){ // 连线是自上而下的走向 转换后连线方向应为 自左向右 - // 处理from坐标 - bpmnLinkerFromObj.put("x",bpmnShapeFromProps.getDoubleValue("x") + bpmnShapeFromProps.getDoubleValue("w")); - bpmnLinkerFromObj.put("y",bpmnShapeFromProps.getDoubleValue("y") + (bpmnShapeFromProps.getDoubleValue("h") / 2)); - bpmnLinkerFromObj.put("angle",LinkerDefConstant.ANGLE_LEFT); - // 处理to坐标 - bpmnLinkerToObj.put("x",bpmnShapeToProps.getDoubleValue("x")); - bpmnLinkerToObj.put("y",bpmnShapeToProps.getDoubleValue("y") + (bpmnShapeToProps.getDoubleValue("h") / 2)); - bpmnLinkerToObj.put("angle",LinkerDefConstant.ANGLE_RIGHT); - // 直线的话会有两个相同坐标点的折点 坐标点为两个图形的距离的一半 - JSONObject point1 = new JSONObject(); - point1.put("x",bpmnLinkerFromObj.getDoubleValue("x") + ((bpmnLinkerToObj.getDoubleValue("x") - bpmnLinkerFromObj.getDoubleValue("x")) / 2)); - point1.put("y",bpmnLinkerToObj.getDoubleValue("y")); - points.add(point1); - JSONObject point2 = new JSONObject(); - point2.put("x",bpmnLinkerFromObj.getDoubleValue("x") + ((bpmnLinkerToObj.getDoubleValue("x") - bpmnLinkerFromObj.getDoubleValue("x")) / 2)); - point2.put("y",bpmnLinkerToObj.getDoubleValue("y")); - points.add(point2); - }else { // 连线是自下而上的走向 转换后连线方向应为 自右向左 - bpmnLinkerFromObj.put("x",bpmnShapeFromProps.getDoubleValue("x")); - bpmnLinkerFromObj.put("y",bpmnShapeFromProps.getDoubleValue("y") + (bpmnShapeFromProps.getDoubleValue("h") / 2)); - bpmnLinkerFromObj.put("angle",LinkerDefConstant.ANGLE_RIGHT); - bpmnLinkerToObj.put("x",bpmnShapeToProps.getDoubleValue("x") + bpmnShapeToProps.getDoubleValue("x")); - bpmnLinkerToObj.put("y",bpmnShapeToProps.getDoubleValue("y") + bpmnShapeToProps.getDoubleValue("h") / 2); - bpmnLinkerToObj.put("angle",LinkerDefConstant.ANGLE_LEFT); - JSONObject point3 = new JSONObject(); - point3.put("x",bpmnLinkerToObj.getDoubleValue("x") + ((bpmnLinkerFromObj.getDoubleValue("x") - bpmnLinkerToObj.getDoubleValue("x")) / 2)); - point3.put("y",bpmnLinkerToObj.getDoubleValue("y")); - points.add(point3); - JSONObject point4 = new JSONObject(); - point4.put("x",bpmnLinkerToObj.getDoubleValue("x") + ((bpmnLinkerFromObj.getDoubleValue("x") - bpmnLinkerToObj.getDoubleValue("x")) / 2)); - point4.put("y",bpmnLinkerToObj.getDoubleValue("y")); - points.add(point4); - } - }else if (epcLinkerFromPoi.getY() == epcLinkerToPoi.getY() - && epcLinkerFromPoi.getX() != epcLinkerToPoi.getX() - && epcLinkerPoints.size() == 2 - && epcLinkerPoint1.equals(epcLinkerPoint2)){ // 说明连线原本是水平方向的 转换后连线方向应为垂直方向 - if (epcLinkerFromPoi.getX() < epcLinkerToPoi.getX()){ // 连线是自左而右的走向 转换后连线方向应为 自下而上 - // 处理from坐标 - bpmnLinkerFromObj.put("x",bpmnShapeFromProps.getDoubleValue("x") + (bpmnShapeFromProps.getDoubleValue("w") / 2)); - bpmnLinkerFromObj.put("y",bpmnShapeFromProps.getDoubleValue("y")); - bpmnLinkerFromObj.put("angle",LinkerDefConstant.ANGLE_DOWN); - // 处理to坐标 - bpmnLinkerToObj.put("x",bpmnShapeToProps.getDoubleValue("x") + (bpmnShapeToProps.getDoubleValue("w") / 2)); - bpmnLinkerToObj.put("y",bpmnShapeToProps.getDoubleValue("y") + bpmnShapeToProps.getDoubleValue("h")); - bpmnLinkerToObj.put("angle",LinkerDefConstant.ANGLE_UP); - // 直线的话会有两个相同坐标点的折点 坐标点为两个图形的距离的一半 - JSONObject point5 = new JSONObject(); - point5.put("x",bpmnLinkerFromObj.getDoubleValue("x")); - point5.put("y",bpmnLinkerToObj.getDoubleValue("y") + ((bpmnLinkerFromObj.getDoubleValue("y") - bpmnLinkerToObj.getDoubleValue("y")) / 2)); - points.add(point5); - JSONObject point6 = new JSONObject(); - point6.put("x",bpmnLinkerFromObj.getDoubleValue("x")); - point6.put("y",bpmnLinkerToObj.getDoubleValue("y") + ((bpmnLinkerFromObj.getDoubleValue("y") - bpmnLinkerToObj.getDoubleValue("y")) / 2)); - points.add(point6); - }else { // 连线是自右向左的走向 转换后连线方向应为自上而下 - bpmnLinkerFromObj.put("x",bpmnShapeFromProps.getDoubleValue("x") + (bpmnShapeFromProps.getDoubleValue("w") / 2)); - bpmnLinkerFromObj.put("y",bpmnShapeFromProps.getDoubleValue("y") + bpmnShapeFromProps.getDoubleValue("h")); - bpmnLinkerFromObj.put("angle",LinkerDefConstant.ANGLE_UP); - bpmnLinkerToObj.put("x",bpmnShapeToProps.getDoubleValue("x") + (bpmnShapeToProps.getDoubleValue("w") / 2)); - bpmnLinkerToObj.put("y",bpmnShapeToProps.getDoubleValue("y")); - bpmnLinkerToObj.put("angle",LinkerDefConstant.ANGLE_DOWN); - JSONObject point7 = new JSONObject(); - point7.put("x",bpmnLinkerFromObj.getDoubleValue("x")); - point7.put("y",bpmnLinkerFromObj.getDoubleValue("y") + (bpmnLinkerToObj.getDoubleValue("y") - bpmnLinkerFromObj.getDoubleValue("y")) / 2); - points.add(point7); - JSONObject point8 = new JSONObject(); - point8.put("x",bpmnLinkerFromObj.getDoubleValue("x")); - point8.put("y",bpmnLinkerFromObj.getDoubleValue("y") + (bpmnLinkerToObj.getDoubleValue("y") - bpmnLinkerFromObj.getDoubleValue("y")) / 2); - points.add(point8); - } - }else { // 处理带明显折点的连线 - // 判断转换后的连线是在图形的上方还是下方 - if (epcLinkerFromObj.getDoubleValue("x") < epcLinkerPoint1.getX() - && epcLinkerFromObj.getDoubleValue("y") == epcLinkerPoint1.getY()){ // 从图形右侧侧出发 转换后 图形上侧出发 - bpmnLinkerFromObj.put("x",bpmnShapeFromProps.getDoubleValue("x") + (bpmnShapeFromProps.getDoubleValue("w") / 2)); - bpmnLinkerFromObj.put("y",bpmnShapeFromProps.getDoubleValue("y")); - bpmnLinkerFromObj.put("angle",LinkerDefConstant.ANGLE_DOWN); - bpmnLinkerToObj.put("x",bpmnShapeToProps.getDoubleValue("x") + (bpmnShapeToProps.getDoubleValue("w") / 2)); - bpmnLinkerToObj.put("y",bpmnShapeToProps.getDoubleValue("y")); - bpmnLinkerToObj.put("angle",LinkerDefConstant.ANGLE_DOWN); - - JSONObject point9 = new JSONObject(); - point9.put("x",epcLinkerPoint1.getY()); - point9.put("y",epcPageWidth - epcLinkerPoint1.getX()); - points.add(point9); - if (epcLinkerPoints.size() > 1){ - JSONObject point10 = new JSONObject(); - point10.put("x",epcLinkerPoint2.getY()); - point10.put("y",epcPageWidth - epcLinkerPoint2.getX()); - points.add(point10); - } - }else if (epcLinkerFromObj.getDoubleValue("x") > epcLinkerPoint1.getX() - && epcLinkerFromObj.getDoubleValue("y") == epcLinkerPoint1.getY()){ // 从图形左侧出发 转换后 图形下侧出发 - bpmnLinkerFromObj.put("x",bpmnShapeFromProps.getDoubleValue("x") + (bpmnShapeFromProps.getDoubleValue("w") / 2)); - bpmnLinkerFromObj.put("y",bpmnShapeFromProps.getDoubleValue("y") + bpmnShapeFromProps.getDoubleValue("h")); - bpmnLinkerFromObj.put("angle",LinkerDefConstant.ANGLE_UP); - bpmnLinkerToObj.put("x",bpmnShapeToProps.getDoubleValue("x") + (bpmnShapeToProps.getDoubleValue("w") / 2)); - bpmnLinkerToObj.put("y",bpmnShapeToProps.getDoubleValue("y") + bpmnShapeToProps.getDoubleValue("h")); - bpmnLinkerToObj.put("angle",LinkerDefConstant.ANGLE_UP); - - JSONObject point11 = new JSONObject(); - point11.put("x",epcLinkerPoint1.getY()); - point11.put("y",epcPageWidth - epcLinkerPoint1.getX()); - points.add(point11); - if (epcLinkerPoints.size() > 1){ - JSONObject point12 = new JSONObject(); - point12.put("x",epcLinkerPoint2.getY()); - point12.put("y",epcPageWidth - epcLinkerPoint2.getX()); - points.add(point12); - } - }else { - // 垂直方向上 - Map anchorPoiMap = ConvertUtil.getConvertAnchorPoi(elements, bpmnElements, epcLinkerObj); - if (anchorPoiMap.containsKey("from")){ - Position fromPoi = anchorPoiMap.get("from"); - bpmnLinkerFromObj.put("x",fromPoi.getX()); - bpmnLinkerFromObj.put("y",fromPoi.getY()); - } - List positionList = new ArrayList<>(); - positionList.add(new Position(bpmnLinkerFromObj.getDoubleValue("x"),bpmnLinkerFromObj.getDoubleValue("y"))); - for (Object o : epcLinkerPoints) { - JSONObject point = (JSONObject)o; - Position tempPoi = new Position(point.getDoubleValue("y"),epcPageWidth - point.getDoubleValue("x")); - positionList.add(tempPoi); - JSONObject tempPoint = new JSONObject(); - tempPoint.put("x",tempPoi.getX()); - tempPoint.put("y",tempPoi.getY()); - points.add(tempPoint); - } - if (anchorPoiMap.containsKey("to")){ - Position toPoi = anchorPoiMap.get("to"); - bpmnLinkerToObj.put("x",toPoi.getX()); - bpmnLinkerToObj.put("y",toPoi.getY()); - } - positionList.add(new Position(bpmnLinkerToObj.getDoubleValue("x"),bpmnLinkerToObj.getDoubleValue("y"))); - bpmnLinkerToObj.put("angle",ConvertUtil.getLinkerAngle(positionList,"to")); - bpmnLinkerFromObj.put("angle",ConvertUtil.getLinkerAngle(positionList,"from")); - } - } - JSONObject bpmnLinkerProps = new JSONObject(); - int zindex = zIndexMap.get("zindex").intValue(); - zIndexMap.put("zindex",zindex++); - bpmnLinkerProps.put("zindex",zindex++); - bpmnLinkerObj.put("props",bpmnLinkerProps); - bpmnLinkerObj.put("points",points); - bpmnLinkerObj.put("from",bpmnLinkerFromObj); - bpmnLinkerObj.put("to",bpmnLinkerToObj); - ConvertShapeIdMapping.getInstance().load(ConvertType.EPC_BPMN,key,bpmnLinkerDefId); - bpmnElements.put(bpmnLinkerDefId,bpmnLinkerObj); - }); - - // 1.3 增加开始 结束节点 - Map shapeYCountMap = new HashMap<>(); - List shapeYSet = new ArrayList<>(); - List shapeXSet = new ArrayList<>(); - bpmnElements.keySet().stream() - .filter(key -> !"linker".equals(bpmnElements.getJSONObject(key).getString("name"))) - .forEach(key -> { - JSONObject shapeProps = bpmnElements.getJSONObject(key).getJSONObject("props"); - Position shapePoi = new Position(shapeProps.getDoubleValue("x") + (shapeProps.getDoubleValue("w") / 2),shapeProps.getDoubleValue("y") + (shapeProps.getDoubleValue("h") / 2)); - shapeYSet.add(shapePoi.getY()); - shapeXSet.add(shapePoi.getX()); - }); - shapeYSet.stream().forEach(y -> { - if (shapeYCountMap.containsKey(y)){ - int value = shapeYCountMap.get(y).intValue() + 1; - shapeYCountMap.put(y,value); - }else { - shapeYCountMap.put(y,1); - } - }); - // 找到出现最多的中心点y值 一般来讲就是在整个水平的中轴线上 - double y = shapeYCountMap.entrySet().stream().sorted(new Comparator>() { - @Override - public int compare(Map.Entry o1, Map.Entry o2) { - return o2.getValue().intValue() - o1.getValue().intValue(); - } - }).map(entry -> entry.getKey()).findFirst().get(); - // 增加开始节点 - JSONObject startEventShapeDefinition = CoeDesignerUtil.getShapeDefinition(targetMethod, "startEvent"); - String startEventId = UUIDGener.getObjectId(); - startEventShapeDefinition.put("id",startEventId); - double startShapeX = 60.0 + epcPagePadding; - JSONObject startEventProps = startEventShapeDefinition.getJSONObject("props"); - double startShapeH = startEventProps.getDoubleValue("h"); - startEventProps.put("x",startShapeX); - startEventProps.put("y",y - (startShapeH / 2)); - startEventProps.put("angle","0"); - int zindex = zIndexMap.get("zindex").intValue(); - zIndexMap.put("zindex",zindex++); - startEventProps.put("zindex",zindex++); - startEventShapeDefinition.put("props",startEventProps); - this.handleDefaultProperty(startEventShapeDefinition); - bpmnElements.put(startEventId,startEventShapeDefinition); - // 增加结束节点 - Double endShapeX = shapeXSet.stream().max(Comparator.comparingDouble(Double::doubleValue)).get(); - JSONObject endEventShapeDefinition = CoeDesignerUtil.getShapeDefinition(targetMethod, "endEvent"); - String endEventId = UUIDGener.getObjectId(); - endEventShapeDefinition.put("id",endEventId); - JSONObject endEventProps = endEventShapeDefinition.getJSONObject("props"); - endEventProps.put("x",endShapeX + (endEventProps.getDoubleValue("w") / 2) + 100); - endEventProps.put("y",y - (startShapeH / 2)); - endEventProps.put("angle","0"); - int endZIndex = zIndexMap.get("zindex").intValue(); - zIndexMap.put("zindex",endZIndex++); - endEventProps.put("zindex",endZIndex++); - endEventShapeDefinition.put("props",endEventProps); - this.handleDefaultProperty(endEventShapeDefinition); - bpmnElements.put(endEventId,endEventShapeDefinition); + // 1.3 第二次循环 根据连线关系生成新的连线 + this.handleGenerateShapeLinker(elements,bpmnElements,zIndexMap,epcPageWidth); + // 1.4 增加开始 结束节点 // 存储事件节点 Map eventNodeMap = new HashMap<>(); Map>> linkerAdapterMap = new HashMap<>(); - - String eventMappingName = ConvertUtil.epcToBPMNShapeMapping("event"); - String annotation = ConvertUtil.epcToBPMNShapeMapping("procedure"); List annotationIds = new ArrayList<>(); - // Map eventShapeCenterPoiMap = new HashMap<>(); - List eventNodeList = new ArrayList<>(); - for (String key : bpmnElements.keySet()) { - JSONObject element = bpmnElements.getJSONObject(key); - String eleName = element.getString("name"); - if (annotation.equals(eleName)) annotationIds.add(element.getString("id")); - if (!eventMappingName.equals(eleName)) continue; - JSONObject props = element.getJSONObject("props"); - EventNode eventNode = new EventNode(key, props.getDoubleValue("x"), props.getDoubleValue("y"), props.getDoubleValue("w"), props.getDoubleValue("h")); - eventNodeList.add(eventNode); - - eventNodeMap.put(key,eventNode); - } - eventNodeList = eventNodeList.stream().sorted(new Comparator() { - @Override - public int compare(EventNode o1, EventNode o2) { - return (int) o1.getX() - (int)o2.getX(); - } - }).collect(Collectors.toList()); - // 1.4 开始节点/结束节点 与 开始事件/结束事件连线 - JSONObject startEventLinker = JSONObject.parseObject(LinkerDefConstant.linker); - String startEventLinkerId = UUIDGener.getObjectId(); - startEventLinker.put("id",startEventLinkerId); - JSONObject startEventLinkerFrom = new JSONObject(); - startEventLinkerFrom.put("id",startEventShapeDefinition.getString("id")); - startEventLinkerFrom.put("x",startEventProps.getDoubleValue("x") + startEventProps.getDoubleValue("w")); - startEventLinkerFrom.put("y",startEventProps.getDoubleValue("y") + (startEventProps.getDoubleValue("h") / 2)); - startEventLinkerFrom.put("angle",LinkerDefConstant.ANGLE_LEFT); - JSONObject startEventLinkerTo = new JSONObject(); - // 与产品沟通 转换前一定会有开始事件/结束事件 且在最两边 - EventNode startEpcEventNode = eventNodeList.get(0); - startEventLinkerTo.put("id",startEpcEventNode.getId()); - - int startEventLinkerZIndex = zIndexMap.get("zindex").intValue(); - JSONObject startEventLinkerProps = new JSONObject(); - zIndexMap.put("zindex",startEventLinkerZIndex++); - startEventLinkerProps.put("zindex",startEventLinkerZIndex++); - startEventLinker.put("props",startEventLinkerProps); - startEventLinker.put("from",startEventLinkerFrom); - - JSONArray startLinkerPoints = new JSONArray(); - if (startEventLinkerFrom.getDoubleValue("y") > startEventLinkerTo.getDoubleValue("y")){ - startEventLinkerTo.put("angle",LinkerDefConstant.ANGLE_UP); - startEventLinkerTo.put("x",startEpcEventNode.getX() + (startEpcEventNode.getWidth() / 2)); - startEventLinkerTo.put("y",startEpcEventNode.getY() + startEpcEventNode.getHeight()); - JSONObject point = new JSONObject(); - point.put("x",startEventLinkerTo.getDoubleValue("x")); - point.put("y",startEventLinkerFrom.getDoubleValue("y")); - startLinkerPoints.add(point); - }else if (startEventLinkerFrom.getDoubleValue("y") < startEventLinkerTo.getDoubleValue("y")){ - startEventLinkerTo.put("angle",LinkerDefConstant.ANGLE_DOWN); - startEventLinkerTo.put("x",startEpcEventNode.getX() + (startEpcEventNode.getWidth() / 2)); - startEventLinkerTo.put("y",startEpcEventNode.getY()); - JSONObject point = new JSONObject(); - point.put("x",startEventLinkerTo.getDoubleValue("x")); - point.put("y",startEventLinkerFrom.getDoubleValue("y")); - startLinkerPoints.add(point); - }else if (startEventLinkerFrom.getDoubleValue("y") == startEventLinkerTo.getDoubleValue("y")){ - startEventLinkerTo.put("angle",LinkerDefConstant.ANGLE_RIGHT); - startEventLinkerTo.put("x",startEpcEventNode.getX()); - startEventLinkerTo.put("y",startEpcEventNode.getY() + (startEpcEventNode.getWidth() / 2)); - JSONObject p1 = new JSONObject(); - p1.put("x",(startEventLinkerTo.getDoubleValue("x") - startEventLinkerFrom.getDoubleValue("x")) / 2); - p1.put("y",startEventLinkerFrom.getDoubleValue("y")); - startLinkerPoints.add(p1); - JSONObject p2 = new JSONObject(); - p2.put("x",(startEventLinkerTo.getDoubleValue("x") - startEventLinkerFrom.getDoubleValue("x")) / 2); - p2.put("y",startEventLinkerFrom.getDoubleValue("y")); - startLinkerPoints.add(p2); - } - startEventLinker.put("points",startLinkerPoints); - startEventLinker.put("to",startEventLinkerTo); - bpmnElements.put(startEventLinkerId,startEventLinker); - - JSONObject endEventLinker = JSONObject.parseObject(LinkerDefConstant.linker); - String endEventLinkerId = UUIDGener.getObjectId(); - endEventLinker.put("id",endEventLinkerId); - JSONObject endEventLinkerFrom = new JSONObject(); - EventNode endEpcEventNode = eventNodeList.get(eventNodeList.size() - 1); - endEventLinkerFrom.put("id",endEpcEventNode.getId()); - endEventLinkerFrom.put("x",endEpcEventNode.getCenterShapePosi().getX() + (endEpcEventNode.getWidth() / 2)); - endEventLinkerFrom.put("y",endEpcEventNode.getCenterShapePosi().getY()); - endEventLinkerFrom.put("angle",LinkerDefConstant.ANGLE_LEFT); - JSONObject endEventLinkerTo = new JSONObject(); - endEventLinkerTo.put("id",endEventShapeDefinition.getString("id")); - endEventLinkerTo.put("x",endEventProps.getDoubleValue("x")); - endEventLinkerTo.put("y",endEventProps.getDoubleValue("y") + (endEventProps.getDoubleValue("h") / 2)); - endEventLinker.put("angle",LinkerDefConstant.ANGLE_RIGHT); - int endEventLinkerZIndex = zIndexMap.get("zindex").intValue(); - JSONObject endEventLinkerProps = new JSONObject(); - zIndexMap.put("zindex",endEventLinkerZIndex++); - endEventLinkerProps.put("zindex",endEventLinkerZIndex++); - endEventLinker.put("props",endEventLinkerProps); - endEventLinker.put("from",endEventLinkerFrom); - endEventLinker.put("to",endEventLinkerTo); - bpmnElements.put(endEventLinkerId,endEventLinker); + this.handleStartAndEndNode(bpmnElements,zIndexMap,targetMethod,epcPagePadding,eventNodeMap,annotationIds); // 1.5 处理事件节点 图形变为线 Set toBeDeletes = new HashSet<>(); - eventNodeMap.keySet().stream().forEach(key -> { - EventNode eventNode = eventNodeMap.get(key); - bpmnElements.keySet().stream() - .filter(k -> "linker".equals(bpmnElements.getJSONObject(k).getString("name"))) - .forEach(k -> { - JSONObject linkerObj = bpmnElements.getJSONObject(k); - JSONObject fromObj = linkerObj.getJSONObject("from"); - JSONObject toObj = linkerObj.getJSONObject("to"); - JSONArray points = linkerObj.getJSONArray("points"); - // 找到从【事件】出去的线 进而找出【事件线】的to - if (eventNode.getId().equals(fromObj.getString("id"))){ - String toId = toObj.getString("id"); - if (!linkerAdapterMap.containsKey(key)){ - Map> map = new HashMap<>(); - List linkerAdapters = new ArrayList<>(); - map.put("to",linkerAdapters); - linkerAdapterMap.put(key,map); - } - Map> map = linkerAdapterMap.get(key); - if (!map.containsKey("to")){ - List linkerAdapters = new ArrayList<>(); - map.put("to",linkerAdapters); - } - List linkerAdapterList = map.get("to"); - Position position = new Position(toObj.getDoubleValue("x"),toObj.getDoubleValue("y")); - List pointList = new ArrayList<>(); - points.stream().forEach(item -> { - JSONObject point = (JSONObject) item; - Position poi = new Position(point.getDoubleValue("x"),point.getDoubleValue("y")); - pointList.add(poi); - }); - Position linkPoint = new Position(fromObj.getDoubleValue("x"),fromObj.getDoubleValue("y")); - LinkerAdapter linkerAdapter = new LinkerAdapter(toId,"to",position,pointList,linkPoint); - linkerAdapterList.add(linkerAdapter); - // 记录下待删除的连线的key - toBeDeletes.add(k); - }else if (eventNode.getId().equals(toObj.getString("id"))){ // 找到指向【事件】的线 进而找出【事件线】的from - String fromId = fromObj.getString("id"); - if (!linkerAdapterMap.containsKey(key)){ - Map> map = new HashMap<>(); - List linkerAdapters = new ArrayList<>(); - map.put("from",linkerAdapters); - linkerAdapterMap.put(key,map); - } - Map> map = linkerAdapterMap.get(key); - if (!map.containsKey("from")){ - List linkerAdapters = new ArrayList<>(); - map.put("from",linkerAdapters); - } - List linkerAdapterList = map.get("from"); - Position position = new Position(fromObj.getDoubleValue("x"),fromObj.getDoubleValue("y")); - List pointList = new ArrayList<>(); - points.stream().forEach(item -> { - JSONObject point = (JSONObject) item; - Position poi = new Position(point.getDoubleValue("x"),point.getDoubleValue("y")); - pointList.add(poi); - }); - Position linkPoint = new Position(toObj.getDoubleValue("x"),toObj.getDoubleValue("y")); - LinkerAdapter linkerAdapter = new LinkerAdapter(fromId,"from",position,pointList,linkPoint); - linkerAdapterList.add(linkerAdapter); - // 记录下待删除的连线的key - toBeDeletes.add(k); - } - }); - // 记录下待删除图形的key - toBeDeletes.add(key); - }); - - // 根据封装的LinkerAdapter生成新的linker 生成事件线 - for (String key : linkerAdapterMap.keySet()) { - EventNode eventNode = eventNodeMap.get(key); - String text = UtilString.isEmpty(bpmnElements.getJSONObject(eventNode.getId()).getString("text")) ? "事件" : bpmnElements.getJSONObject(eventNode.getId()).getString("text"); - Position centerShapePosi = eventNode.getCenterShapePosi(); - Map> listMap = linkerAdapterMap.get(key); - List fromLinkerList = listMap.get("from"); - List toLinkerList = listMap.get("to"); - if (!listMap.containsKey("from") || !listMap.containsKey("to")) { // 只有指出或者接收的线 - if (listMap.containsKey("to")){ // 没有指向event的线 - toLinkerList.stream().forEach(linkerAdapter -> { - Position toLinkerPosi = linkerAdapter.getPosition(); - JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); - String linkDefId = UUIDGener.getObjectId(); - linkerDef.put("id",linkDefId); - linkerDef.put("text",text); - linkerDef.put("points", ConvertUtil.getLinkerPoints(linkerAdapter.getPoints())); - JSONObject from = linkerDef.getJSONObject("from"); - from.put("x",centerShapePosi.getX()); - from.put("y",centerShapePosi.getY()); - linkerDef.put("from",from); - JSONObject to = linkerDef.getJSONObject("to"); - to.put("x",toLinkerPosi.getX()); - to.put("y",toLinkerPosi.getY()); - List positionList = new ArrayList<>(); - positionList.add(centerShapePosi); - if (linkerAdapter.getPoints().size() > 0) positionList.addAll(linkerAdapter.getPoints()); - positionList.add(toLinkerPosi); - to.put("angle",ConvertUtil.getLinkerAngle(positionList,"to")); - to.put("id",linkerAdapter.getId()); - linkerDef.put("to",to); - bpmnElements.put(linkDefId,linkerDef); - }); - }else if (listMap.containsKey("from")){ // 没有从event出发的线 - fromLinkerList.stream().forEach(linkerAdapter -> { - Position fromLinkPosi = linkerAdapter.getPosition(); - JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); - String linkDefId = UUIDGener.getObjectId(); - linkerDef.put("id",linkDefId); - linkerDef.put("text",text); - linkerDef.put("points",ConvertUtil.getLinkerPoints(linkerAdapter.getPoints())); - JSONObject from = linkerDef.getJSONObject("from"); - from.put("x",fromLinkPosi.getX()); - from.put("y",fromLinkPosi.getY()); - from.put("id",linkerAdapter.getId()); - List positionList = new ArrayList<>(); - positionList.add(fromLinkPosi); - if (linkerAdapter.getPoints().size() > 0) positionList.addAll(linkerAdapter.getPoints()); - positionList.add(centerShapePosi); - from.put("angle",ConvertUtil.getLinkerAngle(positionList,"from")); - linkerDef.put("from",from); - JSONObject to = linkerDef.getJSONObject("to"); - to.put("x",centerShapePosi.getX()); - to.put("y",centerShapePosi.getY()); - linkerDef.put("to",to); - bpmnElements.put(linkDefId,linkerDef); - }); - } - }else if (listMap.containsKey("from") && listMap.containsKey("to")){ - if (fromLinkerList.size() == 1 && toLinkerList.size() == 1){ - LinkerAdapter fromLinkerAdapter = fromLinkerList.get(0); - LinkerAdapter toLinkerAdapter = toLinkerList.get(0); - JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); - String linkDefId = UUIDGener.getObjectId(); - linkerDef.put("id",linkDefId); - linkerDef.put("text",text); - if (annotationIds.contains(fromLinkerAdapter.getId())){ - JSONObject lineStyle = linkerDef.getJSONObject("lineStyle"); - lineStyle.put("lineStyle","dashed"); - lineStyle.put("endArrowStyle","none"); - linkerDef.put("lineStyle",lineStyle); - } - List pointList = new ArrayList<>(); - if (fromLinkerAdapter.getPoints().size() > 0) pointList.addAll(fromLinkerAdapter.getPoints()); - // 判断当前事件节点是否要作为一个折点 - Position fromLinkPoint = fromLinkerAdapter.getLinkPoint(); - Position toLinkPoint = toLinkerAdapter.getLinkPoint(); - if (fromLinkPoint.getX() != toLinkPoint.getX() && fromLinkPoint.getY() != toLinkPoint.getY()){ - pointList.add(centerShapePosi); - } - if (toLinkerAdapter.getPoints().size() > 0) pointList.addAll(toLinkerAdapter.getPoints()); - linkerDef.put("points",ConvertUtil.getLinkerPoints(pointList)); - List allPosition = new ArrayList<>(); - allPosition.add(fromLinkerAdapter.getPosition()); - if (pointList.size() > 0) allPosition.addAll(pointList); - allPosition.add(toLinkerAdapter.getPosition()); - JSONObject from = linkerDef.getJSONObject("from"); - from.put("id",fromLinkerAdapter.getId()); - from.put("x",fromLinkerAdapter.getPosition().getX()); - from.put("y",fromLinkerAdapter.getPosition().getY()); - from.put("angle",ConvertUtil.getLinkerAngle(allPosition,"from")); - linkerDef.put("from",from); - JSONObject to = linkerDef.getJSONObject("to"); - to.put("id",toLinkerAdapter.getId()); - to.put("x",toLinkerAdapter.getPosition().getX()); - to.put("y",toLinkerAdapter.getPosition().getY()); - to.put("angle",ConvertUtil.getLinkerAngle(allPosition,"to")); - linkerDef.put("to",to); - bpmnElements.put(linkDefId,linkerDef); - }else if (fromLinkerList.size() > toLinkerList.size()){ - LinkerAdapter toLinkerAdapter = toLinkerList.get(0); - for (LinkerAdapter fromLinkerAdapter : fromLinkerList) { - JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); - String linkDefId = UUIDGener.getObjectId(); - linkerDef.put("id",linkDefId); - linkerDef.put("text",text); - // System.out.println("========>>>> " + annotationIds + " " + fromLinkerAdapter.getId()); - if (annotationIds.contains(fromLinkerAdapter.getId())){ - JSONObject lineStyle = linkerDef.getJSONObject("lineStyle"); - lineStyle.put("lineStyle","dashed"); - lineStyle.put("endArrowStyle","none"); - linkerDef.put("lineStyle",lineStyle); - } - List pointList = new ArrayList<>(); - if (fromLinkerAdapter.getPoints().size() > 0) pointList.addAll(fromLinkerAdapter.getPoints()); - // 判断当前事件节点是否要作为一个折点 - Position fromLinkPoint = fromLinkerAdapter.getLinkPoint(); - Position toLinkPoint = toLinkerAdapter.getLinkPoint(); - if (fromLinkPoint.getX() != toLinkPoint.getX() && fromLinkPoint.getY() != toLinkPoint.getY()){ - pointList.add(centerShapePosi); - } - if (toLinkerAdapter.getPoints().size() > 0) pointList.addAll(toLinkerAdapter.getPoints()); - linkerDef.put("points",ConvertUtil.getLinkerPoints(pointList)); - List allPosition = new ArrayList<>(); - allPosition.add(fromLinkerAdapter.getPosition()); - if (pointList.size() > 0) allPosition.addAll(pointList); - allPosition.add(toLinkerAdapter.getPosition()); - JSONObject from = linkerDef.getJSONObject("from"); - from.put("id",fromLinkerAdapter.getId()); - from.put("x",fromLinkerAdapter.getPosition().getX()); - from.put("y",fromLinkerAdapter.getPosition().getY()); - from.put("angle",ConvertUtil.getLinkerAngle(allPosition,"from")); - linkerDef.put("from",from); - JSONObject to = linkerDef.getJSONObject("to"); - to.put("id",toLinkerAdapter.getId()); - to.put("x",toLinkerAdapter.getPosition().getX()); - to.put("y",toLinkerAdapter.getPosition().getY()); - to.put("angle",ConvertUtil.getLinkerAngle(allPosition,"to")); - linkerDef.put("to",to); - bpmnElements.put(linkDefId,linkerDef); - } - } - } - } + this.handleEventNodeLinker(eventNodeMap,bpmnElements,linkerAdapterMap,toBeDeletes,annotationIds); // 1.6 删除待删除的节点 toBeDeletes.stream().forEach(key -> { @@ -839,7 +228,7 @@ public class EpcToBPMN implements ModelConvertStrategy { JSONObject bpmnDefineObj = JSONObject.parseObject(bpmnDefinition); bpmnDefineObj.put("elements",bpmnElements); JSONObject bpmnPage = bpmnDefineObj.getJSONObject("page"); - bpmnPage.put("width",epcPageHeight); + bpmnPage.put("width",maxX + 500); bpmnPage.put("height",epcPageWidth); bpmnDefineObj.put("page",bpmnPage); @@ -1124,4 +513,623 @@ public class EpcToBPMN implements ModelConvertStrategy { shapeDefinition.put("resizeable","1"); } } + + // 处理图形转换 + private void handleShapeConvert(JSONObject elements,JSONObject bpmnElements,Map zIndexMap,int epcPageWidth,String targetMethod){ + elements.keySet().stream().forEach(key -> { + JSONObject epcElement = elements.getJSONObject(key); + String shapeName = epcElement.getString("name"); + JSONObject props = epcElement.getJSONObject("props"); + // 处理图形 + if (!"linker".equals(shapeName)){ + // 记录当前EPC图形的中心点坐标 + double shapeCenterPoiX = props.getDoubleValue("x") + (props.getDoubleValue("w") / 2); + double shapeCenterPoiY = props.getDoubleValue("y") + (props.getDoubleValue("h") / 2); + Position epcShapePoi = new Position(shapeCenterPoiX, shapeCenterPoiY); + // 构建BPMN图形的中心点坐标 相当于向右旋转90度的效果 + Position bpmnShapeCenterPoi = new Position(shapeCenterPoiY, epcPageWidth - shapeCenterPoiX); + // 根据映射关系构建转换后的BPMN图形 + JSONObject shapeDefinition = CoeDesignerUtil.getShapeDefinition(targetMethod, ConvertUtil.epcToBPMNShapeMapping(shapeName)); + // 如果为空shapeDefinition可能是需求要求的图形映射关系不包含当前图形 + if (shapeDefinition != null){ + // 计算转后BPMN图形的起始坐标 + JSONObject propsObj = shapeDefinition.getJSONObject("props"); + double w = propsObj.getDoubleValue("w"); + double h = propsObj.getDoubleValue("h"); + double x = bpmnShapeCenterPoi.getX() - w / 2; + double y = bpmnShapeCenterPoi.getY() - h / 2; + propsObj.put("x",x); + propsObj.put("y",y); + int zindex = zIndexMap.get("zindex").intValue(); + zIndexMap.put("zindex",zindex++); + propsObj.put("zindex",zindex++); + propsObj.put("angle",props.getIntValue("angle")); + shapeDefinition.put("props",propsObj); + shapeDefinition.put("text",epcElement.getString("text")); + // 补充图形初始化结构的默认属性 + this.handleDefaultProperty(shapeDefinition); + // 记录下图形ID的映射关系 + String newShapeId = UUIDGener.getObjectId(); + shapeDefinition.put("id",newShapeId); + + ConvertShapeIdMapping.getInstance().load(ConvertType.EPC_BPMN,key,newShapeId); + + bpmnElements.put(newShapeId,shapeDefinition); + } + } + }); + } + + // 处理转换后的图形间距 + private double handleShapeSpace(JSONObject elements,JSONObject bpmnElements){ + double maxX = 0.0; + List linkerList = new ArrayList<>(); + for (String key : elements.keySet()) { + JSONObject element = elements.getJSONObject(key); + if (!"linker".equals(element.getString("name"))){ + continue; + } + JSONObject epcLinkerFromObj = element.getJSONObject("from"); + JSONObject epcLinkerToObj = element.getJSONObject("to"); + String epcLinkerFromId = epcLinkerFromObj.getString("id"); + String epcLinkerToId = epcLinkerToObj.getString("id"); + if (UtilString.isEmpty(epcLinkerFromId) && UtilString.isEmpty(epcLinkerToId)){ + continue; + } + // 转换前水平线过滤掉 + if (epcLinkerFromObj.getDoubleValue("y") == epcLinkerToObj.getDoubleValue("y")){ + continue; + } + linkerList.add(element); + } + linkerList = linkerList.stream().sorted(new Comparator() { + @Override + public int compare(JSONObject o1, JSONObject o2) { + JSONObject props1 = o1.getJSONObject("from"); + JSONObject props2 = o2.getJSONObject("from"); + if (props1.getDoubleValue("y") < props2.getDoubleValue("y")){ + return -1; + }else if (props1.getDoubleValue("y") > props2.getDoubleValue("y")){ + return 1; + }else { + return 0; + } + } + }).collect(Collectors.toList()); + + + List fromShapeId = new ArrayList<>(); + List toShapeId = new ArrayList<>(); + linkerList.stream().forEach(linkerObj -> { + JSONObject epcLinkerFromObj = linkerObj.getJSONObject("from"); + JSONObject epcLinkerToObj = linkerObj.getJSONObject("to"); + String epcLinkerFromId = epcLinkerFromObj.getString("id"); + String epcLinkerToId = epcLinkerToObj.getString("id"); + String bpmnFromShapeId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN, epcLinkerFromId); + String bpmnToShapeId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN, epcLinkerToId); + JSONObject bpmnFromShapeObj = bpmnElements.getJSONObject(bpmnFromShapeId); + JSONObject bpmnFromShapeProps = bpmnFromShapeObj.getJSONObject("props"); + JSONObject bpmnToShapeObj = bpmnElements.getJSONObject(bpmnToShapeId); + JSONObject bpmnToShapeProps = bpmnToShapeObj.getJSONObject("props"); + + Position bpmnFromShapeCenterPoi = new Position(bpmnFromShapeProps.getDoubleValue("x") + (bpmnFromShapeProps.getDoubleValue("w") / 2),bpmnFromShapeProps.getDoubleValue("y") + (bpmnFromShapeProps.getDoubleValue("h") / 2)); + Position bpmnToShapeCenterPoi = new Position(bpmnToShapeProps.getDoubleValue("x") + (bpmnToShapeProps.getDoubleValue("w") / 2),bpmnToShapeProps.getDoubleValue("y") + (bpmnToShapeProps.getDoubleValue("h") / 2)); + + if (bpmnToShapeCenterPoi.getX() < bpmnFromShapeCenterPoi.getX()){ + toShapeId.add(bpmnToShapeId); + } + }); + + // 根据排序后的连线处理图形间距 因为连线已经排序完毕 + // 所以正常来讲 都是被指向的图形向右移动 每个被指向的图形仅移动一次 + // 如果被指向的图形已经移动过 则考虑指向图形是否需要移动 + + for (JSONObject linker : linkerList) { + JSONObject epcLinkerFromObj = linker.getJSONObject("from"); + JSONObject epcLinkerToObj = linker.getJSONObject("to"); + String epcLinkerFromId = epcLinkerFromObj.getString("id"); + String epcLinkerToId = epcLinkerToObj.getString("id"); + String bpmnFromShapeId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN, epcLinkerFromId); + String bpmnToShapeId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN, epcLinkerToId); + JSONObject bpmnFromShapeObj = bpmnElements.getJSONObject(bpmnFromShapeId); + JSONObject bpmnFromShapeProps = bpmnFromShapeObj.getJSONObject("props"); + JSONObject bpmnToShapeObj = bpmnElements.getJSONObject(bpmnToShapeId); + JSONObject bpmnToShapeProps = bpmnToShapeObj.getJSONObject("props"); + + Position bpmnFromShapeCenterPoi = new Position(bpmnFromShapeProps.getDoubleValue("x") + (bpmnFromShapeProps.getDoubleValue("w") / 2),bpmnFromShapeProps.getDoubleValue("y") + (bpmnFromShapeProps.getDoubleValue("h") / 2)); + Position bpmnToShapeCenterPoi = new Position(bpmnToShapeProps.getDoubleValue("x") + (bpmnToShapeProps.getDoubleValue("w") / 2),bpmnToShapeProps.getDoubleValue("y") + (bpmnToShapeProps.getDoubleValue("h") / 2)); + + + if (bpmnToShapeCenterPoi.getX() >= bpmnFromShapeCenterPoi.getX()){ + double currentSpace = bpmnToShapeCenterPoi.getX() - bpmnFromShapeCenterPoi.getX(); // 当前间距 + double moveDistance = Math.ceil(ShapeConstant.EPC_TO_BPMN_SHAPE_SPACE - currentSpace); // 应该向右移动的距离 + double x = bpmnToShapeProps.getDoubleValue("x"); + bpmnToShapeProps.put("x",x + moveDistance); + bpmnToShapeObj.put("props",bpmnToShapeProps); + bpmnElements.put(bpmnToShapeId,bpmnToShapeObj); + + maxX = x + moveDistance > maxX ? x + moveDistance : maxX; + }else if (bpmnToShapeCenterPoi.getX() <= bpmnFromShapeCenterPoi.getX()){ + double currentSpace = bpmnFromShapeCenterPoi.getX() - bpmnToShapeCenterPoi.getX(); // 当前间距 + if (!toShapeId.contains(bpmnToShapeId)){ + double moveDistance = Math.ceil(ShapeConstant.EPC_TO_BPMN_SHAPE_SPACE + currentSpace); // 应该向右移动的距离 + double x = bpmnToShapeProps.getDoubleValue("x"); + bpmnToShapeProps.put("x",x + moveDistance); + bpmnToShapeObj.put("props",bpmnToShapeProps); + bpmnElements.put(bpmnToShapeId,bpmnToShapeObj); + + maxX = x + moveDistance > maxX ? x + moveDistance : maxX; + } + } + } + return maxX; + } + + // 处理生成新的连线 + private void handleGenerateShapeLinker(JSONObject elements,JSONObject bpmnElements,Map zIndexMap,int epcPageWidth){ + elements.keySet().stream() + .filter(key -> "linker".equals(elements.getJSONObject(key).getString("name"))) + .filter(key -> { + // 过滤掉既没有图形链接的线 + boolean flag = false; + JSONObject epcLinkerObj = elements.getJSONObject(key); + JSONObject epcLinkerFromObj = epcLinkerObj.getJSONObject("from"); + JSONObject epcLinkerToObj = epcLinkerObj.getJSONObject("to"); + String epcLinkerFromId = epcLinkerFromObj.getString("id"); + String epcLinkerToId = epcLinkerToObj.getString("id"); + if (UtilString.isNotEmpty(epcLinkerFromId) && UtilString.isNotEmpty(epcLinkerToId)){ + flag = true; + } + return flag; + }) + .forEach(key -> { + JSONObject epcLinkerObj = elements.getJSONObject(key); + JSONObject epcLinkerFromObj = epcLinkerObj.getJSONObject("from"); + JSONObject epcLinkerToObj = epcLinkerObj.getJSONObject("to"); + String epcLinkerFromId = epcLinkerFromObj.getString("id"); + Position epcLinkerFromPoi = new Position(epcLinkerFromObj.getDoubleValue("x"),epcLinkerFromObj.getDoubleValue("y")); + String epcLinkerToId = epcLinkerToObj.getString("id"); + Position epcLinkerToPoi = new Position(epcLinkerToObj.getDoubleValue("x"),epcLinkerToObj.getDoubleValue("y")); + JSONObject epcLinkerProps = epcLinkerObj.getJSONObject("props"); + JSONArray epcLinkerPoints = epcLinkerObj.getJSONArray("points"); + Position epcLinkerPoint1 = new Position(((JSONObject)epcLinkerPoints.get(0)).getDoubleValue("x"),((JSONObject)epcLinkerPoints.get(0)).getDoubleValue("y")); + Position epcLinkerPoint2 = null; + if (epcLinkerPoints.size() > 1){ + epcLinkerPoint2 = new Position(((JSONObject)epcLinkerPoints.get(1)).getDoubleValue("x"),((JSONObject)epcLinkerPoints.get(1)).getDoubleValue("y")); + } + + JSONObject bpmnLinkerObj = JSONObject.parseObject(LinkerDefConstant.linker); + String bpmnLinkerDefId = UUIDGener.getObjectId(); + String bpmnShapeFromId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN,epcLinkerFromId); + String bpmnShapeToId = ConvertShapeIdMapping.getInstance().getTargetShapeId(ConvertType.EPC_BPMN,epcLinkerToId); + bpmnLinkerObj.put("id",bpmnLinkerDefId); + bpmnLinkerObj.put("text",epcLinkerObj.getString("text")); + + JSONObject bpmnLinkerFromObj = new JSONObject(); + bpmnLinkerFromObj.put("id",bpmnShapeFromId); + JSONObject bpmnLinkerToObj = new JSONObject(); + bpmnLinkerToObj.put("id",bpmnShapeToId); + + JSONObject bpmnShapeFromObj = bpmnElements.getJSONObject(bpmnShapeFromId); + JSONObject bpmnShapeToObj = bpmnElements.getJSONObject(bpmnShapeToId); + + JSONObject bpmnShapeFromProps = bpmnShapeFromObj.getJSONObject("props"); + JSONObject bpmnShapeToProps = bpmnShapeToObj.getJSONObject("props"); + + JSONArray points = new JSONArray(); + Map convertLinkerTypeMap = new HashMap<>(); + Map anchorPoiMap = ConvertUtil.getConvertAnchorPoi(elements, bpmnElements, epcLinkerObj,convertLinkerTypeMap); + if (anchorPoiMap.containsKey("from")){ + Position fromPoi = anchorPoiMap.get("from"); + bpmnLinkerFromObj.put("x",fromPoi.getX()); + bpmnLinkerFromObj.put("y",fromPoi.getY()); + } + List positionList = new ArrayList<>(); + positionList.add(new Position(bpmnLinkerFromObj.getDoubleValue("x"),bpmnLinkerFromObj.getDoubleValue("y"))); + // 获取连线折点 + JSONArray linkerPoints = ConvertUtil.getLinkerPoints(convertLinkerTypeMap, anchorPoiMap, epcPageWidth); + if (linkerPoints != null){ + for (Object o : linkerPoints) { + JSONObject point = (JSONObject)o; + Position tempPoi = new Position(point.getDoubleValue("x"),point.getDoubleValue("y")); + positionList.add(tempPoi); + points.add(point); + } + } + if (anchorPoiMap.containsKey("to")){ + Position toPoi = anchorPoiMap.get("to"); + bpmnLinkerToObj.put("x",toPoi.getX()); + bpmnLinkerToObj.put("y",toPoi.getY()); + } + positionList.add(new Position(bpmnLinkerToObj.getDoubleValue("x"),bpmnLinkerToObj.getDoubleValue("y"))); + bpmnLinkerToObj.put("angle",ConvertUtil.getLinkerAngle(positionList,"to")); + bpmnLinkerFromObj.put("angle",ConvertUtil.getLinkerAngle(positionList,"from")); + JSONObject bpmnLinkerProps = new JSONObject(); + int zindex = zIndexMap.get("zindex").intValue(); + zIndexMap.put("zindex",zindex++); + bpmnLinkerProps.put("zindex",zindex++); + bpmnLinkerObj.put("props",bpmnLinkerProps); + bpmnLinkerObj.put("points",points); + bpmnLinkerObj.put("from",bpmnLinkerFromObj); + bpmnLinkerObj.put("to",bpmnLinkerToObj); + ConvertShapeIdMapping.getInstance().load(ConvertType.EPC_BPMN,key,bpmnLinkerDefId); + bpmnElements.put(bpmnLinkerDefId,bpmnLinkerObj); + }); + } + + // 处理开始节点结束节点 并连线 + private void handleStartAndEndNode(JSONObject bpmnElements,Map zIndexMap,String targetMethod,double epcPagePadding,Map eventNodeMap,List annotationIds){ + Map shapeYCountMap = new HashMap<>(); + List shapeYSet = new ArrayList<>(); + List shapeXSet = new ArrayList<>(); + bpmnElements.keySet().stream() + .filter(key -> !"linker".equals(bpmnElements.getJSONObject(key).getString("name"))) + .forEach(key -> { + JSONObject shapeProps = bpmnElements.getJSONObject(key).getJSONObject("props"); + Position shapePoi = new Position(shapeProps.getDoubleValue("x") + (shapeProps.getDoubleValue("w") / 2),shapeProps.getDoubleValue("y") + (shapeProps.getDoubleValue("h") / 2)); + shapeYSet.add(shapePoi.getY()); + shapeXSet.add(shapePoi.getX()); + }); + shapeYSet.stream().forEach(y -> { + if (shapeYCountMap.containsKey(y)){ + int value = shapeYCountMap.get(y).intValue() + 1; + shapeYCountMap.put(y,value); + }else { + shapeYCountMap.put(y,1); + } + }); + // 找到出现最多的中心点y值 一般来讲就是在整个水平的中轴线上 + double y = shapeYCountMap.entrySet().stream().sorted(new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + return o2.getValue().intValue() - o1.getValue().intValue(); + } + }).map(entry -> entry.getKey()).findFirst().get(); + // 增加开始节点 + JSONObject startEventShapeDefinition = CoeDesignerUtil.getShapeDefinition(targetMethod, "startEvent"); + String startEventId = UUIDGener.getObjectId(); + startEventShapeDefinition.put("id",startEventId); + double startShapeX = 20.0 + epcPagePadding; + JSONObject startEventProps = startEventShapeDefinition.getJSONObject("props"); + double startShapeH = startEventProps.getDoubleValue("h"); + startEventProps.put("x",startShapeX); + startEventProps.put("y",y - (startShapeH / 2)); + startEventProps.put("angle","0"); + int zindex = zIndexMap.get("zindex").intValue(); + zIndexMap.put("zindex",zindex++); + startEventProps.put("zindex",zindex++); + startEventShapeDefinition.put("props",startEventProps); + this.handleDefaultProperty(startEventShapeDefinition); + bpmnElements.put(startEventId,startEventShapeDefinition); + // 增加结束节点 + Double endShapeX = shapeXSet.stream().max(Comparator.comparingDouble(Double::doubleValue)).get(); + JSONObject endEventShapeDefinition = CoeDesignerUtil.getShapeDefinition(targetMethod, "endEvent"); + String endEventId = UUIDGener.getObjectId(); + endEventShapeDefinition.put("id",endEventId); + JSONObject endEventProps = endEventShapeDefinition.getJSONObject("props"); + endEventProps.put("x",endShapeX + (endEventProps.getDoubleValue("w") / 2) + 100); + endEventProps.put("y",y - (startShapeH / 2)); + endEventProps.put("angle","0"); + int endZIndex = zIndexMap.get("zindex").intValue(); + zIndexMap.put("zindex",endZIndex++); + endEventProps.put("zindex",endZIndex++); + endEventShapeDefinition.put("props",endEventProps); + this.handleDefaultProperty(endEventShapeDefinition); + bpmnElements.put(endEventId,endEventShapeDefinition); + + String eventMappingName = ConvertUtil.epcToBPMNShapeMapping("event"); + String annotation = ConvertUtil.epcToBPMNShapeMapping("procedure"); + List eventNodeList = new ArrayList<>(); + for (String key : bpmnElements.keySet()) { + JSONObject element = bpmnElements.getJSONObject(key); + String eleName = element.getString("name"); + if (annotation.equals(eleName)) annotationIds.add(element.getString("id")); + if (!eventMappingName.equals(eleName)) continue; + JSONObject props = element.getJSONObject("props"); + EventNode eventNode = new EventNode(key, props.getDoubleValue("x"), props.getDoubleValue("y"), props.getDoubleValue("w"), props.getDoubleValue("h")); + eventNodeList.add(eventNode); + + eventNodeMap.put(key,eventNode); + } + eventNodeList = eventNodeList.stream().sorted(new Comparator() { + @Override + public int compare(EventNode o1, EventNode o2) { + return (int) o1.getX() - (int)o2.getX(); + } + }).collect(Collectors.toList()); + // 1.4 开始节点/结束节点 与 开始事件/结束事件连线 + JSONObject startEventLinker = JSONObject.parseObject(LinkerDefConstant.linker); + String startEventLinkerId = UUIDGener.getObjectId(); + startEventLinker.put("id",startEventLinkerId); + JSONObject startEventLinkerFrom = new JSONObject(); + startEventLinkerFrom.put("id",startEventShapeDefinition.getString("id")); + startEventLinkerFrom.put("x",startEventProps.getDoubleValue("x") + startEventProps.getDoubleValue("w")); + startEventLinkerFrom.put("y",startEventProps.getDoubleValue("y") + (startEventProps.getDoubleValue("h") / 2)); + startEventLinkerFrom.put("angle",LinkerDefConstant.ANGLE_LEFT); + JSONObject startEventLinkerTo = new JSONObject(); + // 与产品沟通 转换前一定会有开始事件/结束事件 且在最两边 + EventNode startEpcEventNode = eventNodeList.get(0); + startEventLinkerTo.put("id",startEpcEventNode.getId()); + + int startEventLinkerZIndex = zIndexMap.get("zindex").intValue(); + JSONObject startEventLinkerProps = new JSONObject(); + zIndexMap.put("zindex",startEventLinkerZIndex++); + startEventLinkerProps.put("zindex",startEventLinkerZIndex++); + startEventLinker.put("props",startEventLinkerProps); + startEventLinker.put("from",startEventLinkerFrom); + + // + JSONArray startLinkerPoints = new JSONArray(); + if (startEventLinkerFrom.getDoubleValue("y") > startEpcEventNode.getY() + startEpcEventNode.getHeight() / 2){ + startEventLinkerTo.put("angle",LinkerDefConstant.ANGLE_UP); + startEventLinkerTo.put("x",startEpcEventNode.getX() + (startEpcEventNode.getWidth() / 2)); + startEventLinkerTo.put("y",startEpcEventNode.getY() + startEpcEventNode.getHeight()); + JSONObject point = new JSONObject(); + point.put("x",startEventLinkerTo.getDoubleValue("x")); + point.put("y",startEventLinkerFrom.getDoubleValue("y")); + startLinkerPoints.add(point); + }else if (startEventLinkerFrom.getDoubleValue("y") < startEpcEventNode.getY() + startEpcEventNode.getHeight() / 2){ + startEventLinkerTo.put("angle",LinkerDefConstant.ANGLE_DOWN); + startEventLinkerTo.put("x",startEpcEventNode.getX() + (startEpcEventNode.getWidth() / 2)); + startEventLinkerTo.put("y",startEpcEventNode.getY()); + JSONObject point = new JSONObject(); + point.put("x",startEventLinkerTo.getDoubleValue("x")); + point.put("y",startEventLinkerFrom.getDoubleValue("y")); + startLinkerPoints.add(point); + }else if (startEventLinkerFrom.getDoubleValue("y") == startEpcEventNode.getY() + startEpcEventNode.getHeight() / 2){ + startEventLinkerTo.put("angle",LinkerDefConstant.ANGLE_RIGHT); + startEventLinkerTo.put("x",startEpcEventNode.getX()); + startEventLinkerTo.put("y",startEpcEventNode.getY() + (startEpcEventNode.getHeight() / 2)); + JSONObject p1 = new JSONObject(); + p1.put("x",startEventLinkerFrom.getDoubleValue("x") + (startEventLinkerTo.getDoubleValue("x") - startEventLinkerFrom.getDoubleValue("x")) / 2); + p1.put("y",startEventLinkerFrom.getDoubleValue("y")); + startLinkerPoints.add(p1); + JSONObject p2 = new JSONObject(); + p2.put("x",startEventLinkerFrom.getDoubleValue("x") + (startEventLinkerTo.getDoubleValue("x") - startEventLinkerFrom.getDoubleValue("x")) / 2); + p2.put("y",startEventLinkerFrom.getDoubleValue("y")); + startLinkerPoints.add(p2); + } + startEventLinker.put("points",startLinkerPoints); + startEventLinker.put("to",startEventLinkerTo); + bpmnElements.put(startEventLinkerId,startEventLinker); + + JSONObject endEventLinker = JSONObject.parseObject(LinkerDefConstant.linker); + String endEventLinkerId = UUIDGener.getObjectId(); + endEventLinker.put("id",endEventLinkerId); + JSONObject endEventLinkerFrom = new JSONObject(); + EventNode endEpcEventNode = eventNodeList.get(eventNodeList.size() - 1); + endEventLinkerFrom.put("id",endEpcEventNode.getId()); + endEventLinkerFrom.put("x",endEpcEventNode.getCenterShapePosi().getX() + (endEpcEventNode.getWidth() / 2)); + endEventLinkerFrom.put("y",endEpcEventNode.getCenterShapePosi().getY()); + endEventLinkerFrom.put("angle",LinkerDefConstant.ANGLE_LEFT); + JSONObject endEventLinkerTo = new JSONObject(); + endEventLinkerTo.put("id",endEventShapeDefinition.getString("id")); + endEventLinkerTo.put("x",endEventProps.getDoubleValue("x")); + endEventLinkerTo.put("y",endEventProps.getDoubleValue("y") + (endEventProps.getDoubleValue("h") / 2)); + endEventLinker.put("angle",LinkerDefConstant.ANGLE_RIGHT); + int endEventLinkerZIndex = zIndexMap.get("zindex").intValue(); + JSONObject endEventLinkerProps = new JSONObject(); + zIndexMap.put("zindex",endEventLinkerZIndex++); + endEventLinkerProps.put("zindex",endEventLinkerZIndex++); + endEventLinker.put("props",endEventLinkerProps); + endEventLinker.put("from",endEventLinkerFrom); + endEventLinker.put("to",endEventLinkerTo); + bpmnElements.put(endEventLinkerId,endEventLinker); + } + + // 处理事件节点转换为 连线 + private void handleEventNodeLinker(Map eventNodeMap,JSONObject bpmnElements,Map>> linkerAdapterMap,Set toBeDeletes,List annotationIds){ + eventNodeMap.keySet().stream().forEach(key -> { + EventNode eventNode = eventNodeMap.get(key); + bpmnElements.keySet().stream() + .filter(k -> "linker".equals(bpmnElements.getJSONObject(k).getString("name"))) + .forEach(k -> { + JSONObject linkerObj = bpmnElements.getJSONObject(k); + JSONObject fromObj = linkerObj.getJSONObject("from"); + JSONObject toObj = linkerObj.getJSONObject("to"); + JSONArray points = linkerObj.getJSONArray("points"); + // 找到从【事件】出去的线 进而找出【事件线】的to + if (eventNode.getId().equals(fromObj.getString("id"))){ + String toId = toObj.getString("id"); + if (!linkerAdapterMap.containsKey(key)){ + Map> map = new HashMap<>(); + List linkerAdapters = new ArrayList<>(); + map.put("to",linkerAdapters); + linkerAdapterMap.put(key,map); + } + Map> map = linkerAdapterMap.get(key); + if (!map.containsKey("to")){ + List linkerAdapters = new ArrayList<>(); + map.put("to",linkerAdapters); + } + List linkerAdapterList = map.get("to"); + Position position = new Position(toObj.getDoubleValue("x"),toObj.getDoubleValue("y")); + List pointList = new ArrayList<>(); + points.stream().forEach(item -> { + JSONObject point = (JSONObject) item; + Position poi = new Position(point.getDoubleValue("x"),point.getDoubleValue("y")); + pointList.add(poi); + }); + Position linkPoint = new Position(fromObj.getDoubleValue("x"),fromObj.getDoubleValue("y")); + LinkerAdapter linkerAdapter = new LinkerAdapter(toId,"to",position,pointList,linkPoint); + linkerAdapterList.add(linkerAdapter); + // 记录下待删除的连线的key + toBeDeletes.add(k); + }else if (eventNode.getId().equals(toObj.getString("id"))){ // 找到指向【事件】的线 进而找出【事件线】的from + String fromId = fromObj.getString("id"); + if (!linkerAdapterMap.containsKey(key)){ + Map> map = new HashMap<>(); + List linkerAdapters = new ArrayList<>(); + map.put("from",linkerAdapters); + linkerAdapterMap.put(key,map); + } + Map> map = linkerAdapterMap.get(key); + if (!map.containsKey("from")){ + List linkerAdapters = new ArrayList<>(); + map.put("from",linkerAdapters); + } + List linkerAdapterList = map.get("from"); + Position position = new Position(fromObj.getDoubleValue("x"),fromObj.getDoubleValue("y")); + List pointList = new ArrayList<>(); + points.stream().forEach(item -> { + JSONObject point = (JSONObject) item; + Position poi = new Position(point.getDoubleValue("x"),point.getDoubleValue("y")); + pointList.add(poi); + }); + Position linkPoint = new Position(toObj.getDoubleValue("x"),toObj.getDoubleValue("y")); + LinkerAdapter linkerAdapter = new LinkerAdapter(fromId,"from",position,pointList,linkPoint); + linkerAdapterList.add(linkerAdapter); + // 记录下待删除的连线的key + toBeDeletes.add(k); + } + }); + // 记录下待删除图形的key + toBeDeletes.add(key); + }); + + // 根据封装的LinkerAdapter生成新的linker 生成事件线 + for (String key : linkerAdapterMap.keySet()) { + EventNode eventNode = eventNodeMap.get(key); + String text = UtilString.isEmpty(bpmnElements.getJSONObject(eventNode.getId()).getString("text")) ? "事件" : bpmnElements.getJSONObject(eventNode.getId()).getString("text"); + Position centerShapePosi = eventNode.getCenterShapePosi(); + Map> listMap = linkerAdapterMap.get(key); + List fromLinkerList = listMap.get("from"); + List toLinkerList = listMap.get("to"); + if (!listMap.containsKey("from") || !listMap.containsKey("to")) { // 只有指出或者接收的线 + if (listMap.containsKey("to")){ // 没有指向event的线 + toLinkerList.stream().forEach(linkerAdapter -> { + Position toLinkerPosi = linkerAdapter.getPosition(); + JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); + String linkDefId = UUIDGener.getObjectId(); + linkerDef.put("id",linkDefId); + linkerDef.put("text",text); + linkerDef.put("points", ConvertUtil.getLinkerPoints(linkerAdapter.getPoints())); + JSONObject from = linkerDef.getJSONObject("from"); + from.put("x",centerShapePosi.getX()); + from.put("y",centerShapePosi.getY()); + linkerDef.put("from",from); + JSONObject to = linkerDef.getJSONObject("to"); + to.put("x",toLinkerPosi.getX()); + to.put("y",toLinkerPosi.getY()); + List positionList = new ArrayList<>(); + positionList.add(centerShapePosi); + if (linkerAdapter.getPoints().size() > 0) positionList.addAll(linkerAdapter.getPoints()); + positionList.add(toLinkerPosi); + to.put("angle",ConvertUtil.getLinkerAngle(positionList,"to")); + to.put("id",linkerAdapter.getId()); + linkerDef.put("to",to); + bpmnElements.put(linkDefId,linkerDef); + }); + }else if (listMap.containsKey("from")){ // 没有从event出发的线 + fromLinkerList.stream().forEach(linkerAdapter -> { + Position fromLinkPosi = linkerAdapter.getPosition(); + JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); + String linkDefId = UUIDGener.getObjectId(); + linkerDef.put("id",linkDefId); + linkerDef.put("text",text); + linkerDef.put("points",ConvertUtil.getLinkerPoints(linkerAdapter.getPoints())); + JSONObject from = linkerDef.getJSONObject("from"); + from.put("x",fromLinkPosi.getX()); + from.put("y",fromLinkPosi.getY()); + from.put("id",linkerAdapter.getId()); + List positionList = new ArrayList<>(); + positionList.add(fromLinkPosi); + if (linkerAdapter.getPoints().size() > 0) positionList.addAll(linkerAdapter.getPoints()); + positionList.add(centerShapePosi); + from.put("angle",ConvertUtil.getLinkerAngle(positionList,"from")); + linkerDef.put("from",from); + JSONObject to = linkerDef.getJSONObject("to"); + to.put("x",centerShapePosi.getX()); + to.put("y",centerShapePosi.getY()); + linkerDef.put("to",to); + bpmnElements.put(linkDefId,linkerDef); + }); + } + }else if (listMap.containsKey("from") && listMap.containsKey("to")){ + if (fromLinkerList.size() == 1 && toLinkerList.size() == 1){ + LinkerAdapter fromLinkerAdapter = fromLinkerList.get(0); + LinkerAdapter toLinkerAdapter = toLinkerList.get(0); + JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); + String linkDefId = UUIDGener.getObjectId(); + linkerDef.put("id",linkDefId); + linkerDef.put("text",text); + if (annotationIds.contains(fromLinkerAdapter.getId())){ + JSONObject lineStyle = linkerDef.getJSONObject("lineStyle"); + lineStyle.put("lineStyle","dashed"); + lineStyle.put("endArrowStyle","none"); + linkerDef.put("lineStyle",lineStyle); + } + List pointList = new ArrayList<>(); + if (fromLinkerAdapter.getPoints().size() > 0) pointList.addAll(fromLinkerAdapter.getPoints()); + // 判断当前事件节点是否要作为一个折点 + Position fromLinkPoint = fromLinkerAdapter.getLinkPoint(); + Position toLinkPoint = toLinkerAdapter.getLinkPoint(); + if (fromLinkPoint.getX() != toLinkPoint.getX() && fromLinkPoint.getY() != toLinkPoint.getY()){ + pointList.add(centerShapePosi); + } + if (toLinkerAdapter.getPoints().size() > 0) pointList.addAll(toLinkerAdapter.getPoints()); + linkerDef.put("points",ConvertUtil.getLinkerPoints(pointList)); + List allPosition = new ArrayList<>(); + allPosition.add(fromLinkerAdapter.getPosition()); + if (pointList.size() > 0) allPosition.addAll(pointList); + allPosition.add(toLinkerAdapter.getPosition()); + JSONObject from = linkerDef.getJSONObject("from"); + from.put("id",fromLinkerAdapter.getId()); + from.put("x",fromLinkerAdapter.getPosition().getX()); + from.put("y",fromLinkerAdapter.getPosition().getY()); + from.put("angle",ConvertUtil.getLinkerAngle(allPosition,"from")); + linkerDef.put("from",from); + JSONObject to = linkerDef.getJSONObject("to"); + to.put("id",toLinkerAdapter.getId()); + to.put("x",toLinkerAdapter.getPosition().getX()); + to.put("y",toLinkerAdapter.getPosition().getY()); + to.put("angle",ConvertUtil.getLinkerAngle(allPosition,"to")); + linkerDef.put("to",to); + bpmnElements.put(linkDefId,linkerDef); + }else if (fromLinkerList.size() > toLinkerList.size()){ + LinkerAdapter toLinkerAdapter = toLinkerList.get(0); + for (LinkerAdapter fromLinkerAdapter : fromLinkerList) { + JSONObject linkerDef = JSONObject.parseObject(LinkerDefConstant.linker); + String linkDefId = UUIDGener.getObjectId(); + linkerDef.put("id",linkDefId); + linkerDef.put("text",text); + // System.out.println("========>>>> " + annotationIds + " " + fromLinkerAdapter.getId()); + if (annotationIds.contains(fromLinkerAdapter.getId())){ + JSONObject lineStyle = linkerDef.getJSONObject("lineStyle"); + lineStyle.put("lineStyle","dashed"); + lineStyle.put("endArrowStyle","none"); + linkerDef.put("lineStyle",lineStyle); + } + List pointList = new ArrayList<>(); + if (fromLinkerAdapter.getPoints().size() > 0) pointList.addAll(fromLinkerAdapter.getPoints()); + // 判断当前事件节点是否要作为一个折点 + Position fromLinkPoint = fromLinkerAdapter.getLinkPoint(); + Position toLinkPoint = toLinkerAdapter.getLinkPoint(); + if (fromLinkPoint.getX() != toLinkPoint.getX() && fromLinkPoint.getY() != toLinkPoint.getY()){ + pointList.add(centerShapePosi); + } + if (toLinkerAdapter.getPoints().size() > 0) pointList.addAll(toLinkerAdapter.getPoints()); + linkerDef.put("points",ConvertUtil.getLinkerPoints(pointList)); + List allPosition = new ArrayList<>(); + allPosition.add(fromLinkerAdapter.getPosition()); + if (pointList.size() > 0) allPosition.addAll(pointList); + allPosition.add(toLinkerAdapter.getPosition()); + JSONObject from = linkerDef.getJSONObject("from"); + from.put("id",fromLinkerAdapter.getId()); + from.put("x",fromLinkerAdapter.getPosition().getX()); + from.put("y",fromLinkerAdapter.getPosition().getY()); + from.put("angle",ConvertUtil.getLinkerAngle(allPosition,"from")); + linkerDef.put("from",from); + JSONObject to = linkerDef.getJSONObject("to"); + to.put("id",toLinkerAdapter.getId()); + to.put("x",toLinkerAdapter.getPosition().getX()); + to.put("y",toLinkerAdapter.getPosition().getY()); + to.put("angle",ConvertUtil.getLinkerAngle(allPosition,"to")); + linkerDef.put("to",to); + bpmnElements.put(linkDefId,linkerDef); + } + } + } + } + } } diff --git a/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/util/ConvertUtil.java b/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/util/ConvertUtil.java index 691dceef..ad443746 100644 --- a/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/util/ConvertUtil.java +++ b/com.actionsoft.apps.coe.pal.modelconvert/src/com/actionsoft/apps/coe/pal/modelconvert/util/ConvertUtil.java @@ -3,6 +3,7 @@ package com.actionsoft.apps.coe.pal.modelconvert.util; import com.actionsoft.apps.coe.pal.modelconvert.cache.ConvertShapeIdMapping; import com.actionsoft.apps.coe.pal.modelconvert.constant.ConvertType; import com.actionsoft.apps.coe.pal.modelconvert.constant.LinkerDefConstant; +import com.actionsoft.apps.coe.pal.modelconvert.constant.ShapeConstant; import com.actionsoft.apps.coe.pal.modelconvert.model.Position; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -213,7 +214,7 @@ public class ConvertUtil { * @param beforeConvertLinker * @return */ - public static Map getConvertAnchorPoi(JSONObject beforeConvertElement,JSONObject afterConvertElement,JSONObject beforeConvertLinker){ + public static Map getConvertAnchorPoi(JSONObject beforeConvertElement,JSONObject afterConvertElement,JSONObject beforeConvertLinker,Map convertLinkerTypeMap){ Map resultMap = new HashMap<>(2); @@ -236,15 +237,42 @@ public class ConvertUtil { if (beforeConvertFromAnchorPoi.equals(leftFromPoi)){ // 转换前从左侧出 转换后从下侧出 Position afterBottomFromPoi = new Position(afterFromShapeProps.getDoubleValue("x") + (afterFromShapeProps.getDoubleValue("w") / 2),afterFromShapeProps.getDoubleValue("y") + afterFromShapeProps.getDoubleValue("h")); resultMap.put("from",afterBottomFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"bottom"); }else if (beforeConvertFromAnchorPoi.equals(topFromPoi)){ // 转换前从上侧出 转换后从左侧出 Position afterLeftFromPoi = new Position(afterFromShapeProps.getDoubleValue("x"),afterFromShapeProps.getDoubleValue("y") + (afterFromShapeProps.getDoubleValue("h") / 2)); resultMap.put("from",afterLeftFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"left"); }else if (beforeConvertFromAnchorPoi.equals(rightFromPoi)){ // 转换前从右侧出 转换后从上侧出 Position afterTopFromPoi = new Position(afterFromShapeProps.getDoubleValue("x") + (afterFromShapeProps.getDoubleValue("w") / 2),afterFromShapeProps.getDoubleValue("y")); resultMap.put("from",afterTopFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"top"); }else if (beforeConvertFromAnchorPoi.equals(bottomFromPoi)){ // 转换前从下侧出 转换后从右侧出 Position afterRightFromPoi = new Position(afterFromShapeProps.getDoubleValue("x") + afterFromShapeProps.getDoubleValue("w"),afterFromShapeProps.getDoubleValue("y") + (afterFromShapeProps.getDoubleValue("h") / 2)); resultMap.put("from",afterRightFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"right"); + }else{ + // 有坑 正常来讲不会进入这里 + if (beforeConvertFromAnchorPoi.getX() >= rightFromPoi.getX() && beforeConvertFromAnchorPoi.getY() > topFromPoi.getY() && beforeConvertFromAnchorPoi.getY() < bottomFromPoi.getY()){ + // 转换前从右侧出 转换后从上侧出 + Position afterTopFromPoi = new Position(afterFromShapeProps.getDoubleValue("x") + (afterFromShapeProps.getDoubleValue("w") / 2),afterFromShapeProps.getDoubleValue("y")); + resultMap.put("from",afterTopFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"top"); + }else if (beforeConvertFromAnchorPoi.getX() <= leftFromPoi.getX() && beforeConvertFromAnchorPoi.getY() > topFromPoi.getY() && beforeConvertFromAnchorPoi.getY() < bottomFromPoi.getY()){ + // 转换前从左侧出 转换后从下侧出 + Position afterBottomFromPoi = new Position(afterFromShapeProps.getDoubleValue("x") + (afterFromShapeProps.getDoubleValue("w") / 2),afterFromShapeProps.getDoubleValue("y") + afterFromShapeProps.getDoubleValue("h")); + resultMap.put("from",afterBottomFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"bottom"); + }else if (beforeConvertFromAnchorPoi.getX() > leftFromPoi.getX() && beforeConvertFromAnchorPoi.getX() < rightFromPoi.getX() && beforeConvertFromAnchorPoi.getY() <= topFromPoi.getY()){ + // 转换前从上侧出 转换后从左侧出 + Position afterLeftFromPoi = new Position(afterFromShapeProps.getDoubleValue("x"),afterFromShapeProps.getDoubleValue("y") + (afterFromShapeProps.getDoubleValue("h") / 2)); + resultMap.put("from",afterLeftFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"left"); + }else if (beforeConvertFromAnchorPoi.getX() > leftFromPoi.getX() && beforeConvertFromAnchorPoi.getX() < rightFromPoi.getX() && beforeConvertFromAnchorPoi.getY() >= bottomFromPoi.getY()){ + // 转换前从下侧出 转换后从右侧出 + Position afterRightFromPoi = new Position(afterFromShapeProps.getDoubleValue("x") + afterFromShapeProps.getDoubleValue("w"),afterFromShapeProps.getDoubleValue("y") + (afterFromShapeProps.getDoubleValue("h") / 2)); + resultMap.put("from",afterRightFromPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_FROM_DIRECTION_KEY,"right"); + } } }else { Position noneShape = new Position(linkerFromObj.getDoubleValue("y"),beforeConvertElement.getJSONObject("page").getDoubleValue("width") - linkerFromObj.getDoubleValue("x")); @@ -267,17 +295,44 @@ public class ConvertUtil { if (beforeConvertToAnchorPoi.equals(leftToPoi)){ // 转换前从左侧进入 转换后从下侧进入 Position afterBottomToPoi = new Position(afterToShapeProps.getDoubleValue("x") + (afterToShapeProps.getDoubleValue("w") / 2),afterToShapeProps.getDoubleValue("y") + afterToShapeProps.getDoubleValue("h")); resultMap.put("to",afterBottomToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"bottom"); }else if (beforeConvertToAnchorPoi.equals(topToPoi)){ // 转换前从上侧进入 转换后从左侧进入 Position afterLeftToPoi = new Position(afterToShapeProps.getDoubleValue("x"),afterToShapeProps.getDoubleValue("y") + (afterToShapeProps.getDoubleValue("h") / 2)); resultMap.put("to",afterLeftToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"left"); }else if (beforeConvertToAnchorPoi.equals(rightToPoi)){ // 转换前从右侧进入 转换后从上侧进入 Position afterTopToPoi = new Position(afterToShapeProps.getDoubleValue("x") + (afterToShapeProps.getDoubleValue("w") / 2),afterToShapeProps.getDoubleValue("y")); resultMap.put("to",afterTopToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"top"); }else if (beforeConvertToAnchorPoi.equals(bottomToPoi)){ // 转换前从下侧进入 转换后从右侧进入 Position afterRightToPoi = new Position(afterToShapeProps.getDoubleValue("x") + afterToShapeProps.getDoubleValue("w"),afterToShapeProps.getDoubleValue("y") + (afterToShapeProps.getDoubleValue("h") / 2)); resultMap.put("to",afterRightToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"right"); + }else { + // 有坑 正常来讲不会进入这里 + if (beforeConvertToAnchorPoi.getX() >= rightToPoi.getX() && beforeConvertToAnchorPoi.getY() > topToPoi.getY() && beforeConvertToAnchorPoi.getY() < bottomToPoi.getY()){ + // 转换前从右侧进入 转换后 从上侧进入 + Position afterTopToPoi = new Position(afterToShapeProps.getDoubleValue("x") + (afterToShapeProps.getDoubleValue("w") / 2),afterToShapeProps.getDoubleValue("y")); + resultMap.put("to",afterTopToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"top"); + }else if (beforeConvertToAnchorPoi.getX() <= leftToPoi.getX() && beforeConvertToAnchorPoi.getY() > topToPoi.getY() && beforeConvertToAnchorPoi.getY() < bottomToPoi.getY()){ + // 转换前从左侧进入 转换后 从下侧进入 + Position afterBottomToPoi = new Position(afterToShapeProps.getDoubleValue("x") + (afterToShapeProps.getDoubleValue("w") / 2),afterToShapeProps.getDoubleValue("y") + afterToShapeProps.getDoubleValue("h")); + resultMap.put("to",afterBottomToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"bottom"); + }else if (beforeConvertToAnchorPoi.getX() > leftToPoi.getX() && beforeConvertToAnchorPoi.getX() < rightToPoi.getX() && beforeConvertToAnchorPoi.getY() <= topToPoi.getY()){ + // 转换前从上侧进入 转换后 从左侧进入 + Position afterLeftToPoi = new Position(afterToShapeProps.getDoubleValue("x"),afterToShapeProps.getDoubleValue("y") + (afterToShapeProps.getDoubleValue("h") / 2)); + resultMap.put("to",afterLeftToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"left"); + }else if (beforeConvertToAnchorPoi.getX() > leftToPoi.getX() && beforeConvertToAnchorPoi.getX() < rightToPoi.getX() && beforeConvertToAnchorPoi.getY() >= bottomToPoi.getY()){ + // 转换前从下侧进入 转换后 从右侧进入 + Position afterRightToPoi = new Position(afterToShapeProps.getDoubleValue("x") + afterToShapeProps.getDoubleValue("w"),afterToShapeProps.getDoubleValue("y") + (afterToShapeProps.getDoubleValue("h") / 2)); + resultMap.put("to",afterRightToPoi); + convertLinkerTypeMap.put(ShapeConstant.LINKER_TO_DIRECTION_KEY,"right"); + } } - }else { + }else { Position noneShape = new Position(linkerToObj.getDoubleValue("y"),beforeConvertElement.getJSONObject("page").getDoubleValue("width") - linkerToObj.getDoubleValue("x")); resultMap.put("to",noneShape); } @@ -285,4 +340,85 @@ public class ConvertUtil { return resultMap; } + + /** + * 获取图形转换后的连线折点【基于垂直向下方向 转向 水平向右方向的转换】 + * 【大概思路】连线折点大概有三种 + * 水平线折点为连线中点 + * 含有一个明显折点的连线 + * 含有两个明显折点的连线 + * @return + */ + public static JSONArray getLinkerPoints(Map convertLinkerTypeMap,Map anchorPoiMap,int pageHeight){ + + if (convertLinkerTypeMap.containsKey(ShapeConstant.LINKER_FROM_DIRECTION_KEY) && convertLinkerTypeMap.containsKey(ShapeConstant.LINKER_TO_DIRECTION_KEY)){ + JSONArray points = new JSONArray(); + Position fromPoi = anchorPoiMap.get("from"); + Position toPoi = anchorPoiMap.get("to"); + String fromDirection = convertLinkerTypeMap.get(ShapeConstant.LINKER_FROM_DIRECTION_KEY); + String toDirection = convertLinkerTypeMap.get(ShapeConstant.LINKER_TO_DIRECTION_KEY); + if ("right".equals(fromDirection) && "left".equals(toDirection)){ // 水平连线 + double x = (toPoi.getX() - fromPoi.getX()) / 2; + JSONObject p1 = new JSONObject(); + p1.put("x",fromPoi.getX() + x); + p1.put("y",fromPoi.getY()); + JSONObject p2 = new JSONObject(); + p2.put("x",fromPoi.getX() + x); + p2.put("y",fromPoi.getY()); + points.add(p1); + points.add(p2); + }else if ("left".equals(fromDirection) && "right".equals(toDirection)){ + double x = (fromPoi.getX() - toPoi.getX()) / 2; + JSONObject p1 = new JSONObject(); + p1.put("x",toPoi.getX() + x); + p1.put("y",toPoi.getY()); + JSONObject p2 = new JSONObject(); + p2.put("x",toPoi.getX() + x); + p2.put("y",toPoi.getY()); + points.add(p1); + points.add(p2); + }else if ("top".equals(fromDirection) && ("left".equals(toDirection) || "right".equals(toDirection))){ + JSONObject p = new JSONObject(); + p.put("x",fromPoi.getX()); + p.put("y",toPoi.getY()); + points.add(p); + }else if ("top".equals(toDirection) && ("left".equals(fromDirection) || "right".equals(fromDirection))){ + JSONObject p = new JSONObject(); + p.put("x",toPoi.getX()); + p.put("y",fromPoi.getY()); + points.add(p); + }else if ("bottom".equals(fromDirection) && ("left".equals(toDirection) || "right".equals(toDirection))){ + JSONObject p = new JSONObject(); + p.put("x",fromPoi.getX()); + p.put("y",toPoi.getY()); + points.add(p); + }else if ("bottom".equals(toDirection) && ("left".equals(fromDirection) || "right".equals(fromDirection))){ + JSONObject p = new JSONObject(); + p.put("x",toPoi.getX()); + p.put("y",fromPoi.getY()); + points.add(p); + }else if ("top".equals(fromDirection) && "top".equals(toDirection)){ + JSONObject p1 = new JSONObject(); + JSONObject p2 = new JSONObject(); + p1.put("x",fromPoi.getX()); + p1.put("y",100); + p2.put("x",toPoi.getX()); + p2.put("y",100); + points.add(p1); + points.add(p2); + }else if ("bottom".equals(fromDirection) && "bottom".equals(toDirection)){ + JSONObject p1 = new JSONObject(); + JSONObject p2 = new JSONObject(); + p1.put("x",fromPoi.getX()); + p1.put("y",pageHeight - 50); + p2.put("x",toPoi.getX()); + p2.put("y",pageHeight - 50); + points.add(p1); + points.add(p2); + } + return points; + } + return null; + } + }