فهرست منبع

添加三级查房制度规则

hujing 5 سال پیش
والد
کامیت
64bec7d636

+ 23 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0122.java

@@ -1,20 +1,41 @@
 package com.lantone.qc.kernel.catalogue.threelevelward;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
 
 /**
- * @ClassName : CLI0001
- * @Description : 无输血/血制品病程记录
+ * @ClassName : THR0122
+ * @Description : 首次病程未在患者入院8小时内完成
  * @Author : 楼辉荣
  * @Date: 2020-03-06 17:28
  */
 @Component
 public class THR0122 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null
+                && inputInfo.getFirstCourseRecordDoc() != null && inputInfo.getFirstCourseRecordDoc().getStructureMap() != null) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisDate = beHospitalStructureMap.get(Content.admisDate);
+            Map<String, String> firstCourseRecordStructureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
+            String recordTime = firstCourseRecordStructureMap.get("记录时间");
+            if (CatalogueUtil.isEmpty(admisDate) || CatalogueUtil.isEmpty(recordTime)) {
+                return;
+            }
+            if (CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(admisDate),
+                    StringUtil.parseDateTime(recordTime),
+                    Long.valueOf(8 * 60))) {
+                status = "-1";
+            }
+
+        }
     }
 }

+ 39 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0123.java

@@ -0,0 +1,39 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : THR0123
+ * @Description : 入院记录未在患者入院24小时内完成
+ * @Author : 胡敬
+ * @Date: 2020-03-19 13:51
+ */
+@Component
+public class THR0123 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisDate = beHospitalStructureMap.get(Content.admisDate);
+            String recordTime = beHospitalStructureMap.get("记录日期");
+            if (CatalogueUtil.isEmpty(admisDate) || CatalogueUtil.isEmpty(recordTime)) {
+                return;
+            }
+            if (CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(admisDate),
+                    StringUtil.parseDateTime(recordTime),
+                    Long.valueOf(24 * 60))) {
+                status = "-1";
+            }
+
+        }
+    }
+}

+ 97 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0125.java

@@ -0,0 +1,97 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0125
+ * @Description : 副主任医师/主任医师查房首次查房记录未在患者入院72h内完成
+ * @Author : 胡敬
+ * @Date: 2020-03-19 13:51
+ */
+@Component
+public class THR0125 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null
+                && inputInfo.getThreeLevelWardDocs().size() > 0) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisTime = beHospitalStructureMap.get(Content.admisDate);
+            if (CatalogueUtil.isEmpty(admisTime)) {
+                return;
+            }
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+            Map<String, String> doctorRecord = extractWardRecord(
+                    threeLevelWardDocs,
+                    admisTime,
+                    72 * 60);
+            if (!doctorRecord.containsKey(Content.director)) {
+                status = "-1";
+            }
+        }
+    }
+
+    /**
+     * 抽取住院duration分钟内查房记录并取第一条主治医师查房记录以及第一条主任/副主任医师查房记录
+     *
+     * @param threeLevelWardDocs
+     * @param admisTime
+     * @param duration
+     * @return
+     */
+    private Map<String, String> extractWardRecord(List<ThreeLevelWardDoc> threeLevelWardDocs, String admisTime, int duration) {
+        Map<Date, String> dateRecord = new HashMap<>();
+        List<String> sortRecord = new ArrayList<>();
+        Map<String, String> doctorRecord = new HashMap<>();
+        String recordTime = "";
+        Date admisDate = StringUtil.parseDateTime(admisTime);
+        if (admisDate == null) {
+            return doctorRecord;
+        }
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardStructureMap = threeLevelWardDoc.getStructureMap();
+            recordTime = threeLevelWardStructureMap.get("查房日期");
+            Date recordDate = StringUtil.parseDateTime(recordTime);
+            if (recordDate == null) {
+                continue;
+            }
+            if (admisDate.before(recordDate) && !CatalogueUtil.compareTime(admisDate, recordDate, Long.valueOf(duration))) {
+                String wardTitle = threeLevelWardStructureMap.get("查房标题");
+                wardTitle = StringUtil.isBlank(wardTitle) ? "" : wardTitle;
+                dateRecord.put(recordDate, wardTitle);
+            }
+        }
+        dateRecord.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(
+                x -> sortRecord.add(x.getValue())
+        );
+        //按时间排好序查房记录的第一条主治医师查房记录存进doctorRecord
+        for (String record : sortRecord) {
+            if (!CatalogueUtil.subTitle(record).contains(Content.indications)) {
+                continue;
+            }
+            doctorRecord.put(Content.indications, record);
+            break;
+        }
+        //按时间排好序查房记录的第一条主任医师/副主任医师查房记录存进doctorRecord
+        for (String record : sortRecord) {
+            if (!CatalogueUtil.subTitle(record).contains(Content.director)) {
+                continue;
+            }
+            doctorRecord.put(Content.director, record);
+            break;
+        }
+        return doctorRecord;
+    }
+}

