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: