426 lines
20 KiB
Java
Raw Normal View History

2025-08-28 18:13:57 +08:00
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;
2025-09-01 19:19:09 +08:00
import com.czlis.interfaceCommon.mapper.LabCheckrulesMapper;
2025-08-28 18:13:57 +08:00
import com.czlis.interfaceCommon.mapper.XmInfoMapper;
2025-09-04 18:35:55 +08:00
import lombok.extern.slf4j.Slf4j;
2025-08-28 18:13:57 +08:00
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
2025-09-02 17:47:53 +08:00
import java.util.*;
2025-08-28 18:13:57 +08:00
import java.util.stream.Collectors;
@Component
public class CheckResultUtils {
2025-09-02 17:47:53 +08:00
2025-08-28 18:13:57 +08:00
@Autowired
CheckResultMapper checkResultMapper;
2025-09-01 19:19:09 +08:00
@Autowired
LabCheckrulesMapper labCheckrulesMapper;
2025-09-02 17:47:53 +08:00
@Autowired
CommonUtil commonUtil = new CommonUtil();
2025-09-02 18:30:07 +08:00
2025-08-28 18:13:57 +08:00
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();
2025-09-03 19:26:35 +08:00
List<XmInfo> xmInfoList0 = commonUtil.getXmInfoList(yq);
2025-09-04 18:35:55 +08:00
if(xmInfoList0.size()==0) return errmsg;
2025-09-03 19:26:35 +08:00
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();
2025-09-04 18:35:55 +08:00
2025-09-03 19:26:35 +08:00
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 + " 结果超出审核条件";
}
2025-08-28 18:13:57 +08:00
}
}
2025-09-03 19:26:35 +08:00
//字典规定的多少天内结果间隔范围约束
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());
2025-08-28 18:13:57 +08:00
2025-09-03 19:26:35 +08:00
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;
2025-08-28 18:13:57 +08:00
}
2025-09-03 19:26:35 +08:00
List<LabResult> chkval = checkResultMapper.getChkvaList(brdh, ldt_startda, jyrq, yq, xmdh);
2025-09-04 18:35:55 +08:00
if (chkval != null && chkval.size() > 0) {
List<LabResult> collect0 = chkval.stream().filter(LabResult0 -> LisUtil.isNumber(LabResult0.getCsjg())).collect(Collectors.toList());
2025-09-03 19:26:35 +08:00
if (collect0.size() > 0) {
2025-09-04 18:35:55 +08:00
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() + ") 相比超标";
}
2025-08-28 18:13:57 +08:00
2025-09-04 18:35:55 +08:00
}
2025-09-03 19:26:35 +08:00
}
2025-08-28 18:13:57 +08:00
}
}
2025-09-03 19:26:35 +08:00
2025-08-28 18:13:57 +08:00
}
}
}
2025-09-02 18:30:07 +08:00
List<LabChk> labChkList = checkResultMapper.getLabChkList(yq);
2025-09-04 18:35:55 +08:00
if(labChkList.size()==0) return errmsg;
2025-09-02 18:30:07 +08:00
for (LabChk labChk : labChkList) {
String jsgs = labChk.getHdnr();
2025-08-28 18:13:57 +08:00
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();
2025-09-03 19:26:35 +08:00
// if ("1".equals(sex)) sex = "男";
// if ("2".equals(sex)) sex = "女";
2025-08-28 18:13:57 +08:00
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;
}
}
}
//项目不全,此公式跳过
2025-09-02 18:30:07 +08:00
if (setjgsg) {
2025-09-24 10:16:11 +08:00
boolean result = CalcUtils.getBooleanFromCalc(jsgs, variables,true);
if (!result) {
2025-09-03 19:26:35 +08:00
errmsg = errmsg + LisUtil.LINE_SEPARATOR + "审核条件: " + jsgs + " 规则触发,未通过审核!";
2025-08-28 18:13:57 +08:00
}
}
}
2025-09-02 18:30:07 +08:00
if (!"".equals(errmsg)) errmsg = errmsg + LisUtil.LINE_SEPARATOR + "请咨询该仪器组长或专业检验师 !";
2025-08-28 18:13:57 +08:00
return errmsg;
}
2025-09-01 19:19:09 +08:00
/**
* 自动审核时,询问默认失败,填备注默认每次都填
2025-09-02 18:30:07 +08:00
*
2025-09-01 19:19:09 +08:00
* @param labPat
* @param labResultList
* @return
*/
public Map<String, Object> autochksamplenew(LabPat labPat, List<LabResult> labResultList) {
2025-09-02 18:30:07 +08:00
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");
2025-09-01 19:19:09 +08:00
return params;
}
/**
* 高级审核,对于重复询问通过xh递归询问
2025-09-02 18:30:07 +08:00
*
2025-09-01 19:19:09 +08:00
* @param labPat
* @param labResultList
* @param xh
* @return
*/
2025-09-02 18:30:07 +08:00
public Map<String, Object> chksamplenew(LabPat labPat, List<LabResult> labResultList, int xh) {
2025-09-01 19:19:09 +08:00
String yq = labPat.getYq();
2025-09-02 18:30:07 +08:00
String bz = labPat.getBz();
2025-09-01 19:19:09 +08:00
Map<String, Object> params = new HashMap<>();
params.put("code", "0");
2025-09-02 18:30:07 +08:00
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;
2025-09-03 19:26:35 +08:00
if (xh > labCheckruleslist.size()) return params;
2025-09-02 18:30:07 +08:00
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)) {
2025-09-04 18:35:55 +08:00
errmsg = errmsg+ LisUtil.LINE_SEPARATOR + "你是否要强行通过?" ;
2025-09-01 19:19:09 +08:00
params.put("code", "5");
2025-09-02 18:30:07 +08:00
params.put("msg", errmsg);
int ruleid0 = labCheckrules.getRuleid();
2025-09-03 19:26:35 +08:00
params.put("xh", i+1);
2025-09-01 19:19:09 +08:00
return params;
2025-09-02 18:30:07 +08:00
} else if ("3".equals(checktype)) {
2025-09-04 18:35:55 +08:00
errmsg = errmsg + LisUtil.LINE_SEPARATOR + "不允许审核!";
2025-09-01 19:19:09 +08:00
params.put("code", "1");
2025-09-02 18:30:07 +08:00
params.put("msg", errmsg);
2025-09-03 19:26:35 +08:00
params.put("xh", i+1);
2025-09-01 19:19:09 +08:00
return params;
2025-09-02 18:30:07 +08:00
} else if ("4".equals(checktype)) {
bz = replacebz(labPat, labResultList, logcontent);
2025-09-01 19:19:09 +08:00
labPat.setBz(bz);
params.put("setbz", true);
2025-09-02 18:30:07 +08:00
errmsg = "此次审核将产生一个备注信息" + LisUtil.LINE_SEPARATOR + bz;
2025-09-01 19:19:09 +08:00
params.put("code", "3");
2025-09-02 18:30:07 +08:00
params.put("msg", errmsg);
params.put("bz", bz);
2025-09-03 19:26:35 +08:00
params.put("xh", i+1);
2025-09-01 19:19:09 +08:00
}
}
}
return params;
}
2025-09-02 17:47:53 +08:00
/**
* 计算公式注入参数执行,返回为真则证明筛选条件成立,需要禁止审核通过!
2025-09-02 18:30:07 +08:00
*
2025-09-02 17:47:53 +08:00
* @param labPat
* @param labResultList
* @param checkrules
* @param ruledisplay
* @return
*/
2025-09-02 18:30:07 +08:00
private String checkcondition(LabPat labPat, List<LabResult> labResultList, String checkrules, String ruledisplay) {
String errmsg = "";
boolean flag = false;
checkrules = checkrules.replace("\"", "'");
if (checkrules.contains("ANY_")) {
2025-09-01 19:19:09 +08:00
Map<String, String> variables = new HashMap<>();
2025-09-02 18:30:07 +08:00
String[] parameters = CalcUtils.getParameters(checkrules);
2025-09-01 19:19:09 +08:00
for (int i = 0; i < parameters.length; i++) {
String itemcode = parameters[i];
switch (itemcode) {
case "SEX":
String sex = labPat.getBrxb().trim();
2025-09-03 19:26:35 +08:00
// if ("1".equals(sex)) sex = "男";
// if ("2".equals(sex)) sex = "女";
2025-09-02 17:47:53 +08:00
errmsg.replace("[SEX]", sex);
2025-09-01 19:19:09 +08:00
break;
case "AGE":
double age = AgeUtils.getDecimalAge(AgeUtils.getBirthDateByAge(labPat.getNl(), labPat.getNldw()));
2025-09-02 17:47:53 +08:00
errmsg.replace("[AGE]", String.valueOf(age));
break;
case "BRLY":
2025-09-02 18:30:07 +08:00
String brly = labPat.getBrly();
2025-09-03 19:26:35 +08:00
// String brlymc = commonUtil.getComDictNameById("PT", brly);
// if (!"".equals(brlymc) || brlymc != null) brly = brlymc;
2025-09-02 17:47:53 +08:00
errmsg.replace("[BRLY]", brly);
break;
case "KSDH":
2025-09-02 18:30:07 +08:00
String ksdh = labPat.getKsdh();
2025-09-03 19:26:35 +08:00
// String ksdhmc = commonUtil.getComDictNameById("DP", ksdh);
// if (!"".equals(ksdhmc) || ksdhmc != null) ksdh = ksdhmc;
2025-09-02 17:47:53 +08:00
errmsg.replace("[KSDH]", ksdh);
break;
case "YBLX":
2025-09-02 18:30:07 +08:00
String yblx = labPat.getYblx();
String yblxmc = commonUtil.getComDictNameById("BT", yblx);
if (!"".equals(yblxmc) || yblxmc != null) yblx = yblxmc;
2025-09-02 17:47:53 +08:00
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");
2025-09-01 19:19:09 +08:00
break;
2025-09-02 17:47:53 +08:00
case "ANY_TEXT":
errmsg.replace("[ANY_TEXT]", "lab_result.csjg");
2025-09-01 19:19:09 +08:00
break;
2025-09-02 17:47:53 +08:00
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:
2025-09-02 18:30:07 +08:00
String csjg = Optional.ofNullable(labResultList).flatMap(list -> list.stream().filter(result -> result != null && itemcode.equals(result.getXmdh())).map(LabResult::getCsjg).findFirst()).orElse(null);
2025-09-05 20:21:10 +08:00
if (csjg == null) return "";
2025-09-02 18:30:07 +08:00
errmsg.replace("[" + itemcode + "]", csjg);
2025-09-02 17:47:53 +08:00
2025-09-01 19:19:09 +08:00
}
2025-09-04 18:35:55 +08:00
List<LabResult> labResultList0 = commonUtil.getLabResultWithSql(labPat.getJyrq(), labPat.getYq(), labPat.getYbh(), errmsg);
2025-09-02 18:30:07 +08:00
if (labResultList0.size() > 0) flag = true;
2025-09-01 19:19:09 +08:00
}
2025-09-03 19:26:35 +08:00
if (flag = true) errmsg = "审核条件: " + ruledisplay + " 规则触发,未通过审核!";
2025-09-02 18:30:07 +08:00
} else {
2025-09-02 17:47:53 +08:00
Map<String, String> variables = new HashMap<>();
2025-09-02 18:30:07 +08:00
String[] parameters = CalcUtils.getParameters(checkrules);
2025-09-02 17:47:53 +08:00
for (int i = 0; i < parameters.length; i++) {
String itemcode = parameters[i];
switch (itemcode) {
case "SEX":
String sex = labPat.getBrxb().trim();
2025-09-03 19:26:35 +08:00
// if ("1".equals(sex)) sex = "男";
// if ("2".equals(sex)) sex = "女";
2025-09-02 17:47:53 +08:00
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":
2025-09-02 18:30:07 +08:00
String brly = labPat.getBrly();
2025-09-03 19:26:35 +08:00
// String brlymc = commonUtil.getComDictNameById("PT", brly);
// if (!"".equals(brlymc) || brlymc != null) brly = brlymc;
2025-09-02 17:47:53 +08:00
variables.put(itemcode, brly);
break;
case "KSDH":
2025-09-02 18:30:07 +08:00
String ksdh = labPat.getKsdh();
2025-09-03 19:26:35 +08:00
// String ksdhmc = commonUtil.getComDictNameById("DP", ksdh);
// if (!"".equals(ksdhmc) || ksdhmc != null) ksdh = ksdhmc;
2025-09-02 17:47:53 +08:00
variables.put(itemcode, ksdh);
break;
case "YBLX":
2025-09-02 18:30:07 +08:00
String yblx = labPat.getYblx();
String yblxmc = commonUtil.getComDictNameById("BT", yblx);
if (!"".equals(yblxmc) || yblxmc != null) yblx = yblxmc;
2025-09-02 17:47:53 +08:00
variables.put(itemcode, yblx);
break;
case "BZ":
variables.put(itemcode, labPat.getBz());
break;
case "ZD":
variables.put(itemcode, labPat.getZd());
break;
default:
2025-09-02 18:30:07 +08:00
String csjg = Optional.ofNullable(labResultList).flatMap(list -> list.stream().filter(result -> result != null && itemcode.equals(result.getXmdh())).map(LabResult::getCsjg).findFirst()).orElse(null);
2025-09-05 20:21:10 +08:00
if (csjg == null)return "";
2025-09-02 17:47:53 +08:00
variables.put(itemcode, csjg);
}
}
2025-09-02 18:30:07 +08:00
flag = CalcUtils.getBooleanFromCalc(checkrules, variables);
2025-09-23 19:11:20 +08:00
if (flag) errmsg = "审核条件: " + ruledisplay + " 规则触发,未通过审核!";
2025-09-01 19:19:09 +08:00
}
return errmsg;
}
2025-09-02 17:47:53 +08:00
/**
* 备注信息公式转换备注内容
2025-09-02 18:30:07 +08:00
*
2025-09-02 17:47:53 +08:00
* @param labPat
* @param labResultList
* @param logcontent
* @return
*/
2025-09-02 18:30:07 +08:00
private String replacebz(LabPat labPat, List<LabResult> labResultList, String logcontent) {
String errmsg = logcontent;
String[] parameters = CalcUtils.getParameters(logcontent);
2025-09-01 19:19:09 +08:00
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 = "女";
2025-09-02 18:30:07 +08:00
errmsg.replace("[SEX]", sex);
2025-09-01 19:19:09 +08:00
break;
case "AGE":
double age = AgeUtils.getDecimalAge(AgeUtils.getBirthDateByAge(labPat.getNl(), labPat.getNldw()));
2025-09-02 18:30:07 +08:00
errmsg.replace("[AGE]", String.valueOf(age));
2025-09-01 19:19:09 +08:00
break;
2025-09-02 17:47:53 +08:00
case "BRLY":
2025-09-02 18:30:07 +08:00
String brly = labPat.getBrly();
String brlymc = commonUtil.getComDictNameById("PT", brly);
if (!"".equals(brlymc) || brlymc != null) brly = brlymc;
2025-09-02 17:47:53 +08:00
errmsg.replace("[BRLY]", brly);
break;
case "KSDH":
2025-09-02 18:30:07 +08:00
String ksdh = labPat.getKsdh();
String ksdhmc = commonUtil.getComDictNameById("DP", ksdh);
if (!"".equals(ksdhmc) || ksdhmc != null) ksdh = ksdhmc;
2025-09-02 17:47:53 +08:00
errmsg.replace("[KSDH]", ksdh);
2025-09-01 19:19:09 +08:00
break;
2025-09-02 17:47:53 +08:00
case "YBLX":
2025-09-02 18:30:07 +08:00
String yblx = labPat.getYblx();
String yblxmc = commonUtil.getComDictNameById("BT", yblx);
if (!"".equals(yblxmc) || yblxmc != null) yblx = yblxmc;
2025-09-02 17:47:53 +08:00
errmsg.replace("[YBLX]", yblx);
break;
case "BZ":
errmsg.replace("[BZ]", labPat.getBz());
break;
case "ZD":
errmsg.replace("[ZD]", labPat.getZd());
break;
default:
2025-09-02 18:30:07 +08:00
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);
2025-09-01 19:19:09 +08:00
}
}
2025-09-02 18:30:07 +08:00
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;
}
2025-09-02 17:47:53 +08:00
return bz;
2025-08-28 18:13:57 +08:00
}
2025-09-02 17:47:53 +08:00
2025-08-28 18:13:57 +08:00
}