Преглед изворни кода

fix: addElement 添加幂等性检查,防止重复要素节点

何文松 пре 2 дана
родитељ
комит
dd9c858da2

+ 41 - 22
backend/lingyue-project/src/main/java/com/lingyue/project/project/service/ElementService.java

@@ -42,35 +42,54 @@ public class ElementService {
             throw new BusinessException(404, "项目不存在");
         }
 
-        Long elementId = nodeService.createNode(
-                Constants.NODE_ELEMENT, dto.getElementKey(), dto.getElementName(), project.getCreatedBy());
+        // 查找已存在的要素定义,或创建新的
+        Long elementId;
+        Node existingElement = nodeService.getByTypeAndKey(Constants.NODE_ELEMENT, dto.getElementKey());
+        if (existingElement != null) {
+            elementId = existingElement.getId();
+            // 检查是否已经关联到该项目
+            if (edgeService.getByTypeAndNodes(Constants.EDGE_HAS_ELEMENT, projectId, elementId) != null) {
+                // 已存在关联,直接返回
+                Map<String, Object> result = new HashMap<>();
+                result.put("elementId", elementId);
+                result.put("elementKey", dto.getElementKey());
+                result.put("existed", true);
+                return result;
+            }
+        } else {
+            // 创建新的要素定义
+            elementId = nodeService.createNode(
+                    Constants.NODE_ELEMENT, dto.getElementKey(), dto.getElementName(), project.getCreatedBy());
 
-        if (StringUtils.hasText(dto.getElementType())) {
-            propertyService.setNodeProperty(elementId, "element_type", dto.getElementType());
-        }
-        if (StringUtils.hasText(dto.getNamespace())) {
-            propertyService.setNodeProperty(elementId, "namespace", dto.getNamespace());
-        }
-        if (StringUtils.hasText(dto.getFieldName())) {
-            propertyService.setNodeProperty(elementId, "field_name", dto.getFieldName());
-        }
-        if (StringUtils.hasText(dto.getTableColumns())) {
-            propertyService.setNodePropertyJson(elementId, "table_columns", dto.getTableColumns());
-        }
-        if (dto.getRequired() != null) {
-            propertyService.setNodeProperty(elementId, "required", String.valueOf(dto.getRequired()));
-        }
-        if (StringUtils.hasText(dto.getDefaultValue())) {
-            propertyService.setNodeProperty(elementId, "default_value", dto.getDefaultValue());
-        }
-        if (StringUtils.hasText(dto.getDescription())) {
-            propertyService.setNodeProperty(elementId, "description", dto.getDescription());
+            if (StringUtils.hasText(dto.getElementType())) {
+                propertyService.setNodeProperty(elementId, "element_type", dto.getElementType());
+            }
+            if (StringUtils.hasText(dto.getNamespace())) {
+                propertyService.setNodeProperty(elementId, "namespace", dto.getNamespace());
+            }
+            if (StringUtils.hasText(dto.getFieldName())) {
+                propertyService.setNodeProperty(elementId, "field_name", dto.getFieldName());
+            }
+            if (StringUtils.hasText(dto.getTableColumns())) {
+                propertyService.setNodePropertyJson(elementId, "table_columns", dto.getTableColumns());
+            }
+            if (dto.getRequired() != null) {
+                propertyService.setNodeProperty(elementId, "required", String.valueOf(dto.getRequired()));
+            }
+            if (StringUtils.hasText(dto.getDefaultValue())) {
+                propertyService.setNodeProperty(elementId, "default_value", dto.getDefaultValue());
+            }
+            if (StringUtils.hasText(dto.getDescription())) {
+                propertyService.setNodeProperty(elementId, "description", dto.getDescription());
+            }
         }
 
+        // 创建项目与要素的关联
         int sortOrder = dto.getSortOrder() != null ? dto.getSortOrder() :
                 edgeService.countByTypeAndFrom(Constants.EDGE_HAS_ELEMENT, projectId);
         edgeService.createEdge(Constants.EDGE_HAS_ELEMENT, projectId, elementId, sortOrder);
 
+        // 为该项目创建新的值节点(node_key使用elementKey,用于视图查询)
         Long valueId = nodeService.createNode(
                 Constants.NODE_VALUE, dto.getElementKey(), dto.getElementName() + "-值", project.getCreatedBy());
         propertyService.setNodeProperty(valueId, "value_text", "");