xiaochan před 8 měsíci
rodič
revize
281e1ae27a
19 změnil soubory, kde provedl 273 přidání a 193 odebrání
  1. 6 1
      pom.xml
  2. 0 33
      thyy-emr-query/.gitignore
  3. 1 1
      thyy-emr-query/src/main/java/org/thyy/emrquery/config/AuthenticationInterceptor.java
  4. 2 1
      thyy-emr-query/src/main/java/org/thyy/emrquery/dao/EmrQualityControlDao.java
  5. 79 47
      thyy-emr-query/src/main/java/org/thyy/emrquery/dao/query/QueryEmrDao.java
  6. 20 0
      thyy-emr-query/src/main/java/org/thyy/emrquery/entity/dto/PatientInfo.java
  7. 7 9
      thyy-emr-query/src/main/java/org/thyy/emrquery/entity/emr/EmrAuditDetail.java
  8. 29 39
      thyy-emr-query/src/main/java/org/thyy/emrquery/entity/emr/PatientInfo.java
  9. 2 0
      thyy-emr-query/src/main/java/org/thyy/emrquery/entity/timeLimitConfig/CreateEditingRestrictions.java
  10. 50 16
      thyy-emr-query/src/main/java/org/thyy/emrquery/service/emr/EmrQualityControlService.java
  11. 36 14
      thyy-emr-query/src/main/java/org/thyy/emrquery/service/query/VariousRateServer.java
  12. 7 2
      thyy-emr-query/src/main/java/org/thyy/emrquery/service/query/utils/KeyFindByAuditUtils.java
  13. 7 11
      thyy-emr-query/src/main/java/org/thyy/emrquery/service/query/utils/PassRateUtils.java
  14. 14 0
      thyy-emr-query/src/main/java/org/thyy/emrquery/utils/StrFormatTest.java
  15. 0 6
      thyy-haikang/src/main/java/org/thyy/haikang/controller/DoorController.java
  16. 5 0
      thyy-haikang/src/main/java/org/thyy/haikang/dao/DoorDao.java
  17. 3 7
      thyy-haikang/src/main/java/org/thyy/haikang/service/DoorService.java
  18. 2 2
      thyy-haikang/src/main/resources/application-prod.yml
  19. 3 4
      thyy-haikang/src/main/resources/application.yml

+ 6 - 1
pom.xml

@@ -22,7 +22,7 @@
         <thyy-archive>0.0.8</thyy-archive>
         <thyy-haikang>0.0.4</thyy-haikang>
         <thyy-beinhospital>0.0.1</thyy-beinhospital>
-        <thyy-emr-query>1.3.8</thyy-emr-query>
+        <thyy-emr-query>1.4.6</thyy-emr-query>
     </properties>
     <modules>
         <module>thyy-archive</module>
@@ -64,6 +64,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.jdbd.mysql</groupId>
+            <artifactId>jdbd-mysql</artifactId>
+            <version>0.11.9</version>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>

+ 0 - 33
thyy-emr-query/.gitignore

@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/

+ 1 - 1
thyy-emr-query/src/main/java/org/thyy/emrquery/config/AuthenticationInterceptor.java

@@ -28,7 +28,7 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
             log.info("请求来源:{}", request.getRemoteAddr());
             log.info("请求路径: {}", request.getRequestURI());
             log.info("请求参数: {}", request.getQueryString());
-            throw new BizException(ExceptionEnum.ERROR_MESSAGE, TOKEN_ERR_MSG);
+            throw new BizException(ExceptionEnum.ERROR_MESSAGE, "接口不存在");
         }
         if (request.getRequestURI().startsWith("/dataBase/api")) {
             return true;

+ 2 - 1
thyy-emr-query/src/main/java/org/thyy/emrquery/dao/EmrQualityControlDao.java

@@ -12,6 +12,7 @@ import org.thyy.emrquery.entity.emr.IcuTime;
 import org.thyy.emrquery.entity.emr.PatientInfo;
 import org.thyy.emrquery.service.emr.EmrQualityControlService;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -697,6 +698,6 @@ public interface EmrQualityControlDao {
               and times = #{times}
               and history = 0
               and minus_points > 0""")
-    Integer getMinusPoints(String patNo, Integer times);
+    BigDecimal getMinusPoints(String patNo, Integer times);
 
 }

+ 79 - 47
thyy-emr-query/src/main/java/org/thyy/emrquery/dao/query/QueryEmrDao.java

@@ -82,7 +82,7 @@ public interface QueryEmrDao {
               and start_time <= '${end}'
               and emr_category_code = 'ruyuanjiluzhuanyong'
               and del_flag <> 1
-              and inpatient_no not like 'S%' and inpatient_no not like '%$%'
+              and inpatient_no not like 'S%' and inpatient_no not like '%$%' and inpatient_no not like '%JT%'
               group by pat_no, times,start_time""")
     List<PatientInfo.timeCheck> admissDateAndRuYuanBingLi(String start, String end);
 
@@ -106,9 +106,9 @@ public interface QueryEmrDao {
                  emr_patient_data b on (inpatient_no = pat_no
                      and times = admiss_times
                      and del_flag <> 1
-                     and emr_category_code = 'chuyuanjilu')
+                     and emr_category_code = 'chuyuanjilu' or emr_category_code='siwangjilu')
             where  dis_date >= '${start}' and dis_date <= '${end}'
-              and inpatient_no not like 'S%' and inpatient_no not like '%$%' group by dis_date,inpatient_no, admiss_times;""")
+              and inpatient_no not like 'S%' and inpatient_no not like '%$%'   and inpatient_no not like '%JT%' group by dis_date,inpatient_no, admiss_times;""")
     List<PatientInfo.timeCheck> disDate(String start, String end);
 
     @Select("""
@@ -119,7 +119,7 @@ public interface QueryEmrDao {
               and times = admiss_times
               and dis_date >= '${start}'
               and dis_date <= '${end}'
-              and inpatient_no not like 'S%' and inpatient_no not like '%$%'
+              and inpatient_no not like 'S%' and inpatient_no not like '%$%'  and inpatient_no not like '%JT%'
             group by pat_no, times, dis_date""")
     List<PatientInfo.timeCheck> firstPageOfMedicalRecord(String start, String end);
 
