LIJU há 1 semana atrás
pai
commit
ca3ce29851

+ 34 - 0
src/main/java/thyyxxk/webserver/dao/his/medicaladvice/nursing/NursingManagementDao.java

@@ -219,6 +219,40 @@ public interface NursingManagementDao {
          "        yz_act_order.serial = yp_zd_dict.serial and" +
          "    (yz_supply_type.ps_flag='1' or yz_supply_type.ps_flag='0') order by cast(bed_no as float) ")
  List<PsInfoVO> listPsInfo(String startBedNo, String endBedNo, String curWard,String psOperCondition);
+ 
+ /**
+  * @description: 按住院号查询皮试信息
+  * @author: lihong
+  * @date: 2023/4/23 11:00
+  * @param: inpatientNo, admissTimes, psOperCondition
+  * @return: java.util.List<thyyxxk.webserver.entity.medicaladvice.medicamanage.PsInfoVO>
+  **/
+   @Select(" select distinct rtrim(zy_actpatient.inpatient_no) as inpatientNo," +
+          "        rtrim(zy_actpatient.name) as name," +
+          "        rtrim(zy_actpatient.bed_no) as bedNo," +
+          "        zy_actpatient.admiss_times as admissTimes," +
+          "        rtrim(yz_act_order.order_name) as orderName," +
+          "        yz_act_order.act_order_no as actOrderNo," +
+          "        yz_act_order.enter_time as enterTime," +
+          "        yz_act_order.order_time as orderTime," +
+          "        yz_act_order.dose as dose," +
+          "        rtrim(yz_act_order.dose_unit) as doseUnit," +
+          "        rtrim(yz_supply_type.supply_name) as supplyName," +
+          "        yz_act_order.ps_status as psStatus," +
+          "        rtrim(yz_act_order.ps_oper) as psOper," +
+          "        yz_act_order.ps_result_time as psResultTime" +
+          " from zy_actpatient,yz_act_order,yz_supply_type,yp_zd_dict" +
+          " where zy_actpatient.inpatient_no = yz_act_order.inpatient_no and" +
+          "        zy_actpatient.admiss_times = yz_act_order.admiss_times and" +
+          "        yz_act_order.supply_code = yz_supply_type.supply_code and" +
+          "        zy_actpatient.inpatient_no = #{inpatientNo} and" +
+          "        zy_actpatient.admiss_times = #{admissTimes} and" +
+          "        yz_act_order.frequ_code  <> ''  and" +
+          "       ${psOperCondition}  and" +
+          "        yz_act_order.order_code = yp_zd_dict.code and" +
+          "        yz_act_order.serial = yp_zd_dict.serial and" +
+          "    (yz_supply_type.ps_flag='1' or yz_supply_type.ps_flag='0') ")
+ List<PsInfoVO> listPsInfoByInpatientNo(String inpatientNo, Integer admissTimes, String psOperCondition);
     /**
      * @description:更新皮试信息
      * @author: lihong

+ 123 - 9
src/main/java/thyyxxk/webserver/service/medicaladvice/nursing/NursingManagementService.java

@@ -359,20 +359,38 @@ public class NursingManagementService {
      * @param: psInfoVO
      * @return: java.util.List<thyyxxk.webserver.entity.medicaladvice.medicamanage.PsInfoVO>
      **/