+ 97 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0126.java

@@ -0,0 +1,97 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0126
+ * @Description : 主治医师首次查房未在48小时内完成
+ * @Author : 胡敬
+ * @Date: 2020-03-19 15:50
+ */
+@Component
+public class THR0126 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null
+                && inputInfo.getThreeLevelWardDocs().size() > 0) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisTime = beHospitalStructureMap.get(Content.admisDate);
+            if (CatalogueUtil.isEmpty(admisTime)) {
+                return;
+            }
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+            Map<String, String> doctorRecord = extractWardRecord(
+                    threeLevelWardDocs,
+                    admisTime,
+                    48 * 60);
+            if (!doctorRecord.containsKey(Content.indications)) {
+                status = "-1";
+            }
+        }
+    }
+
+    /**
+     * 抽取住院duration分钟内查房记录并取第一条主治医师查房记录以及第一条主任/副主任医师查房记录
+     *
+     * @param threeLevelWardDocs
+     * @param admisTime
+     * @param duration
+     * @return
+     */
+    private static Map<String, String> extractWardRecord(List<ThreeLevelWardDoc> threeLevelWardDocs, String admisTime, int duration) {
+        Map<Date, String> dateRecord = new HashMap<>();
+        List<String> sortRecord = new ArrayList<>();
+        Map<String, String> doctorRecord = new HashMap<>();
+        String recordTime = "";
+        Date admisDate = StringUtil.parseDateTime(admisTime);
+        if (admisDate == null) {
+            return doctorRecord;
+        }
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardStructureMap = threeLevelWardDoc.getStructureMap();
+            recordTime = threeLevelWardStructureMap.get("查房日期");
+            Date recordDate = StringUtil.parseDateTime(recordTime);
+            if (recordDate == null) {
+                continue;
+            }
+            if (admisDate.before(recordDate) && !CatalogueUtil.compareTime(admisDate, recordDate, Long.valueOf(duration))) {
+                String wardTitle = threeLevelWardStructureMap.get("查房标题");
+                wardTitle = StringUtil.isBlank(wardTitle) ? "" : wardTitle;
+                dateRecord.put(recordDate, wardTitle);
+            }
+        }
+        dateRecord.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(
+                x -> sortRecord.add(x.getValue())
+        );
+        //按时间排好序查房记录的第一条主治医师查房记录存进doctorRecord
+        for (String record : sortRecord) {
+            if (!CatalogueUtil.subTitle(record).contains(Content.indications)) {
+                continue;
+            }
+            doctorRecord.put(Content.indications, record);
+            break;
+        }
+        //按时间排好序查房记录的第一条主任医师/副主任医师查房记录存进doctorRecord
+        for (String record : sortRecord) {
+            if (!CatalogueUtil.subTitle(record).contains(Content.director)) {
+                continue;
+            }
+            doctorRecord.put(Content.director, record);
+            break;
+        }
+        return doctorRecord;
+    }
+}

+ 97 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0127.java

