业务需求是需要做一个对某个人所有评估表中的数据进行一个统计的功能,其中可以选择评估表与时间段来观察某个人具体在何时进行评估并且算出相应得分。因为业务场景较为复杂则将模板与评估表分开存储,且评估实例中有属性:得分、时间点、模板编号;模板表中有属性:模板编号、模板名称。首先我们最终需要构造如下数据通过接口输出:
{
"columns": [
"日期",
"出血风险评估2.0",
"VTE风险评估2.0"
],
"rows": [
{
"日期": "2022-06-16 11:17:19",
"VTE风险评估2.0": 20,
"出血风险评估2.0": 0
},
{
"日期": "2022-06-16 11:17:33",
"VTE风险评估2.0": 20,
"出血风险评估2.0": 0
},
{
"日期": "2022-06-16 11:18:25",
"出血风险评估2.0": 16,
"VTE风险评估2.0": 0
}
]
}
第一步先将模板编号与模板名称对应起来:
Map<String, String> tempMap = templateEntities.stream().collect(Collectors.toMap(EvaluationFormTemplateEntity::getId, EvaluationFormTemplateEntity::getFormName));
而后把评估表根据时间分一下组:
Map<String, List<EvaluationFormInstanceEntity>> groupedEvaIns1 =
histEv.stream().sorted(Comparator.comparing(EvaluationFormInstanceEntity::getCreateDateStr))
.collect(Collectors.groupingBy(EvaluationFormInstanceEntity::getCreateDateStr));
现在就处理为,编号->名称,时间->评估记录,现在处理两个参数就可以继续后续计算,选择表与时间段处理过程是表通过编号过滤即可,时间段处理为:
groupedEvaIns1 = groupedEvaIns1.entrySet().stream().filter(p -> {
if (p.getKey().compareTo(voTime) > 0 && p.getKey().compareTo(dateStr) < 0) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}).collect(Collectors.toMap(
(e) -> (String) e.getKey(),
Map.Entry::getValue
));
map对key进行排序后进行横纵坐标数据填充:
Map<String, List<EvaluationFormInstanceEntity>> groupedEvaIns = ChangeUtils.sortMapByKey(groupedEvaIns1);
最后进行填充即可:
JSONObject ret = new JSONObject();
ret.put("rows", rowsList);
ret.put("columns", columnList);
if(null!=groupedEvaIns) {
groupedEvaIns.forEach((k, v) -> {
Map<String, Object> ev = new HashMap();
ev.put("日期", k);
for (EvaluationFormInstanceEntity e : v) {
String tempTemplateId = e.getEvaluationFormReleaseId();
EvaluationFormReleaseEntity formRelease = evaluationFormReleaseService.findById(tempTemplateId);
if (null != formRelease) {
tempTemplateId = formRelease.getTemplateId();
}
ev.put(tempMap.get(tempTemplateId), e.getScore());
evaTempId.add(tempMap.get(tempTemplateId));
}
rowsList.add(ev);
});
}
columnList.addAll(evaTempId);
List<Map<String, Object>> res = new ArrayList<>();
List<String> formNames = columnList.stream().filter(p -> !"日期".equals(p)).collect(Collectors.toList());
for (Map<String, Object> map : rowsList) {
AtomicReference<String> formNameTemp = new AtomicReference<>();
AtomicReference<Integer> score = new AtomicReference<>(0);
map.forEach((k,v)->{
if(!k.equals("日期")){
formNameTemp.set(k);
score.set(Integer.parseInt(String.valueOf(v)));
}
});
Map<String, Object> tempMaps = map.entrySet().stream().filter(p -> p.getKey().equals("日期")).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
formNames.forEach(p->tempMaps.put(p,0));
tempMaps.put(formNameTemp.get(),score.get());
res.add(tempMaps);
}
ret.put("rows", res);
有一说一stream流式计算还是挺方便的,下一篇一起探讨定时任务模块中,定时器轮询,MQ与时间轮处理并发问题。