|
|
|
|
@ -11,6 +11,7 @@ import com.biutag.supervisiondata.pojo.entity.dwd.GBaseHY;
|
|
|
|
|
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.pojo.entity.wdpc2.WdpcGrjdHyqkb; |
|
|
|
|
import com.biutag.supervisiondata.repository.*; |
|
|
|
|
import com.biutag.supervisiondata.service.MarriageService; |
|
|
|
|
import com.biutag.supervisiondata.service.RiskModelTaskClueService; |
|
|
|
|
@ -19,8 +20,10 @@ import lombok.AllArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
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; |
|
|
|
|
@ -48,219 +51,91 @@ public class MarriageServiceImpl implements MarriageService {
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void marriageModelTask(TaskParamDomain domain) { |
|
|
|
|
// 婚姻不用管管控
|
|
|
|
|
// clue 应该要看结婚状态
|
|
|
|
|
RiskTask task = createTask(domain.getPersons().size(), 39); |
|
|
|
|
RiskTask task2 = createTask(domain.getPersons().size(), 51); |
|
|
|
|
List<WdpcGrjdHyqkb> data = hyqkbRepository.getBaseMapper().selectDistinctInfo(); |
|
|
|
|
|
|
|
|
|
LocalDateTime yearsDate = LocalDateTime.now().minusYears(1); |
|
|
|
|
RiskTask task = riskTaskRepository.create(data.size(), 39); |
|
|
|
|
RiskTask task2 = riskTaskRepository.create(data.size(), 51); |
|
|
|
|
riskTaskRepository.saveBatch(List.of(task,task2)); |
|
|
|
|
|
|
|
|
|
List<GBaseHY> hyList = new ArrayList<>(); |
|
|
|
|
Map<String, WdpcGrjdHyqkb> dataMap = data.stream().collect(Collectors.toMap(WdpcGrjdHyqkb::getIdCode, Function.identity(), (val, old) -> val)); |
|
|
|
|
log.info("开始查询结婚数据:{}", domain.getIdCards().size()); |
|
|
|
|
List<List<String>> manIdCards = new ArrayList<>(); |
|
|
|
|
List<List<String>> femanIdCards = new ArrayList<>(); |
|
|
|
|
for (RiskPersonal person : domain.getPersons()) { |
|
|
|
|
if(manIdCards.isEmpty()) { |
|
|
|
|
manIdCards.add(new ArrayList<>()); |
|
|
|
|
femanIdCards.add(new ArrayList<>()); |
|
|
|
|
} |
|
|
|
|
if("2".equals(person.getGender())) { |
|
|
|
|
femanIdCards.getLast().add(person.getIdCode()); |
|
|
|
|
if(femanIdCards.getLast().size() >= 10000) { |
|
|
|
|
femanIdCards.add(new ArrayList<>()); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
manIdCards.getLast().add(person.getIdCode()); |
|
|
|
|
if(manIdCards.getLast().size() >= 10000) { |
|
|
|
|
manIdCards.add(new ArrayList<>()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CompletableFuture.allOf( |
|
|
|
|
CompletableFutureUtil.runSyncObject(() -> manIdCards.forEach(item -> hyList.addAll(hyRepository.list(new LambdaQueryWrapper<GBaseHY>() |
|
|
|
|
.select(GBaseHY::getYwlxdmmc, GBaseHY::getYwlxdmdm,GBaseHY::getYxbzdm, GBaseHY::getNfsfhm, GBaseHY::getNvfsfhm, GBaseHY::getDjrq) |
|
|
|
|
.eq(GBaseHY::getYxbzdm, "1") |
|
|
|
|
.in(GBaseHY::getNfsfhm, item))))), |
|
|
|
|
CompletableFutureUtil.runSyncObject(() -> femanIdCards.forEach(item -> hyList.addAll(hyRepository.list(new LambdaQueryWrapper<GBaseHY>() |
|
|
|
|
.select(GBaseHY::getYwlxdmmc, GBaseHY::getYwlxdmdm, GBaseHY::getYxbzdm, GBaseHY::getNfsfhm, GBaseHY::getNvfsfhm,GBaseHY::getDjrq) |
|
|
|
|
.eq(GBaseHY::getYxbzdm, "1") |
|
|
|
|
.in(GBaseHY::getNvfsfhm, item))))) |
|
|
|
|
).join(); |
|
|
|
|
Map<String, RiskModelTaskClue> old1 = domain.getOldMap(39, true); |
|
|
|
|
Map<String, RiskModelTaskClue> old2 = domain.getOldMap(51, true); |
|
|
|
|
|
|
|
|
|
LocalDateTime time = null; |
|
|
|
|
for (GBaseHY gBaseHY : hyList) { |
|
|
|
|
if(gBaseHY.getDjrq() == null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
LocalDateTime tmp = gBaseHY.getDjrq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); |
|
|
|
|
if(tmp.isAfter(LocalDateTime.now())) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if(time == null) { |
|
|
|
|
time = tmp; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if(tmp.isAfter(time)) { |
|
|
|
|
time = tmp; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
log.info("最大时间{}", time); |
|
|
|
|
// 每个人应该是最新的婚姻登记为标准
|
|
|
|
|
Map<String, List<GBaseHY>> manMap = new HashMap<>(); |
|
|
|
|
Map<String, List<GBaseHY>> femanMap = new HashMap<>(); |
|
|
|
|
for (GBaseHY gBaseHY : hyList) { |
|
|
|
|
manMap.computeIfAbsent(gBaseHY.getNfsfhm(), k -> new ArrayList<>()).add(gBaseHY); |
|
|
|
|
femanMap.computeIfAbsent(gBaseHY.getNvfsfhm(), k -> new ArrayList<>()).add(gBaseHY); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
log.info("男性数据:{}", manMap.size()); |
|
|
|
|
log.info("女性数据:{}", femanMap.size()); |
|
|
|
|
// 旧线索
|
|
|
|
|
List<RiskModelTaskClue> oldClues = Optional.ofNullable(domain.getMap().get(task.getModelId())).orElse(new ArrayList<>()); |
|
|
|
|
Map<String, RiskModelTaskClue> oldClueMap = oldClues.stream().collect(Collectors.toMap(RiskModelTaskClue::getIdCode, Function.identity(), (oldValue, newValue) -> newValue)); |
|
|
|
|
// 旧线索
|
|
|
|
|
List<RiskModelTaskClue> oldClues2 = Optional.ofNullable(domain.getMap().get(task2.getModelId())).orElse(new ArrayList<>()); |
|
|
|
|
Map<String, RiskModelTaskClue> oldClueMap2 = oldClues2.stream().collect(Collectors.toMap(RiskModelTaskClue::getIdCode, Function.identity(), (oldValue, newValue) -> newValue)); |
|
|
|
|
|
|
|
|
|
// 遍历了
|
|
|
|
|
List<ClueData> toInsertData = new ArrayList<>(); |
|
|
|
|
List<RiskModelTaskClue> toUpdateData = new ArrayList<>(); |
|
|
|
|
List<ClueData> toInsertData2 = new ArrayList<>(); |
|
|
|
|
List<RiskModelTaskClue> toUpdateData2 = new ArrayList<>(); |
|
|
|
|
List<RiskModelTaskClue> toInsert1 = new ArrayList<>(); |
|
|
|
|
List<RiskModelTaskClue> toInsert2 = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
LocalDateTime targetTime = LocalDateTime.now().minusDays(365); |
|
|
|
|
log.info("指定时间:{}", targetTime); |
|
|
|
|
for (RiskPersonal person : domain.getPersons()) { |
|
|
|
|
List<GBaseHY> tmpList = manMap.get(person.getIdCode()); |
|
|
|
|
if(tmpList == null) { |
|
|
|
|
tmpList = femanMap.get(person.getIdCode()); |
|
|
|
|
} |
|
|
|
|
if(tmpList == null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// 找到最新的婚姻登记
|
|
|
|
|
GBaseHY last = null; |
|
|
|
|
for (GBaseHY gBaseHY : tmpList) { |
|
|
|
|
if(gBaseHY.getDjrq() == null) { |
|
|
|
|
log.error("没有登记日期"); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if(last == null) { |
|
|
|
|
last = gBaseHY; |
|
|
|
|
if(old1.get(person.getIdCode()) != null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if(gBaseHY.getDjrq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().isAfter(last.getDjrq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime())) { |
|
|
|
|
last = gBaseHY; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 看看是不是离婚
|
|
|
|
|
if(last == null || last.getYwlxdmdm() == null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if(last.getYwlxdmdm().toUpperCase().contains("IB") || last.getYwlxdmdm().toUpperCase().contains("ICB")) { |
|
|
|
|
// 离婚 如果旧数据不存在就要新增
|
|
|
|
|
if(last.getDjrq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().isAfter(targetTime)) { |
|
|
|
|
// 近365天的离婚
|
|
|
|
|
RiskModelTaskClue clue = oldClueMap.get(person.getIdCode()); |
|
|
|
|
if(clue != null) { |
|
|
|
|
WdpcGrjdHyqkb result = dataMap.get(person.getIdCode()); |
|
|
|
|
if(result == null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
ClueData data = ClueData.builder() |
|
|
|
|
ClueData clueData = ClueData.builder() |
|
|
|
|
.personId(person.getId()) |
|
|
|
|
.tag("近12月内离婚") |
|
|
|
|
.id(last.getXlzjdjzh()) |
|
|
|
|
.tag("离婚") |
|
|
|
|
.id(person.getIdCode()) |
|
|
|
|
.idCode(person.getIdCode()) |
|
|
|
|
.name(person.getName()) |
|
|
|
|
.sourceData("根据该人员最新的婚姻登记信息,发现该人员登记为离婚,存在感情失意的可能,增加风险分3分") |
|
|
|
|
.sourceData("根据该人员最新的婚姻登记信息,发现该人员登记为离婚,增加风险分5分") |
|
|
|
|
.build(); |
|
|
|
|
data.setEventTime(last.getDjrq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); |
|
|
|
|
toInsertData.add(data); |
|
|
|
|
} else { |
|
|
|
|
// 365天之前的离婚,进基础因素
|
|
|
|
|
RiskModelTaskClue clue = oldClueMap2.get(person.getIdCode()); |
|
|
|
|
if(clue != null) { |
|
|
|
|
try { |
|
|
|
|
clueData.setEventTime(LocalDate.parse(result.getRegisterTime(), DateTimeFormatter.ofPattern("yyyyMMdd")).atTime(0,0,0)); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
clueData.setEventTime(LocalDateTime.now()); |
|
|
|
|
} |
|
|
|
|
toInsert1.add(createClue(task.getModelId(), 5, task.getId(), clueData)); |
|
|
|
|
if(clueData.getEventTime().isBefore(yearsDate) || old2.get(person.getIdCode()) != null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
ClueData data = ClueData.builder() |
|
|
|
|
ClueData clueData2 = ClueData.builder() |
|
|
|
|
.personId(person.getId()) |
|
|
|
|
.tag("离婚") |
|
|
|
|
.id(last.getXlzjdjzh()) |
|
|
|
|
.tag("个人婚姻创伤") |
|
|
|
|
.id(person.getIdCode()) |
|
|
|
|
.idCode(person.getIdCode()) |
|
|
|
|
.name(person.getName()) |
|
|
|
|
.sourceData("根据该人员最新的婚姻登记信息,发现该人员登记为离婚,增加风险分5分") |
|
|
|
|
.sourceData("该人员最近一年有离婚登记信息,增加风险分5分") |
|
|
|
|
.build(); |
|
|
|
|
data.setEventTime(last.getDjrq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); |
|
|
|
|
toInsertData2.add(data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else if(last.getYwlxdmdm().toUpperCase().contains("IA") || last.getYwlxdmdm().toUpperCase().contains("ICA")) { |
|
|
|
|
// 结婚 如果旧数据存在就要修改为0
|
|
|
|
|
// 近365天的离婚
|
|
|
|
|
if(last.getDjrq().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().isAfter(targetTime)) { |
|
|
|
|
RiskModelTaskClue clue = oldClueMap.get(person.getIdCode()); |
|
|
|
|
if(clue == null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
RiskModelTaskClue update = new RiskModelTaskClue(); |
|
|
|
|
update.setId(clue.getId()); |
|
|
|
|
update.setDel(1); |
|
|
|
|
toUpdateData.add(update); |
|
|
|
|
} else { |
|
|
|
|
RiskModelTaskClue clue = oldClueMap2.get(person.getIdCode()); |
|
|
|
|
if(clue == null) { |
|
|
|
|
continue; |
|
|
|
|
try { |
|
|
|
|
clueData2.setEventTime(LocalDate.parse(result.getRegisterTime(), DateTimeFormatter.ofPattern("yyyyMMdd")).atTime(0,0,0)); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
clueData.setEventTime(LocalDateTime.now()); |
|
|
|
|
} |
|
|
|
|
RiskModelTaskClue update = new RiskModelTaskClue(); |
|
|
|
|
update.setId(clue.getId()); |
|
|
|
|
update.setDel(1); |
|
|
|
|
toUpdateData2.add(update); |
|
|
|
|
toInsert2.add(createClue(task2.getModelId(), 5, task2.getId(), clueData2)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<RiskModelTaskClue> toUpdate = new ArrayList<>(); |
|
|
|
|
List<String> idCodes = new ArrayList<>(); |
|
|
|
|
for (Map.Entry<String, RiskModelTaskClue> entry : old2.entrySet()) { |
|
|
|
|
if(entry.getValue().getEventTime().isBefore(yearsDate)) { |
|
|
|
|
RiskModelTaskClue clue = new RiskModelTaskClue(); |
|
|
|
|
clue.setId(entry.getValue().getId()); |
|
|
|
|
clue.setDel(1); |
|
|
|
|
toUpdate.add(clue); |
|
|
|
|
idCodes.add(entry.getValue().getIdCode()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
List<RiskModelTaskClue> toInsert = new ArrayList<>(); |
|
|
|
|
List<RiskModelTaskClue> toInsert2 = new ArrayList<>(); |
|
|
|
|
log.info("插入数据条数: {} | {}", toInsertData.size(), toInsertData2.size()); |
|
|
|
|
for (ClueData toInsertDatum : toInsertData) { |
|
|
|
|
toInsert.add(createClue(task.getModelId(), 3, task.getId(), toInsertDatum)); |
|
|
|
|
} |
|
|
|
|
for (ClueData toInsertDatum : toInsertData2) { |
|
|
|
|
toInsert2.add(createClue(task2.getModelId(), 5, task2.getId(), toInsertDatum)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(!toInsert.isEmpty()) { |
|
|
|
|
riskModelTaskClueService.saveClues(toInsert, Default.NO_LOVE_IG); |
|
|
|
|
} |
|
|
|
|
if(!toInsert2.isEmpty()) { |
|
|
|
|
riskModelTaskClueService.saveClues(toInsert2, Default.MARRAY_IG); |
|
|
|
|
} |
|
|
|
|
if(!toUpdateData.isEmpty()) { |
|
|
|
|
log.info("修改线索 | {}", toUpdateData.size()); |
|
|
|
|
clueRepository.updateBatchById(toUpdateData); |
|
|
|
|
if(!toInsert1.isEmpty()) { |
|
|
|
|
log.info("新增离婚数据:{}", toInsert1.size()); |
|
|
|
|
riskModelTaskClueService.saveClues(toInsert1, "婚姻状态"); |
|
|
|
|
} |
|
|
|
|
riskTaskRepository.updateTask(task.getId(), toInsert1.size(), 0); |
|
|
|
|
|
|
|
|
|
if(!toUpdateData2.isEmpty()) { |
|
|
|
|
log.info("修改线索2 | {}", toUpdateData2.size()); |
|
|
|
|
clueRepository.updateBatchById(toUpdateData2); |
|
|
|
|
if(!toInsert2.isEmpty()) { |
|
|
|
|
log.info("新增个人婚姻创伤:{}", toInsert2.size()); |
|
|
|
|
riskModelTaskClueService.saveClues(toInsert2, "个人婚姻创伤"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RiskTask updateTask = new RiskTask(); |
|
|
|
|
updateTask.setId(task.getId()); |
|
|
|
|
updateTask.setInsertSize(toInsert.size()); |
|
|
|
|
updateTask.setUpdateSize(toUpdateData.size()); |
|
|
|
|
updateTask.setState(1); |
|
|
|
|
updateTask.setEndTime(LocalDateTime.now()); |
|
|
|
|
riskTaskRepository.updateById(updateTask); |
|
|
|
|
|
|
|
|
|
if(!toUpdate.isEmpty()) { |
|
|
|
|
log.info("修改个人婚姻创伤:{}", toUpdate.size()); |
|
|
|
|
riskModelTaskClueService.deleteCluesAndDeleteTag(toUpdate, idCodes, "个人婚姻创伤"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RiskTask createTask(Integer size, Integer modelId) { |
|
|
|
|
RiskTask task = new RiskTask(); |
|
|
|
|
task.setModelId(modelId); |
|
|
|
|
task.setStartTime(LocalDateTime.now()); |
|
|
|
|
task.setState(0); |
|
|
|
|
task.setScanSize(size); |
|
|
|
|
return task; |
|
|
|
|
riskTaskRepository.updateTask(task.getId(), toInsert1.size(), toUpdate.size()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RiskModelTaskClue createClue(Integer modelId, Integer score, Integer taskId, ClueData data) { |
|
|
|
|
|