From eab1ef6ace63d238e426cb9fe36bc20ca635e656 Mon Sep 17 00:00:00 2001 From: kami <605128600@qq.com> Date: Mon, 23 Dec 2024 17:53:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=95=B0=E6=8D=AE=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/ApplicationEvent.java | 2 +- .../mapper/dwd/GBaseAJJBXXMapper.java | 8 + .../supervisiondata/pojo/domain/BadHabit.java | 22 ++ .../supervisiondata/service/HabitService.java | 7 +- .../service/RiskModelTaskClueService.java | 7 + .../service/impl/HabitServiceImpl.java | 245 +++++------------- .../service/impl/MarriageServiceImpl.java | 19 +- .../service/impl/NoControlServiceImpl.java | 78 +++--- .../service/impl/PointServiceImpl.java | 157 ++++++----- .../impl/RiskModelTaskClueServiceImpl.java | 22 +- .../supervisiondata/task/TaskService.java | 17 ++ 11 files changed, 309 insertions(+), 275 deletions(-) create mode 100644 src/main/java/com/biutag/supervisiondata/pojo/domain/BadHabit.java diff --git a/src/main/java/com/biutag/supervisiondata/event/ApplicationEvent.java b/src/main/java/com/biutag/supervisiondata/event/ApplicationEvent.java index 32ec349..9b534fd 100644 --- a/src/main/java/com/biutag/supervisiondata/event/ApplicationEvent.java +++ b/src/main/java/com/biutag/supervisiondata/event/ApplicationEvent.java @@ -119,7 +119,7 @@ public class ApplicationEvent { // riskTaskService.eduAndAreaModelTask(initDomain(List.of(34,41))); // riskTaskService.infoModelTask(initDomain(List.of(32,33))); // marriageService.marriageModelTask(initDomain(List.of(39,51))); -// habitService.habitModelTask(LocalDateTime.of(2023, 12, 6, 0, 0, 0), initDomain(List.of(36,60,61,62))); +// habitService.syncBadHabit(LocalDateTime.of(2019, 12, 6, 0, 0, 0), initDomain(List.of(36,60,61,62))); // pointService.syncCarUser(initDomain(List.of(53))); // pointService.syncScore(initDomain(List.of(43))); // pointService.syncViolence(initDomain(List.of(44))); diff --git a/src/main/java/com/biutag/supervisiondata/mapper/dwd/GBaseAJJBXXMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/dwd/GBaseAJJBXXMapper.java index ef57e75..30861d5 100644 --- a/src/main/java/com/biutag/supervisiondata/mapper/dwd/GBaseAJJBXXMapper.java +++ b/src/main/java/com/biutag/supervisiondata/mapper/dwd/GBaseAJJBXXMapper.java @@ -1,6 +1,7 @@ package com.biutag.supervisiondata.mapper.dwd; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervisiondata.pojo.domain.BadHabit; import com.biutag.supervisiondata.pojo.entity.dwd.GBaseAJJBXX; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -16,4 +17,11 @@ public interface GBaseAJJBXXMapper extends BaseMapper { @Select(" select ajbh, barq, ajlbmc from dwd_asj_zfba_ajjbxx where barq > #{time}") List selectHabit(@Param("time")String time); + + @Select(" select a.ajbh, a.barq, a.ajlbmc, c.id_code from dwd_asj_zfba_ajjbxx as a " + + " inner join dwd_ry_zfba_wfryxx as b on a.ajbh = b.ajbh " + + " inner join csga_wdpcdb.wdpc_person as c on c.id_code = b.zjhm " + + " where a.barq > #{time} and a.ajlbmc is not null ") + List selectBadHabit(@Param("time")String time); + } diff --git a/src/main/java/com/biutag/supervisiondata/pojo/domain/BadHabit.java b/src/main/java/com/biutag/supervisiondata/pojo/domain/BadHabit.java new file mode 100644 index 0000000..7e84011 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/pojo/domain/BadHabit.java @@ -0,0 +1,22 @@ +package com.biutag.supervisiondata.pojo.domain; + +import lombok.Data; + +import java.util.Date; + +/** + * @author kami on 2024-12-23 14:58 + * @version 1.0 + * @since 1.8 + */ +@Data +public class BadHabit { + + String idCode; + + String ajbh; + + String ajlbmc; + + Date barq; +} diff --git a/src/main/java/com/biutag/supervisiondata/service/HabitService.java b/src/main/java/com/biutag/supervisiondata/service/HabitService.java index 9f93eaf..5568533 100644 --- a/src/main/java/com/biutag/supervisiondata/service/HabitService.java +++ b/src/main/java/com/biutag/supervisiondata/service/HabitService.java @@ -12,5 +12,10 @@ import java.time.LocalDateTime; */ public interface HabitService { - void habitModelTask(LocalDateTime targetTime, TaskParamDomain domain); + /** + * 拉取不良嗜好 + * @param targetTime 目标开始时间 + * @param domain 数据 + */ + void syncBadHabit(LocalDateTime targetTime, TaskParamDomain domain); } diff --git a/src/main/java/com/biutag/supervisiondata/service/RiskModelTaskClueService.java b/src/main/java/com/biutag/supervisiondata/service/RiskModelTaskClueService.java index 35a76f4..29320ca 100644 --- a/src/main/java/com/biutag/supervisiondata/service/RiskModelTaskClueService.java +++ b/src/main/java/com/biutag/supervisiondata/service/RiskModelTaskClueService.java @@ -20,4 +20,11 @@ public interface RiskModelTaskClueService { * @param modelId 要删除的模型id */ void deleteCluesAndDeleteTag(List list, List idCodes, Integer modelId); + + /** + * 修改记录 + * @param list 要修改的数据 + * @param modelId 模型id + */ + void updateClues(List list, Integer modelId); } diff --git a/src/main/java/com/biutag/supervisiondata/service/impl/HabitServiceImpl.java b/src/main/java/com/biutag/supervisiondata/service/impl/HabitServiceImpl.java index dccf3b0..7fba2e8 100644 --- a/src/main/java/com/biutag/supervisiondata/service/impl/HabitServiceImpl.java +++ b/src/main/java/com/biutag/supervisiondata/service/impl/HabitServiceImpl.java @@ -1,13 +1,9 @@ package com.biutag.supervisiondata.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.biutag.supervisiondata.common.interfaces.CompletableFutureUtil; -import com.biutag.supervisiondata.common.utils.StreamUtil; import com.biutag.supervisiondata.pojo.ClueData; -import com.biutag.supervisiondata.pojo.constants.Default; +import com.biutag.supervisiondata.pojo.domain.BadHabit; import com.biutag.supervisiondata.pojo.domain.TaskParamDomain; -import com.biutag.supervisiondata.pojo.entity.dwd.GBaseAJJBXX; -import com.biutag.supervisiondata.pojo.entity.dwd.GBaseWFRXX; import com.biutag.supervisiondata.pojo.entity.mine.RiskModelTaskClue; import com.biutag.supervisiondata.pojo.entity.mine.RiskPersonal; import com.biutag.supervisiondata.pojo.entity.mine.RiskTask; @@ -15,18 +11,15 @@ import com.biutag.supervisiondata.repository.*; import com.biutag.supervisiondata.service.HabitService; import com.biutag.supervisiondata.service.RiskModelTaskClueService; import com.biutag.supervisiondata.util.DataUtil; +import com.biutag.supervisiondata.util.DateTimeUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.IntStream; /** * @author kami on 2024-11-13 11:11:56 @@ -40,203 +33,107 @@ public class HabitServiceImpl implements HabitService { private final GBaseAJJBXXRepository gBaseAJJBXXRepository; - private final GBaseWFRXXRepository gBaseWFRXXRepository; - private final RiskTaskRepository riskTaskRepository; private final RiskModelTaskClueService riskModelTaskClueService; @Override - public void habitModelTask(LocalDateTime targetTime, TaskParamDomain domain) { - List ajjbxxList = gBaseAJJBXXRepository.getBaseMapper().selectHabit(targetTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - - LocalDateTime limit = LocalDateTime.now().minusYears(1); - log.info("总案件数:{}", ajjbxxList.size()); - // 酒 - List targetAjList = new ArrayList<>(); - List ajNos = new ArrayList<>(); + public void syncBadHabit(LocalDateTime targetTime, TaskParamDomain domain) { + List habitList = gBaseAJJBXXRepository.getBaseMapper().selectBadHabit(targetTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - // 赌博 - List targetAjList2 = new ArrayList<>(); - List ajNos2 = new ArrayList<>(); + Map> alcoholics = new WeakHashMap<>(); + Map> gambler = new WeakHashMap<>(); + Map> AIDS = new WeakHashMap<>(); + Map> alcoholics2 = new WeakHashMap<>(); - // 其他行为 - List targetAjList3 = new ArrayList<>(); - List ajNos3 = new ArrayList<>(); - - for (GBaseAJJBXX gBaseAJJBXX : ajjbxxList) { - if (gBaseAJJBXX.getAjlbmc() == null) { - continue; - } - if (gBaseAJJBXX.getAjlbmc().contains("酒")){ - targetAjList.add(gBaseAJJBXX); - ajNos.add(gBaseAJJBXX.getAjbh()); + LocalDateTime limit = LocalDateTime.now().minusYears(1); + for (BadHabit badHabit : habitList) { + if (badHabit.getAjlbmc().contains("酒")) { + alcoholics.computeIfAbsent(badHabit.getIdCode(), k -> new ArrayList<>()).add(badHabit.getAjbh()); + LocalDateTime tmp = DateTimeUtil.date2LocalDateTime(badHabit.getBarq()); + if (tmp != null && tmp.isAfter(limit)) + alcoholics2.computeIfAbsent(badHabit.getIdCode(), k -> new ArrayList<>()).add(badHabit.getAjbh()); } - if (gBaseAJJBXX.getAjlbmc().contains("赌博")) { - targetAjList2.add(gBaseAJJBXX); - ajNos2.add(gBaseAJJBXX.getAjbh()); + if (badHabit.getAjlbmc().contains("赌博")) { + gambler.computeIfAbsent(badHabit.getIdCode(), k -> new ArrayList<>()).add(badHabit.getAjbh()); } - - if (gBaseAJJBXX.getAjlbmc().contains("嫖娼") || gBaseAJJBXX.getAjlbmc().contains("招嫖") - || gBaseAJJBXX.getAjlbmc().contains("嫖宿")) { - if (gBaseAJJBXX.getAjlbmc().contains("幼女")) { + if (badHabit.getAjlbmc().contains("嫖娼") || badHabit.getAjlbmc().contains("招嫖") + || badHabit.getAjlbmc().contains("嫖宿")) { + if (badHabit.getAjlbmc().contains("幼女")) { continue; } - targetAjList3.add(gBaseAJJBXX); - ajNos3.add(gBaseAJJBXX.getAjbh()); + AIDS.computeIfAbsent(badHabit.getIdCode(), k -> new ArrayList<>()).add(badHabit.getAjbh()); } } - RiskTask task = riskTaskRepository.create(ajNos.size(), 36); - RiskTask task2 = riskTaskRepository.create(ajNos2.size(), 60); - RiskTask task3 = riskTaskRepository.create(ajNos3.size(), 61); - log.info("共计案件:{} | {} | {}", ajNos.size(), ajNos2.size(), ajNos3.size()); - - - List toInsert1 = new ArrayList<>(); - CompletableFuture.allOf( - CompletableFutureUtil.runSyncObject(() -> toInsert1.addAll(findBadHabit(ajNos, targetAjList, task, domain, "酗酒行为", "B35酗酒"))), - CompletableFutureUtil.runSyncObject(() -> findBadHabit(ajNos2, targetAjList2, task2, domain, "赌博行为", "B37赌博")), - CompletableFutureUtil.runSyncObject(() -> findBadHabit(ajNos3, targetAjList3, task3, domain, "其它成瘾行为", "B40其它成瘾行为")) + CompletableFutureUtil.runSyncObject(() -> createBadHabit(alcoholics, domain, 36, "酗酒行为", "B35酗酒")), + CompletableFutureUtil.runSyncObject(() -> createBadHabit(gambler, domain, 60, "赌博行为", "B37赌博")), + CompletableFutureUtil.runSyncObject(() -> createBadHabit(AIDS, domain, 61, "其它成瘾行为", "B40其它成瘾行为")), + CompletableFutureUtil.runSyncObject(() -> createBadHabit(alcoholics2, domain, 62, "一年内酗酒行为", "B78酗酒")) ).join(); - - log.info("开始进行数据库操作"); - - - if(toInsert1.isEmpty()) { - return; - } - // 近一年酗酒 - RiskTask task4 = riskTaskRepository.create(toInsert1.size(), 62); - - Map old = domain.getOldMap(task4.getModelId(), true); - - List toInsertYears = new ArrayList<>(); - for (RiskModelTaskClue clue : toInsert1) { - if(old.get(clue.getIdCode()) == null) { - clue.setModelId(task4.getModelId()); - clue.setTaskId(task4.getId()); - toInsertYears.add(clue); - } - } - - if(!toInsertYears.isEmpty()) { - riskModelTaskClueService.saveClues(toInsertYears, "B78酗酒"); - } - List toUpdate = new ArrayList<>(); - List idCodes = new ArrayList<>(); - // 酗酒 看看有没有过期 - for (Map.Entry entry : old.entrySet()) { - if(entry.getValue().getEventTime() == null) { - continue; - } - if(entry.getValue().getEventTime().isBefore(limit)) { - RiskModelTaskClue update = new RiskModelTaskClue(); - update.setId(entry.getValue().getId()); - update.setDel(1); - toUpdate.add(update); - idCodes.add(entry.getValue().getIdCode()); - } - } - if(!toUpdate.isEmpty()) { - riskModelTaskClueService.deleteCluesAndDeleteTag(toUpdate, idCodes, task4.getModelId()); - } - riskTaskRepository.updateTask(task4.getId(), toInsertYears.size(), toUpdate.size()); } - List findBadHabit(List ajNos, List targetAjList, RiskTask task, TaskParamDomain domain, String tag, String bigTag) { - List> ajNo = IntStream.range(0, (ajNos.size() + 9999) / 10000) - .mapToObj(i -> ajNos.subList(i * 10000, Math.min((i + 1) * 10000, ajNos.size()))) - .toList(); - List wfrList = new ArrayList<>(); - ajNo.forEach(aj -> wfrList.addAll(gBaseWFRXXRepository.list(new LambdaQueryWrapper() - .select(GBaseWFRXX::getAjbh, GBaseWFRXX::getZjhm) - .in(GBaseWFRXX::getAjbh, aj)))); - // 违法信息 - Map> wfrMap = wfrList.stream().filter(it -> it.getZjhm() != null).collect(Collectors.groupingBy(GBaseWFRXX::getZjhm)); - // 案件信息 - Map ajMap = targetAjList.stream().collect(Collectors.toMap(GBaseAJJBXX::getAjbh, Function.identity(), (oldValue, newValue) -> newValue)); - List oldList = Optional.ofNullable(domain.getMap().get(task.getModelId())).orElse(new ArrayList<>()); - // 人员的旧线索 - Map> clueMap = oldList.stream().collect(Collectors.groupingBy(RiskModelTaskClue::getIdCode)); - List clues; + void createBadHabit(Map> badHabits, TaskParamDomain domain, Integer modelId, String tag, String bigTag) { + RiskTask task = riskTaskRepository.create(badHabits.size(), modelId); + Map olds = domain.getOldMap(modelId, true); - LocalDateTime limit = LocalDateTime.now().minusYears(1); - - // 创建新数据 + List toUpdate = new ArrayList<>(); List toInsert = new ArrayList<>(); - List toInsert2 = new ArrayList<>(); - log.info("开始遍历人员:{}", wfrMap.size()); for (RiskPersonal person : domain.getPersons()) { - List wfTmp = Optional.ofNullable(wfrMap.get(person.getIdCode())).orElse(new ArrayList<>()); - wfTmp = wfTmp.stream().filter(StreamUtil.distinctByKey(GBaseWFRXX::getAjbh)).toList(); - if(wfTmp.isEmpty()){ + List tmp = badHabits.get(person.getIdCode()); + if (tmp == null) continue; + tmp = tmp.stream().distinct().sorted().toList(); + String desc = "结合案件信息和违法人信息相关数据,发现该人员有" + tmp.size() + "起" + tag + "相关案件,相关案件编号为:" + String.join(",", tmp); + + RiskModelTaskClue old = olds.get(person.getIdCode()); + if (old != null && !old.getData().equals(desc)) { + RiskModelTaskClue update = new RiskModelTaskClue(); + update.setId(old.getId()); + update.setData(desc); + update.setEventTime(LocalDateTime.now()); + update.setScore(Math.min(5, tmp.size())); + update.setModelId(modelId); + toUpdate.add(update); + olds.remove(person.getIdCode()); continue; } - // 该人员旧的线索 - clues = clueMap.get(person.getIdCode()); - if(clues != null) { + if(old != null) { + olds.remove(person.getIdCode()); continue; } - - StringBuilder sb = new StringBuilder("结合案件信息和违法人信息相关数据,发现该人员有"+wfTmp.size()+"起"+tag+"相关案件,相关案件编号为:"); - StringBuilder ajs = new StringBuilder(); - LocalDateTime eventTime = null; - int count = 0; - int size = 0; - for (GBaseWFRXX gBaseWFRXX : wfTmp) { - GBaseAJJBXX aj = ajMap.get(gBaseWFRXX.getAjbh()); - if (aj == null) { - continue; - } - sb.append(gBaseWFRXX.getAjbh()).append(","); - size++; - try { - LocalDateTime tmp = aj.getBarq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); - if(tmp.isAfter(limit)) { - count++; - ajs.append(aj.getAjbh()).append(","); - } - if(eventTime == null) { - eventTime = tmp; - continue; - } - if(eventTime.isBefore(tmp)) { - eventTime = tmp; - } - } catch (Exception ignored) { - } - } - ClueData data = ClueData.builder() + toInsert.add(DataUtil.createClueData(task, ClueData.builder() .id("habit") .name(person.getName()) .idCode(person.getIdCode()) .tags(List.of(tag)) .personId(person.getId()) - .sourceData(sb.substring(0, sb.length()-1)) - .score(Math.min(size, 5)) - .eventTime(Optional.ofNullable(eventTime).orElse(LocalDateTime.now())) - .build(); - toInsert.add(DataUtil.createClueData(task, data)); - if(count > 0) { - toInsert2.add(DataUtil.createClueData(new RiskTask(), ClueData.builder() - .id("habit2") - .name(person.getName()) - .idCode(person.getIdCode()) - .tags(List.of(Default.YEAR_DRINK)) - .score(5) - .personId(person.getId()) - .sourceData("发现该人员近一年内有酗酒行为,具体案件为:"+ajs.substring(0, ajs.length()-1)) - .eventTime(LocalDateTime.now()) - .build())); - } + .sourceData(desc) + .score(Math.min(tmp.size(), 5)) + .eventTime(LocalDateTime.now()) + .build())); + } + List toDelete = new ArrayList<>(); + List deleteIdCodes = new ArrayList<>(); + for (Map.Entry entry : olds.entrySet()) { + RiskModelTaskClue delete = new RiskModelTaskClue(); + delete.setId(entry.getValue().getId()); + delete.setDel(1); + toDelete.add(delete); + deleteIdCodes.add(entry.getValue().getIdCode()); } - if(!toInsert.isEmpty()) { + if (!toInsert.isEmpty()) { + log.info("新增{}数据{}条", tag, toInsert.size()); riskModelTaskClueService.saveClues(toInsert, bigTag); } - riskTaskRepository.updateTask(task.getId(), toInsert.size(), 0); - return toInsert2; + if (!toUpdate.isEmpty()) { + log.info("修改{}数据{}条", tag, toUpdate.size()); + riskModelTaskClueService.updateClues(toInsert, modelId); + } + if (!toDelete.isEmpty()) { + log.info("删除{}数据{}条", tag, toDelete.size()); + riskModelTaskClueService.deleteCluesAndDeleteTag(toDelete, deleteIdCodes, modelId); + } + riskTaskRepository.updateTask(task.getId(), toInsert.size(), toDelete.size() + toUpdate.size()); } - } diff --git a/src/main/java/com/biutag/supervisiondata/service/impl/MarriageServiceImpl.java b/src/main/java/com/biutag/supervisiondata/service/impl/MarriageServiceImpl.java index 6697c69..9c5d4c7 100644 --- a/src/main/java/com/biutag/supervisiondata/service/impl/MarriageServiceImpl.java +++ b/src/main/java/com/biutag/supervisiondata/service/impl/MarriageServiceImpl.java @@ -78,9 +78,10 @@ public class MarriageServiceImpl implements MarriageService { clueData.setEventTime(LocalDateTime.now()); } toInsert1.add(DataUtil.createClueData(task2, clueData)); - if(clueData.getEventTime().isBefore(yearsDate) || old2.get(person.getIdCode()) != null) { - continue; - } + if(clueData.getEventTime().isBefore(yearsDate)) continue; + RiskModelTaskClue oldClue = old2.get(person.getIdCode()); + // 如果老数据存在且在新数据之前 + if(oldClue != null && !clueData.getEventTime().isAfter(oldClue.getEventTime())) continue; ClueData clueData2 = ClueData.builder() .id("") .score(5) @@ -128,16 +129,18 @@ public class MarriageServiceImpl implements MarriageService { log.info("修改个离婚:{}", toUpdate2.size()); riskModelTaskClueService.deleteCluesAndDeleteTag(toUpdate2, idCodes2, task2.getModelId()); } - riskTaskRepository.updateTask(task2.getId(), toInsert1.size(), 0); + riskTaskRepository.updateTask(task2.getId(), toInsert1.size(), toUpdate2.size()); - if(!toInsert2.isEmpty()) { - log.info("新增个人婚姻创伤:{}", toInsert2.size()); - riskModelTaskClueService.saveClues(toInsert2, "个人婚姻创伤"); - } + // 创伤先删在增 if(!toUpdate.isEmpty()) { log.info("修改个人婚姻创伤:{}", toUpdate.size()); riskModelTaskClueService.deleteCluesAndDeleteTag(toUpdate, idCodes, task.getModelId()); } + + if(!toInsert2.isEmpty()) { + log.info("新增个人婚姻创伤:{}", toInsert2.size()); + riskModelTaskClueService.saveClues(toInsert2, "个人婚姻创伤"); + } riskTaskRepository.updateTask(task.getId(), toInsert2.size(), toUpdate.size()); } } diff --git a/src/main/java/com/biutag/supervisiondata/service/impl/NoControlServiceImpl.java b/src/main/java/com/biutag/supervisiondata/service/impl/NoControlServiceImpl.java index d72a63d..4b6bbf9 100644 --- a/src/main/java/com/biutag/supervisiondata/service/impl/NoControlServiceImpl.java +++ b/src/main/java/com/biutag/supervisiondata/service/impl/NoControlServiceImpl.java @@ -2,25 +2,21 @@ package com.biutag.supervisiondata.service.impl; import com.biutag.supervisiondata.common.interfaces.CompletableFutureUtil; import com.biutag.supervisiondata.pojo.ClueData; -import com.biutag.supervisiondata.pojo.constants.Default; import com.biutag.supervisiondata.pojo.domain.*; import com.biutag.supervisiondata.pojo.entity.mine.RiskModelTaskClue; import com.biutag.supervisiondata.pojo.entity.mine.RiskPersonal; import com.biutag.supervisiondata.pojo.entity.mine.RiskTask; import com.biutag.supervisiondata.repository.GBaseZDRYRepository; -import com.biutag.supervisiondata.repository.RiskPersonalRepository; import com.biutag.supervisiondata.repository.RiskTaskRepository; import com.biutag.supervisiondata.service.NoControlService; import com.biutag.supervisiondata.service.RiskModelTaskClueService; import com.biutag.supervisiondata.util.DataUtil; import com.biutag.supervisiondata.util.BhUtil; -import com.biutag.supervisiondata.util.DateTimeUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -39,16 +35,10 @@ public class NoControlServiceImpl implements NoControlService { private final RiskTaskRepository riskTaskRepository; - private final RiskPersonalRepository personalRepository; - private final RiskModelTaskClueService clueService; @Override public void syncNoControlData(TaskParamDomain domain) { - // 婚姻不用管管控 - // clue 应该要看结婚状态 - RiskTask task = riskTaskRepository.create(domain.getPersons().size(), 45); - List clueData = new ArrayList<>(); Map idCodes = new HashMap<>(); Map mobiles = new HashMap<>(); @@ -64,32 +54,68 @@ public class NoControlServiceImpl implements NoControlService { CompletableFutureUtil.runSyncObject(() -> clueData.addAll(crazyLevelThreeControl(idCodes, mobiles))) ).join(); - List clues = new ArrayList<>(); + RiskTask task = riskTaskRepository.create(clueData.size(), 45); + + List toInsert = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + List toDelete = new ArrayList<>(); + List deleteIdCodes = new ArrayList<>(); Map> clueDataMap = clueData.stream().collect(Collectors.groupingBy(ClueData::getIdCode)); + Map oldMap = domain.getOldMap(task.getModelId(), true); + for (Map.Entry> entry : clueDataMap.entrySet()) { RiskPersonal personal = idCodes.get(entry.getKey()); - - List tags = new ArrayList<>(); - for (ClueData data : entry.getValue()) { - tags.addAll(data.getTags()); + List tags = entry.getValue().stream().flatMap(data -> data.getTags().stream()) + .collect(Collectors.toList()); + + String desc = "该人员存在:"+ tags.stream().distinct().sorted().collect(Collectors.joining(",")); + RiskModelTaskClue old = oldMap.get(entry.getKey()); + + if(old != null && !old.getData().equals(desc)) { + RiskModelTaskClue update = new RiskModelTaskClue(); + update.setId(old.getId()); + update.setData(desc); + update.setEventTime(LocalDateTime.now()); + toUpdate.add(update); + oldMap.remove(entry.getKey()); + continue; } - String tag = tags.stream().distinct().collect(Collectors.joining(",")); - clues.add(DataUtil.createClueData(task, ClueData.builder() + if(old != null) { + oldMap.remove(entry.getKey()); + continue; + } + toInsert.add(DataUtil.createClueData(task, ClueData.builder() .id("") .idCode(personal.getIdCode()) .name(personal.getName()) .personId(personal.getId()) .tags(tags) .score(5) - .sourceData("该人员存在:"+tag) - .eventTime(LocalDateTime.now()) + .sourceData(desc) .build())); } - if (!clues.isEmpty()) { - clueService.saveClues(clues, "B92风险人员排查不到位"); + + for (Map.Entry entry : oldMap.entrySet()) { + RiskModelTaskClue delete = new RiskModelTaskClue(); + delete.setId(entry.getValue().getId()); + delete.setDel(1); + toDelete.add(delete); + deleteIdCodes.add(entry.getValue().getIdCode()); + } + if (!toInsert.isEmpty()) { + log.info("新增风险人员排查不到位数据{}条", toInsert.size()); + clueService.saveClues(toInsert, "B92风险人员排查不到位"); + } + if (!toUpdate.isEmpty()) { + log.info("修改风险人员排查不到位数据{}条", toUpdate.size()); + clueService.updateClues(toUpdate, task.getModelId()); + } + if (!toDelete.isEmpty()) { + log.info("删除风险人员排查不到位数据{}条", toDelete.size()); + clueService.deleteCluesAndDeleteTag(toDelete, deleteIdCodes, task.getModelId()); } - riskTaskRepository.updateTask(task.getId(), clues.size(), 0); + riskTaskRepository.updateTask(task.getId(), toInsert.size(), toDelete.size()+toUpdate.size()); } List crazyControl(Map idCodes, Map mobiles) { @@ -114,8 +140,6 @@ public class NoControlServiceImpl implements NoControlService { .personId(person.getId()) .tags(List.of("精神病人排查不到位")) .score(5) - .sourceData("该人员属于精神病人,涉及到有关警情," + Optional.ofNullable(extreme.getJjdbh()).map(it -> "接警单编号:" + it).orElse("") + "属于管控不到位" + Optional.ofNullable(extreme.getCjqk()).map(it -> ",具体情况:" + it).orElse("")) - .eventTime(DateTimeUtil.date2LocalDateTime(extreme.getBjsj())) .build(); clueData.add(data); } @@ -141,8 +165,6 @@ public class NoControlServiceImpl implements NoControlService { .personId(person.getId()) .tags(List.of("刑事、吸毒人员排查不到位")) .score(5) - .sourceData("该人员属于故意犯罪并作出刑事判决人员(排除仍在羁押状态的)、公安机关查处吸毒人员(排除仍在羁押状态的),涉及到案件," + Optional.ofNullable(violence.getAjbh()).map(it -> "案件编号:" + it).orElse("") + "属于管控不到位" + Optional.ofNullable(violence.getAjmc()).map(it -> ",案件名称:" + it).orElse("") + Optional.ofNullable(violence.getWfss()).map(it -> ",违法事实:" + it).orElse("")) - .eventTime(DateTimeUtil.date2LocalDateTime(violence.getBarq())) .build(); clueData.add(data); } @@ -168,8 +190,6 @@ public class NoControlServiceImpl implements NoControlService { .personId(person.getId()) .tags(List.of("刑满释放人排查不到位")) .score(5) - .sourceData("该人员属于看守所故意犯罪刑满释放不满5年人员,发现在重点人员中 未纳入或未按要求落实双列管," + Optional.ofNullable(noControl.getCrime()).map(it -> "涉及犯罪事实:" + it).orElse("") + "" + Optional.ofNullable(noControl.getBriefCase()).map(it -> ",,具体事件表现为:" + it).orElse("")) - .eventTime(DateTimeUtil.date2LocalDateTime(noControl.getOutDate())) .build(); clueData.add(data); } @@ -198,8 +218,6 @@ public class NoControlServiceImpl implements NoControlService { .personId(person.getId()) .tags(List.of("精神疾病三级以上人员排查不到位")) .score(5) - .sourceData("卫健委精神疾病三级以上人员,发现在重点人员中 未纳入或未按要求落实双列管" + Optional.ofNullable(crazyLevelThree.getTsqksm()).map(it -> ",备注:" + it).orElse("")) - .eventTime(LocalDateTime.now()) .build()); } return clueData; diff --git a/src/main/java/com/biutag/supervisiondata/service/impl/PointServiceImpl.java b/src/main/java/com/biutag/supervisiondata/service/impl/PointServiceImpl.java index 2e8e485..9679c92 100644 --- a/src/main/java/com/biutag/supervisiondata/service/impl/PointServiceImpl.java +++ b/src/main/java/com/biutag/supervisiondata/service/impl/PointServiceImpl.java @@ -62,10 +62,6 @@ public class PointServiceImpl implements PointService { private final GBaseCSCZRKRepository cSCZRKRepository; - private final GBaseWFRWFXXRepository wFRWFXXRepository; - - private final GBaseGAXZCFJDSRepository gAXZCFJDSRepository; - private final WdpcHZCRYXXRepository hZCRYXXRepository; private final WdpcXdryRepository xdryRepository; @@ -103,20 +99,30 @@ public class PointServiceImpl implements PointService { List persons = getPersons(); RiskTask task = taskRepository.create(persons.size(), 43); - List clues = Optional.ofNullable(domain.getMap().get(task.getModelId())).orElse(new ArrayList<>()); - Map> oldClueMap = clues.stream().collect(Collectors.groupingBy(RiskModelTaskClue::getIdCode)); + Map oldClueMap = domain.getOldMap(task.getModelId(), true); Map> map = persons.stream().collect(Collectors.groupingBy(RiskPersonal::getIdCode)); List toInsert = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + List toDelete = new ArrayList<>(); + List deleteIdCodes = new ArrayList<>(); for (Map.Entry> entry : map.entrySet()) { - List olds = oldClueMap.get(entry.getKey()); - // 是否类型只存在一条 - if (olds != null) { + List personals = entry.getValue().stream().filter(StreamUtil.distinctByKey(RiskPersonal::getTags)).toList(); + if (personals.isEmpty()) continue; + String desc = "发现该人员为重点人员,存在" + personals.size() + "个标签"; + RiskModelTaskClue old = oldClueMap.get(entry.getKey()); + if (old != null && old.getData().equals(desc)) { + oldClueMap.remove(entry.getKey()); continue; } - List personals = entry.getValue().stream().filter(StreamUtil.distinctByKey(RiskPersonal::getTags)).toList(); - if (personals.isEmpty()) { + if (old != null) { + oldClueMap.remove(entry.getKey()); + RiskModelTaskClue update = new RiskModelTaskClue(); + update.setId(old.getId()); + update.setData(desc); + update.setEventTime(LocalDateTime.now()); + toUpdate.add(update); continue; } toInsert.add(DataUtil.createClueData(task, ClueData.builder() @@ -124,16 +130,31 @@ public class PointServiceImpl implements PointService { .score(5) .personId(personals.getFirst().getId()) .tags(List.of("重点人员")) - .sourceData("发现该人员为重点人员,存在" + personals.size() + "个标签") + .sourceData(desc) .name(personals.getFirst().getName()) .idCode(personals.getFirst().getIdCode()) - .eventTime(personals.getFirst().getControlTime()) .build())); } + for (Map.Entry entry : oldClueMap.entrySet()) { + RiskModelTaskClue delete = new RiskModelTaskClue(); + delete.setId(entry.getValue().getId()); + delete.setDel(1); + toDelete.add(delete); + deleteIdCodes.add(entry.getValue().getIdCode()); + } if (!toInsert.isEmpty()) { + log.info("新增是否重点人员人数{}条", toInsert.size()); modelTaskClueService.saveClues(toInsert, "B11是否是重点人员"); } - taskRepository.updateTask(task.getId(), toInsert.size(), 0); + if (!toUpdate.isEmpty()) { + log.info("修改是否重点人员人数{}条", toUpdate.size()); + modelTaskClueService.updateClues(toUpdate, task.getModelId()); + } + if (!toDelete.isEmpty()) { + log.info("修改是否重点人员人数{}条", toDelete.size()); + modelTaskClueService.deleteCluesAndDeleteTag(toDelete, deleteIdCodes, task.getModelId()); + } + taskRepository.updateTask(task.getId(), toInsert.size(), toUpdate.size() + toUpdate.size()); } private final WdpcGrjdZblxRepository zblxRepository; @@ -166,7 +187,7 @@ public class PointServiceImpl implements PointService { continue; } List oldList = personMap.get(ry.getSfzh()); - if(oldList != null) { + if (oldList != null) { continue; } codes = codes.stream().distinct().toList(); @@ -234,52 +255,67 @@ public class PointServiceImpl implements PointService { List list = zdryRepository.getBaseMapper().syncViolencePerson(); Map> violenceMap = list.stream().collect(Collectors.groupingBy(Violence::getZjhm)); - List olds = Optional.ofNullable(domain.getMap().get(task.getId())).orElse(new ArrayList<>()); - Map> maps = olds.stream().collect(Collectors.groupingBy(RiskModelTaskClue::getIdCode)); + Map oldMap = domain.getOldMap(task.getModelId(), true); + List toInsert = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + List toDelete = new ArrayList<>(); + List deleteIdCodes = new ArrayList<>(); for (RiskPersonal person : domain.getPersons()) { List tmp = violenceMap.get(person.getIdCode()); if (tmp == null) continue; - List old = maps.get(person.getIdCode()); - if (old != null) continue; + String desc = "通过核查案件信息,发现该人员有暴力伤害行为,案件编号为:" + String.join(",", tmp.stream().map(Violence::getAjbh).distinct().sorted().toList()); tmp = tmp.stream().filter(StreamUtil.distinctByKey(Violence::getAjbh)).toList(); - StringBuilder sb = new StringBuilder("通过核查案件信息,发现该人员有暴力伤害行为,案件编号为:"); - List tags = new ArrayList<>(); - LocalDateTime date = null; - for (Violence violence : tmp) { - sb.append(violence.getAjbh()).append(","); - if(!tags.contains(violence.getAjlbmc())) { - tags.add(violence.getAjlbmc()); - } - try { - LocalDateTime ld = violence.getBarq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); - if(date == null) { - date = ld; - continue; - } - if(date.isAfter(ld)) { - date = ld; - } - } catch (Exception ignored) { - } + List tags = tmp.stream().map(Violence::getAjlbmc).distinct().toList(); + + RiskModelTaskClue old = oldMap.get(person.getIdCode()); + if (old != null && old.getData().equals(desc)) { + oldMap.remove(person.getIdCode()); + continue; + } + if (old != null) { + oldMap.remove(person.getIdCode()); + RiskModelTaskClue update = new RiskModelTaskClue(); + update.setId(old.getId()); + update.setData(desc); + update.setEventTime(LocalDateTime.now()); + update.setScore(Math.min(tmp.size(), 5)); + toUpdate.add(update); + continue; } ClueData data = ClueData.builder() .name(person.getName()) .id("") .personId(person.getId()) .idCode(person.getIdCode()) - .sourceData(sb.substring(0, sb.length()-1)) + .sourceData(desc) .tags(tags) .score(Math.min(tmp.size(), 5)) - .eventTime(date) .build(); toInsert.add(DataUtil.createClueData(task, data)); } + for (Map.Entry entry : oldMap.entrySet()) { + RiskModelTaskClue delete = new RiskModelTaskClue(); + delete.setId(entry.getValue().getId()); + delete.setDel(1); + toDelete.add(delete); + deleteIdCodes.add(entry.getValue().getIdCode()); + } + if (!toInsert.isEmpty()) { + log.info("新增暴力伤害行为数据{}条", toInsert.size()); modelTaskClueService.saveClues(toInsert, "B89暴力伤害行为"); } - taskRepository.updateTask(task.getId(), toInsert.size(), 0); + if (!toUpdate.isEmpty()) { + log.info("修改暴力伤害行为数据{}条", toUpdate.size()); + modelTaskClueService.updateClues(toUpdate, task.getModelId()); + } + if (!toDelete.isEmpty()) { + log.info("删除暴力伤害行为数据{}条", toDelete.size()); + modelTaskClueService.deleteCluesAndDeleteTag(toDelete, deleteIdCodes, task.getModelId()); + } + taskRepository.updateTask(task.getId(), toInsert.size(), toDelete.size()+toUpdate.size()); } @Override @@ -311,7 +347,8 @@ public class PointServiceImpl implements PointService { .build(); try { data.setEventTime(extreme.getBjsj().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); - } catch (Exception ignored) {} + } catch (Exception ignored) { + } toInsert.add(DataUtil.createClueData(task, data)); } @@ -1425,18 +1462,18 @@ public class PointServiceImpl implements PointService { if (oldMap.get(domicileType) != null) continue; idCode.put(domicileType, 1); - ClueData data = ClueData.builder() - .name(personal.getName()) - .id(personal.getId().toString()) - .idCode(personal.getIdCode()) - .tags(List.of("亲近家人死亡")) - .score(5) - .eventTime(LocalDateTime.now()) - .personId(personal.getId()) - .sourceData("发现该人员亲近家人死亡") - .build(); - toInsert.add(DataUtil.createClueData(task, data)); - } + ClueData data = ClueData.builder() + .name(personal.getName()) + .id(personal.getId().toString()) + .idCode(personal.getIdCode()) + .tags(List.of("亲近家人死亡")) + .score(5) + .eventTime(LocalDateTime.now()) + .personId(personal.getId()) + .sourceData("发现该人员亲近家人死亡") + .build(); + toInsert.add(DataUtil.createClueData(task, data)); + } if (!toInsert.isEmpty()) { modelTaskClueService.saveClues(toInsert, Default.FAMILYDIE); } @@ -1630,9 +1667,9 @@ public class PointServiceImpl implements PointService { case "研究生", "研究生肄业", "研究生毕业", "大学毕业", "大学本科", "大学肄业", "相当大学毕业" -> 1;// 本科 case "大学专科和专科学校", "相当专科毕业", "专科毕业", "专科肄业" -> 2;// 大专 case "相当高中毕业", "相当中专或中技毕业", "中专中技肄业", "职业高中毕业", "中专毕业", "高中肄业", - "中技毕业", "中等专科学校", "高中", "高中毕业", "农业高中毕业" -> 3;// 高中中专 + "中技毕业", "中等专科学校", "高中", "高中毕业", "农业高中毕业" -> 3;// 高中中专 case "农业初中毕业", "技工学校", "技工学校肄业", "技工学校毕业", "初中", "职业初中毕业", "初中毕业", - "初中肆业", "相当初中毕业" -> 4;// 初中 + "初中肆业", "相当初中毕业" -> 4;// 初中 case "小学", "小学肄业", "小学肆业", "小学毕业", "相当小学毕业", "文盲", "文盲或半文盲", "学龄前儿童" -> 5;// 小学 default -> 0; @@ -1933,18 +1970,18 @@ public class PointServiceImpl implements PointService { count++; try { LocalDateTime tmp = LocalDateTime.parse(item.getTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - if(time == null) { + if (time == null) { time = tmp; continue; } - if(tmp.isAfter(time)) { + if (tmp.isAfter(time)) { time = tmp; } } catch (Exception e) { log.error("散装油时间转化异常"); } } - if(count <= 0) { + if (count <= 0) { continue; } ClueData data = ClueData.builder() @@ -2032,7 +2069,7 @@ public class PointServiceImpl implements PointService { log.info("车主数量:{}", carUsers.size()); RiskTask task = taskRepository.create(carUsers.size(), 53); - Map clueMap = domain.getOldMap(task.getModelId(), false); + Map clueMap = domain.getOldMap(task.getModelId(), true); HashSet exist = new HashSet<>(); for (String carUser : carUsers) { exist.add(carUser); diff --git a/src/main/java/com/biutag/supervisiondata/service/impl/RiskModelTaskClueServiceImpl.java b/src/main/java/com/biutag/supervisiondata/service/impl/RiskModelTaskClueServiceImpl.java index 61b889e..555d668 100644 --- a/src/main/java/com/biutag/supervisiondata/service/impl/RiskModelTaskClueServiceImpl.java +++ b/src/main/java/com/biutag/supervisiondata/service/impl/RiskModelTaskClueServiceImpl.java @@ -115,12 +115,32 @@ public class RiskModelTaskClueServiceImpl implements RiskModelTaskClueService { @Override public void deleteCluesAndDeleteTag(List list, List idCodes, Integer modelId) { + list.forEach(item -> item.setUpdateTime(LocalDateTime.now())); clueRepository.updateBatchById(list); if (!idCodes.isEmpty()) { tagRepository.getBaseMapper().updateToDelete(idCodes, modelId); } } + @Override + public void updateClues(List list, Integer modelId) { + List rules = riskScoreRuleMapper.selectRuleByModelId(List.of(modelId)); + // 赋分规则 + Map ruleMap = rules.stream().collect(Collectors.toMap(ScoreRule::getModelId, Function.identity(), (val, old) -> val)); + ScoreRule rule = ruleMap.get(modelId); + for (RiskModelTaskClue clue : list) { + if (rule == null) continue; + BigDecimal score = new BigDecimal(clue.getScore().toString()); + BigDecimal weight = new BigDecimal(rule.getWeight().toString()); + score = score.multiply(new BigDecimal("20")) + .multiply(weight) + .divide(new BigDecimal("100"), 2, RoundingMode.UP); + clue.setScoreCalc(Optional.ofNullable(score.doubleValue()).orElse(0.00)); + clue.setUpdateTime(LocalDateTime.now()); + } + clueRepository.updateBatchById(list); + } + final String sql = "INSERT INTO risk_model_task_clue(model_id, name, id_code, task_id, source_id, risk_reason, source, data, score, score_calc, score_result, event_time, create_time, update_time, case_ids) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; public void batchInsert(List alliances, String bigTag, Map ruleMap) { @@ -163,7 +183,7 @@ public class RiskModelTaskClueServiceImpl implements RiskModelTaskClueService { prepareStatement.executeBatch(); connection.commit(); } catch (Exception e) { - e.printStackTrace(); + log.error("", e); throw new BusinessException(StatusCode.BUSINESS, "数据保存失败"); } } diff --git a/src/main/java/com/biutag/supervisiondata/task/TaskService.java b/src/main/java/com/biutag/supervisiondata/task/TaskService.java index ba4fd55..7190895 100644 --- a/src/main/java/com/biutag/supervisiondata/task/TaskService.java +++ b/src/main/java/com/biutag/supervisiondata/task/TaskService.java @@ -86,14 +86,31 @@ public class TaskService { @Resource private RiskTaskService riskTaskService; + @Resource + private MarriageService marriageService; + + @Resource + private HabitService habitService; + + @Resource + private NoControlService noControlService; + /** * 2点更新模型 */ @Scheduled(cron = "0 0 02 * * ?") public void modelRefresh() { + LocalDateTime fiveYearsAgo = LocalDateTime.now().minusYears(5); CompletableFutureUtil.runSync(() -> { riskTaskService.eduAndAreaModelTask(initDomain(List.of(34,41))); riskTaskService.infoModelTask(initDomain(List.of(32,33))); + marriageService.marriageModelTask(initDomain(List.of(39,51))); + // 五年内酒、赌博、嫖娼案件,一年内酒案件 + habitService.syncBadHabit(fiveYearsAgo, initDomain(List.of(36,60,61,62))); + pointService.syncCarUser(initDomain(List.of(53))); + pointService.syncScore(initDomain(List.of(43))); + pointService.syncViolence(initDomain(List.of(44))); + noControlService.syncNoControlData(initDomain(List.of(45))); }); }