diff --git a/src/main/java/com/xydl/cac/entity/IcdConfigType.java b/src/main/java/com/xydl/cac/entity/IcdConfigType.java index ae4a00a..6a0bfc7 100644 --- a/src/main/java/com/xydl/cac/entity/IcdConfigType.java +++ b/src/main/java/com/xydl/cac/entity/IcdConfigType.java @@ -27,6 +27,18 @@ public class IcdConfigType { @Column(name = "id") private Integer id; + @ApiModelProperty(name = "ICD文件id") + @Column(name = "icd_file_id") + private Integer icdFileId; + + @ApiModelProperty(name = "ip") + @Column(name = "ip") + private String ip; + + @ApiModelProperty(name = "OSI-AP-Title") + @Column(name = "ap_title") + private String apTitle; + @ApiModelProperty(name = "IED名称") @Column(name = "ied_name") private String iedName; diff --git a/src/main/java/com/xydl/cac/entity/IcdFile.java b/src/main/java/com/xydl/cac/entity/IcdFile.java new file mode 100644 index 0000000..35d917c --- /dev/null +++ b/src/main/java/com/xydl/cac/entity/IcdFile.java @@ -0,0 +1,39 @@ +package com.xydl.cac.entity; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "icd_file") +@ApiModel("ICD文件表") +public class IcdFile { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Integer id; + + @ApiModelProperty(name = "md5") + @Column(name = "md5") + private String md5; + + @ApiModelProperty(name = "xml") + @Column(name = "xml") + private String xml; + + @Transient + private List configList; +} \ No newline at end of file diff --git a/src/main/java/com/xydl/cac/repository/IcdFileRepository.java b/src/main/java/com/xydl/cac/repository/IcdFileRepository.java new file mode 100644 index 0000000..c104d5e --- /dev/null +++ b/src/main/java/com/xydl/cac/repository/IcdFileRepository.java @@ -0,0 +1,15 @@ +package com.xydl.cac.repository; + +import com.xydl.cac.entity.IcdFile; +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 IcdFileRepository extends JpaRepository, JpaSpecificationExecutor { + + List findByMd5(String md5); +} \ 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 511100e..f75382a 100644 --- a/src/main/java/com/xydl/cac/service/impl/IcdFileConfigServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/IcdFileConfigServiceImpl.java @@ -6,6 +6,7 @@ import com.xydl.cac.model.IcdAttUpdateModel; import com.xydl.cac.repository.*; import com.xydl.cac.service.IcdFileConfigService; import com.xydl.cac.util.IcdXmlUtil; +import com.xydl.cac.util.Md5; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.jdbc.core.JdbcTemplate; @@ -22,7 +23,9 @@ import java.util.*; public class IcdFileConfigServiceImpl implements IcdFileConfigService { @Resource - IcdConfigTypeRepository repository; + IcdFileRepository fileRepository; + @Resource + IcdConfigTypeRepository configRepository; @Resource IcdConfigTypeAttRepository attRepository; @Resource @@ -34,16 +37,18 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { @Override public void upload(String xml) throws Exception { - LinkedHashMap result = IcdXmlUtil.loadIcdType(xml); - Collection configList = result.values(); - for (IcdConfigType config : configList) { - List list = repository.findByIedNameAndLdeviceInstAndLnClass( - config.getIedName(), config.getLdeviceInst(), config.getLnClass()); - if (CollectionUtils.isEmpty(list)) { - repository.save(config); - } else { - config.setId(list.get(0).getId()); - } + String md5 = Md5.getMD5Code(xml); + List files = fileRepository.findByMd5(md5); + if (!CollectionUtils.isEmpty(files)) { + throw new BusinessException("该文件已存在"); + } + + IcdFile icdFile = IcdXmlUtil.loadIcdType(xml); + icdFile.setMd5(md5); + fileRepository.save(icdFile); + for (IcdConfigType config : icdFile.getConfigList()) { + config.setIcdFileId(icdFile.getId()); + configRepository.save(config); attRepository.deleteByIcdConfigTypeId(config.getId()); if (config.getAttMap() != null) { @@ -77,9 +82,9 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { public List list(String iedName) throws Exception { List result; if (StringUtils.isNotBlank(iedName)) { - result = repository.findByIedName(iedName); + result = configRepository.findByIedName(iedName); } else { - result = repository.findAll(); + result = configRepository.findAll(); } for (IcdConfigType item : result) { List atts = attRepository.findByIcdConfigTypeId(item.getId()); @@ -97,7 +102,7 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { @Override public void update(IcdConfigType item) throws Exception { - Optional optional = repository.findById(item.getId()); + Optional optional = configRepository.findById(item.getId()); if (!optional.isPresent()) { throw new BusinessException("未找到该项"); } @@ -110,7 +115,7 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { attRepository.saveAll(attList); } r.setTableName(item.getTableName()); - repository.save(r); + configRepository.save(r); } @Override @@ -133,7 +138,7 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { public void delete(Integer id) { instRepository.deleteByIcdConfigTypeId(id); attRepository.deleteByIcdConfigTypeId(id); - repository.deleteById(id); + configRepository.deleteById(id); } @Override @@ -145,7 +150,8 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { public void clearAll() { instRepository.deleteAll(); attRepository.deleteAll(); - repository.deleteAll(); + configRepository.deleteAll(); + fileRepository.deleteAll(); } @Override @@ -157,7 +163,7 @@ public class IcdFileConfigServiceImpl implements IcdFileConfigService { } List paramList = new ArrayList<>(); - List typeLIst = repository.findAll(); + List typeLIst = configRepository.findAll(); for (IcdConfigType type : typeLIst) { List instList = instRepository.findByIcdConfigTypeId(type.getId()); List attList = attRepository.findByIcdConfigTypeId(type.getId()); diff --git a/src/main/java/com/xydl/cac/util/IcdXmlUtil.java b/src/main/java/com/xydl/cac/util/IcdXmlUtil.java index d9c616a..d574069 100644 --- a/src/main/java/com/xydl/cac/util/IcdXmlUtil.java +++ b/src/main/java/com/xydl/cac/util/IcdXmlUtil.java @@ -5,6 +5,7 @@ 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.entity.IcdConfigType; +import com.xydl.cac.entity.IcdFile; import com.xydl.cac.exception.BusinessException; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -13,7 +14,7 @@ import java.util.*; public class IcdXmlUtil { - public static LinkedHashMap loadIcdType(String xml) throws Exception { + public static IcdFile loadIcdType(String xml) throws Exception { XmlMapper xmlMapper = XmlMapper.builder() .build(); JsonNode root; @@ -22,12 +23,16 @@ public class IcdXmlUtil { } catch (Exception ex) { throw new BusinessException("ICD文件解析失败,请上传正确的xml类型文件"); } - LinkedHashMap result = processTypeRoot(root); - return result; + IcdFile icdFile = IcdFile.builder() + .xml(xml) + .build(); + LinkedHashMap iedMap = processTypeRoot(root); + icdFile.setConfigList(new ArrayList<>(iedMap.values())); + return icdFile; } private static LinkedHashMap processTypeRoot(JsonNode root) { - LinkedHashMap result = new LinkedHashMap<>(); + LinkedHashMap iedMap = new LinkedHashMap<>(); Map mapLNodeType = buildLNodeTypeMap(root); Map mapDOType = buildDOTypeMap(root); @@ -35,24 +40,46 @@ public class IcdXmlUtil { List iedList = findNodes(root, "IED"); for (JsonNode iedNode : iedList) { - processIEDNode(result, iedNode, + processIEDNode(iedMap, iedNode, mapLNodeType, mapDOType, mapDAType); } - return result; + + List apList = findNodes(root, "ConnectedAP"); + for (JsonNode apNode : apList) { + String iedName = apNode.get("iedName").asText(); + IcdConfigType config = iedMap.get(iedName); + if (config != null) { + processAPNode(apNode, config); + } + } + + return iedMap; + } + + private static void processAPNode(JsonNode apNode, IcdConfigType config) { + List pList = findNodes(apNode, "P"); + for (JsonNode pNode : pList) { + String type = pNode.get("type").asText(); + if ("IP".equalsIgnoreCase(type)) { + config.setIp(pNode.asText()); + } else if ("OSI-AP-Title".equalsIgnoreCase(type)) { + config.setApTitle(pNode.asText()); + } + } } - private static void processIEDNode(LinkedHashMap result, JsonNode iedNode, + private static void processIEDNode(LinkedHashMap iedMap, JsonNode iedNode, Map mapLNodeType, Map mapDOType, Map mapDAType) { String iedName = iedNode.get("name").asText(); List devList = findNodes(iedNode, "LDevice"); for (JsonNode dev : devList) { - processTypeDeviceNode(result, iedName, dev, + processTypeDeviceNode(iedMap, iedName, dev, mapLNodeType, mapDOType, mapDAType); } } - private static void processTypeDeviceNode(LinkedHashMap result, String iedName, JsonNode deviceNode, + private static void processTypeDeviceNode(LinkedHashMap iedMap, String iedName, JsonNode deviceNode, Map mapLNodeType, Map mapDOType, Map mapDAType) { String ldeviceInst = deviceNode.get("inst").asText(); Map mapLN = buildLNMap(deviceNode); @@ -84,7 +111,7 @@ public class IcdXmlUtil { String key = iedName + ldeviceInst + "/" + lnClass; if ("MX".equals(fc)) { - IcdConfigType config = result.get(key); + IcdConfigType config = iedMap.get(key); if (config == null) { config = IcdConfigType.builder() .iedName(iedName) @@ -92,20 +119,20 @@ public class IcdXmlUtil { .lnClass(lnClass) .lnDesc(lnDesc) .build(); - result.put(key, config); + iedMap.put(key, config); } String param = fc + "$" + doName + "$" + lastname; config.addInst(lnInst); config.addAtt(doName, doDesc, param, lnInst); } else if ("ST".equals(fc)) { - IcdConfigType config = result.get(key); + IcdConfigType config = iedMap.get(key); if (config == null) { config = IcdConfigType.builder() .iedName(iedName) .ldeviceInst(ldeviceInst) .lnClass(lnClass) .build(); - result.put(key, config); + iedMap.put(key, config); } String param = fc + "$" + doName + "$" + lastname; config.addInst(lnInst);