diff --git a/pom.xml b/pom.xml
index 15940a1..2ebe390 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.7.17
+ 2.7.18
com.xydl
@@ -15,6 +15,7 @@
cac-backend project for Spring Boot
8
+ 2.16.1
@@ -89,6 +90,27 @@
easyexcel-core
3.3.3
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ ${jackson.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+ ${jackson.version}
+
diff --git a/src/main/java/com/xydl/cac/controller/IcdController.java b/src/main/java/com/xydl/cac/controller/IcdController.java
new file mode 100644
index 0000000..8f4b5b4
--- /dev/null
+++ b/src/main/java/com/xydl/cac/controller/IcdController.java
@@ -0,0 +1,34 @@
+package com.xydl.cac.controller;
+
+import com.xydl.cac.model.Response;
+import com.xydl.cac.service.IcdService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@Api(tags = {"Icd相关接口"})
+@RequestMapping("icd")
+@Slf4j
+public class IcdController extends BasicController {
+
+ @Resource
+ IcdService service;
+
+ @PostMapping("process")
+ @ApiOperation("处理icd文件")
+ public Response> process(@RequestParam("file") MultipartFile file) throws Exception {
+ if (file != null && file.getInputStream() != null) {
+ List paramList = service.loadXml(file.getInputStream());
+ return Response.success(paramList);
+ } else {
+ return Response.fail("缺少上传文件");
+ }
+ }
+
+}
diff --git a/src/main/java/com/xydl/cac/service/IcdService.java b/src/main/java/com/xydl/cac/service/IcdService.java
new file mode 100644
index 0000000..752b60f
--- /dev/null
+++ b/src/main/java/com/xydl/cac/service/IcdService.java
@@ -0,0 +1,10 @@
+package com.xydl.cac.service;
+
+import java.io.InputStream;
+import java.util.List;
+
+public interface IcdService {
+ List loadXml(InputStream input) throws Exception;
+
+ List loadXml(String xml) throws Exception;
+}
diff --git a/src/main/java/com/xydl/cac/service/impl/IcdServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/IcdServiceImpl.java
new file mode 100644
index 0000000..6d2668c
--- /dev/null
+++ b/src/main/java/com/xydl/cac/service/impl/IcdServiceImpl.java
@@ -0,0 +1,128 @@
+package com.xydl.cac.service.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.xydl.cac.service.IcdService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.InputStream;
+import java.util.*;
+
+@Service
+@Slf4j
+public class IcdServiceImpl implements IcdService {
+
+ @Override
+ public List loadXml(InputStream input) throws Exception {
+ XmlMapper xmlMapper = XmlMapper.builder()
+ .build();
+ JsonNode root = xmlMapper.readTree(input);
+ List paramList = this.processRoot(root);
+ return paramList;
+ }
+
+ @Override
+ public List loadXml(String xml) throws Exception {
+ XmlMapper xmlMapper = XmlMapper.builder()
+ .build();
+ JsonNode root = xmlMapper.readTree(xml);
+ List paramList = this.processRoot(root);
+ return paramList;
+ }
+
+ private List processRoot(JsonNode root) {
+ List paramList = new ArrayList<>();
+ List iedList = this.findNodes(root, "IED");
+
+ for (JsonNode iedNode : iedList) {
+ String iedName = iedNode.get("name").asText();
+
+ List devList = this.findNodes(iedNode, "LDevice");
+ for (JsonNode dev : devList) {
+ this.processDeviceNode(dev, iedName, paramList);
+ }
+ }
+ return paramList;
+ }
+
+ private void processDeviceNode(JsonNode deviceNode, String iedName, List paramList) {
+ String inst = deviceNode.get("inst").asText();
+ Map lnMap = this.buildLNMap(deviceNode);
+
+ List fcdaList = this.findNodes(deviceNode, "FCDA");
+ for (JsonNode fcdaNode : fcdaList) {
+ String lnClass = fcdaNode.get("lnClass").asText();
+ String lnInst = fcdaNode.get("lnInst").asText();
+ String doName = fcdaNode.get("doName").asText();
+ String fc = fcdaNode.get("fc").asText();
+
+ JsonNode lnNode = lnMap.get(lnClass + lnInst);
+ String dai = this.findLN_DOI_DAI(lnNode, doName);
+ String param = iedName + inst + "/" + lnClass + lnInst + "$" + fc + "$" + doName + "$" + dai;
+ paramList.add(param);
+ }
+ }
+
+ private Map buildLNMap(JsonNode deviceNode) {
+ Map map = new HashMap<>();
+ List lnList = this.findNodes(deviceNode, "LN");
+ for (JsonNode lnNode : lnList) {
+ String lnClass = lnNode.get("lnClass").asText();
+ String inst = lnNode.get("inst").asText();
+ map.put(lnClass + inst, lnNode);
+ }
+ return map;
+ }
+
+ private String findLN_DOI_DAI(JsonNode lnNode, String doName) {
+ String result = "";
+ List doiList = this.findNodes(lnNode, "DOI");
+ for (JsonNode doiNode : doiList) {
+ String doiName = doiNode.get("name").asText();
+ if (doiName.equals(doName)) {
+ JsonNode pnode = doiNode;
+ List sdiList = this.findNodes(doiNode, "SDI");
+ if (sdiList.size() > 0) {
+ JsonNode sdiNode = sdiList.get(0);
+ result = sdiNode.get("name").asText();
+ pnode = sdiNode;
+ }
+ List daiList = this.findNodes(pnode, "DAI");
+ if (daiList.size() > 0) {
+ JsonNode daiNode = daiList.get(0);
+ String daiName = daiNode.get("name").asText();
+ if (StringUtils.isNotBlank(result)) {
+ result = result + "$" + daiName;
+ } else {
+ result = daiName;
+ }
+ }
+ break;
+ }
+ }
+ return result;
+ }
+
+ private List findNodes(JsonNode root, String fieldName) {
+ List result = new ArrayList<>();
+ List list = root.findValues(fieldName);
+ for (JsonNode node : list) {
+ if (node instanceof ObjectNode) {
+ result.add(node);
+ }
+ if (node instanceof ArrayNode) {
+ ArrayNode array = (ArrayNode) node;
+ Iterator elements = array.elements();
+ while (elements.hasNext()) {
+ JsonNode item = elements.next();
+ result.add(item);
+ }
+ }
+ }
+ return result;
+ }
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 7d9e370..a085524 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -9,7 +9,7 @@ spring:
time-zone: GMT+8
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://192.168.50.200:3306/iec104?charset=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=60000&socketTimeout=60000
+ url: jdbc:mysql://192.168.1.190:3306/iec104?charset=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=60000&socketTimeout=60000
username: root
password: 123456
jpa: