diff --git a/src/main/java/com/supervision/neo4j/dto/WebRelDTO.java b/src/main/java/com/supervision/neo4j/dto/WebRelDTO.java index 3ddc7be..06e730b 100644 --- a/src/main/java/com/supervision/neo4j/dto/WebRelDTO.java +++ b/src/main/java/com/supervision/neo4j/dto/WebRelDTO.java @@ -16,4 +16,10 @@ public class WebRelDTO { this.target = String.valueOf(target); this.name = name; } + + public WebRelDTO(String source, String target, String name) { + this.source = source; + this.target = target; + this.name = name; + } } diff --git a/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java b/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java index b71d5bb..74a649b 100644 --- a/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java +++ b/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java @@ -1,9 +1,6 @@ package com.supervision.neo4j.service.impl; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSON; -import cn.hutool.json.JSONUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import com.supervision.common.domain.R; @@ -15,16 +12,16 @@ import com.supervision.neo4j.service.Neo4jService; import com.supervision.neo4j.utils.Neo4jUtils; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.neo4j.cypherdsl.core.Case; import org.neo4j.driver.*; import org.neo4j.driver.Record; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * @author qmy @@ -312,31 +309,112 @@ public class Neo4jServiceImpl implements Neo4jService { } catch (Exception e) { e.printStackTrace(); } + + // 节点和关系合并 + Map nodeRecordMap = electNodeRecord(nodes); + list = mergerWebRel(list,nodeRecordMap); + nodes = mergeNode(nodes, nodeRecordMap); + map.put("list", list); map.put("nodes", nodes); return R.ok(map); } -// @Override -// public R test() { -// Session session = driver.session(); -// Map params = new HashMap<>(); -// params.put("lawActor", "行为人"); -// params.put("lawParty", "aaaaaa"); -// Result run = session.run("MATCH (m:LawActor), (n:FictionalOrgan) where m.name=$lawActor OPTIONAL MATCH (m)-[r:`冒充`]->(n) RETURN id(m) as startId, id(n) as endId, id(r) as relId, m.recordId as recordId, m.recordsId as recordsId", params); -// while (run.hasNext()) { -// Record record = run.next(); -// -// String id = Neo4jUtils.valueTransportString(record.get("startId")); -// String endId = Neo4jUtils.valueTransportString(record.get("endId")); -// String relId = Neo4jUtils.valueTransportString(record.get("relId")); -// System.out.println("************" + id); -// System.out.println("************" + endId); -// System.out.println("************" + relId); -// } -// return R.ok("222"); -// } + record NodeMapRecord(String name, String id, Set idSet) { + } + + + /** + * 推选出代表节点信息 + * @param nodes key: name ,entityName,id 节点信息 + * @return + */ + private Map electNodeRecord(List> nodes){ + Map nodeRecordMap = new HashMap<>(); + for (Map node : nodes) { + String name = node.get("name"); + String id = node.get("id"); + NodeMapRecord nodeMapRecord = nodeRecordMap.get(name); + if (nodeMapRecord == null){ + Set idSet = new HashSet<>(); + idSet.add(id); + nodeRecordMap.put(name, new NodeMapRecord(name, id,idSet)); + }else { + nodeMapRecord.idSet.add(id); + } + } + return nodeRecordMap; + } + /** + *合并节点信息 + * 合并依据: + * name为唯一标识 + * @param nodes key: name ,entityName,id + * @param nodeRecordMap 代表节点信息 + * @return + */ + private List> mergeNode(List> nodes,Map nodeRecordMap) { + + return nodes.stream().map(map -> { + Map nodeMap = new HashMap<>(); + nodeMap.put("name", map.get("name")); + nodeMap.put("entityName", map.get("entityName")); + + NodeMapRecord nodeMapRecord = nodeRecordMap.get(map.get("name")); + if (null == nodeMapRecord) { + log.warn("mergeNode:节点信息异常,nodeRecordMap中不存在节点名称为:{}的NodeMapRecord", map.get("name")); + return nodeMap; + } + if (!nodeMapRecord.idSet.contains(map.get("id"))) { + log.warn("mergeNode:节点信息异常,nodeMapRecord.idSet中不包含节点id:{},节点名称为:{}", map.get("id"), map.get("name")); + return nodeMap; + } + nodeMap.put("id", nodeMapRecord.id); + return nodeMap; + }).filter(map -> StrUtil.isNotEmpty(map.get("id"))) + .filter(distinctPredicate(m->m.get("id"))).collect(Collectors.toList()); + } + + /** + * 合并关系信息 + * @param webRelDTOList 关系信息 + * @param nodeRecordMap 代表节点信息 + * @return + */ + private List mergerWebRel(List webRelDTOList, Map nodeRecordMap) { + + Map idNodeRecordMap = nodeRecordMap.entrySet().stream() + .collect(Collectors.toMap(entry -> entry.getValue().id, Map.Entry::getValue)); + + return webRelDTOList.stream().map(webRelDTO -> { + String target = webRelDTO.getTarget(); + String source = webRelDTO.getSource(); + String name = webRelDTO.getName(); + + String sourceNew = idNodeRecordMap.entrySet().stream() + .filter(entry -> entry.getValue().idSet.contains(source)) + .findAny().map(Map.Entry::getKey).orElse(""); + + String targetNew = idNodeRecordMap.entrySet().stream() + .filter(entry -> entry.getValue().idSet.contains(target)) + .findAny().map(Map.Entry::getKey).orElse(""); + + if (StrUtil.isEmpty(sourceNew) || StrUtil.isEmpty(targetNew)){ + log.warn("mergerWebRel:关系信息异常,nodeRecordMap中不存在节点id:{}或节点id:{}信息,节点名称为:{}", source, target, name); + } + + return new WebRelDTO(sourceNew, targetNew, name); + }).filter(webRelDTO -> StrUtil.isNotEmpty(webRelDTO.getSource()) && StrUtil.isNotEmpty(webRelDTO.getTarget())) + .filter(distinctPredicate(rel -> rel.getSource() + rel.getTarget())).toList(); + } + + private Predicate distinctPredicate(Function function){ + ConcurrentHashMap map = new ConcurrentHashMap<>(); + return (t)-> null == map.putIfAbsent(function.apply(t),true); + + } + @Override public void createAbstractGraph(String path, String sheetName) { diff --git a/src/main/java/com/supervision/police/dto/NoteRecordDetailDTO.java b/src/main/java/com/supervision/police/dto/NoteRecordDetailDTO.java index 49cb531..a9aed9f 100644 --- a/src/main/java/com/supervision/police/dto/NoteRecordDetailDTO.java +++ b/src/main/java/com/supervision/police/dto/NoteRecordDetailDTO.java @@ -1,12 +1,13 @@ package com.supervision.police.dto; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonFormat; import com.supervision.minio.domain.MinioFile; -import com.supervision.police.domain.NoteRecord; import lombok.Data; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; @Data @@ -105,8 +106,14 @@ public class NoteRecordDetailDTO { this.role = noteRecordDTO.getRole(); this.confessionMaterial = String.valueOf(noteRecordDTO.getConfessionMaterial()); this.lawAsker = noteRecordDTO.getLawAsker(); - this.confessionStartTime = noteRecordDTO.getConfessionStartTime(); - this.confessionEndTime = noteRecordDTO.getConfessionEndTime(); + if (StrUtil.isNotEmpty(noteRecordDTO.getConfessionStartTime())){ + this.confessionStartTime = LocalDateTimeUtil.parse(noteRecordDTO.getConfessionStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + } + if (StrUtil.isNotEmpty(noteRecordDTO.getConfessionEndTime())){ + this.confessionEndTime = LocalDateTimeUtil.parse(noteRecordDTO.getConfessionEndTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + } this.createTime = noteRecordDTO.getCreateTime(); this.updateTime = noteRecordDTO.getUpdateTime(); this.personIdCard = noteRecordDTO.getCasePersonIdCard(); diff --git a/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java b/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java index e494c0d..f51c474 100644 --- a/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java @@ -34,8 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.BufferedInputStream; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.time.LocalDateTime;