@@ -0,0 +1,97 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0127
+ * @Description : 每周无2次副主任医师/主任医师查房记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 15:52
+ */
+@Component
+public class THR0127 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null
+                && inputInfo.getThreeLevelWardDocs().size() > 0) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisTime = beHospitalStructureMap.get(Content.admisDate);
+            if (CatalogueUtil.isEmpty(admisTime)) {
+                return;
+            }
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+            int hoursPerWeek = 7 * 24 * 60;
+            String roundRecordThisWeek = "";
+            List<String> roundRecordEveryWeek = new ArrayList<>();
+            //开始时间(入院时间)
+            Date beginDate = StringUtil.parseDateTime(admisTime);
+            int i = 1;
+            //每周的病历记录
+            while (i >= 1) {
+                roundRecordThisWeek = extractWardRecord(threeLevelWardDocs, beginDate, hoursPerWeek);
+                if (CatalogueUtil.isEmpty(roundRecordThisWeek)) {
+                    break;
+                }
+                roundRecordEveryWeek.add(roundRecordThisWeek);
+                beginDate = DateUtil.addDate(beginDate, 7);
+                i++;
+            }
+            for (String roundRecord : roundRecordEveryWeek) {
+                int directorNum = CatalogueUtil.appearNumber(roundRecord.split(","), Content.director);
+                int dept_doctorNum = CatalogueUtil.appearNumber(roundRecord.split(","), Content.dept_doctor);
+                if (directorNum + dept_doctorNum < 2) {
+                    //每周无2次主任医师查房记录/科主任查房记录
+                    status = "-1";
+                    return;
+                }
+            }
+        }
+    }
+
+    /**
+     * 抽取duration分钟内所有查房标题
+     * 抽取一周内所有查房标题,若一周内记录少于6天,则返回""
+     *
+     * @param threeLevelWardDocs
+     * @param admisDate
+     * @param duration
+     * @return
+     */
+    private static String extractWardRecord(List<ThreeLevelWardDoc> threeLevelWardDocs, Date admisDate, int duration) {
+        String recordTime = "", recordTitle = "";
+        List<Date> dateList = new ArrayList();
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardStructureMap = threeLevelWardDoc.getStructureMap();
+            recordTime = threeLevelWardStructureMap.get("查房日期");
+            Date recordDate = StringUtil.parseDateTime(recordTime);
+            if (recordDate == null) {
+                continue;
+            }
+            if (admisDate.before(recordDate) && !CatalogueUtil.compareTime(admisDate, recordDate, Long.valueOf(duration))) {
+                String wardTitle = CatalogueUtil.removeSpecialChar(threeLevelWardStructureMap.get("查房标题"));
+                recordTitle += wardTitle + ",";
+                dateList.add(recordDate);
+            }
+        }
+        if (dateList.size() >= 2) {
+            dateList.sort(Date::compareTo);
+            if (CatalogueUtil.compareTime(admisDate, dateList.get(dateList.size() - 1), Long.valueOf(6 * 24 * 60))) {
+                return recordTitle;
+            }
+        }
+        return "";
+    }
+}

+ 96 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0128.java