@@ -219,49 +219,68 @@ public interface QueryEmrDao {
     List<PatientInfo> 抢救(String start, String end);
 
     @Select("""
-            select rtrim(inpatient_no) as inpatient_no, admiss_times, name
-            from (select inpatient_no, admiss_times, name
-                  from zy_inactpatient zy
-                           inner join (select max(yz.start_time) as kssj, yz.inpatient_no as zyh, yz.admiss_times as zycs
-                                       from yz_inact_order yz
-                                       where yz.order_code in ('06025', '06026', '06027', '06053', '05973')
-                                         and isnull(yz.group_no, '00') = '00'
-                                         and yz.start_time >= '${start}'
-                                         and yz.start_time <= '${end}'
-                                       group by yz.inpatient_no, yz.admiss_times) tt
-                                      on zy.inpatient_no = tt.zyh and zy.admiss_times = tt.zycs
-                  where zy.inpatient_no not like 'JT%'
-                    and zy.inpatient_no not like '%$%'
-                    and zy.inpatient_no not like '%S%'
-                  union
-                  select inpatient_no, admiss_times, name
-                  from zy_inactpatient zy
-                           inner join (select max(yz.start_time) as kssj, yz.inpatient_no as zyh, yz.admiss_times as zycs
-                                       from yz_act_order yz
-                                       where yz.order_code in ('06025', '06026', '06027', '06053', '05973')
-                                         and isnull(yz.group_no, '00') = '00'
-                                         and yz.start_time >= '${start}'
-                                         and yz.start_time <= '${end}'
-                                       group by yz.inpatient_no, yz.admiss_times) tt
-                                      on zy.inpatient_no = tt.zyh and zy.admiss_times = tt.zycs
-                  where zy.inpatient_no not like 'JT%'
-                    and zy.inpatient_no not like '%$%'
-                    and zy.inpatient_no not like '%S%'
-                  union
-                  select inpatient_no, admiss_times, name
-                  from zy_actpatient zy
-                           inner join (select max(yz.start_time) as kssj, yz.inpatient_no as zyh, yz.admiss_times as zycs
-                                       from yz_act_order yz
-                                       where yz.order_code in ('06025', '06026', '06027', '06053', '05973')
-                                         and isnull(yz.group_no, '00') = '00'
-                                         and yz.start_time >= '${start}'
-                                         and yz.start_time <= '${end}'
-                                       group by yz.inpatient_no, yz.admiss_times) tt
-                                      on zy.inpatient_no = tt.zyh and zy.admiss_times = tt.zycs
-                  where zy.inpatient_no not like 'JT%'
-                    and zy.inpatient_no not like '%$%'
-                    and zy.inpatient_no not like '%S%') tmp
-            group by inpatient_no, admiss_times, name, inpatient_no, admiss_times, name""")
+            select inpatient_no,
+                   admiss_times,
+                   name,
+                   refer_physician   = (select rtrim(name) from a_employee_mi where code = refer_physician),
+                   consult_physician = (select rtrim(name) from a_employee_mi where code = consult_physician),
+                   dept_director     = (select rtrim(name) from a_employee_mi where code = dept_director),
+                   ward              = (select rtrim(name) from zd_unit_code where code = admiss_dept),
+                   dept              = (select rtrim(name) from zd_unit_code where isnull(zk_ward, small_dept) = code)
+            from zy_inactpatient zy
+                     inner join (select max(yz.start_time) as kssj, yz.inpatient_no as zyh, yz.admiss_times as zycs
+                                 from yz_inact_order yz
+                                 where yz.order_code in ('06025', '06026', '06027', '06053', '05973')
+                                   and isnull(yz.group_no, '00') = '00'
+                                   and yz.start_time >= '${start}'
+                                   and yz.start_time <= '${end}'
+                                 group by yz.inpatient_no, yz.admiss_times) tt
+                                on zy.inpatient_no = tt.zyh and zy.admiss_times = tt.zycs
+            where zy.inpatient_no not like 'JT%'
+              and zy.inpatient_no not like '%$%'
+              and zy.inpatient_no not like '%S%'
+            union
+            select inpatient_no,
+                   admiss_times,
+                   name,
+                   refer_physician   = (select rtrim(name) from a_employee_mi where code = refer_physician),
+                   consult_physician = (select rtrim(name) from a_employee_mi where code = consult_physician),
+                   dept_director     = (select rtrim(name) from a_employee_mi where code = dept_director),
+                   ward              = (select rtrim(name) from zd_unit_code where code = admiss_dept),
+                   dept              = (select rtrim(name) from zd_unit_code where isnull(zk_ward, small_dept) = code)
+            from zy_inactpatient zy
+                     inner join (select max(yz.start_time) as kssj, yz.inpatient_no as zyh, yz.admiss_times as zycs
+                                 from yz_act_order yz
+                                 where yz.order_code in ('06025', '06026', '06027', '06053', '05973')
+                                   and isnull(yz.group_no, '00') = '00'
+                                   and yz.start_time >= '${start}'
+                                   and yz.start_time <= '${end}'
+                                 group by yz.inpatient_no, yz.admiss_times) tt
+                                on zy.inpatient_no = tt.zyh and zy.admiss_times = tt.zycs
+            where zy.inpatient_no not like 'JT%'
+              and zy.inpatient_no not like '%$%'
+              and zy.inpatient_no not like '%S%'
+            union
+            select inpatient_no,
+                   admiss_times,
+                   name,
+                   refer_physician   = (select rtrim(name) from a_employee_mi where code = refer_physician),
+                   consult_physician = (select rtrim(name) from a_employee_mi where code = consult_physician),
+                   dept_director     = (select rtrim(name) from a_employee_mi where code = dept_director),
+                   ward              = (select rtrim(name) from zd_unit_code where code = admiss_dept),
+                   dept              = (select rtrim(name) from zd_unit_code where isnull(zk_ward, small_dept) = code)
+            from zy_actpatient zy
+                     inner join (select max(yz.start_time) as kssj, yz.inpatient_no as zyh, yz.admiss_times as zycs
+                                 from yz_act_order yz
+                                 where yz.order_code in ('06025', '06026', '06027', '06053', '05973')
+                                   and isnull(yz.group_no, '00') = '00'
+                                   and yz.start_time >= '${start}'
+                                   and yz.start_time <= '${end}'
+                                 group by yz.inpatient_no, yz.admiss_times) tt
+                                on zy.inpatient_no = tt.zyh and zy.admiss_times = tt.zycs
+            where zy.inpatient_no not like 'JT%'
+              and zy.inpatient_no not like '%$%'
+              and zy.inpatient_no not like '%S%'""")
     List<PatientInfo> chuyuanCount(String start, String end);
 
 
@@ -277,4 +296,17 @@ public interface QueryEmrDao {
             select name from emr_audit_detail where pat_no = '${patNo}' and times = ${times} and final_control = 1 and history = 0""")
     List<EmrAuditDetail> 患者意见(String patNo, Integer times);
 