-   public List<PsInfoVO> queryPsInfo(PsInfoVO psInfoVO){
+      public List<PsInfoVO> queryPsInfo(PsInfoVO psInfoVO){
        String psOperCondition = "";
-        if(psInfoVO.getConfirmFlag() == 0){
+        if(psInfoVO.getConfirmFlag() == null || psInfoVO.getConfirmFlag() == 0){
             psOperCondition = "isnull(ps_oper,'') ='' ";
         }else {
             psOperCondition = " isnull(ps_oper,'') <>''";
         }
-       List<PsInfoVO> psInfoVOS = dao.listPsInfo(psInfoVO.getStartBedNo(), psInfoVO.getEndBedNo(),psInfoVO.getCurWard(), psOperCondition);
+        
+        List<PsInfoVO> psInfoVOS;
+        
+        // 如果有住院号和入院次数,优先按这些条件查询
+        if (StrUtil.isNotBlank(psInfoVO.getInpatientNo()) && psInfoVO.getAdmissTimes() != null) {
+            log.info("queryPsInfo - 按住院号和入院次数查询: 住院号={}, 入院次数={}", psInfoVO.getInpatientNo(), psInfoVO.getAdmissTimes());
+            psInfoVOS = dao.listPsInfoByInpatientNo(psInfoVO.getInpatientNo(), psInfoVO.getAdmissTimes(), psOperCondition);
+            log.info("queryPsInfo - 按住院号查询结果数量: {}", psInfoVOS != null ? psInfoVOS.size() : 0);
+        } else {
+            // 如果没有住院号,使用原有的查询方式
+            psInfoVOS = dao.listPsInfo(
+                psInfoVO.getStartBedNo() != null ? psInfoVO.getStartBedNo() : "", 
+                psInfoVO.getEndBedNo() != null ? psInfoVO.getEndBedNo() : "", 
+                psInfoVO.getCurWard() != null ? psInfoVO.getCurWard() : "", 
+                psOperCondition
+            );
+        }
        if(CollUtil.isNotEmpty(psInfoVOS)){
            psInfoVOS.forEach(item->{
                if(StrUtil.isBlank(item.getPsOper())){
                    UserInfo userInfo = userCache.getUserInfoByToken();
-                   item.setPsOper(userInfo.getCode());
-                   item.setPsOperName(userInfo.getName());
+                   if(userInfo != null){
+                       item.setPsOper(userInfo.getCode());
+                       item.setPsOperName(userInfo.getName());
+                   }
                }
            });
        }
@@ -937,11 +955,32 @@ public class NursingManagementService {
         yzTemperatureVO.setAdmissTimes(query.getAdmissTimes());
         List<YzTemperatureGm> yzTemperatureGms = dao.listYzTemperatureGm(yzTemperatureVO);
         CommonUtil.BeanTrim(yzTemperatureGms);
-        GraphicsDataVO graphicsDataVO =createGraphicsDataVO(yzTemperatures,yzTemperatureSums,yzTemperatureGms,query);
+        
+        // 获取皮试数据
+        PsInfoVO psInfoVO = new PsInfoVO();
+        psInfoVO.setInpatientNo(query.getInpatientNo());
+        psInfoVO.setAdmissTimes(query.getAdmissTimes());
+        // 设置必要的查询参数,避免空指针异常
+        psInfoVO.setStartBedNo("");
+        psInfoVO.setEndBedNo("");
+        psInfoVO.setCurWard("");
+        psInfoVO.setConfirmFlag(1); // 设置为已确认状态
+        List<PsInfoVO> psInfoList = queryPsInfo(psInfoVO);
+        log.info("getChartData - 获取到皮试数据: 住院号={}, 数据条数={}", query.getInpatientNo(), psInfoList != null ? psInfoList.size() : 0);
+        
+        // 如果没有获取到数据,尝试不设置confirmFlag
+        if (CollUtil.isEmpty(psInfoList)) {
+            log.info("getChartData - 第一次查询无数据,尝试不设置confirmFlag");
+            psInfoVO.setConfirmFlag(null);
+            psInfoList = queryPsInfo(psInfoVO);
+            log.info("getChartData - 第二次查询结果: 数据条数={}", psInfoList != null ? psInfoList.size() : 0);
+        }
+        
+        GraphicsDataVO graphicsDataVO =createGraphicsDataVO(yzTemperatures,yzTemperatureSums,yzTemperatureGms,psInfoList,query);
         return ResultVoUtil.success(graphicsDataVO);
     }
 
-    public GraphicsDataVO createGraphicsDataVO(List<YzTemperature> yzTemperatures, List<YzTemperatureSum> yzTemperatureSums, List<YzTemperatureGm> yzTemperatureGms, GraphicsParam query) {
+    public GraphicsDataVO createGraphicsDataVO(List<YzTemperature> yzTemperatures, List<YzTemperatureSum> yzTemperatureSums, List<YzTemperatureGm> yzTemperatureGms, List<PsInfoVO> psInfoList, GraphicsParam query) {
         GraphicsDataVO graphicsDataVO = new GraphicsDataVO();
         List<String> operDays = getOperDays(query);
         graphicsDataVO.setOperaDays(operDays);
@@ -955,12 +994,12 @@ public class NursingManagementService {
         //呼吸和疼痛
         setBreatheAndPain(query,types,yzTemperatures,dateList,timeList);
         //其他
-        setOtherTypes(query,types,yzTemperatureGms,yzTemperatureSums,dateList);
+        setOtherTypes(query,types,yzTemperatureGms,yzTemperatureSums,psInfoList,dateList);
         graphicsDataVO.setTypes(types);
         return graphicsDataVO;
     }
 
-    private void setOtherTypes(GraphicsParam query,List<ScdBaseInfo> types, List<YzTemperatureGm> yzTemperatureGms, List<YzTemperatureSum> yzTemperatureSums,List<String> dateList) {
+    private void setOtherTypes(GraphicsParam query,List<ScdBaseInfo> types, List<YzTemperatureGm> yzTemperatureGms, List<YzTemperatureSum> yzTemperatureSums, List<PsInfoVO> psInfoList, List<String> dateList) {
         //过敏药物 010 过敏药物
         setGmYw(types, yzTemperatureGms, dateList);
         //005 大便
@@ -975,6 +1014,9 @@ public class NursingManagementService {
         for (int i = 0; i < typeCodes.length; i++) {
             setPublicOtherTypes(query,types,yzTemperatureSums,dateList,typeCodes[i],fieldNames[i]);
         }
+        
+        // 皮试结果 031,032,033,034
+        setPsInfoTypes(types, psInfoList, dateList);
     }
 
     private void setPublicOtherTypes(GraphicsParam query,List<ScdBaseInfo> types, List<YzTemperatureSum> yzTemperatureSums, List<String> dateList, String typeCode, String fieldName) {
@@ -1032,6 +1074,78 @@ public class NursingManagementService {
         return o -> itemDate.equals(DateUtil.formatDate(o.getRecDate()));
     }
 
+    /**
+     * 设置皮试结果数据
+     * @param types 类型列表
+     * @param psInfoList 皮试信息列表
+     * @param dateList 日期列表
+     */
+    private void setPsInfoTypes(List<ScdBaseInfo> types, List<PsInfoVO> psInfoList, List<String> dateList) {
+        log.info("setPsInfoTypes - 开始处理皮试数据,psInfoList大小: {}", psInfoList != null ? psInfoList.size() : 0);
+        
+        if (CollUtil.isEmpty(psInfoList)) {
+            log.info("setPsInfoTypes - 没有皮试数据,创建空的皮试结果行");
+            // 如果没有皮试数据,创建空的皮试结果行
+            for (String itemDate : dateList) {
+                for (int i = 0; i < 4; i++) {
+                    ScdBaseInfo scdBaseInfo = new ScdBaseInfo();
+                    scdBaseInfo.setDate(itemDate);
+                                    String typeCode = "031";
+                if (i == 1) typeCode = "032";
+                else if (i == 2) typeCode = "033";
+                else if (i == 3) typeCode = "034";
+                    scdBaseInfo.setTypeCode(typeCode);
+                    scdBaseInfo.setTypeValue("");
+                    types.add(scdBaseInfo);
+                }
+            }
+            return;
+        }
+
+        // 按日期分组皮试数据,过滤掉psResultTime为null的数据
+        Map<String, List<PsInfoVO>> psInfoByDate = psInfoList.stream()
+                .filter(ps -> ps.getPsResultTime() != null)
+                .collect(Collectors.groupingBy(ps -> DateUtil.formatDate(ps.getPsResultTime())));
+        
+        log.info("setPsInfoTypes - 按日期分组后的皮试数据: {}", psInfoByDate.keySet());
+        log.info("setPsInfoTypes - 原始皮试数据详情:");
+        for (PsInfoVO ps : psInfoList) {
+            log.info("setPsInfoTypes - 皮试数据: 住院号={}, 姓名={}, 结果时间={}, 状态={}", 
+                    ps.getInpatientNo(), ps.getName(), ps.getPsResultTime(), ps.getPsStatus());
+        }
+
+        for (String itemDate : dateList) {
+            List<PsInfoVO> dayPsInfo = psInfoByDate.get(itemDate);
+            
+            // 最多显示4个皮试结果
+            for (int i = 0; i < 4; i++) {
+                ScdBaseInfo scdBaseInfo = new ScdBaseInfo();
+                scdBaseInfo.setDate(itemDate);
+                
+                String typeCode = "031";
+                if (i == 1) typeCode = "032";
+                else if (i == 2) typeCode = "033";
+                else if (i == 3) typeCode = "034";
+                
+                scdBaseInfo.setTypeCode(typeCode);
+                
+                if (dayPsInfo != null && i < dayPsInfo.size()) {
+                    PsInfoVO psInfo = dayPsInfo.get(i);
+                    String psResult = "";
+                    if (StrUtil.isNotBlank(psInfo.getPsStatus())) {
+                        psResult = "1".equals(psInfo.getPsStatus()) ? "阳性" : "阴性";
+                    }
+                    scdBaseInfo.setTypeValue(psResult);
+                    log.info("setPsInfoTypes - 设置皮试结果: 日期={}, 类型码={}, 结果={}", itemDate, typeCode, psResult);
+                } else {
+                    scdBaseInfo.setTypeValue("");
+                }
+                
+                types.add(scdBaseInfo);
+            }
+        }
+    }
+
     private void setGmYw(List<ScdBaseInfo> types, List<YzTemperatureGm> yzTemperatureGms, List<String> dateList) {
         List<String> gmyws = new ArrayList<>();
         if(CollUtil.isNotEmpty(yzTemperatureGms)){