From 88201def0f2b764a52e87da0dc31e43641cb3be0 Mon Sep 17 00:00:00 2001 From: zhangchao Date: Mon, 29 Sep 2025 20:10:59 +0800 Subject: [PATCH] =?UTF-8?q?#fix:=E4=BC=98=E5=8C=96=E8=B4=AB=E8=A1=80?= =?UTF-8?q?=E4=B8=93=E7=97=85=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/operate/web/facade/PatientFacade.java | 24 +- .../operate/web/worker/AnaemiaPatientWorker.java | 471 +++++++++++++++++++++ 2 files changed, 493 insertions(+), 2 deletions(-) create mode 100644 platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/AnaemiaPatientWorker.java diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/PatientFacade.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/PatientFacade.java index ef0569d..ccff0da 100644 --- a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/PatientFacade.java +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/PatientFacade.java @@ -1500,7 +1500,7 @@ public class PatientFacade extends BaseServiceImpl { if (CollectionUtils.isNotEmpty(patientses)) { if (type == 1) { //处理全部孕妇的情况 - data = convertToTwinsPatient(riskPatientsQueryRequest, patientses, userId, hospital); + data = convertToAnaemiaPatient(riskPatientsQueryRequest, patientses, userId, hospital); } } // patientsQuery.mysqlBuild(data.size()); @@ -2405,7 +2405,27 @@ public class PatientFacade extends BaseServiceImpl { return data; } - + private List convertToAnaemiaPatient(RiskPatientsQueryRequest riskPatientsQueryRequest, List patientses, Integer userId, String hospital) { + List data = new ArrayList <>(); + int batchSize = 4; + int end = 0; + List listFuture = new ArrayList <>(); + for (int i = 0; i < patientses.size(); i += batchSize) { + end = (end + batchSize); + if (end > patientses.size()) { + end = patientses.size(); + } + listFuture.add(commonThreadPool.submit(new AnaemiaPatientWorker(riskPatientsQueryRequest, patientses.subList(i, end), usersService, hospital, antExService, basicConfigService, patientsService, organizationService))); + } + for (Future f : listFuture) { + try { + data.addAll((List) f.get(30, TimeUnit.SECONDS)); + } catch (Exception e) { + ExceptionUtils.catchException(e, "convertToAnaemiaPatient get result Future error."); + } + } + return data; + } private List convertToQuanPatient(List patientses, Integer userId, String hospital) { List data = new ArrayList <>(); diff --git a/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/AnaemiaPatientWorker.java b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/AnaemiaPatientWorker.java new file mode 100644 index 0000000..5091072 --- /dev/null +++ b/platform-operate-api/src/main/java/com/lyms/platform/operate/web/worker/AnaemiaPatientWorker.java @@ -0,0 +1,471 @@ +package com.lyms.platform.operate.web.worker; + +import com.lyms.platform.biz.service.AntenatalExaminationService; +import com.lyms.platform.biz.service.BasicConfigService; +import com.lyms.platform.biz.service.PatientsService; +import com.lyms.platform.common.enums.ServiceStatusEnums; +import com.lyms.platform.common.enums.ServiceTypeEnums; +import com.lyms.platform.common.enums.YnEnums; +import com.lyms.platform.common.utils.DateUtil; +import com.lyms.platform.common.utils.ExceptionUtils; +import com.lyms.platform.common.utils.JsonUtil; +import com.lyms.platform.operate.web.facade.PatientFacade; +import com.lyms.platform.operate.web.request.RiskPatientsQueryRequest; +import com.lyms.platform.operate.web.result.HighScoreResult; +import com.lyms.platform.operate.web.result.QuanPatientsResult; +import com.lyms.platform.operate.web.result.TwinsPatientsResult; +import com.lyms.platform.operate.web.utils.CommonsHelper; +import com.lyms.platform.permission.model.Organization; +import com.lyms.platform.permission.model.Users; +import com.lyms.platform.permission.service.OrganizationService; +import com.lyms.platform.permission.service.UsersService; +import com.lyms.platform.pojo.AntExChuModel; +import com.lyms.platform.pojo.AntenatalExaminationModel; +import com.lyms.platform.pojo.BasicConfig; +import com.lyms.platform.pojo.Patients; +import com.lyms.platform.query.AntExChuQuery; +import com.lyms.platform.query.AntExQuery; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.NumberUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StopWatch; + +import java.util.*; +import java.util.concurrent.Callable; + +/** + * 全部孕妇列表 + */ +public class AnaemiaPatientWorker implements Callable> { + + private static final Logger logger = LoggerFactory.getLogger(PatientFacade.class); + + private List patientses; + + private String hospital; + private UsersService usersService; + private AntenatalExaminationService antExService; + private BasicConfigService basicConfigService; + private PatientsService patientsService; + private OrganizationService organizationService; + private RiskPatientsQueryRequest riskPatientsQueryRequest; + + public AnaemiaPatientWorker(RiskPatientsQueryRequest riskPatientsQueryRequest, + List patientses, + UsersService usersService, + String hospital, + AntenatalExaminationService antExService, + BasicConfigService basicConfigService, PatientsService patientsService, OrganizationService organizationService) { + this.riskPatientsQueryRequest = riskPatientsQueryRequest; + this.patientses = patientses; + this.usersService = usersService; + this.antExService = antExService; + this.hospital = hospital; + this.basicConfigService = basicConfigService; + this.patientsService = patientsService; + this.organizationService = organizationService; + } + + @Override + public List call() throws Exception { + List data = new ArrayList<>(); + AntExQuery antExQuery = new AntExQuery(); + antExQuery.setYn(YnEnums.YES.getId()); + AntExChuQuery antExChuQuery1 = new AntExChuQuery(); + + antExChuQuery1.setYn(YnEnums.YES.getId()); + String twinsType = ""; + if(StringUtils.isNotEmpty(riskPatientsQueryRequest.getTwinsType())){ + twinsType = riskPatientsQueryRequest.getTwinsType(); + } + + for (Patients patients : patientses) { + + StopWatch stopWatch = new StopWatch("AnaemiaPatientWorker -" + patients.getId()); + TwinsPatientsResult twinsPatientsResult = new TwinsPatientsResult(); + twinsPatientsResult.setYi("-"); + twinsPatientsResult.setEr("-"); + twinsPatientsResult.setSan("-"); + twinsPatientsResult.setSi("-"); + twinsPatientsResult.setWu("-"); + twinsPatientsResult.convertToResult(patients); + antExQuery.setPid(patients.getPid()); + //增加查询本次产程条数 + antExQuery.setStart(patients.getLastMenses()); + if (StringUtils.isNotEmpty(patients.getBookbuildingDoctor())) { + if (NumberUtils.isNumber(patients.getBookbuildingDoctor())) { + Users users = usersService.getUsers(NumberUtils.toInt(patients.getBookbuildingDoctor())); + if (null != users) { + twinsPatientsResult.setlName(users.getName()); + } else { + twinsPatientsResult.setlName(patients.getBookbuildingDoctor()); + } + } else { + twinsPatientsResult.setlName(patients.getBookbuildingDoctor()); + } + } + //筛查结果 + String screenStr = basicConfigService.getScreenResult(patients.getScreenResult()); + twinsPatientsResult.setScreenResult(screenStr); + twinsPatientsResult.setbTime(DateUtil.getyyyy_MM_dd(patients.getBookbuildingDate())); + stopWatch.start("query ant count"); + antExChuQuery1.setPid(patients.getPid()); + //antExChuQuery1.setParentId(patients.getId()); + //增加查询本次产程条数 + antExChuQuery1.setStart(patients.getLastMenses()); + List chu = antExService.queryAntExChu(antExChuQuery1.convertToQuery()); + //复诊次数 + List ant = null; + if (CollectionUtils.isNotEmpty(chu)) { + for (AntExChuModel a : chu) {//唐山滦县导出判断初诊是否是本院 + if (StringUtils.isNotEmpty(a.getHospitalId())) { + if (a.getHospitalId().equals(hospital)) { + twinsPatientsResult.setYi("本院"); + } else { + twinsPatientsResult.setYi("外院"); + } + break; + } + } + ant = antExService.queryAntenatalExamination(antExQuery.convertToQuery()); + } + + //唐山滦县判断复诊是否是本院 + if (CollectionUtils.isNotEmpty(ant)) { + for (int k = 0; k < ant.size(); k++) { + if (k >= 4) { + break; + } + if (0 == k) { + if (ant.get(k).getHospitalId().equals(hospital)) { + twinsPatientsResult.setEr("本院"); + } else { + twinsPatientsResult.setEr("外院"); + } + } else if (1 == k) { + if (ant.get(k).getHospitalId().equals(hospital)) { + twinsPatientsResult.setSan("本院"); + } else { + twinsPatientsResult.setSan("外院"); + } + } else if (2 == k) { + if (ant.get(k).getHospitalId().equals(hospital)) { + twinsPatientsResult.setSi("本院"); + } else { + twinsPatientsResult.setSi("外院"); + } + } else if (3 == k) { + if (ant.get(k).getHospitalId().equals(hospital)) { + twinsPatientsResult.setWu("本院"); + } else { + twinsPatientsResult.setWu("外院"); + } + } + } + } + + //系统初诊次数 + int ichu = CollectionUtils.isEmpty(chu) ? 0 : chu.size(); + + //系统复诊次数 + int i = 0; + if (CollectionUtils.isNotEmpty(ant)) { + //复诊次数 + i = ant.size(); + sort(ant); + for (AntenatalExaminationModel a : ant) { + try { + if (StringUtils.isNotEmpty(a.getHospitalId())) { + Organization og = organizationService.getOrganization(Integer.valueOf(a.getHospitalId())); + if (null != og) { + twinsPatientsResult.setCurrentCh(og.getName()); + break; + } + } + } catch (Exception e) { + twinsPatientsResult.setCurrentCh(""); + } + } + } else { + for (AntExChuModel a : chu) { + try { + if (StringUtils.isNotEmpty(a.getHospitalId())) { + Organization og = organizationService.getOrganization(Integer.valueOf(a.getHospitalId())); + if (null != og) { + twinsPatientsResult.setCurrentCh(og.getName()); + break; + } + } + } catch (Exception e) { + twinsPatientsResult.setCurrentCh(""); + } + } + } + + twinsPatientsResult.setcTimes(i + ichu); + + + antExQuery.setHospitalId(hospital); + //本院初诊 + int chi = countAntChu(chu, hospital); + + //本院复诊 + int chb = capLocalHospital(hospital, ant); + twinsPatientsResult.setcHTimes(chi + chb); + stopWatch.stop(); + String nextCheckTime = ""; + stopWatch.start("query antex list"); + + + if (null != patients.getNextCheckTime()) { + nextCheckTime = DateUtil.getyyyy_MM_dd(patients.getNextCheckTime()); + } + + if (StringUtils.isNotEmpty(patients.getLastCheckEmployeeId())) { + if (NumberUtils.isNumber(patients.getLastCheckEmployeeId())) { + Users users = usersService.getUsers(NumberUtils.toInt(patients.getLastCheckEmployeeId())); + if (null != users) { + twinsPatientsResult.setCheckDoctor(users.getName()); + } else { + twinsPatientsResult.setCheckDoctor(patients.getLastCheckEmployeeId()); + } + } else { + twinsPatientsResult.setCheckDoctor(patients.getLastCheckEmployeeId()); + } + } + + + stopWatch.stop(); + stopWatch.start("query basicconfig"); + //注册地址 + twinsPatientsResult.setRegisterAddr(CommonsHelper.getResidence(patients.getProvinceId(), patients.getCityId(), patients.getAreaId(), patients.getStreetId(), patients.getAddress(), basicConfigService)); + twinsPatientsResult.setAddr(CommonsHelper.getResidence(patients.getProvinceRegisterId(), patients.getCityRegisterId(), patients.getAreaRegisterId(), patients.getStreetRegisterId(), patients.getAddressRegister(), basicConfigService)); + try { + twinsPatientsResult.setFirstBH(organizationService.getOrganization(Integer.valueOf(patients.getHospitalId())).getName()); + } catch (Exception e) { + twinsPatientsResult.setFirstBH(""); + } + + twinsPatientsResult.setServiceType(ServiceTypeEnums.getTitleById(patients.getServiceType())); + twinsPatientsResult.setServiceStatus(ServiceStatusEnums.getNameById(patients.getServiceStatus())); + //修改获取建档里面的高危等级不用在重新去算 +// HighScoreResult highScoreResult = antenatalExaminationFacade.findLastRisk(patients.getPid(), true); +// twinsPatientsResult.setrLevel(highScoreResult.filter(highScoreResult.getLevel())); + twinsPatientsResult.setcTime(nextCheckTime); + + + //高危因素 + List factor = patients.getRiskFactorId(); + + if (CollectionUtils.isNotEmpty(factor)) { + StringBuilder sb = new StringBuilder(56); + for (String srt : factor) { + if (StringUtils.isNotEmpty(srt)) { + BasicConfig basicConfig = basicConfigService.getOneBasicConfigById(srt); + if (null != basicConfig && sb.indexOf(basicConfig.getName()) == -1) { + //妊娠合并贫血(Hb 60-110g/L) 轻度缺铁性贫血(100-109g/L)中度缺铁性贫血(70-99g/L)轻度妊娠期贫血(100-109g/l)(缺铁性) + //轻度妊娠期贫血(100-109g/l)(巨幼细胞性) 轻度妊娠期贫血(100-109g/l)(再生障碍性) 中度妊娠期贫血(70-99g/l)(缺铁性) + //中度妊娠期贫血(70-99g/l)(巨幼细胞性) 中度妊娠期贫血(70-99g/l)(再生障碍性) 中度妊娠期贫血(70-99g/l)(未分类) 轻度妊娠期贫血(100-109g/l)(未分类) + //重度贫血(Hb40-60g/L) 极重度贫血(Hb<40g/L)极重度贫血(<40 g/L)(缺铁性)极重度贫血(<40 g/L)(巨幼细胞) + //极重度贫血(<40 g/L)(再生障碍性) 极重度贫血(<40 g/L)(未分类)重度妊娠期贫血(40-69g/L)(缺铁性)重度妊娠期贫血(40-69g/L)(巨幼细胞性) + //重度妊娠期贫血(40-69g/l)(再生障碍性) 重度妊娠期贫血(40-69g/l)(未分类)再生障碍性贫血 + + if(basicConfig.getName().contains("贫血")){ + sb.append(basicConfig.getName()).append(','); + } + } + } + } + if (sb.toString().endsWith(",")) { + twinsPatientsResult.setrFactor(sb.substring(0, sb.length() - 1)); + } else { + twinsPatientsResult.setrFactor(sb.toString()); + } + + /* if (!"-".equals(twinsPatientsResult.getrFactor()) && StringUtils.isNotEmpty(patients.getoRiskFactor())) { + twinsPatientsResult.setrFactor(twinsPatientsResult.getrFactor() + "," + patients.getoRiskFactor()); + } else if (StringUtils.isNotEmpty(patients.getoRiskFactor())) { + twinsPatientsResult.setrFactor(patients.getoRiskFactor()); + }*/ + } else if (StringUtils.isNotEmpty(patients.getoRiskFactor())) { + twinsPatientsResult.setrFactor(patients.getoRiskFactor()); + } + List level = new ArrayList(); + if (StringUtils.isNotEmpty(patients.getRiskLevelId())) { + try { + List list = JsonUtil.jkstr2Obj(patients.getRiskLevelId(), List.class); + for (String str : list) { + BasicConfig basicConfig = basicConfigService.getOneBasicConfigById(str); + if (null != basicConfig) { + Map map = new HashMap(); + basicConfig.replenRisk(map); + // String name = basicConfig.getName(); + // if (name.indexOf("预警") > -1) { + // name = name.replace("预警", ""); + // } + // map.put("name", name); + // map.put("color", "risk_" + RiskDefaultTypeEnum.getColor(name)); + level.add(map); + } + } + } catch (Exception e) { + ExceptionUtils.catchException(e, "patients.getRiskLevelId error."); + } + + twinsPatientsResult.setrLevel(HighScoreResult.filter(level)); + } + twinsPatientsResult.setCardNo(patients.getCardNo()); + twinsPatientsResult.setPcerteTypeId(patients.getPcerteTypeId()); + stopWatch.stop(); + if (twinsPatientsResult.getrFactor() != null) { + + if ("1".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("妊娠合并贫血(Hb 60-110g/L)")) { + data.add(twinsPatientsResult); + } + + } else if ("2".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("轻度缺铁性贫血(100-109g/L)")) { + data.add(twinsPatientsResult); + } + } else if ("3".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("中度缺铁性贫血(70-99g/L)")) { + data.add(twinsPatientsResult); + } + }else if ("4".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("轻度妊娠期贫血(100-109g/l)(缺铁性)")) { + data.add(twinsPatientsResult); + } + + } else if ("5".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("轻度妊娠期贫血(100-109g/l)(巨幼细胞性)")) { + data.add(twinsPatientsResult); + } + } else if ("6".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("轻度妊娠期贫血(100-109g/l)(再生障碍性)")) { + data.add(twinsPatientsResult); + } + }else if ("7".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("轻度妊娠期贫血(100-109g/l)(未分类)")) { + data.add(twinsPatientsResult); + } + + } else if ("8".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("中度妊娠期贫血(70-99g/l)(缺铁性)")) { + data.add(twinsPatientsResult); + } + } else if ("9".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("中度妊娠期贫血(70-99g/l)(巨幼细胞性)")) { + data.add(twinsPatientsResult); + } + }else if ("10".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("中度妊娠期贫血(70-99g/l)(再生障碍性)")) { + data.add(twinsPatientsResult); + } + + } else if ("11".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("中度妊娠期贫血(70-99g/l)(未分类)")) { + data.add(twinsPatientsResult); + } + } else if ("12".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("重度贫血(Hb40-60g/L)")) { + data.add(twinsPatientsResult); + } + }else if ("13".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("重度妊娠期贫血(40-69g/L)(缺铁性)")) { + data.add(twinsPatientsResult); + } + + } else if ("14".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("重度妊娠期贫血(40-69g/L)(巨幼细胞性)")) { + data.add(twinsPatientsResult); + } + } else if ("15".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("重度妊娠期贫血(40-69g/l)(再生障碍性)")) { + data.add(twinsPatientsResult); + } + }else if ("16".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("重度妊娠期贫血(40-69g/l)(未分类)")) { + data.add(twinsPatientsResult); + } + + } else if ("17".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("极重度贫血(Hb<40g/L)")) { + data.add(twinsPatientsResult); + } + } else if ("18".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("极重度贫血(Hb<40g/L)(缺铁性)")) { + data.add(twinsPatientsResult); + } + }else if ("19".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("极重度贫血(<40 g/L)(巨幼细胞)")) { + data.add(twinsPatientsResult); + } + + } else if ("20".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("极重度贫血(<40 g/L)(再生障碍性)")) { + data.add(twinsPatientsResult); + } + } else if ("21".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("极重度贫血(<40 g/L)(未分类)")) { + data.add(twinsPatientsResult); + } + }else if ("22".equals(twinsType)) { + if (twinsPatientsResult.getrFactor().contains("再生障碍性贫血")) { + data.add(twinsPatientsResult); + } + }else if (twinsPatientsResult.getrFactor().contains("贫血")) { + data.add(twinsPatientsResult); + } + } + logger.debug(stopWatch.toString()); + } + return data; + } + + private int capLocalHospital(String hospitalId, List list) { + if (CollectionUtils.isEmpty(list)) { + return 0; + } + int count = 0; + for (AntenatalExaminationModel model : list) { + if (model.getHospitalId().equals(hospitalId)) { + count++; + } + } + return count; + } + + //统计复查里面的本院检查数 + private int countAntChu(List list, String hospital) { + int count = 0; + if (CollectionUtils.isEmpty(list) || StringUtils.isEmpty(hospital)) { + return count; + } + for (AntExChuModel model : list) { + if (hospital.equals(model.getHospitalId())) { + count++; + } + } + return count; + } + + private void sort(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + Collections.sort(list, new Comparator() { + @Override + public int compare(AntenatalExaminationModel o1, AntenatalExaminationModel o2) { + if (o1.getCreated().getTime() > o2.getCreated().getTime()) { + return 1; + } else if (o1.getCreated().getTime() < o2.getCreated().getTime()) { + return -1; + } + return 0; + } + }); + } +} \ No newline at end of file -- 1.8.3.1