@@ -0,0 +1,96 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0128
+ * @Description : 每周无3次主治医师查房记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 16:52
+ */
+@Component
+public class THR0128 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null
+                && inputInfo.getThreeLevelWardDocs().size() > 0) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisTime = beHospitalStructureMap.get(Content.admisDate);
+            if (CatalogueUtil.isEmpty(admisTime)) {
+                return;
+            }
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+            int hoursPerWeek = 7 * 24 * 60;
+            String roundRecordThisWeek = "";
+            List<String> roundRecordEveryWeek = new ArrayList<>();
+            //开始时间(入院时间)
+            Date beginDate = StringUtil.parseDateTime(admisTime);
+            int i = 1;
+            //每周的病历记录
+            while (i >= 1) {
+                roundRecordThisWeek = extractWardRecord(threeLevelWardDocs, beginDate, hoursPerWeek);
+                if (CatalogueUtil.isEmpty(roundRecordThisWeek)) {
+                    break;
+                }
+                roundRecordEveryWeek.add(roundRecordThisWeek);
+                beginDate = DateUtil.addDate(beginDate, 7);
+                i++;
+            }
+            for (String roundRecord : roundRecordEveryWeek) {
+                int indicationsNum = CatalogueUtil.appearNumber(roundRecord.split(","), Content.indications);
+                if (indicationsNum < 3) {
+                    //每周无3次主治医师查房记录
+                    status = "-1";
+                    return;
+                }
+            }
+        }
+    }
+
+    /**
+     * 抽取duration分钟内所有查房标题
+     * 抽取一周内所有查房标题,若一周内记录少于6天,则返回""
+     *
+     * @param threeLevelWardDocs
+     * @param admisDate
+     * @param duration
+     * @return
+     */
+    private static String extractWardRecord(List<ThreeLevelWardDoc> threeLevelWardDocs, Date admisDate, int duration) {
+        String recordTime = "", recordTitle = "";
+        List<Date> dateList = new ArrayList();
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardStructureMap = threeLevelWardDoc.getStructureMap();
+            recordTime = threeLevelWardStructureMap.get("查房日期");
+            Date recordDate = StringUtil.parseDateTime(recordTime);
+            if (recordDate == null) {
+                continue;
+            }
+            if (admisDate.before(recordDate) && !CatalogueUtil.compareTime(admisDate, recordDate, Long.valueOf(duration))) {
+                String wardTitle = CatalogueUtil.removeSpecialChar(threeLevelWardStructureMap.get("查房标题"));
+                recordTitle += wardTitle + ",";
+                dateList.add(recordDate);
+            }
+        }
+        if (dateList.size() >= 2) {
+            dateList.sort(Date::compareTo);
+            if (CatalogueUtil.compareTime(admisDate, dateList.get(dateList.size() - 1), Long.valueOf(6 * 24 * 60))) {
+                return recordTitle;
+            }
+        }
+        return "";
+    }
+}

+ 56 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0140.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0140
+ * @Description : 危重患者、疑难患者、抢救患者查房记录无主任医师/科主任签名
+ * @Author : 胡敬
+ * @Date: 2020-03-19 19:20
+ */
+@Component
+public class THR0140 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+            return;
+        }
+        if (inputInfo.getDifficultCaseDiscussDocs().size() > 0) {
+            processSign(inputInfo, "疑难患者");
+        }
+        if (inputInfo.getRescueDocs().size() > 0) {
+            processSign(inputInfo, "抢救患者");
+        }
+    }
+
+    private void processSign(InputInfo inputInfo, String info) {
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardDocStructureMap = threeLevelWardDoc.getStructureMap();
+            String title = threeLevelWardDocStructureMap.get("查房标题");
+            String recordDoctor = threeLevelWardDocStructureMap.get("记录医师");
+            if (CatalogueUtil.isEmpty(title)) {
+                continue;
+            }
+            if (CatalogueUtil.subTitle(title).contains(Content.director) && CatalogueUtil.isEmpty(recordDoctor)) {
+                status = "-1";
+                if (StringUtil.isBlank(info)) {
+                    this.info = info;
+                } else {
+                    this.info += "," + info;
+                }
+                break;
+            }
+        }
+    }
+}

+ 58 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0141.java

@@ -0,0 +1,58 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0141
+ * @Description : 危重患者、疑难患者、抢救患者无主任医师/科主任查房记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 19:26
+ */
+@Component
+public class THR0141 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+            return;
+        }
+        if (inputInfo.getDifficultCaseDiscussDocs().size() > 0) {
+            processSign(inputInfo, "疑难患者");
+        }
+        if (inputInfo.getRescueDocs().size() > 0) {
+            processSign(inputInfo, "抢救患者");
+        }
+    }
+
+    private void processSign(InputInfo inputInfo, String info) {
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        int directorSum = 0;
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardDocStructureMap = threeLevelWardDoc.getStructureMap();
+            String title = threeLevelWardDocStructureMap.get("查房标题");
+            if (CatalogueUtil.isEmpty(title)) {
+                continue;
+            }
+            if (CatalogueUtil.subTitle(title).contains(Content.director)) {
+                directorSum++;
+            }
+        }
+        if (directorSum != threeLevelWardDocs.size()) {
+            status = "-1";
+            if (StringUtil.isBlank(info)) {
+                this.info = info;
+            } else {
+                this.info += "," + info;
+            }
+        }
+    }
+}