+    @Select("""
+            select inpatient_no,
+                   admiss_times,
+                   name,
+                   refer_physician   = (select rtrim(name) from a_employee_mi where code = refer_physician),
+                   consult_physician = (select rtrim(name) from a_employee_mi where code = consult_physician),
+                   dept_director     = (select rtrim(name) from a_employee_mi where code = dept_director),
+                   ward              = (select rtrim(name) from zd_unit_code where code = admiss_dept),
+                   dept              = (select rtrim(name) from zd_unit_code where isnull(zk_ward, small_dept) = code)
+            from view_zy_allpatient
+            where inpatient_no = '${patNo}'
+              and admiss_times = ${times}""")
+    PatientInfo 获取患者信息(String patNo, Integer times);
 }

+ 20 - 0
thyy-emr-query/src/main/java/org/thyy/emrquery/entity/dto/PatientInfo.java

@@ -4,12 +4,20 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.util.Date;
+import java.util.function.Function;
 
 @Data
 public class PatientInfo {
     private String inpatientNo;
     private Integer admissTimes;
     private String name;
+
+    private String referPhysician;
+    private String consultPhysician;
+    private String deptDirector;
+    private String dept;
+    private String ward;
+
     private Boolean flag;
     private Date start;
     private Date end;
@@ -18,6 +26,18 @@ public class PatientInfo {
         return inpatientNo + "_" + admissTimes;
     }
 
+    public void 设置患者额外信息(Function<String, PatientInfo> function) {
+        PatientInfo info = function.apply(this.patKey());
+        if (info == null) {
+            return;
+        }
+        this.setReferPhysician(info.getReferPhysician());
+        this.setConsultPhysician(info.getConsultPhysician());
+        this.setDept(info.getDept());
+        this.setWard(info.getWard());
+        this.setDeptDirector(info.getDeptDirector());
+    }
+
     @EqualsAndHashCode(callSuper = true)
     @Data
     public static class timeCheck extends PatientInfo {

+ 7 - 9
thyy-emr-query/src/main/java/org/thyy/emrquery/entity/emr/EmrAuditDetail.java

@@ -6,6 +6,7 @@ import lombok.experimental.Accessors;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -102,7 +103,7 @@ public class EmrAuditDetail implements Serializable {
      * 减分
      */
     @TableField(value = "minus_points")
-    private Integer minusPoints;
+    private BigDecimal minusPoints;
 
     public String getLevelName() {
         if (level == null) return "";
@@ -126,14 +127,11 @@ public class EmrAuditDetail implements Serializable {
 
     public String getRemediationStatusName() {
         if (remediationStatus == null) return "";
-        switch (remediationStatus) {
-            case 1:
-                return "已整改";
-            case 2:
-                return "已知无需整改";
-            default:
-                return "";
-        }
+        return switch (remediationStatus) {
+            case 1 -> "已整改";
+            case 2 -> "已知无需整改";
+            default -> "";
+        };
     }
 
 

+ 29 - 39
thyy-emr-query/src/main/java/org/thyy/emrquery/entity/emr/PatientInfo.java

@@ -5,13 +5,21 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import lombok.Data;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Data
-public class PatientInfo {
+public class PatientInfo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
     private String patNo;
     private Integer times;
     private String inpatientNo;
@@ -211,7 +219,7 @@ public class PatientInfo {
     /**
      * 总的缺陷评分
      */
-    private Integer minusPoints;
+    private BigDecimal minusPoints;
 
     public void setMapMessage(String name, String message) {
         String tempMsg = this.mapMessage.get(name);
@@ -225,22 +233,19 @@ public class PatientInfo {
 
     private Map<String, String> qualityControlOpinions = new HashMap<>();
 
-    public void setQualityControlOpinions(EmrAuditDetail auditDetail) {
-        String key = auditDetail.getEmrName();
+    public void setQualityControlOpinion(List<EmrAuditDetail> auditDetail) {
+        if (auditDetail == null || auditDetail.isEmpty()) return;
         String template = "{}({})。减分【{}】,审批人:【{}】质控等级:【{}】。";
-        String str = StrUtil.format(template,
-                auditDetail.getName(),
-                auditDetail.getRemark() == null ? "" : auditDetail.getMinusPoints(),
-                auditDetail.getMinusPoints() == null ? "0" : auditDetail.getMinusPoints(),
-                auditDetail.getApproverName(),
-                auditDetail.getLevelName());
-        String temp = qualityControlOpinions.get(auditDetail.getEmrName());
-        if (temp != null) {
-            temp += str;
-            qualityControlOpinions.replace(key, temp);
-        } else {
-            qualityControlOpinions.put(key, str);
-        }
+        auditDetail.forEach(audit -> {
+            String str = StrUtil.format(template,
+                    audit.getName(),
+                    audit.getRemark(),
+                    audit.getMinusPoints(),
+                    audit.getApproverName(),
+                    audit.getLevelName());
+
+            qualityControlOpinions.compute(audit.getEmrName(), (key, v) -> v == null ? str : v + str);
+        });
     }
 
     public String getOpinion() {
@@ -315,31 +320,16 @@ public class PatientInfo {
     }
 
     public String getGradingScale() {
-        int b = light / 6;
-
-        if (b > 0) {
-            light = 0;
-            middle += 1;
-        }
-
-        if (heavy >= 1) {
-            score = 5;
-            return "Ⅴ";
-        }
-        if (middle >= 4) {
-            score = 4;
-            return "Ⅳ";
+        if (minusPoints == null) {
+            return "";
         }
-        if (middle == 2 || middle == 3) {
-            score = 3;
-            return "Ⅲ";
+        if (minusPoints.compareTo(new BigDecimal("90")) > 0) {
+            return "甲";
         }
-        if (middle == 1) {
-            score = 2;
-            return "Ⅱ";
+        if (minusPoints.compareTo(new BigDecimal("75")) > 0 && minusPoints.compareTo(new BigDecimal("90")) <= 0) {
+            return "乙";
         }
-        score = 1;
-        return "Ⅰ";
+        return "丙";
     }
 
     public String getDeathName() {

+ 2 - 0
thyy-emr-query/src/main/java/org/thyy/emrquery/entity/timeLimitConfig/CreateEditingRestrictions.java

@@ -3,12 +3,14 @@ package org.thyy.emrquery.entity.timeLimitConfig;
 import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 
+import java.io.Serial;
 import java.io.Serializable;
 
 
 @Data
 public class CreateEditingRestrictions implements Serializable {
 
+    @Serial
     private static final long serialVersionUID = 3711423377934905816L;
 
     private Integer id;

+ 50 - 16
thyy-emr-query/src/main/java/org/thyy/emrquery/service/emr/EmrQualityControlService.java

@@ -1,5 +1,6 @@
 package org.thyy.emrquery.service.emr;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -22,8 +23,9 @@ import org.thyy.emrquery.websocket.WebSocketServer;
 import org.thyy.utils.result.R;
 import org.thyy.utils.result.ResultVo;
 
+import java.math.BigDecimal;
 import java.text.NumberFormat;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -158,8 +160,8 @@ public class EmrQualityControlService {
 
         if (StringUtil.notBlank(param.getSurgery())) {
             sb.append(" and ").append("(select count(1) from t_case_frontsheet_surgery surgeryWhere" +
-                    " where zy.inpatient_no = surgeryWhere.bah and zy.admiss_times = surgeryWhere.times " +
-                    " and code  = '").append(param.getSurgery()).append("') > 0 ");
+                                      " where zy.inpatient_no = surgeryWhere.bah and zy.admiss_times = surgeryWhere.times " +
+                                      " and code  = '").append(param.getSurgery()).append("') > 0 ");
         }
 
         if (StringUtil.notBlank(param.getQualityControlLevel())) {
@@ -229,6 +231,8 @@ public class EmrQualityControlService {
 
         JSONObject socket = new JSONObject();
         socket.put("total", list.size());
+        List<PatientInfo> 电子病历审核分组 = new ArrayList<>();
+
         for (int i = 0, len = list.size(); i < len; i++) {
             PatientInfo item = list.get(i);
             Integer 病程记录id = dao.getDocumentIdByCode(item, "shoucibingchengjilu");
@@ -237,24 +241,18 @@ public class EmrQualityControlService {
                 item.setCourseId(病程记录id);
             }
 
-            item.setMinusPoints(100 - dao.getMinusPoints(item.getInpatientNo(), item.getAdmissTimes()));
+            BigDecimal fullMarks = new BigDecimal("100");
+            fullMarks = fullMarks.subtract(dao.getMinusPoints(item.getInpatientNo(), item.getAdmissTimes()));
+            item.setMinusPoints(fullMarks);
 
             afterAdmission.start(item, p);
             afterTheInstructionIsGiven.start(item, p);
             fragmentInterval.start(item, p);
             // 设置审核数据
-            List<EmrAuditDetail> auditDetail = dao.patientQualityControl(item.getPatNo(), item.getTimes());
-            if (auditDetail != null && !auditDetail.isEmpty()) {
-                for (EmrAuditDetail detail : auditDetail) {
-                    item.setApproverName(detail.getApproverName());
-                    item.setReviewTime(detail.getReviewTime());
-                    item.setQualityControlOpinions(detail);
-                    if (detail.getNumberOfDefects() != null && detail.getNumberOfDefects() > 0) {
-                        item.setScore(detail.getScoringCriteria(), detail.getNumberOfDefects());
-                    }
-                }
-            }
+//            List<EmrAuditDetail> auditDetail = dao.patientQualityControl(item.getPatNo(), item.getTimes());
+//            item.setQualityControlOpinion(auditDetail);
             setAdditionalInfo(item);
+            审核分组(电子病历审核分组, item);
             socket.put("current", (i + 1));
             if (sid != null) {
                 WebSocketServer.sendMessageBySid(sid, SocketUtil.send(socketEnum, socket));
@@ -263,10 +261,47 @@ public class EmrQualityControlService {
         log.info("患者信息:{}", JSON.toJSONString(list));
         JSONObject js = new JSONObject();
         js.put("count", p.getNumberOfProblemMedicalRecords());
+        if (!电子病历审核分组.isEmpty()) {
+            list.addAll(电子病历审核分组);
+        }
+        list.sort(Comparator.comparing(PatientInfo::getAdmissDate));
         js.put("patient", list);
         return js;
     }
 
+    private void 审核分组(List<PatientInfo> 电子病历审核分组, PatientInfo 患者) {
+        List<EmrAuditDetail> auditDetail = dao.patientQualityControl(患者.getPatNo(), 患者.getTimes());
+        if (auditDetail.isEmpty()) {
+            return;
+        }
+        Map<String, List<EmrAuditDetail>> 分组审核员 = auditDetail
+                .stream()
+                .collect(
+                        Collectors.groupingBy(EmrAuditDetail::getApprover)
+                );
+
+        boolean init = true;
+
+        for (Map.Entry<String, List<EmrAuditDetail>> item : 分组审核员.entrySet()) {
+            List<EmrAuditDetail> value = item.getValue();
+            if (init) {
+                设置审核值(患者, value);
+            } else {
+                PatientInfo 临时患者 = ObjectUtil.cloneByStream(患者);
+                临时患者.setQualityControlOpinions(new HashMap<>());
+                设置审核值(临时患者, value);
+                电子病历审核分组.add(临时患者);
+            }
+            init = false;
+        }
+    }
+
+    private void 设置审核值(PatientInfo 患者, List<EmrAuditDetail> value) {
+        患者.setQualityControlOpinion(value);
+        患者.setApproverName(value.getFirst().getApproverName());
+        患者.setReviewTime(value.getFirst().getReviewTime());
+    }
+
 
     /**
      * 设置患者附加的信息,转科病历分型等其他信息
@@ -302,7 +337,6 @@ public class EmrQualityControlService {
                 }
             }
         } catch (Exception ignore) {
-
         }
 
     }

+ 36 - 14
thyy-emr-query/src/main/java/org/thyy/emrquery/service/query/VariousRateServer.java

@@ -25,8 +25,11 @@ public class VariousRateServer {
     Integer 质控病历总数;
     private final Map<String, List<EmrAuditDetail>> 缓存患者意见 = new HashMap<>();
     private final Function<String, List<EmrAuditDetail>> 获取意见;
-    private final Set<String> 没有意见 = new HashSet<>();
     private final List<PatientInfo> 出院患者;
+    private final Map<String, PatientInfo> 缓存患者数据 = new HashMap<>();
+    private final Function<String, PatientInfo> 获取患者信息;
+    private final PassRateUtils passRateUtils;
+
 
     public VariousRateServer(QueryEmrDao dao, String start, String end) {
         this.dao = dao;
@@ -34,9 +37,14 @@ public class VariousRateServer {
         this.end = end;
         this.出院患者 = dao.chuyuanCount(start, end);
 
+        for (PatientInfo item : 出院患者) {
+            String key = item.getInpatientNo().trim() + "_" + item.getAdmissTimes();
+            缓存患者数据.put(key, item);
+        }
+
         this.获取意见 = (val) -> {
-            if (没有意见.contains(val)) {
-                return null;
+            if (缓存患者意见.containsKey(val)) {
+                return 缓存患者意见.get(val);
             }
             List<EmrAuditDetail> 意见 = 缓存患者意见.get(val);
             if (意见 != null) {
@@ -44,14 +52,23 @@ public class VariousRateServer {
             }
             String[] split = val.split("_");
             List<EmrAuditDetail> 患者意见 = dao.患者意见(split[0], Convert.toInt(split[1]));
-            if (患者意见 == null || 患者意见.isEmpty()) {
-                没有意见.add(val);
-                return null;
+            缓存患者意见.put(val, 患者意见);
+            return 患者意见;
+        };
+
+        this.获取患者信息 = (val) -> {
+            PatientInfo patientInfo = 缓存患者数据.get(val);
+            if (patientInfo == null) {
+                String[] split = val.split("_");
+                PatientInfo info = dao.获取患者信息(split[0], Convert.toInt(split[1]));
+                缓存患者数据.put(val, info);
+                return info;
             } else {
-                缓存患者意见.put(val, 患者意见);
+                return patientInfo;
             }
-            return 患者意见;
         };
+
+        passRateUtils = new PassRateUtils(获取患者信息);
     }
 
     public static class CreateData {
@@ -118,7 +135,7 @@ public class VariousRateServer {
 
     private VariousRateResult admissDateAndRuYuanBingLi() {
         List<PatientInfo.timeCheck> objects = dao.admissDateAndRuYuanBingLi(start, end);
-        return PassRateUtils.between(objects, "入院记录24小时完成率");
+        return passRateUtils.between(objects, "入院记录24小时完成率");
     }
 
     /**
@@ -126,7 +143,7 @@ public class VariousRateServer {
      */
     private VariousRateResult operation() {
         List<PatientInfo.timeCheck> maps = dao.opRecord(start, end);
-        return PassRateUtils.create(maps, (item) -> {
+        return passRateUtils.create(maps, (item) -> {
             boolean flag = item.getEnd() != null;
             item.setFlag(flag);
             return flag;
@@ -138,12 +155,12 @@ public class VariousRateServer {
      */
     private VariousRateResult disDateRate() {
         List<PatientInfo.timeCheck> maps = dao.disDate(start, end);
-        return PassRateUtils.between(maps, "出院记录24小时内完成率");
+        return passRateUtils.between(maps, "出院记录24小时内完成率");
     }
 
     private VariousRateResult firstPageOfMedicalRecord() {
         List<PatientInfo.timeCheck> maps = dao.firstPageOfMedicalRecord(start, end);
-        return PassRateUtils.between(maps, "病案首页24小时内完成率");
+        return passRateUtils.between(maps, "病案首页24小时内完成率");
     }
 
     private VariousRateResult numberOfDischargedPatients() {
@@ -156,7 +173,7 @@ public class VariousRateServer {
     }
 
     private List<VariousRateResult> 重大检查记录符合率() {
-        KeyFindByAuditUtils keyFindByAuditUtils = new KeyFindByAuditUtils(dao, 出院人数, 获取意见, 质控病历总数);
+        KeyFindByAuditUtils keyFindByAuditUtils = new KeyFindByAuditUtils(dao, 出院人数, 获取意见, 质控病历总数, 获取患者信息);
         return keyFindByAuditUtils.find(new ArrayList<>() {{
             add(KeyFindByAuditUtils.keyList("CT/MRI检查记录符合率", new String[]{"CT/MRI问题"}, dao.ctmriCount(start, end)));
             add(KeyFindByAuditUtils.keyList("病理检查记录符合率", new String[]{"病理问题"}, dao.bingliCount(start, end)));
@@ -165,7 +182,7 @@ public class VariousRateServer {
     }
 
     private List<VariousRateResult> 诊疗行为记录符合率() {
-        KeyFindByAuditUtils keyFindByAuditUtils = new KeyFindByAuditUtils(dao, 出院人数, 获取意见, 质控病历总数);
+        KeyFindByAuditUtils keyFindByAuditUtils = new KeyFindByAuditUtils(dao, 出院人数, 获取意见, 质控病历总数, 获取患者信息);
         ArrayList<KeyFindByAuditUtils.KeyValue> data = new ArrayList<>() {{
             add(KeyFindByAuditUtils.keyList("抗菌药物使用记录符合率", new String[]{"抗菌药物问题"}, dao.抗菌药物问题(start, end)));
             add(KeyFindByAuditUtils.keyList("恶性肿瘤化学治疗记录符合率", new String[]{"化疗记录问题"}, dao.化学治疗(start, end)));
@@ -177,4 +194,9 @@ public class VariousRateServer {
         }};
         return keyFindByAuditUtils.find(data);
     }
+
+    private List<VariousRateResult> 病历归档质量指标() {
+        ArrayList<VariousRateResult> list = new ArrayList<>();
+        return list;
+    }
 }

+ 7 - 2
thyy-emr-query/src/main/java/org/thyy/emrquery/service/query/utils/KeyFindByAuditUtils.java

@@ -35,12 +35,15 @@ public class KeyFindByAuditUtils {
     private final Integer 出院人数;
     private final QueryEmrDao dao;
     private final Function<String, List<EmrAuditDetail>> 获取患者意见;
+    private final Function<String, PatientInfo> 获取患者信息;
 
-    public KeyFindByAuditUtils(QueryEmrDao dao, Integer 出院人数, Function<String, List<EmrAuditDetail>> 获取患者意见, Integer 质控病历总数) {
+
+    public KeyFindByAuditUtils(QueryEmrDao dao, Integer 出院人数, Function<String, List<EmrAuditDetail>> 获取患者意见, Integer 质控病历总数, Function<String, PatientInfo> 获取患者信息) {
         this.dao = dao;
         this.出院人数 = 出院人数;
         this.质控病历总数 = 质控病历总数;
         this.获取患者意见 = 获取患者意见;
+        this.获取患者信息 = 获取患者信息;
     }
 
     private Set<String> 患者错误 = new HashSet<>();
@@ -60,7 +63,8 @@ public class KeyFindByAuditUtils {
     void 循环患者(PatientInfo 患者, KeyValue keyValue) {
         String 患者主键 = 患者.patKey();
         List<EmrAuditDetail> 意见 = 获取患者意见.apply(患者主键);
-        if (意见 == null) {
+
+        if (意见 == null || 意见.isEmpty()) {
             患者.setFlag(true);
             return;
         }
@@ -71,6 +75,7 @@ public class KeyFindByAuditUtils {
                 if (患者.getFlag() == null || 患者.getFlag()) {
                     患者.setFlag(false);
                     错误计数.compute(keyValue.get项目名称(), (k, o) -> (o == null ? 0 : o) + 1);
+                    患者.设置患者额外信息(获取患者信息);
                 }
             } else {
                 if (患者.getFlag() == null)

+ 7 - 11
thyy-emr-query/src/main/java/org/thyy/emrquery/service/query/utils/PassRateUtils.java

@@ -4,32 +4,28 @@ import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import org.thyy.emrquery.entity.dto.PatientInfo;
 import org.thyy.emrquery.entity.result.query.VariousRateResult;
-import lombok.Data;
 
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.function.Function;
 
-@Data
 public class PassRateUtils {
-    private int numerator;
-    private int denominator;
-    private String description;
-    private String percentage;
-    private double passRate;
-    private int fail;
+    private final Function<String, PatientInfo> 获取患者信息;
 
-    public PassRateUtils() {
+    public PassRateUtils(Function<String, PatientInfo> 获取患者信息) {
+        this.获取患者信息 = 获取患者信息;
     }
 
-    public static <T extends PatientInfo.timeCheck> VariousRateResult create(Iterable<T> iterable, Function<T, Boolean> function, String description) {
+    public <T extends PatientInfo.timeCheck> VariousRateResult create(Iterable<T> iterable, Function<T, Boolean> function, String description) {
         int numerator = 0;
         int denominator = 0;
         List<PatientInfo.timeCheck> list = new ArrayList<>();
         for (T t : iterable) {
             if (function.apply(t)) {
                 numerator++;
+            } else {
+                t.设置患者额外信息(获取患者信息);
             }
             denominator++;
             list.add(t);
@@ -55,7 +51,7 @@ public class PassRateUtils {
                 .build();
     }
 
-    public static <T extends PatientInfo.timeCheck> VariousRateResult between(Iterable<T> iterable, String description) {
+    public <T extends PatientInfo.timeCheck> VariousRateResult between(Iterable<T> iterable, String description) {
         return create(iterable, (o) -> {
             Date o1 = o.getStart();
             Date o2 = o.getEnd();

+ 14 - 0
thyy-emr-query/src/main/java/org/thyy/emrquery/utils/StrFormatTest.java

@@ -0,0 +1,14 @@
+package org.thyy.emrquery.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StrFormatTest<T> {
+    T data;
+
+    private Map<String, Object> map = new HashMap<>();
+
+
+
+
+}

+ 0 - 6
thyy-haikang/src/main/java/org/thyy/haikang/controller/DoorController.java

@@ -46,12 +46,6 @@ public class DoorController {
         return R.ok(doorService.destructionUser(pat));
     }
 
-//    @PostMapping("/barCode")
-//    @Operation(description = "创建卡片二维码", summary = "创建卡片二维码")
-//    public ResultVo<DoorService.CardClass> barCode(@RequestBody PatNo params) {
-//        return R.ok(doorService.barCode(params));
-//    }
-
     @PostMapping("/addFaceRecognition")
     @Operation(description = "添加或修改患者人脸信息", summary = "添加或修改患者人脸信息")
     public ResultVo<String> addFaceRecognition(@RequestBody AddFace params) {

+ 5 - 0
thyy-haikang/src/main/java/org/thyy/haikang/dao/DoorDao.java

@@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.*;
 import org.thyy.haikang.entity.data.HaikangPatient;
 import org.thyy.haikang.entity.params.door.PatientInfo;
 
+import java.util.List;
+
 @Mapper
 public interface DoorDao extends BaseMapper<HaikangPatient> {
 
@@ -51,4 +53,7 @@ public interface DoorDao extends BaseMapper<HaikangPatient> {
     @Delete("delete t_haikang_visitor where id = #{cardId}")
     void deleteVisitorData(String cardId);
 
+    @Select("select rtrim(inpatient_no) as patNo from zy_actpatient")
+    List<PatientInfo> getAllPatient();
+
 }

+ 3 - 7
thyy-haikang/src/main/java/org/thyy/haikang/service/DoorService.java

@@ -12,6 +12,7 @@ import cn.hutool.crypto.asymmetric.KeyType;
 import cn.hutool.crypto.asymmetric.RSA;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import jakarta.annotation.PostConstruct;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.thyy.haikang.dao.DoorDao;
@@ -33,6 +34,7 @@ import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
 import java.util.Base64;
 import java.util.Date;
+import java.util.List;
 
 
 @Slf4j
@@ -48,11 +50,6 @@ public class DoorService {
         this.dao = doorDao;
     }
 
-    public static void main(String[] args) {
-        byte[] bytes = FileUtil.readBytes("D:\\1.jpg");
-        System.out.println(Base64.getEncoder().encodeToString(bytes));
-    }
-
     public String createPatient(PatientInfo params) {
         if (params.getTimes() == null) {
             params = getPatientInfo(params.getPatNo());
@@ -76,7 +73,7 @@ public class DoorService {
         try {
             cardBindings(params);
         } catch (Exception e) {
-            throw new BizException(ExceptionEnum.CARD_BIND_ERROR);
+            log.error("绑卡错误:{}", e.getMessage());
         }
         historicalFacialFeatures(params);
         return "添加成功";
@@ -332,5 +329,4 @@ public class DoorService {
         return date.format(dtf2);
     }
 
-
 }

+ 2 - 2
thyy-haikang/src/main/resources/application-prod.yml

@@ -21,6 +21,6 @@ server:
 
 thyy:
   haikang:
-    key: "26610301"
-    secret: "oZNYo4r0QydlpYkHF7Vp"
+    key: "22496456"
+    secret: "PpeedYV7PjLnInQ5bumY"
     url: "172.16.32.210:443"

+ 3 - 4
thyy-haikang/src/main/resources/application.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: thyy-haikang
   datasource:
-    url: "jdbc:sqlserver://172.16.32.179:1433;databaseName=thxyhisdb"
+    url: "jdbc:sqlserver://172.16.32.168:1433;databaseName=thxyhisdb"
     username: "sa"
     password:
     driver-class-name: "com.microsoft.sqlserver.jdbc.SQLServerDriver"
@@ -20,11 +20,10 @@ server:
     context-path: /thyy/api/haikang
 thyy:
   haikang:
-    key: "26610301"
-    secret: "oZNYo4r0QydlpYkHF7Vp"
+    key: "22496456"
+    secret: "PpeedYV7PjLnInQ5bumY"
     url: "172.16.32.210:443"
 
-
 springdoc:
   swagger-ui:
     path: /swagger-ui.html