package com.yihu.ehr.profile.service; import com.yihu.ehr.profile.family.ResourceCells; import com.yihu.ehr.profile.model.InspectionInfo; import com.yihu.ehr.profile.util.NumberValidationUtils; import com.yihu.ehr.profile.util.SimpleSolrQueryUtil; import com.yihu.ehr.util.rest.Envelop; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.*; /** * @author progr1mmer * @date Created on 2018/3/13. */ @Service public class ProfileInspectionService extends ProfileBasicService { public List inspectionRecords(String demographicId, String filter, String date, String searchParam) throws Exception { List> resultList = new ArrayList<>(); Map typeMap = new HashMap<>(); typeMap.put("HDSD00_79", "inspect"); typeMap.put("HDSD00_77", "examine"); Map nameMap = new HashMap<>(); //检查名称 nameMap.put("HDSD00_79", "EHR_002883"); //检验项目 nameMap.put("HDSD00_77", "EHR_000352"); Map numMap = new HashMap<>(); //检查报告单号 numMap.put("HDSD00_79", "EHR_000316"); //检验报告单号 numMap.put("HDSD00_77", "EHR_000363"); for (String dataset : typeMap.keySet()) { String query = "{\"q\":\"demographic_id:" + demographicId + "\"}"; query = SimpleSolrQueryUtil.getQuery(filter, date, query); Envelop masterEnvelop = resource.getMasterData(query, 1, 1000, null); if (masterEnvelop.isSuccessFlg()) { List> masterList = masterEnvelop.getDetailModelList(); //循环获取结果集 for (Map temp : masterList) { String subQ = "{\"q\":\"rowkey:" + temp.get("rowkey") + "$" + dataset + "$*\"}"; Envelop subEnvelop = resource.getSubData(subQ, 1, 1000, null); List> subList = subEnvelop.getDetailModelList(); subList.forEach(item -> { Map resultMap = simpleEvent(temp, searchParam); if (resultMap != null) { String healthProblemName = (String) resultMap.get("healthProblemName"); String itemName = (String) item.get(nameMap.get(dataset)); if (itemName != null) { resultMap.put("projectName", itemName); } else { if (dataset.equals("HDSD00_79")) { resultMap.put("projectName", "检查报告-" + healthProblemName); } else { resultMap.put("projectName", "检验报告-" + healthProblemName); } } resultMap.put("type", typeMap.get(dataset)); resultMap.put("mark", item.get(numMap.get(dataset))); resultList.add(resultMap); } }); } } } return resultList; } public List inspectionStatistics(String demographicId, String table) throws Exception { String query = "{\"q\":\"demographic_id:" + demographicId + "\"}"; query = SimpleSolrQueryUtil.getQuery(null, null, query); Envelop masterEnvelop = resource.getMasterData(query, 1, 1000, null); Map dataMap = new HashMap<>(); Map firstMap = new HashMap<>(); Map lastMap = new HashMap<>(); Map exMap = new HashMap<>(); if (masterEnvelop.isSuccessFlg()) { List> masterList = masterEnvelop.getDetailModelList(); //循环获取结果集 for (Map temp : masterList) { String subQ = "{\"q\":\"rowkey:" + temp.get("rowkey") + "$" + table + "$*\"}"; Envelop subEnvelop = resource.getSubData(subQ, 1, 1000, null); List> subList = subEnvelop.getDetailModelList(); for (int i = 0; i < subList.size(); i ++) { Map item = subList.get(i); //检查名称 if (!StringUtils.isEmpty(item.get("EHR_002883"))) { String name = item.get("EHR_002883").toString(); //影像结论 String result = item.get("EHR_000347") == null ? "-" : item.get("EHR_000347").toString(); if (dataMap.containsKey(name)) { Integer count = dataMap.get(name); dataMap.put(name, count + 1); lastMap.put(name, temp.get(ResourceCells.EVENT_DATE) + "&" + temp.get(ResourceCells.ORG_NAME) + "&" + item.get(ResourceCells.ROWKEY) + "&" + result); } else { dataMap.put(name, 1); firstMap.put(name, temp.get(ResourceCells.EVENT_DATE) + "&" + temp.get(ResourceCells.ORG_NAME) + "&" + item.get(ResourceCells.ROWKEY) + "&" + result); } if (!StringUtils.isEmpty(item.get("EHR_000344"))) { String ex = item.get("EHR_000344").toString(); if ("1".equals(ex)) { if (exMap.containsKey(name)) { Integer count = exMap.get(name); exMap.put(name, count + 1); } else { exMap.put(name, 1); } } } //检验项目 } else if (!StringUtils.isEmpty(item.get("EHR_000352"))) { String name = item.get("EHR_000352").toString(); if (dataMap.containsKey(name)) { Integer count = dataMap.get(name); dataMap.put(name, count + 1); lastMap.put(name, temp.get(ResourceCells.EVENT_DATE) + "&" + temp.get(ResourceCells.ORG_NAME) + "&" + item.get(ResourceCells.ROWKEY) + "&" + "-"); } else { dataMap.put(name, 1); firstMap.put(name, temp.get(ResourceCells.EVENT_DATE) + "&" + temp.get(ResourceCells.ORG_NAME) + "&" + item.get(ResourceCells.ROWKEY) + "&" + "-"); } } } } } Map newDataMap = sortByValue(dataMap); List inspectionInfos = new ArrayList<>(); newDataMap.forEach((key, val) -> { InspectionInfo inspectionInfo = new InspectionInfo(); inspectionInfo.setName(key); inspectionInfo.setCount(val); inspectionInfo.setFirstTime(firstMap.get(key).split("&")[0]); if (exMap.containsKey(key)) { inspectionInfo.setExCount(exMap.get(key)); } if (lastMap.get(key) != null) { inspectionInfo.setLastTime(lastMap.get(key).split("&")[0]); inspectionInfo.setLastOrg(lastMap.get(key).split("&")[1]); inspectionInfo.setLastRecord(lastMap.get(key).split("&")[2]); inspectionInfo.setResult(lastMap.get(key).split("&")[3]); } else { inspectionInfo.setLastTime(firstMap.get(key).split("&")[0]); inspectionInfo.setLastOrg(firstMap.get(key).split("&")[1]); inspectionInfo.setLastRecord(firstMap.get(key).split("&")[2]); inspectionInfo.setResult(firstMap.get(key).split("&")[3]); } inspectionInfos.add(inspectionInfo); }); return inspectionInfos; } public Map inspectionStatisticsOneSub(String profileId) throws Exception { Map dataMap = new HashMap<>(); String subQ = "{\"q\":\"rowkey:" + profileId + "\"}"; Envelop subData = resource.getSubData(subQ, 1, 1, null); List> subList = subData.getDetailModelList(); if (subList.size() > 0) { Map temp = subList.get(0); //检验报告单号 String reportNo = temp.get("EHR_000363").toString(); subQ = "{\"q\":\"rowkey:" + profileId.split("\\$")[0] + "$HDSD00_75$*" + "\"}"; subData = resource.getSubData(subQ, 1, 1000, null); List> subItems = subData.getDetailModelList(); subItems.forEach(item -> { //子项所属的报告单号 if (reportNo.equals(item.get("EHR_006339"))) { //结果值 if (item.get("EHR_000387") != null) { //结果值 String result = item.get("EHR_000387").toString(); if (item.get("EHR_000391") != null && item.get("EHR_000390")!= null) { //下限 String low = item.get("EHR_000391").toString(); //上限 String high = item.get("EHR_000390").toString(); if (NumberValidationUtils.isRealNumber(result) && NumberValidationUtils.isRealNumber(low) && NumberValidationUtils.isRealNumber(high)) { Double _result = Double.parseDouble(result); Double _row = Double.parseDouble(low); Double _high = Double.parseDouble(high); if (_result < _row) { dataMap.put(item.get("EHR_000394").toString(), "偏低"); } else if (_result > _high) { dataMap.put(item.get("EHR_000394").toString(), "偏高"); } else { dataMap.put(item.get("EHR_000394").toString(), "正常"); } } else { dataMap.put(item.get("EHR_000394").toString(), item.get("EHR_000387").toString()); } } else { dataMap.put(item.get("EHR_000394").toString(), item.get("EHR_000387").toString()); } } else { dataMap.put(item.get("EHR_000394").toString(), ""); } } }); } return dataMap; } public Map> inspectionStatisticsAllSub(String demographicId, String name) throws Exception { String query = "{\"q\":\"demographic_id:" + demographicId + "\"}"; query = SimpleSolrQueryUtil.getQuery(null, null, query); Envelop masterEnvelop = resource.getMasterData(query, 1, 1000, null); List> masterList = masterEnvelop.getDetailModelList(); //循环获取结果集 Set data = new HashSet<>(); Map lowMap = new HashMap<>(); Map highMap = new HashMap<>(); Map normalMap = new HashMap<>(); Map unknownMap = new HashMap<>(); Map positiveMap = new HashMap<>(); Map negativeMap = new HashMap<>(); for (Map masterItem : masterList) { String subQ = "{\"q\":\"rowkey:" + masterItem.get("rowkey") + "$HDSD00_77$*\"}"; Envelop subEnvelop = resource.getSubData(subQ, 1, 1000, null); List> subList = subEnvelop.getDetailModelList(); for (Map subItem : subList) { //检验项目 if (name.equals(subItem.get("EHR_000352"))) { //检验报告单号 String reportNo = subItem.get("EHR_000363").toString(); subQ = "{\"q\":\"rowkey:" + masterItem.get(ResourceCells.ROWKEY) + "$HDSD00_75$*" + "\"}"; subEnvelop = resource.getSubData(subQ, 1, 1000, null); List> subItems = subEnvelop.getDetailModelList(); subItems.forEach(item -> { //子项所属的报告单号 if (reportNo.equals(item.get("EHR_006339"))) { //子项名称 String itemName = item.get("EHR_000394").toString(); data.add(itemName); //结果值 if (item.get("EHR_000387") != null) { String result = item.get("EHR_000387").toString(); if (item.get("EHR_000391") != null && item.get("EHR_000390")!= null) { //上限 String low = item.get("EHR_000391").toString(); //下限 String high = item.get("EHR_000390").toString(); if (NumberValidationUtils.isRealNumber(result) && NumberValidationUtils.isRealNumber(low) && NumberValidationUtils.isRealNumber(high)) { Double _result = Double.parseDouble(result); Double _row = Double.parseDouble(low); Double _high = Double.parseDouble(high); if (_result < _row) { if (lowMap.containsKey(itemName)) { lowMap.put(itemName, lowMap.get(itemName) + 1); } else { lowMap.put(itemName, 1); } } else if (_result > _high) { if (highMap.containsKey(itemName)) { highMap.put(itemName, highMap.get(itemName) + 1); } else { highMap.put(itemName, 1); } } else { if (normalMap.containsKey(itemName)) { normalMap.put(itemName, normalMap.get(itemName) + 1); } else { normalMap.put(itemName, 1); } } } else { if (unknownMap.containsKey(itemName)) { unknownMap.put(itemName, unknownMap.get(itemName) + 1); } else { unknownMap.put(itemName, 1); } } //参考值备注 } else if (item.get("EHR_000382") != null) { String range = item.get("EHR_000382").toString(); //上限 if (range.split("-").length == 2) { String low = range.split("-")[0]; //下限 String high = range.split("-")[1]; if (NumberValidationUtils.isRealNumber(result) && NumberValidationUtils.isRealNumber(low) && NumberValidationUtils.isRealNumber(high)) { Double _result = Double.parseDouble(result); Double _row = Double.parseDouble(low); Double _high = Double.parseDouble(high); if (_result < _row) { if (lowMap.containsKey(itemName)) { lowMap.put(itemName, lowMap.get(itemName) + 1); } else { lowMap.put(itemName, 1); } } else if (_result > _high) { if (highMap.containsKey(itemName)) { highMap.put(itemName, highMap.get(itemName) + 1); } else { highMap.put(itemName, 1); } } else { if (normalMap.containsKey(itemName)) { normalMap.put(itemName, normalMap.get(itemName) + 1); } else { normalMap.put(itemName, 1); } } } else { if (unknownMap.containsKey(itemName)) { unknownMap.put(itemName, unknownMap.get(itemName) + 1); } else { unknownMap.put(itemName, 1); } } } else { if (unknownMap.containsKey(itemName)) { unknownMap.put(itemName, unknownMap.get(itemName) + 1); } else { unknownMap.put(itemName, 1); } } } else { if (result.equals("阳性")) { if (positiveMap.containsKey(itemName)) { positiveMap.put(itemName, positiveMap.get(itemName) + 1); } else { positiveMap.put(itemName, 1); } } else if (result.equals("阴性")) { if (negativeMap.containsKey(itemName)) { negativeMap.put(itemName, negativeMap.get(itemName) + 1); } else { negativeMap.put(itemName, 1); } } else { if (unknownMap.containsKey(itemName)) { unknownMap.put(itemName, unknownMap.get(itemName) + 1); } else { unknownMap.put(itemName, 1); } } } } else { if (unknownMap.containsKey(itemName)) { unknownMap.put(itemName, unknownMap.get(itemName) + 1); } else { unknownMap.put(itemName, 1); } } } }); } } } Map> result = new HashMap<>(); data.forEach(item -> { Map details = new HashMap<>(); if (lowMap.containsKey(item)) { details.put("偏低", lowMap.get(item)); } if (highMap.containsKey(item)) { details.put("偏高", highMap.get(item)); } if (normalMap.containsKey(item)) { details.put("正常", normalMap.get(item)); } if (unknownMap.containsKey(item)) { details.put("未知", unknownMap.get(item)); } if (positiveMap.containsKey(item)) { details.put("阳性", positiveMap.get(item)); } if (negativeMap.containsKey(item)) { details.put("阴性", negativeMap.get(item)); } result.put(item, details); }); return result; } private Map sortByValue(Map sourceMap) { if (sourceMap == null || sourceMap.isEmpty()) { return sourceMap; } Map sortedMap = new LinkedHashMap<>(); List> entryList = new ArrayList<>(sourceMap.entrySet()); Collections.sort(entryList, new MapValueComparator()); Iterator> iterator = entryList.iterator(); while (iterator.hasNext()) { Map.Entry tmpEntry = iterator.next(); sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue()); } return sortedMap; } class MapValueComparator implements Comparator> { @Override public int compare(Map.Entry me1, Map.Entry me2) { return - me1.getValue().compareTo(me2.getValue()); } } }