子流程节点与普通节点相连 子流程节点展开报错问题

This commit is contained in:
qinoy 2023-07-21 16:59:50 +08:00
parent 8057a06476
commit 4b1d967cfa
4 changed files with 72 additions and 50 deletions

View File

@ -73,30 +73,32 @@ public class ExpandOrCloseShapeLinkerConvertHandle {
if (leadNodeType.name().equals(ElementType.OUTER_NODE.name()) || leadNodeType.name().equals(ElementType.SCOPE_NODE.name())){
// 获取前置节点的扩展属性
JSONObject extendAttr = leadNode.getJSONObject(SubProcessConst.EXTEND_ATTR);
// 当前前置节点 所代表的子流程文件ID
String leadNodeRelationId = extendAttr.getString("id");
// 1未展开 子流程节点
// 2此时前置节点为范围框 同时说明之前范围框内部没有节点与当前节点有关联关系
// 判断当前节点内部是否有流程接口 与范围框有关联关系 因为范围框本身也是一个文件
for (Object o2 : procedureArr) {
JSONObject procedure = (JSONObject) o2;
JSONObject attrMark = procedure.getJSONObject(SubProcessConst.SHAPE_PROCEDURE_ATTR_MARK);
String procedureNodeRelationId = attrMark.getString("id");
if (leadNodeRelationId.equals(procedureNodeRelationId)){ // 前置节点与内部流程接口有关联关系
// 删除当前 前置节点与范围框上的连线
definitionHandle.removeShape(leadNodeLinker.getString("id"));
// 重新渲染当前 前置节点与范围框的连线
String procedureId = procedure.getString("id");
double[] fromBounding = new double[]{definitionHandle.getShapeX(leadNodeId), definitionHandle.getShapeY(leadNodeId), definitionHandle.getShapeW(leadNodeId), definitionHandle.getShapeH(leadNodeId)};
double[] toBounding = new double[]{definitionHandle.getShapeX(procedureId), definitionHandle.getShapeY(procedureId), definitionHandle.getShapeW(procedureId), definitionHandle.getShapeH(procedureId)};
JSONObject linker = linkerPointCalculationHandle.toAssembleLinker(direction, leadNodeId, procedureId, fromBounding, toBounding);
// 连线属于内外交叉连线 加个特殊标识属性
linker.put("elementType", ElementType.CROSS_LINKER.name());
linker.put("creator", "system");
definitionHandle.addEle(linker.getString("id"), linker);
break;
}
}
if (extendAttr.containsKey("id")){
// 当前前置节点 所代表的子流程文件ID
String leadNodeRelationId = extendAttr.getString("id");
// 1未展开 子流程节点
// 2此时前置节点为范围框 同时说明之前范围框内部没有节点与当前节点有关联关系
// 判断当前节点内部是否有流程接口 与范围框有关联关系 因为范围框本身也是一个文件
for (Object o2 : procedureArr) {
JSONObject procedure = (JSONObject) o2;
JSONObject attrMark = procedure.getJSONObject(SubProcessConst.SHAPE_PROCEDURE_ATTR_MARK);
String procedureNodeRelationId = attrMark.getString("id");
if (leadNodeRelationId.equals(procedureNodeRelationId)){ // 前置节点与内部流程接口有关联关系
// 删除当前 前置节点与范围框上的连线
definitionHandle.removeShape(leadNodeLinker.getString("id"));
// 重新渲染当前 前置节点与范围框的连线
String procedureId = procedure.getString("id");
double[] fromBounding = new double[]{definitionHandle.getShapeX(leadNodeId), definitionHandle.getShapeY(leadNodeId), definitionHandle.getShapeW(leadNodeId), definitionHandle.getShapeH(leadNodeId)};
double[] toBounding = new double[]{definitionHandle.getShapeX(procedureId), definitionHandle.getShapeY(procedureId), definitionHandle.getShapeW(procedureId), definitionHandle.getShapeH(procedureId)};
JSONObject linker = linkerPointCalculationHandle.toAssembleLinker(direction, leadNodeId, procedureId, fromBounding, toBounding);
// 连线属于内外交叉连线 加个特殊标识属性
linker.put("elementType", ElementType.CROSS_LINKER.name());
linker.put("creator", "system");
definitionHandle.addEle(linker.getString("id"), linker);
break;
}
}
}
}else { // 已展开 内部节点
// 此时前置节点为某一个范围框的内部节点 找到当前内部节点归属哪个范围框 判断当前范围框是否与当前展开的内部流程接口有关联
String scopeShapeId = leadNode.getString("scopeShapeId");
@ -133,26 +135,28 @@ public class ExpandOrCloseShapeLinkerConvertHandle {
if (procedureArr.size() > 0){ // 范围框内部存在前置或者后置流程接口
if (rearNodeType.name().equals(ElementType.OUTER_NODE.name()) || rearNodeType.name().equals(ElementType.SCOPE_NODE.name())){
JSONObject extendAttr = rearNode.getJSONObject(SubProcessConst.EXTEND_ATTR);
// 当前后置节点 所代表的子流程文件ID
String rearNodeRelationId = extendAttr.getString("id");
for (Object o2 : procedureArr) {
JSONObject procedure = (JSONObject) o2;
JSONObject attrMark = procedure.getJSONObject(SubProcessConst.SHAPE_PROCEDURE_ATTR_MARK);
String procedureNodeRelationId = attrMark.getString("id");
if (rearNodeRelationId.equals(procedureNodeRelationId)){ // 后置节点与内部流程接口有关联关系
definitionHandle.removeShape(rearNodeLinker.getString("id"));
// 重新渲染当前 前置节点与范围框的连线
String procedureId = procedure.getString("id");
double[] fromBounding = new double[]{definitionHandle.getShapeX(procedureId), definitionHandle.getShapeY(procedureId), definitionHandle.getShapeW(procedureId), definitionHandle.getShapeH(procedureId)};
double[] toBounding = new double[]{definitionHandle.getShapeX(rearNodeId), definitionHandle.getShapeY(rearNodeId), definitionHandle.getShapeW(rearNodeId), definitionHandle.getShapeH(rearNodeId)};
JSONObject linker = linkerPointCalculationHandle.toAssembleLinker(direction, procedureId, rearNodeId, fromBounding, toBounding);
// 连线属于内外交叉连线 加个特殊标识属性
linker.put("elementType", ElementType.CROSS_LINKER.name());
linker.put("creator", "system");
definitionHandle.addEle(linker.getString("id"), linker);
break;
}
}
if (extendAttr.containsKey("id")){
// 当前后置节点 所代表的子流程文件ID
String rearNodeRelationId = extendAttr.getString("id");
for (Object o2 : procedureArr) {
JSONObject procedure = (JSONObject) o2;
JSONObject attrMark = procedure.getJSONObject(SubProcessConst.SHAPE_PROCEDURE_ATTR_MARK);
String procedureNodeRelationId = attrMark.getString("id");
if (rearNodeRelationId.equals(procedureNodeRelationId)){ // 后置节点与内部流程接口有关联关系
definitionHandle.removeShape(rearNodeLinker.getString("id"));
// 重新渲染当前 前置节点与范围框的连线
String procedureId = procedure.getString("id");
double[] fromBounding = new double[]{definitionHandle.getShapeX(procedureId), definitionHandle.getShapeY(procedureId), definitionHandle.getShapeW(procedureId), definitionHandle.getShapeH(procedureId)};
double[] toBounding = new double[]{definitionHandle.getShapeX(rearNodeId), definitionHandle.getShapeY(rearNodeId), definitionHandle.getShapeW(rearNodeId), definitionHandle.getShapeH(rearNodeId)};
JSONObject linker = linkerPointCalculationHandle.toAssembleLinker(direction, procedureId, rearNodeId, fromBounding, toBounding);
// 连线属于内外交叉连线 加个特殊标识属性
linker.put("elementType", ElementType.CROSS_LINKER.name());
linker.put("creator", "system");
definitionHandle.addEle(linker.getString("id"), linker);
break;
}
}
}
}else {
// 此时后置节点为某一个范围框的内部节点 找到当前内部节点归属哪个范围框 判断当前范围框是否与当前展开的内部流程接口有关联
String scopeShapeId = rearNode.getString("scopeShapeId");

View File

@ -470,10 +470,14 @@ class NodeCloseLinkerRender{
{toX + toW / 2, toY}
};
}else {
// fromX < toX && fromY > toY 目标节点在第一象限 分析可知 纵向排布的情况下 应该不会出现目标节点在第一象限的情况
return new double[][]{
{fromX + fromW, fromY + fromH / 2},
{fromX + getCurrentColMaxW(fromX) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + fromH / 2},
{fromX + getCurrentColMaxW(fromX) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY + toH / 2},
{toX, toY + toH / 2}
};
}
}
return new double[2][2];
}
private double[][] calculationLinkerPointInHorizLayOut(double[] fromBounding, double[] toBounding) {
@ -563,7 +567,12 @@ class NodeCloseLinkerRender{
};
}
}else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 横向布局的情况下 应该不会出现目标节点在第三象限的情况
ConsolePrinter.warn("[端到端功能][节点展开模块]处理连线时目标节点在[横向布局]的情况下出现在了第三象限");
return new double[][]{
{fromX + fromW / 2, fromY + fromH},
{fromX + fromW / 2, fromY + fromH + SubProcessConst.SHAPE_VERT_INTERVAL / 2},
{toX + toW / 2, fromY + fromH + SubProcessConst.SHAPE_VERT_INTERVAL / 2},
{toX + toW / 2, toY}
};
}
}
return new double[2][2];

