package com.czlis.interfaceCommon.utils; import com.czlis.common.core.domain.Result; import com.czlis.common.core.domain.entity.lis.*; import com.czlis.interfaceCommon.mapper.CheckResultMapper; import com.czlis.interfaceCommon.mapper.LabCheckrulesMapper; import com.czlis.interfaceCommon.mapper.XmInfoMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; import java.util.stream.Collectors; @Component public class CheckResultUtils { @Autowired CheckResultMapper checkResultMapper; @Autowired LabCheckrulesMapper labCheckrulesMapper; @Autowired CommonUtil commonUtil = new CommonUtil(); public String chksample(LabPat labPat, List labResultList) { String errmsg = ""; String brdh = labPat.getBrdh(); if (brdh == null || "".equals(brdh)) { return errmsg; } String yq = labPat.getYq(); Date jyrq = labPat.getJyrq(); String ybh = labPat.getYbh(); List xmInfoList0 = commonUtil.getXmInfoList(yq); if(xmInfoList0.size()==0) return errmsg; List xmInfoList = xmInfoList0.stream().filter(xmInfo -> xmInfo.getXjx()!=null||xmInfo.getSjx()!=null||xmInfo.getJgjg()!=null||xmInfo.getJgz()!=null||xmInfo.getJgbz()!=null).collect(Collectors.toList()); if(xmInfoList.size()>0) { for (LabResult labResult : labResultList) { String xmdh = labResult.getXmdh(); List collect = xmInfoList.stream().filter(xmInfo -> xmInfo.getXmdh().equals(xmdh)).collect(Collectors.toList()); if (collect.size() > 0) { XmInfo xmInfo = collect.get(0); //字典规定的结果值范围约束 Double xjx = xmInfo.getXjx(); Double sjx = xmInfo.getSjx(); if (xjx != null || sjx != null) { String csjg = LisUtil.getOverNumber(labResult.getCsjg()); if (LisUtil.isNumber(csjg)) { Double csjgnum = Double.parseDouble(csjg); if (xjx != null && csjgnum <= xjx) { errmsg = errmsg + LisUtil.LINE_SEPARATOR + xmdh + " 结果超出审核条件"; } else if (sjx != null && csjgnum >= sjx) { errmsg = errmsg + LisUtil.LINE_SEPARATOR + xmdh + " 结果超出审核条件"; } } } //字典规定的多少天内结果间隔范围约束 Integer jgjg = xmInfo.getJgjg(); Double jgz = xmInfo.getJgz(); String jgbz = xmInfo.getJgbz(); if (jgjg != null && jgjg > 0 && jgz != null && jgz > 0) { String csjg = LisUtil.getOverNumber(labResult.getCsjg()); if (LisUtil.isNumber(csjg)) { Double csjgnum = Double.parseDouble(csjg); Date ldt_startda = LisUtil.relativeDate(jyrq, -jgjg); Double lde_up = null; Double lde_low = null; if ("2".equals(jgbz)) { lde_up = csjgnum / (1 - jgz / 100); lde_low = csjgnum / (1 + jgz / 100); } else { lde_up = csjgnum + jgz; lde_low = csjgnum - jgz; } List chkval = checkResultMapper.getChkvaList(brdh, ldt_startda, jyrq, yq, xmdh); if (chkval != null && chkval.size() > 0) { List collect0 = chkval.stream().filter(LabResult0 -> LisUtil.isNumber(LabResult0.getCsjg())).collect(Collectors.toList()); if (collect0.size() > 0) { Double finalLde_up = lde_up; Double finalLde_low = lde_low; List collect1 = collect0.stream().filter(LabResult1 -> Double.parseDouble(LabResult1.getCsjg()) > finalLde_up && Double.parseDouble(LabResult1.getCsjg()) < finalLde_low).collect(Collectors.toList()); if (collect1.size() > 0) { errmsg = errmsg + LisUtil.LINE_SEPARATOR + xmdh + " 结果 (" + labResult.getCsjg() + ") 和 " + DateFormatUtils.format(collect1.get(0).getJyrq(), "yyyy-MM-dd") + "日" + collect1.get(0).getYbh() + " 号标本的结果 (" + collect1.get(0).getCsjg() + ") 相比超标"; } } } } } } } } List labChkList = checkResultMapper.getLabChkList(yq); if(labChkList.size()==0) return errmsg; for (LabChk labChk : labChkList) { String jsgs = labChk.getHdnr(); boolean setjgsg = true; Map variables = new HashMap<>(); String[] parameters = CalcUtils.getParameters(jsgs); for (int i = 0; i < parameters.length; i++) { String itemcode = parameters[i]; if ("SEX".equals(itemcode)) { String sex = labPat.getBrxb().trim(); // if ("1".equals(sex)) sex = "男"; // if ("2".equals(sex)) sex = "女"; variables.put("SEX", sex); } else if ("AGE".equals(itemcode)) { double age = AgeUtils.getDecimalAge(AgeUtils.getBirthDateByAge(labPat.getNl(), labPat.getNldw())); variables.put("AGE", String.valueOf(age)); } else { List collect = labResultList.stream().filter(result -> result.getXmdh().equals(itemcode)).collect(Collectors.toList()); if (collect.size() > 0) { variables.put(itemcode, collect.get(0).getCsjg()); } else { setjgsg = false; } } } //项目不全,此公式跳过 if (setjgsg) { boolean result = CalcUtils.getBooleanFromCalc(jsgs, variables,true); if (!result) { errmsg = errmsg + LisUtil.LINE_SEPARATOR + "审核条件: " + jsgs + " 规则触发,未通过审核!"; } } } if (!"".equals(errmsg)) errmsg = errmsg + LisUtil.LINE_SEPARATOR + "请咨询该仪器组长或专业检验师 !"; return errmsg; } /** * 自动审核时,询问默认失败,填备注默认每次都填 * * @param labPat * @param labResultList * @return */ public Map autochksamplenew(LabPat labPat, List labResultList) { Map params = chksamplenew(labPat, labResultList, 0); String code = (String) params.get("code"); if ("3".equals(code)) params.put("code", "0"); if ("5".equals(code)) params.put("code", "-1"); if ("1".equals(code)) params.put("code", "-1"); return params; } /** * 高级审核,对于重复询问通过xh递归询问 * * @param labPat * @param labResultList * @param xh * @return */ public Map chksamplenew(LabPat labPat, List labResultList, int xh) { String yq = labPat.getYq(); String bz = labPat.getBz(); Map params = new HashMap<>(); params.put("code", "0"); params.put("msg", ""); params.put("bz", bz); params.put("setbz", false); params.put("xh", xh); List labCheckruleslist = labCheckrulesMapper.getLabCheckrules(yq); if (labCheckruleslist.size() == 0) return params; if (xh > labCheckruleslist.size()) return params; for (int i = xh; i < labCheckruleslist.size(); i++) { LabCheckrules labCheckrules = labCheckruleslist.get(i); String checkrules = labCheckrules.getCheckrules(); String checktype = labCheckrules.getChecktype(); String logcontent = labCheckrules.getLogcontent(); String ruledisplay = labCheckrules.getRuledisplay(); String errmsg = checkcondition(labPat, labResultList, checkrules, ruledisplay); if (!"".equals(errmsg)) { if ("0".equals(checktype)) { errmsg = errmsg+ LisUtil.LINE_SEPARATOR + "你是否要强行通过?" ; params.put("code", "5"); params.put("msg", errmsg); int ruleid0 = labCheckrules.getRuleid(); params.put("xh", i+1); return params; } else if ("3".equals(checktype)) { errmsg = errmsg + LisUtil.LINE_SEPARATOR + "不允许审核!"; params.put("code", "1"); params.put("msg", errmsg); params.put("xh", i+1); return params; } else if ("4".equals(checktype)) { bz = replacebz(labPat, labResultList, logcontent); labPat.setBz(bz); params.put("setbz", true); errmsg = "此次审核将产生一个备注信息" + LisUtil.LINE_SEPARATOR + bz; params.put("code", "3"); params.put("msg", errmsg); params.put("bz", bz); params.put("xh", i+1); } } } return params; } /** * 计算公式注入参数执行,返回为真则证明筛选条件成立,需要禁止审核通过! * * @param labPat * @param labResultList * @param checkrules * @param ruledisplay * @return */ private String checkcondition(LabPat labPat, List labResultList, String checkrules, String ruledisplay) { String errmsg = ""; boolean flag = false; checkrules = checkrules.replace("\"", "'"); if (checkrules.contains("ANY_")) { Map variables = new HashMap<>(); String[] parameters = CalcUtils.getParameters(checkrules); for (int i = 0; i < parameters.length; i++) { String itemcode = parameters[i]; switch (itemcode) { case "SEX": String sex = labPat.getBrxb().trim(); // if ("1".equals(sex)) sex = "男"; // if ("2".equals(sex)) sex = "女"; errmsg.replace("[SEX]", sex); break; case "AGE": double age = AgeUtils.getDecimalAge(AgeUtils.getBirthDateByAge(labPat.getNl(), labPat.getNldw())); errmsg.replace("[AGE]", String.valueOf(age)); break; case "BRLY": String brly = labPat.getBrly(); // String brlymc = commonUtil.getComDictNameById("PT", brly); // if (!"".equals(brlymc) || brlymc != null) brly = brlymc; errmsg.replace("[BRLY]", brly); break; case "KSDH": String ksdh = labPat.getKsdh(); // String ksdhmc = commonUtil.getComDictNameById("DP", ksdh); // if (!"".equals(ksdhmc) || ksdhmc != null) ksdh = ksdhmc; errmsg.replace("[KSDH]", ksdh); break; case "YBLX": String yblx = labPat.getYblx(); String yblxmc = commonUtil.getComDictNameById("BT", yblx); if (!"".equals(yblxmc) || yblxmc != null) yblx = yblxmc; errmsg.replace("[YBLX]", yblx); break; case "BZ": errmsg.replace("[BZ]", labPat.getBz()); break; case "ZD": errmsg.replace("[ZD]", labPat.getZd()); break; case "ANY_NUMER": errmsg.replace("[ANY_NUMER]", "lab_result.csjg"); break; case "ANY_TEXT": errmsg.replace("[ANY_TEXT]", "lab_result.csjg"); break; case "ANY_CRI": errmsg.replace("[ANY_CRI]", "lab_result.alarm_flag"); break; case "ANY_REV": errmsg.replace("[ANY_REV]", "lab_result.redo_flag"); break; case "ANY_JGBZ": errmsg.replace("[ANY_CRI]", "lab_result.result_flag"); break; case "ANY_ID": errmsg.replace("[ANY_CRI]", "lab_result.xmdh"); break; default: String csjg = Optional.ofNullable(labResultList).flatMap(list -> list.stream().filter(result -> result != null && itemcode.equals(result.getXmdh())).map(LabResult::getCsjg).findFirst()).orElse(null); if (csjg == null) return ""; errmsg.replace("[" + itemcode + "]", csjg); } List labResultList0 = commonUtil.getLabResultWithSql(labPat.getJyrq(), labPat.getYq(), labPat.getYbh(), errmsg); if (labResultList0.size() > 0) flag = true; } if (flag = true) errmsg = "审核条件: " + ruledisplay + " 规则触发,未通过审核!"; } else { Map variables = new HashMap<>(); String[] parameters = CalcUtils.getParameters(checkrules); for (int i = 0; i < parameters.length; i++) { String itemcode = parameters[i]; switch (itemcode) { case "SEX": String sex = labPat.getBrxb().trim(); // if ("1".equals(sex)) sex = "男"; // if ("2".equals(sex)) sex = "女"; variables.put(itemcode, sex); break; case "AGE": double age = AgeUtils.getDecimalAge(AgeUtils.getBirthDateByAge(labPat.getNl(), labPat.getNldw())); variables.put(itemcode, String.valueOf(age)); break; case "BRLY": String brly = labPat.getBrly(); // String brlymc = commonUtil.getComDictNameById("PT", brly); // if (!"".equals(brlymc) || brlymc != null) brly = brlymc; variables.put(itemcode, brly); break; case "KSDH": String ksdh = labPat.getKsdh(); // String ksdhmc = commonUtil.getComDictNameById("DP", ksdh); // if (!"".equals(ksdhmc) || ksdhmc != null) ksdh = ksdhmc; variables.put(itemcode, ksdh); break; case "YBLX": String yblx = labPat.getYblx(); String yblxmc = commonUtil.getComDictNameById("BT", yblx); if (!"".equals(yblxmc) || yblxmc != null) yblx = yblxmc; variables.put(itemcode, yblx); break; case "BZ": variables.put(itemcode, labPat.getBz()); break; case "ZD": variables.put(itemcode, labPat.getZd()); break; default: String csjg = Optional.ofNullable(labResultList).flatMap(list -> list.stream().filter(result -> result != null && itemcode.equals(result.getXmdh())).map(LabResult::getCsjg).findFirst()).orElse(null); if (csjg == null)return ""; variables.put(itemcode, csjg); } } flag = CalcUtils.getBooleanFromCalc(checkrules, variables); if (flag) errmsg = "审核条件: " + ruledisplay + " 规则触发,未通过审核!"; } return errmsg; } /** * 备注信息公式转换备注内容 * * @param labPat * @param labResultList * @param logcontent * @return */ private String replacebz(LabPat labPat, List labResultList, String logcontent) { String errmsg = logcontent; String[] parameters = CalcUtils.getParameters(logcontent); for (int i = 0; i < parameters.length; i++) { String itemcode = parameters[i]; switch (itemcode) { case "SEX": String sex = labPat.getBrxb().trim(); if ("1".equals(sex)) sex = "男"; if ("2".equals(sex)) sex = "女"; errmsg.replace("[SEX]", sex); break; case "AGE": double age = AgeUtils.getDecimalAge(AgeUtils.getBirthDateByAge(labPat.getNl(), labPat.getNldw())); errmsg.replace("[AGE]", String.valueOf(age)); break; case "BRLY": String brly = labPat.getBrly(); String brlymc = commonUtil.getComDictNameById("PT", brly); if (!"".equals(brlymc) || brlymc != null) brly = brlymc; errmsg.replace("[BRLY]", brly); break; case "KSDH": String ksdh = labPat.getKsdh(); String ksdhmc = commonUtil.getComDictNameById("DP", ksdh); if (!"".equals(ksdhmc) || ksdhmc != null) ksdh = ksdhmc; errmsg.replace("[KSDH]", ksdh); break; case "YBLX": String yblx = labPat.getYblx(); String yblxmc = commonUtil.getComDictNameById("BT", yblx); if (!"".equals(yblxmc) || yblxmc != null) yblx = yblxmc; errmsg.replace("[YBLX]", yblx); break; case "BZ": errmsg.replace("[BZ]", labPat.getBz()); break; case "ZD": errmsg.replace("[ZD]", labPat.getZd()); break; default: String csjg = Optional.ofNullable(labResultList).flatMap(list -> list.stream().filter(result -> result != null && itemcode.equals(result.getXmdh())).map(LabResult::getCsjg).findFirst()).orElse(null); if (csjg == null) csjg = ""; errmsg.replace("[" + itemcode + "]", csjg); } } String bz = labPat.getBz(); if (errmsg == null || "".equals(errmsg)) return bz; if (bz == null || "".equals(bz)) return errmsg; if (bz.contains(errmsg)) return bz; String bz0 = String.valueOf(bz.charAt(bz.length() - 1)); switch (bz0) { case ",": case ":": case ";": case ".": case "。": case ",": case "、": case ";": case ":": bz = bz + errmsg; break; default: bz = bz + "," + errmsg; } return bz; } }