Browse Source

bug修改;代码调整;diagram存储逻辑调整

zhaoyk 3 years ago
parent
commit
08c58c3ff0
19 changed files with 193 additions and 71 deletions
  1. 6 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/config/InterceptorAdapterConfig.java
  2. 18 22
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/DiagramBuilder.java
  3. 1 1
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/DiagramDataLoader.java
  4. 13 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/line/PathBuilder.java
  5. 11 1
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/AbstractLine.java
  6. 46 20
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/Diagram.java
  7. 27 12
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/EquipmentNode.java
  8. 7 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/Line.java
  9. 9 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/AbstractComponent.java
  10. 1 1
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/Container.java
  11. 2 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/IComponent.java
  12. 1 1
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/IContainer.java
  13. 17 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/IDataBind.java
  14. 4 3
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/logic/CalcContext.java
  15. 11 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/template/DiagramTemplate.java
  16. 6 0
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/template/MainPipe.java
  17. 1 1
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/virtual/PackNode.java
  18. 8 6
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/util/MyObjectMapper.java
  19. 4 3
      adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/manage/TemplateManager.java

+ 6 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/config/InterceptorAdapterConfig.java

@@ -4,6 +4,7 @@ package com.persagy.adm.diagram.config;
 import com.persagy.adm.diagram.frame.BdtpInterceptor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -24,4 +25,9 @@ public class InterceptorAdapterConfig implements WebMvcConfigurer {
 		registry.addInterceptor(bdtpInterceptor());
 	}
 
+//	@Override
+//	public void addCorsMappings(CorsRegistry registry) {
+//		registry.addMapping("/**");
+//	}
+
 }

+ 18 - 22
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/DiagramBuilder.java

@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.adm.diagram.core.model.*;
 import com.persagy.adm.diagram.core.model.base.Container;
 import com.persagy.adm.diagram.core.model.base.IComponent;
+import com.persagy.adm.diagram.core.model.base.IDataBind;
 import com.persagy.adm.diagram.core.model.base.IEquipHolder;
 import com.persagy.adm.diagram.core.model.legend.Anchor;
 import com.persagy.adm.diagram.core.model.legend.Legend;
