2025-09-24 10:16:11 +08:00

426 lines
20 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<LabResult> 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<XmInfo> xmInfoList0 = commonUtil.getXmInfoList(yq);
if(xmInfoList0.size()==0) return errmsg;
List<XmInfo> 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<XmInfo> 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<LabResult> chkval = checkResultMapper.getChkvaList(brdh, ldt_startda, jyrq, yq, xmdh);
if (chkval != null && chkval.size() > 0) {
List<LabResult> 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<LabResult> 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<LabChk> labChkList = checkResultMapper.getLabChkList(yq);
if(labChkList.size()==0) return errmsg;
for (LabChk labChk : labChkList) {
String jsgs = labChk.getHdnr();
boolean setjgsg = true;
Map<String, String> 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<LabResult> 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<String, Object> autochksamplenew(LabPat labPat, List<LabResult> labResultList) {
Map<String, Object> 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<String, Object> chksamplenew(LabPat labPat, List<LabResult> labResultList, int xh) {
String yq = labPat.getYq();
String bz = labPat.getBz();
Map<String, Object> params = new HashMap<>();
params.put("code", "0");
params.put("msg", "");
params.put("bz", bz);
params.put("setbz", false);
params.put("xh", xh);
List<LabCheckrules> 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<LabResult> labResultList, String checkrules, String ruledisplay) {
String errmsg = "";
boolean flag = false;
checkrules = checkrules.replace("\"", "'");
if (checkrules.contains("ANY_")) {
Map<String, String> 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<LabResult> labResultList0 = commonUtil.getLabResultWithSql(labPat.getJyrq(), labPat.getYq(), labPat.getYbh(), errmsg);
if (labResultList0.size() > 0) flag = true;
}
if (flag = true) errmsg = "审核条件: " + ruledisplay + " 规则触发,未通过审核!";
} else {
Map<String, String> 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<LabResult> 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;
}
}