+ 54 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0144.java

@@ -0,0 +1,54 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0144
+ * @Description : 患者出院前无主治医师/副主任医师/主任医师/科主任同意出院的病程记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 17:20
+ */
+@Component
+public class THR0144 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status = "0";
+        if (inputInfo.getThreeLevelWardDocs().size() > 0) {
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+            String lastWardCRoundRecord = "", lastWardRoundTitle = "";
+            Date lastWardCRoundDate = null;
+            String wardRoundTime, wardCRoundRecord, WardRoundTitle;
+            for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+                Map<String, String> threeLevelWardDocStructureMap = threeLevelWardDoc.getStructureMap();
+                if (StringUtil.isEmpty(threeLevelWardDocStructureMap.get("查房日期"))
+                        || StringUtil.isEmpty(threeLevelWardDocStructureMap.get("病情记录"))) {
+                    continue;
+                }
+                wardRoundTime = threeLevelWardDocStructureMap.get("查房日期");
+                wardCRoundRecord = threeLevelWardDocStructureMap.get("病情记录");
+                WardRoundTitle = threeLevelWardDocStructureMap.get("查房标题");
+                Date wardRoundDate = StringUtil.parseDateTime(wardRoundTime);
+                if (lastWardCRoundDate == null || (wardRoundDate != null && wardRoundDate.after(lastWardCRoundDate))) {
+                    lastWardCRoundDate = wardRoundDate;
+                    lastWardCRoundRecord = wardCRoundRecord;
+                    lastWardRoundTitle = WardRoundTitle;
+                }
+            }
+            if (lastWardCRoundRecord.contains("出院") && !CatalogueUtil.isEmpty(lastWardRoundTitle)
+                    && !CatalogueUtil.subTitle(lastWardRoundTitle).contains(Content.indications)
+                    && !CatalogueUtil.subTitle(lastWardRoundTitle).contains(Content.director)) {
+                status = "-1";
+            }
+        }
+    }
+}

+ 37 - 0
kernel/src/main/java/com/lantone/qc/kernel/util/CatalogueUtil.java

@@ -2,6 +2,8 @@ package com.lantone.qc.kernel.util;
 
 import com.google.common.collect.Lists;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.model.entity.Diag;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
@@ -9,6 +11,7 @@ import lombok.Getter;
 import lombok.Setter;
 
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
@@ -213,4 +216,38 @@ public class CatalogueUtil {
         }
         return overtime;
     }
+
+    /**
+     * 获取查房记录标题中医师职称
+     *
+     * @return
+     */
+    public static String subTitle(String srcText) {
+        if (srcText.contains("代")) {
+            srcText = srcText.substring(srcText.indexOf("代") + 1);
+        }
+        return srcText;
+    }
+
+    /**
+     * 获取指定字符串出现的次数
+     *
+     * @param srcText  源字符串
+     * @param findText 要查找的字符串
+     * @return
+     */
+    public static int appearNumber(String[] srcText, String findText) {
+        int count = 0;
+        Pattern p = null;
+        Matcher m = null;
+        for (String title : srcText) {
+            title = subTitle(title);
+            p = Pattern.compile(findText);
+            m = p.matcher(title);
+            while (m.find()) {
+                count++;
+            }
+        }
+        return count;
+    }
 }

+ 3 - 0
public/src/main/java/com/lantone/qc/pub/Content.java

@@ -194,6 +194,9 @@ public class Content {
     public static final String director_doctor="主任医师";
     public static final String dept_doctor="科主任";
 
+    public static final String indications="主治";
+    public static final String director="主任";
+
     public static final String operative_information="手术信息";
     public static final String operative_code="手术编码";
     public static final String operative_date="手术日期";

+ 1 - 2
public/src/main/java/com/lantone/qc/pub/util/StringUtil.java

@@ -193,9 +193,8 @@ public class StringUtil {
             }
         } catch (ParseException ex) {
             ex.printStackTrace();
-        } finally {
-            return date;
         }
+        return date;
     }
 
     /**