diff --git a/src/main/java/com/xydl/cac/entity/IcdFileConfig.java b/src/main/java/com/xydl/cac/entity/IcdFileConfig.java index be5fc89..d1fd7ef 100644 --- a/src/main/java/com/xydl/cac/entity/IcdFileConfig.java +++ b/src/main/java/com/xydl/cac/entity/IcdFileConfig.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; @Data @Builder @@ -34,10 +36,26 @@ public class IcdFileConfig { @Column(name = "do_name") private String doName; + @Column(name = "last_name") + private String lastName; + @Column(name = "table_name") private String tableName; @Column(name = "col_name") private String colName; + @Transient + private List instList; + + public void addInst(String inst, String paramindex) { + if (instList == null) { + instList = new ArrayList<>(); + } + IcdFileConfigInst item = IcdFileConfigInst.builder() + .inst(inst) + .paramindex(paramindex) + .build(); + instList.add(item); + } } \ No newline at end of file diff --git a/src/main/java/com/xydl/cac/entity/IcdFileConfigInst.java b/src/main/java/com/xydl/cac/entity/IcdFileConfigInst.java new file mode 100644 index 0000000..4faa0f6 --- /dev/null +++ b/src/main/java/com/xydl/cac/entity/IcdFileConfigInst.java @@ -0,0 +1,34 @@ +package com.xydl.cac.entity; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "icd_file_config_inst") +@ApiModel("ICD文件实例表") +public class IcdFileConfigInst { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Integer id; + + @Column(name = "config_id") + private Integer configId; + + @Column(name = "inst") + private String inst; + + @Column(name = "paramindex") + private String paramindex; + +} \ No newline at end of file diff --git a/src/main/java/com/xydl/cac/repository/IcdFileConfigInstRepository.java b/src/main/java/com/xydl/cac/repository/IcdFileConfigInstRepository.java new file mode 100644 index 0000000..28ff9a6 --- /dev/null +++ b/src/main/java/com/xydl/cac/repository/IcdFileConfigInstRepository.java @@ -0,0 +1,18 @@ +package com.xydl.cac.repository; + +import com.xydl.cac.entity.IcdFileConfigInst; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; + +import java.util.List; + + +@Repository +public interface IcdFileConfigInstRepository extends JpaRepository, JpaSpecificationExecutor { + + List findByConfigId(Integer configId); + + void deleteByConfigId(Integer configId); + +} \ No newline at end of file diff --git a/src/main/java/com/xydl/cac/service/impl/IcdFileConfigServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/IcdFileConfigServiceImpl.java index 41530ea..5eb3be7 100644 --- a/src/main/java/com/xydl/cac/service/impl/IcdFileConfigServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/IcdFileConfigServiceImpl.java @@ -1,6 +1,8 @@ package com.xydl.cac.service.impl; import com.xydl.cac.entity.IcdFileConfig; +import com.xydl.cac.entity.IcdFileConfigInst; +import com.xydl.cac.repository.IcdFileConfigInstRepository; import com.xydl.cac.repository.IcdFileConfigRepository; import com.xydl.cac.service.IcdFileConfigService; import com.xydl.cac.util.IcdXmlUtil; @@ -22,6 +24,8 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { @Resource IcdFileConfigRepository repository; + @Resource + IcdFileConfigInstRepository instRepository; @Override public void upload(String xml) throws Exception { @@ -32,17 +36,28 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { config.getIedName(), config.getLdeviceInst(), config.getLnClass(), config.getDoName()); if (CollectionUtils.isEmpty(list)) { repository.save(config); + List instList = config.getInstList(); + for (IcdFileConfigInst item : instList) { + item.setConfigId(config.getId()); + } + instRepository.saveAll(instList); } } } @Override public List list(String iedName) throws Exception { + List result; if (StringUtils.isNotBlank(iedName)) { - return repository.findByIedName(iedName); + result = repository.findByIedName(iedName); } else { - return repository.findAll(); + result = repository.findAll(); + } + for (IcdFileConfig item : result) { + List list = instRepository.findByConfigId(item.getId()); + item.setInstList(list); } + return result; } @Override @@ -52,6 +67,7 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { @Override public void delete(Integer id) { + instRepository.deleteByConfigId(id); repository.deleteById(id); } diff --git a/src/main/java/com/xydl/cac/util/IcdXmlUtil.java b/src/main/java/com/xydl/cac/util/IcdXmlUtil.java index 47898ba..3229bf9 100644 --- a/src/main/java/com/xydl/cac/util/IcdXmlUtil.java +++ b/src/main/java/com/xydl/cac/util/IcdXmlUtil.java @@ -21,21 +21,26 @@ public class IcdXmlUtil { private static LinkedHashMap processTypeRoot(JsonNode root) { LinkedHashMap result = new LinkedHashMap<>(); - List iedList = findNodes(root, "IED"); + List iedList = findNodes(root, "IED"); for (JsonNode iedNode : iedList) { - String iedName = iedNode.get("name").asText(); - - List devList = findNodes(iedNode, "LDevice"); - for (JsonNode dev : devList) { - processTypeDeviceNode(dev, iedName, result); - } + processIEDNode(iedNode, result); } return result; } + private static void processIEDNode(JsonNode iedNode, LinkedHashMap result) { + String iedName = iedNode.get("name").asText(); + + List devList = findNodes(iedNode, "LDevice"); + for (JsonNode dev : devList) { + processTypeDeviceNode(dev, iedName, result); + } + } + private static void processTypeDeviceNode(JsonNode deviceNode, String iedName, LinkedHashMap result) { - String inst = deviceNode.get("inst").asText(); + String ldInst = deviceNode.get("inst").asText(); + Map lnMap = buildLNMap(deviceNode); List fcdaList = findNodes(deviceNode, "FCDA"); for (JsonNode fcdaNode : fcdaList) { @@ -44,15 +49,24 @@ public class IcdXmlUtil { String doName = fcdaNode.get("doName").asText(); String fc = fcdaNode.get("fc").asText(); - String key = iedName + "/" + inst + "/" + lnClass + "/" + doName; - if (!result.containsKey(key) && "MX".equals(fc)) { - IcdFileConfig config = IcdFileConfig.builder() - .iedName(iedName) - .ldeviceInst(inst) - .lnClass(lnClass) - .doName(doName) - .build(); - result.put(key, config); + JsonNode lnNode = lnMap.get(lnClass + lnInst); + String dai = findLN_DOI_DAI(lnNode, doName); + + String key = iedName + ldInst + "/" + lnClass + "/" + doName; + String param = iedName + ldInst + "/" + lnClass + lnInst + "$" + fc + "$" + doName + "$" + dai; + if ("MX".equals(fc)) { + IcdFileConfig config = result.get(key); + if (config == null) { + config = IcdFileConfig.builder() + .iedName(iedName) + .ldeviceInst(ldInst) + .lnClass(lnClass) + .doName(doName) + .lastName(dai) + .build(); + result.put(key, config); + } + config.addInst(lnInst, param); } } }