View File

@ -583,10 +583,14 @@ class NodeExpandLinkerRender{
{toX + toW / 2, toY}
};
}else {
// fromX < toX && fromY > toY 目标节点在第一象限 分析可知 纵向排布的情况下 应该不会出现目标节点在第一象限的情况
return new double[][]{
{fromX + fromW, fromY + fromH / 2},
{fromX + getCurrentColMaxW(fromX) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, fromY + fromH / 2},
{fromX + getCurrentColMaxW(fromX) + SubProcessConst.SHAPE_HORIZ_INTERVAL / 2, toY + toH / 2},
{toX, toY + toH / 2}
};
}
}
return new double[2][2];
}
private double[][] calculationLinkerPointInHorizLayOut(double[] fromBounding, double[] toBounding) {
@ -677,7 +681,12 @@ class NodeExpandLinkerRender{
};
}
}else if (fromX > toX && fromY < toY){ // 目标节点在第三象限 横向布局的情况下 应该不会出现目标节点在第三象限的情况
ConsolePrinter.warn("[端到端功能][节点展开模块]处理连线时目标节点在[横向布局]的情况下出现在了第三象限");
return new double[][]{
{fromX + fromW / 2, fromY + fromH},
{fromX + fromW / 2, fromY + fromH + SubProcessConst.SHAPE_VERT_INTERVAL / 2},
{toX + toW / 2, fromY + fromH + SubProcessConst.SHAPE_VERT_INTERVAL / 2},
{toX + toW / 2, toY}
};
}
}
return new double[2][2];