@@ -100,7 +101,7 @@ public class DiagramBuilder {
 
 		handleNodes();
 
-		buildContainers(containers);
+		handleContainers(containers);
 	}
 
 	private void addEquipNode(Container con, ObjectNode obj){
@@ -110,7 +111,7 @@ public class DiagramBuilder {
 
 		EquipmentNode node = new EquipmentNode();
 		node.setId(IdUtil.simpleUUID());
-		node.setObjId(obj.get("id").asText());
+		node.setDataObjectId(obj.get("id").asText());
 		node.setObjClassCode(DiagramBuilder.getClassCode(obj));
 		node.setDataObject(obj);
 
@@ -131,7 +132,7 @@ public class DiagramBuilder {
 		node.setLabel(label);
 
 		diagram.getNodes().add(node);
-		context.getEquipMap().put(node.getObjId(), node);
+		context.getEquipMap().put(node.getDataObjectId(), node);
 	}
 
 	private void addPackData(Container con, ObjectNode obj){
@@ -199,16 +200,6 @@ public class DiagramBuilder {
 		return false;
 	}
 
-	private void buildContainers(List<Container> containers) {
-		for(Container con : containers) {
-			if(con.isEquipmentBox()) {
-				if(Boolean.TRUE.equals(con.getProp(Container.PROP_AUTO_HIDDEN)) && CollUtil.isEmpty(con.getChildren())) {
-					con.setHidden(true);
-				}
-			}
-		}
-	}
-
 	/**
 	 * 对节点进行处理,并返回图例锚点会使用到的关系类型
 	 */
@@ -235,6 +226,16 @@ public class DiagramBuilder {
 		}
 	}
 
+	private void handleContainers(List<Container> containers) {
+		for(Container con : containers) {
+			if(con.isEquipmentBox()) {
+				if(Boolean.TRUE.equals(con.getProp(Container.PROP_AUTO_HIDDEN)) && CollUtil.isEmpty(con.getChildren())) {
+					con.setHidden(true);
+				}
+			}
+		}
+	}
+
 	private String getTypeName(String classCode){
 		//TODO
 		return classCode;
@@ -294,8 +295,8 @@ public class DiagramBuilder {
 		}
 
 		for(ObjectNode rel : optionalRels) {
-			Object fromObj = context.getEquipMap().get(rel.get(ObjectRelation.OBJ_FROM_HUM).asText());
-			Object toObj = context.getEquipMap().get(rel.get(ObjectRelation.OBJ_TO_HUM).asText());
+			IDataBind fromObj = context.getEquipMap().get(rel.get(ObjectRelation.OBJ_FROM_HUM).asText());
+			IDataBind toObj = context.getEquipMap().get(rel.get(ObjectRelation.OBJ_TO_HUM).asText());
 
 			if(fromObj != null && toObj != null) {
 				String relType = rel.get(ObjectRelation.GRAPH_CODE_HUM).asText() + '/' + rel.get(ObjectRelation.REL_CODE_HUM).asText();
@@ -318,13 +319,8 @@ public class DiagramBuilder {
 
 	}
 
-	private ConnectPoint getConnectPoint(Object obj, String  relType, Object theOtherEnd){
-		ObjectNode theOtherData = null;
-		if(theOtherEnd instanceof EquipmentNode) {
-			theOtherData = (ObjectNode) ((EquipmentNode) theOtherEnd).getDataObject();
-		} else if(theOtherEnd instanceof MainPipe) {
-			theOtherData = (ObjectNode) ((MainPipe) theOtherEnd).getDataObject();
-		}
+	private ConnectPoint getConnectPoint(IDataBind obj, String  relType, IDataBind theOtherEnd){
+		ObjectNode theOtherData = (ObjectNode) theOtherEnd.getDataObject();
 		String theOtherType = getClassCode(theOtherData);
 
 		if(obj instanceof EquipmentNode) {

+ 1 - 1
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/DiagramDataLoader.java

@@ -61,7 +61,7 @@ public class DiagramDataLoader {
 
 			if(EquipmentNode.TYPE.equals(node.getCompType())) { //设备节点
 				EquipmentNode en = (EquipmentNode) node;
-				obj = objMap.get(en.getObjId());
+				obj = objMap.get(en.getDataObjectId());
 
 				if(en.getLegendId() != null) {
 					en.setLegend(dataStrategy.getLegend(en.getLegendId(), en.getObjSystemCode())); //TODO 批量查询优化

+ 13 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/line/PathBuilder.java

@@ -526,6 +526,19 @@ public class PathBuilder {
 
             if (vDirection == vEndNbr) { //当前方向与终点通道方向相同
                 if (vEndNbr == hLine) { //endLine与通道垂直
+                    //当前点和线有偏差时,先做调整
+                    int[] targetScope = new int[]{Math.max(lineScope[0], endNbr[0]), Math.min(lineScope[1], endNbr[1])};
+                    int pos = vEndNbr ? currentPoint.x : currentPoint.y;
+                    if(!(pos > targetScope[0] && pos < targetScope[1])){
+                        int safeOffset = 5;//临时避免和节点边线重合
+                        int target0 = targetScope[0] + safeOffset + random.nextInt(targetScope[1] - targetScope[0] - safeOffset * 2);
+                        if (vEndNbr) {
+                            currentPoint.x = target0;
+                        } else {
+                            currentPoint.y = target0;
+                        }
+                    }
+
                     moveTo(lineTrackPos, hLine); //线横向时做纵向移动
                 } else { //endLine与通道平行
                     //TODO 可能需要调整,避免和线水平连接

+ 11 - 1
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/AbstractLine.java

@@ -1,13 +1,14 @@
 package com.persagy.adm.diagram.core.model;
 
 import com.google.gson.annotations.Expose;
+import com.persagy.adm.diagram.core.model.base.IDataBind;
 import com.persagy.adm.diagram.core.model.style.LineStyle;
 
 /**
  * 线的基类
  * @author zhaoyk
  */
-abstract public class AbstractLine {
+abstract public class AbstractLine implements IDataBind {
 
 	@Expose
 	protected String id;
@@ -39,6 +40,11 @@ abstract public class AbstractLine {
 	 */
 	abstract public void layout(Object layoutContext);
 
+	/**
+	 * 清除布局信息
+	 */
+	abstract public void clearLayout();
+
 	public String getId() {
 		return id;
 	}
@@ -79,18 +85,22 @@ abstract public class AbstractLine {
 		this.label = label;
 	}
 
+	@Override
 	public Object getDataObject() {
 		return dataObject;
 	}
 
+	@Override
 	public void setDataObject(Object dataObject) {
 		this.dataObject = dataObject;
 	}
 
+	@Override
 	public String getDataObjectId() {
 		return dataObjectId;
 	}
 
+	@Override
 	public void setDataObjectId(String dataObjectId) {
 		this.dataObjectId = dataObjectId;
 	}

+ 46 - 20
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/Diagram.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
 import com.google.gson.annotations.Expose;
 import com.persagy.adm.diagram.core.line.LineLayoutManager;
 import com.persagy.adm.diagram.core.model.base.Container;
+import com.persagy.adm.diagram.core.model.base.IComponent;
 import com.persagy.adm.diagram.core.model.base.XY;
 import com.persagy.adm.diagram.core.model.logic.CalcContext;
 import com.persagy.adm.diagram.core.model.template.DiagramTemplate;
@@ -75,40 +76,53 @@ public class Diagram {
 	private Map<String, Object> extraProps;
 
 	/**
-	 * 节点列表
-	 */
-	@Expose
-	private List<DiagramNode> nodes = new ArrayList<>();
-
-	/**
 	 * 连线列表
 	 */
 	@Expose
 	private List<Line> lines = new ArrayList();
 
-	//运行时
-	@Expose(serialize = false)
+	@Expose
 	private DiagramTemplate template;
 
+	@Expose
 	private XY size;
 
+
+	/**
+	 * 节点列表,运行时&显示态数据结构
+	 */
+	@Expose //TODO 删掉
+	private List<DiagramNode> nodes = new ArrayList<>();
+
+
 	public void init(){
 		if (template != null) {
 			template.init();
-		}
 
-		nodes.sort(new Comparator<DiagramNode>() {
-			@Override
-			public int compare(DiagramNode o1, DiagramNode o2) {
-				return o1.getLayoutIndex() - o2.getLayoutIndex();
-			}
-		});
-		for (DiagramNode node : nodes) {
-			Container con = template.getContainerById(node.getContainerId());
-			if (con != null) {
-				con.addComp(node);
+			List<Container> containers = template.getContainers();
+			for(Container con : containers) {
+				if(con.isEquipmentBox()) {
+					for(IComponent comp : con.getChildren()) {
+						if(comp instanceof DiagramNode){
+							nodes.add((DiagramNode) comp);
+						}
+					}
+				}
 			}
 		}
+
+//		nodes.sort(new Comparator<DiagramNode>() {
+//			@Override
+//			public int compare(DiagramNode o1, DiagramNode o2) {
+//				return o1.getLayoutIndex() - o2.getLayoutIndex();
+//			}
+//		});
+//		for (DiagramNode node : nodes) {
+//			Container con = template.getContainerById(node.getContainerId());
+//			if (con != null) {
+//				con.addComp(node);
+//			}
+//		}
 	}
 
 	public void layout(CalcContext context){
@@ -124,6 +138,18 @@ public class Diagram {
 		this.size = template.getFrame().getSize();
 	}
 
+	public void clearLayout(){
+		if(template != null) {
+			template.clearLayout();
+		}
+
+		for(Line line : lines) {
+			line.clearLayout();
+		}
+
+		this.size = null;
+	}
+
 	public void toAbsoluteLocation(){
 		for (DiagramNode node : nodes) {
 			node.setLocation(node.locationToRoot());
@@ -148,7 +174,7 @@ public class Diagram {
 		List<String> ids = new ArrayList<>();
 		for(DiagramNode node : nodes) {
 			if(EquipmentNode.TYPE.equals(node.getCompType())) {
-				ids.add(((EquipmentNode) node).getObjId());
+				ids.add(((EquipmentNode) node).getDataObjectId());
 			}
 		}
 		if(template != null && template.getMainPipes() != null) {

+ 27 - 12
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/EquipmentNode.java

@@ -2,6 +2,7 @@ package com.persagy.adm.diagram.core.model;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.gson.annotations.Expose;
+import com.persagy.adm.diagram.core.model.base.IDataBind;
 import com.persagy.adm.diagram.core.model.base.XY;
 import com.persagy.adm.diagram.core.model.legend.Anchor;
 import com.persagy.adm.diagram.core.model.legend.Legend;
@@ -13,7 +14,7 @@ import java.util.Map;
  * 设备节点
  * @author zhaoyk
  */
-public class EquipmentNode extends DiagramNode {
+public class EquipmentNode extends DiagramNode implements IDataBind {
 
 	public static final String TYPE = "equipmentNode";
 
@@ -21,7 +22,7 @@ public class EquipmentNode extends DiagramNode {
 	 * 绑定的数据对象id
 	 */
 	@Expose
-	private String objId;
+	private String dataObjectId;
 
 	/**
 	 * 数据对象的classCode
@@ -50,12 +51,6 @@ public class EquipmentNode extends DiagramNode {
 	@Override
 	public void layout() {
 		setSize(new XY(legend.getWidth(), legend.getHeight()));
-		if(legend.getAnchors() != null) {
-			anchorLocations = new HashMap<>();
-			for(Anchor anchor : legend.getAnchors()) {
-				anchorLocations.put(anchor.getCode(), anchor.calcLocation(size));
-			}
-		}
 
 		if(label != null) {
 			label.setLocation(new XY(10, 10)); //TODO
@@ -64,12 +59,24 @@ public class EquipmentNode extends DiagramNode {
 		//TODO anchors
 	}
 
-	public String getObjId() {
-		return objId;
+	@Override
+	public String getDataObjectId() {
+		return dataObjectId;
+	}
+
+	@Override
+	public void setDataObjectId(String dataObjectId) {
+		this.dataObjectId = dataObjectId;
+	}
+
+	@Override
+	public Object getDataObject() {
+		return super.getDataObject();
 	}
 
-	public void setObjId(String objId) {
-		this.objId = objId;
+	@Override
+	public void setDataObject(Object dataObject) {
+		super.setDataObject(dataObject);
 	}
 
 	public String getObjClassCode() {
@@ -109,6 +116,14 @@ public class EquipmentNode extends DiagramNode {
 	}
 
 	public Map<String, XY> getAnchorLocations() {
+		if (anchorLocations == null) {
+			if (legend.getAnchors() != null) {
+				anchorLocations = new HashMap<>();
+				for (Anchor anchor : legend.getAnchors()) {
+					anchorLocations.put(anchor.getCode(), anchor.calcLocation(size));
+				}
+			}
+		}
 		return anchorLocations;
 	}
 

+ 7 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/Line.java

@@ -58,11 +58,13 @@ public class Line extends AbstractLine {
 	/**
 	 * 连线的坐标点序列(包含from,to连接点坐标)
 	 */
+	@Expose
 	private List<XY> locationPath;
 
 	/**
 	 * 连线的状态标记
 	 */
+	@Expose
 	private String flag;
 
 	public Line() {
@@ -75,6 +77,11 @@ public class Line extends AbstractLine {
 		locationPath = layoutManager.layout(this);
 	}
 
+	@Override
+	public void clearLayout() {
+		locationPath = null;
+	}
+
 	public int getDirection() {
 		return direction;
 	}

+ 9 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/AbstractComponent.java

@@ -36,16 +36,19 @@ abstract public class AbstractComponent implements IComponent {
 	/**
 	 * 布局定位
 	 */
+	@Expose
 	protected XY location;
 
 	/**
 	 * 布局尺寸
 	 */
+	@Expose
 	protected XY size;
 
 	/**
 	 * 组件的显示/隐藏状态
 	 */
+	@Expose
 	protected boolean hidden;
 
 	/**
@@ -165,6 +168,12 @@ abstract public class AbstractComponent implements IComponent {
 		this.props = props;
 	}
 
+	@Override
+	public void clearLayout() {
+		location = null;
+		size = null;
+	}
+
 	/**
 	 * 相对根容器的坐标位置
 	 */

+ 1 - 1
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/Container.java

@@ -17,7 +17,7 @@ import java.util.stream.Collectors;
  * 布局容器
  * @author zhaoyk
  */
-public class Container extends AbstractComponent implements IContainer {
+public class Container extends AbstractComponent implements IContainer, IEquipHolder {
 
 	public static final String TYPE = "container";
 

+ 2 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/IComponent.java

@@ -22,6 +22,8 @@ public interface IComponent {
 
     void layout();
 
+    void clearLayout();
+
     XY getLocation();
 
     void setLocation(XY xy);

+ 1 - 1
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/IContainer.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 容器接口
  * @author zhaoyk
  */
-public interface IContainer extends IComponent, IEquipHolder {
+public interface IContainer extends IComponent {
 
     Layout getLayout();
 

+ 17 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/base/IDataBind.java

@@ -0,0 +1,17 @@
+package com.persagy.adm.diagram.core.model.base;
+
+/**
+ * 数据绑定接口
+ * @author zhaoyk
+ */
+public interface IDataBind {
+
+	String getDataObjectId();
+
+	void setDataObjectId(String dataObjectId);
+
+	Object getDataObject();
+
+	void setDataObject(Object dataObject);
+
+}

+ 4 - 3
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/logic/CalcContext.java

@@ -6,6 +6,7 @@ import com.persagy.adm.diagram.core.model.Diagram;
 import com.persagy.adm.diagram.core.model.EquipmentNode;
 import com.persagy.adm.diagram.core.model.Line;
 import com.persagy.adm.diagram.core.model.base.Container;
+import com.persagy.adm.diagram.core.model.base.IDataBind;
 import com.persagy.adm.diagram.core.model.template.DiagramTemplate;
 import com.persagy.adm.diagram.core.model.template.MainPipe;
 
@@ -31,7 +32,7 @@ public class CalcContext {
 	/**
 	 * 记录已经使用的数据id和对应的组件
 	 */
-	private HashMap<String, Object> equipMap = new HashMap<>();
+	private HashMap<String, IDataBind> equipMap = new HashMap<>();
 
 	/**
 	 * 记录已经使用的关系id和对应的连线
@@ -49,7 +50,7 @@ public class CalcContext {
 		//记录节点中已使用的数据id
 		diagram.getNodes().forEach(node -> {
 			if (EquipmentNode.TYPE.equals(node.getCompType())) {
-				equipMap.put(((EquipmentNode) node).getObjId(), node);
+				equipMap.put(((EquipmentNode) node).getDataObjectId(), (EquipmentNode)node);
 			}
 		});
 		//记录干管中已使用的数据id
@@ -96,7 +97,7 @@ public class CalcContext {
 		return template;
 	}
 
-	public HashMap<String, Object> getEquipMap() {
+	public HashMap<String, IDataBind> getEquipMap() {
 		return equipMap;
 	}
 

+ 11 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/template/DiagramTemplate.java

@@ -224,6 +224,17 @@ public class DiagramTemplate {
 		}
 	}
 
+	public void clearLayout(){
+		for(Container con : getContainers()) {
+			con.clearLayout();
+		}
+		if(mainPipes != null) {
+			for (MainPipe mainPipe : mainPipes){
+				mainPipe.clearLayout();
+			}
+		}
+	}
+
 	public List<Container> getContainers() {
 		List<Container> list = new ArrayList<>();
 		getContainers(frame, list);

+ 6 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/template/MainPipe.java

@@ -57,6 +57,7 @@ public class MainPipe extends AbstractLine implements IEquipHolder {
 	/**
 	 * 连线的坐标点序列,多条线
 	 */
+	@Expose
 	private List<List<XY>> locationPath;
 
 	/**
@@ -203,6 +204,11 @@ public class MainPipe extends AbstractLine implements IEquipHolder {
 	}
 
 	@Override
+	public void clearLayout() {
+		locationPath = null;
+	}
+
+	@Override
 	public String getId() {
 		return id;
 	}

+ 1 - 1
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/model/virtual/PackNode.java

@@ -30,7 +30,7 @@ public class PackNode extends EquipmentNode {
 	 * 重写getObjId方法,返回节点id
 	 */
 	@Override
-	public String getObjId() {
+	public String getDataObjectId() {
 		return id;
 	}
 

+ 8 - 6
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/util/MyObjectMapper.java

@@ -28,7 +28,7 @@ public class MyObjectMapper {
 
 	@Autowired
 	public MyObjectMapper(ObjectMapper objectMapper) {
-		this.objectMapper = getCommonMapper();
+		this.objectMapper = getCommonMapper(objectMapper);
 
 		this.mapper4Edit = buildMapper4Edit();
 		this.mapper4View = buildMapper4View();
@@ -42,9 +42,7 @@ public class MyObjectMapper {
 		return mapper4View;
 	}
 
-	private ObjectMapper getCommonMapper() {
-		ObjectMapper mapper = new ObjectMapper();
-
+	private ObjectMapper getCommonMapper(ObjectMapper mapper) {
 		//objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 		mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
@@ -56,7 +54,7 @@ public class MyObjectMapper {
 	}
 
 	private ObjectMapper buildMapper4Edit() {
-		ObjectMapper mapper = getCommonMapper();
+		ObjectMapper mapper = getCommonMapper(new ObjectMapper());
 		mapper.addMixIn(Diagram.class, Diagram4Edit.class);
 		mapper.addMixIn(DiagramTemplate.class, Template4Edit.class);
 
@@ -64,7 +62,7 @@ public class MyObjectMapper {
 	}
 
 	private ObjectMapper buildMapper4View() {
-		ObjectMapper mapper = getCommonMapper();
+		ObjectMapper mapper = getCommonMapper(new ObjectMapper());
 		mapper.addMixIn(Diagram.class, Diagram4View.class);
 		mapper.addMixIn(DiagramTemplate.class, Template4View.class);
 		mapper.addMixIn(MainPipe.class, MainPipe4View.class);
@@ -73,6 +71,8 @@ public class MyObjectMapper {
 		return mapper;
 	}
 
+
+	/** 编辑态数据结构 */
 	@JsonIgnoreProperties({"nodes"})
 	public interface Diagram4Edit {
 	}
@@ -81,6 +81,8 @@ public class MyObjectMapper {
 	public interface Template4Edit {
 	}
 
+
+	/** 显示态数据结构 */
 	@JsonIgnoreProperties({})
 	public interface Diagram4View {
 	}

+ 4 - 3
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/manage/TemplateManager.java

@@ -142,9 +142,10 @@ public class TemplateManager {
      * 保存模板
      */
     public DiagramTemplate saveTemplate(DiagramTemplate template) {
-        template = dataStrategy.saveTemplate(template);
-        buildTemplate(template);
-        return template;
+        template.clearLayout(); //保存模板之前,清除布局数据
+        DiagramTemplate rtn = dataStrategy.saveTemplate(template);
+        buildTemplate(rtn);
+        return rtn;
     }
 
     private void buildTemplate(DiagramTemplate template) {