From dfc791c3ab019ed22411f8bb445416b4c9573937 Mon Sep 17 00:00:00 2001 From: tangw Date: Fri, 15 Aug 2025 19:57:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E4=B8=9A=E5=8A=A1=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/domain/entity/lis/LabPat.java | 12 +- .../core/domain/entity/lis/LabResult.java | 2 + .../common/core/domain/entity/lis/XmInfo.java | 66 +++++++ .../common/core/domain/entity/lis/XmRef.java | 43 ++--- .../interfaceCommon/mapper/XmInfoMapper.java | 11 ++ .../interfaceCommon/mapper/XmRefMapper.java | 13 ++ .../interfaceCommon/utils/CommonUtil.java | 13 +- .../czlis/interfaceCommon/utils/LisUtil.java | 135 ++++++++++++++ .../main/resources/mapper/LabResultMapper.xml | 2 +- .../main/resources/mapper/XmInfoMapper.xml | 15 ++ .../src/main/resources/mapper/XmRefMapper.xml | 39 +++++ .../service/impl/LisWorkOperServiceImpl.java | 164 ++++++++++++++++++ 12 files changed, 485 insertions(+), 30 deletions(-) create mode 100644 lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmInfo.java create mode 100644 lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmInfoMapper.java create mode 100644 lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmRefMapper.java create mode 100644 lis-interfaceCommon/src/main/resources/mapper/XmInfoMapper.xml create mode 100644 lis-interfaceCommon/src/main/resources/mapper/XmRefMapper.xml diff --git a/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabPat.java b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabPat.java index 026c24b..7e5d590 100644 --- a/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabPat.java +++ b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabPat.java @@ -73,9 +73,11 @@ public class LabPat extends BaseEntity { private String wyh; private Integer shcs; private String lstd; - - - - - + private String slzq; + private String checker; + private String autojgbz; + private String faultman; + private String fault; + private String faults; + private Date faultdt; } diff --git a/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabResult.java b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabResult.java index 40e575c..17fbef9 100644 --- a/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabResult.java +++ b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/LabResult.java @@ -37,4 +37,6 @@ public class LabResult extends BaseEntity { private String redoFlag; private String sqxmdh; private String xmmc; + private String ygzd; + private String ygzq; } diff --git a/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmInfo.java b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmInfo.java new file mode 100644 index 0000000..cc780ed --- /dev/null +++ b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmInfo.java @@ -0,0 +1,66 @@ +package com.czlis.common.core.domain.entity.lis; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class XmInfo { + + private String yq; + private String xmdh; + private String xmmc; + private String zhbdh; + private String bgdh; + private Double cksx; + private Double ckxx; + private String dyckz; + private String dylx; + private Integer dyxh; + private String zjf; + private String xmlb; + private Double xs; + private Integer xsws; + private String mrz; + private Double jg; + private Double cb; + private String dw; + private String jsxm; + private String jsgs; + private String zkxm; + private Double sjx; + private Double xjx; + private String ygxb; + private String ygnl; + private String ygbb; + private String lcyy; + private String jgbz; + private Integer jgjg; + private Double jgz; + private String csff; + private String yymc; + private Integer fzdyxh; + private String clinicref; + private Double llimit; + private Double hlimit; + private Double xsbs; + private Double redoxx; + private Double redosx; + private String qcuselog; + private String qcusepos; + private String itemclass; + private String whocode; + private String germflag; + private Double qccv; + private String qcvs; + private String knowledge; + private String ygzq; + private String ygzd; + private String uflag; + private String val2; + private Integer id; + private String val1; + private String germclass; +} diff --git a/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmRef.java b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmRef.java index 0fe55d4..3a8817f 100644 --- a/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmRef.java +++ b/lis-common/src/main/java/com/czlis/common/core/domain/entity/lis/XmRef.java @@ -1,32 +1,33 @@ package com.czlis.common.core.domain.entity.lis; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.math.BigDecimal; - @Data @AllArgsConstructor @NoArgsConstructor public class XmRef { - private Integer xmid; - private String xmdh; - private Integer xh; - private String xb; - private BigDecimal nl1; - private BigDecimal nl2; - private String bblx; - private BigDecimal cksx; - private BigDecimal ckxx; - private String dyck; - private String nldw; - private BigDecimal redoxx; - private BigDecimal redosx; - private BigDecimal alterxx; - private BigDecimal altersx; - private String slzq; - private String zd; - private String instrid; - private String yq; + + private String yq; + private String xmdh; + private Integer xh; + private String xb; + private Double nl1; + private Double nl2; + private String bblx; + private Double cksx; + private Double ckxx; + private String dyck; + private String nldw; + private Double redoxx; + private Double redosx; + private Double alterxx; + private Double altersx; + private String slzq; + private String zd; + + + } diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmInfoMapper.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmInfoMapper.java new file mode 100644 index 0000000..f700f08 --- /dev/null +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmInfoMapper.java @@ -0,0 +1,11 @@ +package com.czlis.interfaceCommon.mapper; + +import com.czlis.common.core.domain.entity.lis.XmInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface XmInfoMapper { + List getXmInfoList(String yq); + XmInfo getXmInfo(@Param("yq")String yq, @Param("xmdh")String xmdh); +} diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmRefMapper.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmRefMapper.java new file mode 100644 index 0000000..13c2f67 --- /dev/null +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/mapper/XmRefMapper.java @@ -0,0 +1,13 @@ +package com.czlis.interfaceCommon.mapper; + +import com.czlis.common.core.domain.entity.lis.XmRef; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface XmRefMapper { + List getXmRefList(String yq); + XmRef getXmRef(@Param("yq")String yq, @Param("xmdh")String xmdh); + XmRef getXmRefValue(Map map); +} diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CommonUtil.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CommonUtil.java index e46116e..933fe4b 100644 --- a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CommonUtil.java +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CommonUtil.java @@ -34,6 +34,10 @@ public class CommonUtil { ComUsrMapper comUsrMapper; @Autowired ComUsrpowerMapper comUsrpowerMapper; + @Autowired + XmInfoMapper xmInfoMapper; + @Autowired + XmRefMapper xmRefMapper; //====检验主表操作方法集合=== public LabPat getLabPatOne(Date jyrq, String yq, String ybh){ @@ -65,9 +69,12 @@ public class CommonUtil { public int delLabResult(LabResult labResult) {return labResultMapper.delLabResult(labResult);} @Transactional(rollbackFor = Exception.class) public int updateLabResult(LabResult labResult) {return labResultMapper.updateLabResult(labResult);} - - - + //=====项目字典查询========= + public List getXmInfoList(String yq) {return xmInfoMapper.getXmInfoList(yq);} + public XmInfo getXmInfo(String yq,String xmdh) {return xmInfoMapper.getXmInfo(yq,xmdh);} + public List getXmRefList(String yq) {return xmRefMapper.getXmRefList(yq);} + public XmRef getXmRef(String yq,String xmdh) {return xmRefMapper.getXmRef(yq,xmdh);} + public XmRef getXmRefValue(Map map) {return xmRefMapper.getXmRefValue(map);} //服务器时间方法 public Date getCurrentTime(){return commonMapper.getCurrentTime();} public String getCurrentDate(){return DateFormatUtils.format(commonMapper.getCurrentTime(), "yyyy-MM-dd");} diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java index 31a34c3..96df1a0 100644 --- a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java @@ -68,4 +68,139 @@ public class LisUtil { return result.toString(); } + /** + * 使用正则表达式判断字符串是否为数字 + * 支持:整数(123)、小数(123.45)、正负号(-123、+45.6) + */ + public static boolean isNumber(String str) { + if (str == null || str.trim().isEmpty()) { + return false; + } + // 正则表达式:匹配正负整数、正负小数 + String regex = "^[+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)$"; + return str.matches(regex); + } + /** + * 使用正则表达式判断字符串是否为数字 + * 支持:整数(123)、小数(123.45),不包括带正负号的情况 + */ + public static boolean isTureNumber(String str) { + if (str == null || str.trim().isEmpty()) { + return false; + } + // 正则表达式:仅匹配正整数、正小数(不包含正负号) + // 说明: + // ^[0-9]+(\.[0-9]*)?$ 匹配整数(如123)或带整数部分的小数(如123.45) + // |\.([0-9]+)$ 匹配纯小数(如.67) + String regex = "^[0-9]+(\\.[0-9]*)?|\\.[0-9]+$"; + return str.matches(regex); + } + /** + * 将包含比较运算符的字符串转换为特定格式的数值字符串 + * 不支持的格式或非数字内容将返回原值 + * @param input 输入字符串,如">=123", ">123", "<=123", "<123" + * @return 转换后的字符串或原值 + */ + public static String getOverNumber(String input) { + // 输入为空时返回原值 + if (input == null || input.trim().isEmpty()) { + return input; + } + + // 定义支持的运算符,按长度排序以便正确识别(先长后短) + String[] operators = {">=", "<=", ">", "<"}; + String operator = null; + String numberPart = null; + + // 识别运算符和数字部分 + for (String op : operators) { + if (input.startsWith(op)) { + operator = op; + numberPart = input.substring(op.length()); + break; + } + } + + // 未识别到支持的运算符,返回原值 + if (operator == null) { + return input; + } + + // 尝试将数字部分转换为double + double number; + try { + number = Double.parseDouble(numberPart); + } catch (NumberFormatException e) { + // 数字部分格式不正确,返回原值 + return input; + } + + // 根据运算符进行转换 + switch (operator) { + case ">=": + case ">": + return String.format("%.4f", number + 0.0001); + case "<=": + case "<": + return String.format("%.4f", number - 0.0001); + default: + return input; + } + } + /** + * 保留指定小数位数 + * 支持比较符号(<=、>=、<、>)和负号(-)同时存在的情况 + * @param input 输入字符串,如"123.1234"、">123.252"、"<=123.252"、"-45.67"、">=-89.01" + * @param decimalPlaces 要保留的小数位数,需为非负整数 + * @return 格式化后的字符串,无法处理时返回原值 + */ + public static String round(String input, int decimalPlaces) { + // 处理空输入或无效小数位数 + if (input == null || input.trim().isEmpty() || decimalPlaces < 0) { + return input; + } + + // 定义比较运算符前缀(按长度排序,确保正确识别) + String[] comparisonPrefixes = {"<=", ">=", "<", ">"}; + String comparisonPrefix = ""; + String remainingPart = input; + + // 提取比较运算符前缀 + for (String prefix : comparisonPrefixes) { + if (remainingPart.startsWith(prefix)) { + comparisonPrefix = prefix; + remainingPart = remainingPart.substring(prefix.length()); + break; + } + } + + // 尝试解析剩余部分为数字 + try { + // 解析数字(包含可能的负号) + double number = Double.parseDouble(remainingPart); + + // 创建格式化模式(整数部分至少1位,小数部分固定位数) + StringBuilder formatPattern = new StringBuilder(); + formatPattern.append("0"); + if (decimalPlaces > 0) { + formatPattern.append("."); + // 循环添加指定数量的0 + for (int i = 0; i < decimalPlaces; i++) { + formatPattern.append("0"); + } + } + + // 格式化数字并拼接比较前缀 + String formattedNumber = String.format( + "%s%s", + comparisonPrefix, + String.format(formatPattern.toString(), number) + ); + + return formattedNumber; + } catch (NumberFormatException e) { + // 数字部分无法解析时返回原值 + return input; + } + } } diff --git a/lis-interfaceCommon/src/main/resources/mapper/LabResultMapper.xml b/lis-interfaceCommon/src/main/resources/mapper/LabResultMapper.xml index e215c82..7e84d8d 100644 --- a/lis-interfaceCommon/src/main/resources/mapper/LabResultMapper.xml +++ b/lis-interfaceCommon/src/main/resources/mapper/LabResultMapper.xml @@ -22,7 +22,7 @@ + select * from xm_info where yq=#{yq} + + + + + + diff --git a/lis-interfaceCommon/src/main/resources/mapper/XmRefMapper.xml b/lis-interfaceCommon/src/main/resources/mapper/XmRefMapper.xml new file mode 100644 index 0000000..bb2afa0 --- /dev/null +++ b/lis-interfaceCommon/src/main/resources/mapper/XmRefMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/liswork/src/main/java/com/czlis/liswork/service/impl/LisWorkOperServiceImpl.java b/liswork/src/main/java/com/czlis/liswork/service/impl/LisWorkOperServiceImpl.java index 91bb875..1667e87 100644 --- a/liswork/src/main/java/com/czlis/liswork/service/impl/LisWorkOperServiceImpl.java +++ b/liswork/src/main/java/com/czlis/liswork/service/impl/LisWorkOperServiceImpl.java @@ -381,8 +381,172 @@ public class LisWorkOperServiceImpl implements LisWorkOperService { * @return 返回值0正常,1有危急值明细存在 */ private int saverefs(Date jyrq, String yq, String ybh,LabPat labPat){ + String yqdl=lisWorkOperMapper.selectYqdl(yq); + boolean lb_setbj=true,lb_wjz=false; + if(!"细菌仪".equals(yqdl)) { + Map map = new HashMap<>(); + map.put("jyrq", jyrq); + map.put("yq", yq); + map.put("ybh", ybh); + map.put("settype", "1"); + map.put("retcode", ""); + map.put("retmsg", ""); + lisWorkOperMapper.sp_setrefs(map); + String retCode = String.valueOf(map.get("retcode")); + String retMsg = String.valueOf(map.get("retmsg")); + log.info("调用存储过程{}返回值:{},{}", "sp_setrefs", retCode, retMsg); + if (retCode == null || "".equals(retCode) || "-1".equals(retCode)) lb_setbj=false; + List labResultList=commonUtil.getLabResultList(jyrq, yq, ybh); + for (LabResult labResult : labResultList) { + String csjg=labResult.getCsjg(); + boolean lb_nummode=LisUtil.isTureNumber(csjg); + String ygzq = labResult.getYgzq(); + String ygzd = labResult.getYgzd(); + //当结果为数值并且与周期诊断无关,计算存储过程保存成功后,只进行危急值判断 + if(lb_nummode && lb_setbj && !"Y".equals(ygzd) && !"Y".equals(ygzq)){ + int wjz=alarmcondition(jyrq, yq, ybh, labPat,labResult); + if(wjz==1)lb_wjz=true; + }else { + int wjz = setrefs(jyrq, yq, ybh, labPat, labResult); + if (wjz == 1) lb_wjz = true; + } + } + + if(lb_wjz){ + //危急值处理过程 + } + } return 0; } + /** + * 明细结果计算参考值异常标志危急值标志并更新 + * @param jyrq + * @param yq + * @param ybh + * @param labPat + * @param labResult + * @return + */ + private int setrefs(Date jyrq, String yq, String ybh,LabPat labPat,LabResult labResult){ + String resultflag="M",wjzflag=""; + int wjz=0; + String xmdh=labResult.getXmdh(); + String csjg=labResult.getCsjg(); + if (csjg == null || csjg.trim().isEmpty()) return 0; + String csjgnew=LisUtil.getOverNumber(csjg.trim()); + boolean lb_nummode=LisUtil.isNumber(csjgnew); + //当结果为数值时计算上下限 + if(lb_nummode) { + XmInfo xmInfo = commonUtil.getXmInfo(yq, xmdh); + String dw = xmInfo.getDw(); + String refs = xmInfo.getDyckz(); + Double ckxx = xmInfo.getCkxx(); + Double cksx = xmInfo.getCksx(); + Double llimit=xmInfo.getLlimit(); + Double hlimit=xmInfo.getHlimit(); + String ygxb = xmInfo.getYgxb(); + String ygnl = xmInfo.getYgnl(); + String ygbb = xmInfo.getYgbb(); + String ygzq = xmInfo.getYgzq(); + String ygzd = xmInfo.getYgzd(); + String sex = ""; + if ("Y".equals(ygxb)) { + sex = labPat.getBrxb().trim(); + if (sex == null) sex = ""; + } + String yblx = ""; + if ("Y".equals(ygbb)) { + yblx = labPat.getYblx(); + String bb = commonUtil.getComDictIdByName("BT", yblx); + if (bb != null && !bb.trim().isEmpty()) yblx = bb; + } + String zd = ""; + if ("Y".equals(ygzd)) { + zd = labPat.getZd(); + String icd10 = commonUtil.getComDictIdByName("ICD10", zd); + if (icd10 != null && !icd10.trim().isEmpty()) zd = icd10; + } + String slzq = ""; + if ("Y".equals(ygzq)) { + slzq = labPat.getSlzq(); + String zq = commonUtil.getComDictIdByName("SLZQ", slzq); + if (zq != null && !zq.trim().isEmpty()) slzq = zq; + } + double age = 0; + if ("Y".equals(ygnl)) { + age = AgeUtils.getDecimalAge(AgeUtils.getBirthDateByAge(labPat.getNl(), labPat.getNldw())); + } + XmRef xmRef = new XmRef(); + if ("Y".equals(ygxb) || "Y".equals(ygbb) || "Y".equals(ygnl) || "Y".equals(ygzd) || "Y".equals(ygzq)) { + Map map = new HashMap<>(); + map.put("yq", yblx); + map.put("xmdh", sex); + map.put("bbtype", yblx); + map.put("sex", sex); + map.put("age", age); + map.put("zd", zd); + map.put("slzq", slzq); + xmRef = commonUtil.getXmRefValue(map); + } + if(xmRef !=null){ + ckxx=xmRef.getCkxx(); + cksx=xmRef.getCksx(); + refs=xmRef.getDyck(); + Double alterxx=xmRef.getAlterxx(); + Double altersx=xmRef.getAltersx(); + if(alterxx != null)llimit=alterxx; + if(altersx != null)hlimit=altersx; + } + if(lb_nummode){ + //数值型结果判断 + Double csjgnum = Double.valueOf(csjgnew); + if(ckxx != null)if(csjgnumcksx)resultflag="H"; + int wjzf=alarmcondition(jyrq, yq, ybh, labPat,labResult); + if(wjzf==-1) { + if(llimit != null)if(csjgnumhlimit)wjzflag="H"; + }else if(wjzf==1) { + wjzflag=resultflag; + } + if(!"".equals(wjzflag))wjz=1; + }else{ + //文字型结果判断 + String jgbzold=labResult.getJgbz(); + String lmtflag ="";//commonUtil.getitemlmtflag(yq,xmdh,csjg); + if("P".equals(jgbzold) && (csjg.indexOf("阳")>=0 || csjg.indexOf("+")>=0 || csjg.indexOf(":")>=0 ) && (lmtflag == null || lmtflag.trim().isEmpty())) lmtflag="P"; + resultflag=lmtflag; + if("J".equals(lmtflag))wjzflag="H"; + int wjzf=alarmcondition(jyrq, yq, ybh, labPat,labResult); + if(wjzf==1) { + wjzflag="H"; + } + } + //小数保留位数计算 + Integer xsws= xmInfo.getXsws(); + if(xsws>=0) csjg=LisUtil.round(csjg,xsws); + labResult.setCsjg(csjg); + labResult.setDw(dw); + labResult.setRefs(refs); + labResult.setResultFlag(resultflag); + labResult.setJgbz(resultflag); + labResult.setAlarmFlag(wjzflag); + commonUtil.updateLabResult(labResult); + } + return wjz; + } + /** + *特定条件危急值判断 + * @param jyrq + * @param yq + * @param ybh + * @param labPat + * @param labResult + * @return + */ + private int alarmcondition(Date jyrq, String yq, String ybh,LabPat labPat,LabResult labResult){ + return 0; + } }