Browse Source

Merge branch 'develop' into 20211018_yw_check

# Conflicts:
#	src/main/java/com/diagbot/config/ResourceServerConfigurer.java
#	src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
#	src/main/java/com/diagbot/facade/BehospitalInfoFacade.java
#	src/main/java/com/diagbot/facade/SysUserFacade.java
#	src/main/java/com/diagbot/web/SysUserController.java
#	src/main/resources/mapper/MedCheckInfoMapper.xml
songxinlu 3 năm trước cách đây
mục cha
commit
1a79f73c1c
34 tập tin đã thay đổi với 1460 bổ sung461 xóa
  1. 187 100
      doc/031.20210326v2.0.2/qc_initv2.0.2.sql
  2. 13 0
      doc/033.20210608v2.0.4/qc_initv2.0.4.sql
  3. 12 0
      doc/034.20210804_2.0.5/qc_initv2.0.5.sql
  4. 2 2
      pom.xml
  5. 35 4
      src/main/java/com/diagbot/aggregate/LeaveHosStatisticsAggregate.java
  6. 10 0
      src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  7. 10 0
      src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  8. 5 4
      src/main/java/com/diagbot/dto/MedManageParamsDTO.java
  9. 6 6
      src/main/java/com/diagbot/dto/ReBeHosByDeptDTO.java
  10. 7 6
      src/main/java/com/diagbot/dto/ReBeHosDTO.java
  11. 18 4
      src/main/java/com/diagbot/dto/ReBeHosDetailByDeptDTO.java
  12. 21 4
      src/main/java/com/diagbot/dto/ReBeHosDetailDTO.java
  13. 8 1
      src/main/java/com/diagbot/dto/ReBeHosMergeDTO.java
  14. 35 0
      src/main/java/com/diagbot/dto/StrAdmissionNoteDTO.java
  15. 1 21
      src/main/java/com/diagbot/entity/MedIndexResult.java
  16. 12 1
      src/main/java/com/diagbot/enums/QualityContent.java
  17. 26 18
      src/main/java/com/diagbot/facade/AlgorithmFacade.java
  18. 57 39
      src/main/java/com/diagbot/facade/BehospitalInfoFacade.java
  19. 1 2
      src/main/java/com/diagbot/facade/ConsoleByDeptExportFacade.java
  20. 51 3
      src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java
  21. 1 2
      src/main/java/com/diagbot/facade/ConsoleExportFacade.java
  22. 451 44
      src/main/java/com/diagbot/facade/ConsoleFacade.java
  23. 65 0
      src/main/java/com/diagbot/facade/DataEditFacade.java
  24. 2 0
      src/main/java/com/diagbot/facade/FilterFacade.java
  25. 20 0
      src/main/java/com/diagbot/facade/SysUserFacade.java
  26. 9 2
      src/main/java/com/diagbot/task/MedIndexTask.java
  27. 1 1
      src/main/java/com/diagbot/vo/AnalyzeVO.java
  28. 18 0
      src/main/java/com/diagbot/vo/DataEditVO.java
  29. 2 0
      src/main/java/com/diagbot/vo/ReBeHosPageVO.java
  30. 54 0
      src/main/java/com/diagbot/web/DataEditController.java
  31. 7 0
      src/main/java/com/diagbot/web/SysUserController.java
  32. 307 192
      src/main/resources/mapper/BehospitalInfoMapper.xml
  33. 6 4
      src/main/resources/mapper/MedIndexResultMapper.xml
  34. 0 1
      src/main/resources/mapper/MedicalRecordMapper.xml

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 187 - 100
doc/031.20210326v2.0.2/qc_initv2.0.2.sql


+ 13 - 0
doc/033.20210608v2.0.4/qc_initv2.0.4.sql

@@ -0,0 +1,13 @@
+use `qc`;
+
+-- 字典表加入密码正则表达式  不同的医院需要修改id为对应的医院id
+SET @id ='4';
+INSERT INTO `sys_dictionary_info` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `group_type`, `name`, `val`, `return_type`, `order_no`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '30', @id, '^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\\d]){1,})(?=(.*[\\W]){1,})(?!.*\\s).{8,12}$', '2', '0', '正则表达式(至少8个字符,少于12个字符,大写字母+小写字母+数字+特殊字符)');
+
+UPDATE `sys_menu` SET `name`='31日再入院病历数' WHERE (`name`='31日再入院病人数');
+UPDATE `sys_menu` SET `name`='31日再入院病历数' WHERE (`name`='31日再入院病人数');
+UPDATE `sys_permission` SET  `name`='31日再入院病历数报表',`descritpion`='31日再入院病历数报表' WHERE (`permissionUrl`='/console/reHos31DaysPage');
+UPDATE `sys_permission` SET  `name`='31日再入院病历数报表',`descritpion`='31日再入院病历数报表(科室)' WHERE (`permissionUrl`='/consoleByDept/reHos31DaysPageByDept');
+
+
+

+ 12 - 0
doc/034.20210804_2.0.5/qc_initv2.0.5.sql

@@ -0,0 +1,12 @@
+use `qc`;
+INSERT INTO `sys_menu` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `parent_id`, `code`, `show_status`, `maintain_status`, `order_no`, `remark`) VALUES ('N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '数据编辑', '-1', 'YH-SJBJ', '1', '1', '11', '入院记录展示/编辑');
+SET @id =@@identity;
+INSERT INTO `sys_role_menu` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `menu_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '1',@id, NULL);
+INSERT INTO `sys_role_menu` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `menu_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '-1',@id, NULL);
+
+INSERT INTO `sys_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `permissionUrl`, `method`, `descritpion`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '数据编辑', 'FUNC000151', '/qc/dataEdit/getDataEdit', 'ALL', '数据编辑获取入院记录json数据', NULL);
+SET @it =@@identity;
+INSERT INTO `sys_menu_permission` (`is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `menu_id`, `permission_id`, `order_nu`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', @id, @it, NULL, '数据编辑获取入院记录json数据');
+
+
+

+ 2 - 2
pom.xml

@@ -39,8 +39,8 @@
         <patchca.version>1.1.2</patchca.version>
         <hutool.version>5.0.7</hutool.version>
         <docker-maven-plugin.version>1.2.1</docker-maven-plugin.version>
-        <docker.image.prefix>192.168.2.241:5000/diagbotcloud</docker.image.prefix>
-        <registryUrl>http://192.168.2.241:5000/repository/diagbotcloud/</registryUrl>
+        <docker.image.prefix>192.168.2.121:5000/diagbotcloud</docker.image.prefix>
+        <registryUrl>http://192.168.2.121:5000/repository/diagbotcloud/</registryUrl>
     </properties>
 
     <dependencyManagement>

+ 35 - 4
src/main/java/com/diagbot/aggregate/LeaveHosStatisticsAggregate.java

@@ -1,15 +1,20 @@
 package com.diagbot.aggregate;
 
+import com.diagbot.dto.ReBeHosDTO;
 import com.diagbot.facade.BehospitalInfoFacade;
+import com.diagbot.facade.ConsoleFacade;
+import com.diagbot.util.BeanUtil;
 import com.diagbot.vo.FilterVO;
+import com.diagbot.vo.ReBeHosPageVO;
 import io.github.lvyahui8.spring.annotation.DataConsumer;
 import io.github.lvyahui8.spring.annotation.DataProvider;
 import io.github.lvyahui8.spring.annotation.InvokeParameter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * @Description:
@@ -20,6 +25,8 @@ import java.util.Map;
 public class LeaveHosStatisticsAggregate {
     @Autowired
     private BehospitalInfoFacade behospitalInfoFacade;
+    @Autowired
+    private ConsoleFacade consoleFacade;
 
     @DataProvider("setAllLeaveHos")
     public Map<String, Object> setAllLeaveHos(
@@ -37,7 +44,7 @@ public class LeaveHosStatisticsAggregate {
         retMap.put("新生儿人数", newBornNum);
         retMap.put("手术病人数", operationNum);
         retMap.put("非医嘱离院病人数", nonAdviceNum);
-        retMap.put("31日再入院病数", reBehospitalNum);
+        retMap.put("31日再入院病数", reBehospitalNum);
         return retMap;
 
     }
@@ -105,6 +112,30 @@ public class LeaveHosStatisticsAggregate {
      */
     @DataProvider("get31DaysBehospitalCount")
     public Integer get31DaysBehospitalCount(@InvokeParameter("filterVO") FilterVO filterVO) {
-        return behospitalInfoFacade.get31DaysBehospitalCount(filterVO);
+        ReBeHosPageVO reBeHosPageVO = new ReBeHosPageVO();
+        BeanUtil.copyProperties(filterVO,reBeHosPageVO);
+        reBeHosPageVO.setStartDate(timeTrans(filterVO.getStartDate()));
+        reBeHosPageVO.setEndDate(timeTrans(filterVO.getEndDate()));
+        reBeHosPageVO.setFlag(31);
+        List<ReBeHosDTO> records = consoleFacade.reHos31DaysPage(reBeHosPageVO).getRecords();
+        Set<String> codeList = new HashSet<>();
+        records.forEach(obj->{
+            obj.getDetails().forEach(opj->{
+                codeList.add(opj.getBehospitalCode());
+            });
+        });
+        return codeList.size();
+    }
+
+    public static Date timeTrans(String time){
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            Date date = format.parse(time);
+            return date;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return new Date();
+
     }
 }

+ 10 - 0
src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -39,6 +39,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .regexMatchers(".*swagger.*", ".*v2.*", ".*webjars.*", "/druid.*", "/actuator.*", "/hystrix.*").permitAll()
                 .antMatchers("/sys/user/getJwt").permitAll()
                 .antMatchers("/sys/user/getCaptcha").permitAll()
+                .antMatchers("/sys/user/getHospitalMark").permitAll()
                 .antMatchers("/sys/user/getJwtNoPass").permitAll()
                 .antMatchers("/sys/user/refreshJwt").permitAll()
                 .antMatchers("/sys/user/checkToken").permitAll()
@@ -237,8 +238,17 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/consoleByDept/medicalCheckFormKs").permitAll()
                 .antMatchers("/print/export/medicalCheckExportByDept").permitAll()
                 .antMatchers("/consoleByDept/medicalCheckTitleKs").permitAll()
+                .antMatchers("/console/qualityControl").permitAll()
+                .antMatchers("/console/export/qualityControlExport").permitAll()
+                .antMatchers("/consoleByDept/qualityControlByDept").permitAll()
+                .antMatchers("/print/export/qualityControlExportByDept").permitAll()
+                .antMatchers("/qc/behospitalInfo/getMedQualityCoList").permitAll()
+                .antMatchers("/console/saveMedicaIndicator").permitAll()
                 .antMatchers("/qc/medCheckInfo/createMedBeHospitalInfoType").permitAll()
                 .antMatchers("/qc/medCheckWork/getLocalRegionMedoup").permitAll()
+                .antMatchers("/qc/medCheckInfo/addMedCheckInfo").permitAll()
+                .antMatchers("/qc/medCheckInfo/getDataEdit").permitAll()
+                .antMatchers("/qc/medCheckInfo/saveDataEdit").permitAll()
                 .antMatchers("/**").authenticated();
         //                .antMatchers("/**").permitAll();
     }

+ 10 - 0
src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -82,6 +82,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/hystrix/**", request)
                 || matchers("/sys/user/getJwt", request)
                 || matchers("/sys/user/getCaptcha", request)
+                || matchers("/sys/user/getHospitalMark", request)
                 || matchers("/sys/user/getJwtNoPass", request)
                 || matchers("/sys/user/refreshJwt", request)
                 || matchers("/sys/dictionaryInfo/getDictionary", request)
@@ -281,8 +282,17 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/consoleByDept/medicalCheckFormKs", request)
                 || matchers("/print/export/medicalCheckExportByDept", request)
                 || matchers("/consoleByDept/medicalCheckTitleKs", request)
+                || matchers("/console/qualityControl", request)
+                || matchers("/console/export/qualityControlExport", request)
+                || matchers("/consoleByDept/qualityControlByDept", request)
+                || matchers("/print/export/qualityControlExportByDept", request)
+                || matchers("/qc/behospitalInfo/getMedQualityCoList", request)
+                || matchers("/console/saveMedicaIndicator", request)
                 || matchers("/qc/medCheckInfo/createMedBeHospitalInfoType", request)
                 || matchers("/qc/medCheckWork/getLocalRegionMedoup", request)
+                || matchers("/qc/medCheckInfo/addMedCheckInfo", request)
+                || matchers("/qc/dataEdit/getDataEdit", request)
+                || matchers("/qc/dataEdit/saveDataEdit", request)
                 || matchers("/", request)) {
             return true;
         }

+ 5 - 4
src/main/java/com/diagbot/dto/MedManageParamsDTO.java

@@ -37,10 +37,11 @@ public class MedManageParamsDTO implements Serializable {
     //医嘱状态判别
     private String daStatus;
 
-    /**
-     * 住院科室名称
-     */
-    private String behDeptName;
+    //病历标题
+    private String content;
+
+    //文书内容(blob)
+    private String rec_title;
 
 
 

+ 6 - 6
src/main/java/com/diagbot/dto/ReBeHosByDeptDTO.java

@@ -25,19 +25,19 @@ public class ReBeHosByDeptDTO {
      */
     @Excel(name = "性别", width = 10, needMerge = true, orderNum = "2")
     private String sex;
-    /**
-     * 主诊断
-     */
-    @Excel(name = "主诊断", width = 50, needMerge = true, orderNum = "3")
-    private String diagnose;
+
     /**
      * 间隔天数
      */
     @Excel(name = "间隔天数", width = 10, needMerge = true, orderNum = "4")
     private Integer diffDays;
+
+    @Excel(name = "是否有出院31天内再住院计划", width = 30, needMerge = true,  orderNum = "5")
+    private String lastAgainBehospitalPlan;//31天再入院计划(是/否)
+
     /**
      * 比较病历组
      */
-    @ExcelCollection(name = "", orderNum = "5")
+    @ExcelCollection(name = "", orderNum = "6")
     private List<ReBeHosDetailByDeptDTO> details;
 }

+ 7 - 6
src/main/java/com/diagbot/dto/ReBeHosDTO.java

@@ -25,19 +25,20 @@ public class ReBeHosDTO {
      */
     @Excel(name = "性别", width = 10, needMerge = true, orderNum = "2")
     private String sex;
-    /**
-     * 主诊断
-     */
-    @Excel(name = "主诊断", width = 50, needMerge = true, orderNum = "3")
-    private String diagnose;
+
     /**
      * 间隔天数
      */
     @Excel(name = "间隔天数", width = 10, needMerge = true, orderNum = "4")
     private Integer diffDays;
+
+
+    @Excel(name = "是否有出院31天内再住院计划", width = 30, needMerge = true,  orderNum = "5")
+    private String lastAgainBehospitalPlan;//31天再入院计划(是/否)
+
     /**
      * 比较病历组
      */
-    @ExcelCollection(name = "", orderNum = "5")
+    @ExcelCollection(name = "", orderNum = "6")
     private List<ReBeHosDetailDTO> details;
 }

+ 18 - 4
src/main/java/com/diagbot/dto/ReBeHosDetailByDeptDTO.java

@@ -25,6 +25,7 @@ public class ReBeHosDetailByDeptDTO {
      */
     @Excel(name = "病人姓名", width = 20, orderNum = "2")
     private String name;
+
     /**
      * 病历等级
      */
@@ -51,26 +52,39 @@ public class ReBeHosDetailByDeptDTO {
      */
     @Excel(name = "主管医生", width = 50, orderNum = "6")
     private String doctorName;
+
+    /**
+     * 入院诊断
+     */
+    @Excel(name = "入院诊断", width = 50, needMerge = true, orderNum = "7")
+    private String diagnose;
+
+    /**
+     * 出院诊断
+     */
+    @Excel(name = "出院诊断", width = 50, needMerge = true, orderNum = "8")
+    private String diagnoseName;
+
     /**
      * 出院日期
      */
-    @Excel(name = "出院日期", format = "yyyy-MM-dd", width = 30, orderNum = "7")
+    @Excel(name = "出院日期", format = "yyyy-MM-dd", width = 30, orderNum = "9")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date leaveHospitalDate;
     /**
      * 入院日期
      */
-    @Excel(name = "入院日期", format = "yyyy-MM-dd", width = 30, orderNum = "8")
+    @Excel(name = "入院日期", format = "yyyy-MM-dd", width = 30, orderNum = "10")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date behospitalDate;
     /**
      * 住院天数
      */
-    @Excel(name = "住院天数", width = 15, orderNum = "9")
+    @Excel(name = "住院天数", width = 15, orderNum = "11")
     private String behospitalDayNum;
     /**
      * 住院费用
      */
-    @Excel(name = "住院费用", width = 15, orderNum = "10")
+    @Excel(name = "住院费用", width = 15, orderNum = "12")
     private String totleFee;
 }

+ 21 - 4
src/main/java/com/diagbot/dto/ReBeHosDetailDTO.java

@@ -25,6 +25,8 @@ public class ReBeHosDetailDTO {
      */
     @Excel(name = "病人姓名", width = 20, orderNum = "2")
     private String name;
+
+
     /**
      * 病历等级
      */
@@ -44,26 +46,41 @@ public class ReBeHosDetailDTO {
      */
     @Excel(name = "科室", width = 50, orderNum = "5")
     private String behDeptName;
+
+    /**
+     * 入院诊断
+     */
+    @Excel(name = "入院诊断", width = 50, needMerge = true, orderNum = "6")
+    private String diagnose;
+
+    /**
+     * 出院诊断
+     */
+    @Excel(name = "出院诊断", width = 50, needMerge = true, orderNum = "7")
+    private String diagnoseName;
     /**
      * 出院日期
      */
-    @Excel(name = "出院日期", format = "yyyy-MM-dd", width = 30, orderNum = "6")
+    @Excel(name = "出院日期", format = "yyyy-MM-dd", width = 30, orderNum = "8")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date leaveHospitalDate;
     /**
      * 入院日期
      */
-    @Excel(name = "入院日期", format = "yyyy-MM-dd", width = 30, orderNum = "7")
+    @Excel(name = "入院日期", format = "yyyy-MM-dd", width = 30, orderNum = "9")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date behospitalDate;
     /**
      * 住院天数
      */
-    @Excel(name = "住院天数", width = 15, orderNum = "8")
+    @Excel(name = "住院天数", width = 15, orderNum = "10")
     private String behospitalDayNum;
     /**
      * 住院费用
      */
-    @Excel(name = "住院费用", width = 15, orderNum = "9")
+    @Excel(name = "住院费用", width = 15, orderNum = "11")
     private String totleFee;
+
+    private String age;
+
 }

+ 8 - 1
src/main/java/com/diagbot/dto/ReBeHosMergeDTO.java

@@ -15,7 +15,8 @@ import java.util.Date;
 @Setter
 public class ReBeHosMergeDTO {
     private String fileCode;
-    private String diagnose;
+    private String diagnose = "";
+    private String diagnoseName = "";//病案首页诊断
     private String name;
     private String sex;
     private String doctorName;
@@ -29,6 +30,8 @@ public class ReBeHosMergeDTO {
     private Date behospitalDate;
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date leaveHospitalDate;
+    private String lastDiagnose = "";
+    private String lastDiagnoseName = "";
     private String lastBehDeptId;
     private String lastBehDeptName;
     private String lastDoctorName;
@@ -42,6 +45,10 @@ public class ReBeHosMergeDTO {
     private Integer diffDays;
     private String totleFee;
     private String behospitalDayNum;
+    private String againBehospitalPlan;//31天再入院计划(是/否)
+    private String age;//年龄
+    private String lastAge;//年龄
     private String lastTotleFee;
     private String lastBehospitalDayNum;
+    private String lastAgainBehospitalPlan;//31天再入院计划(是/否)
 }

+ 35 - 0
src/main/java/com/diagbot/dto/StrAdmissionNoteDTO.java

@@ -0,0 +1,35 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 入院记录
+ * </p>
+ *
+ * @author cy
+ * @since 2020-10-09
+ */
+@Data
+public class StrAdmissionNoteDTO implements Serializable {
+
+
+    /**
+     * 记录编号
+     */
+    private String recId;
+
+
+    /**
+     * 结构化数据
+     */
+    private String wholeData;
+
+    /**
+     * modeId
+     */
+    private String modeId;
+
+}

+ 1 - 21
src/main/java/com/diagbot/entity/MedIndexResult.java

@@ -98,11 +98,6 @@ public class MedIndexResult implements Serializable {
      */
     private Double bloodResult;
 
-    /**
-     * 医师查房记录完整率--分母
-     */
-    private Double wardRoundResult;
-
     /**
      * 患者抢救记录及时完成率--分母
      */
@@ -114,25 +109,10 @@ public class MedIndexResult implements Serializable {
     private Double secFileResult;
 
     /**
-     * 出院患者病历归档完整率--分
+     * 出院患者病历归档完整率--分
      */
     private Double fileCompleteResult;
 
-    /**
-     * 不合理复制病历发生率--分母
-     */
-    private Double noCopyResult;
-
-    /**
-     * 知情同意书规范签署率--分母
-     */
-    private Double recordSignResult;
-
-    /**
-     * 甲级病历率--分母
-     */
-    private Double firRecordResult;
-
     private String startDate;
 
     private String endDate;

+ 12 - 1
src/main/java/com/diagbot/enums/QualityContent.java

@@ -148,13 +148,24 @@ public class QualityContent {
      *   临床用血
      */
     public static List<String> BLOODLIST = Arrays.asList(
-            "交叉配血","血交叉","血常规");
+            "交叉配血","血交叉");
 
     /**
      * 用于代码判断指标1、2、3执行路径
      */
     public static List<String> FOURSTR = Arrays.asList(
             "住院病案管理人员月均负担出院患者病历数", "病案编码人员月均负担出院患者病历数", "门诊病案管理人员月均负担门诊患者病历数");
+
+    // 放疗药物目录
+    public static List<String> radiotherapyDrugList = Arrays.asList(
+            "艾迪注射液", "康艾注射液", "康莱特注射液", "鸦胆子油乳注射液", "榄香烯乳注射液", "香菇多糖", "胎盘多肽注射液", "甘露聚糖肽注射液",
+            "脾多肽注射液", "E巨和粒", "欣粒生", "特尔津", "日达仙注射剂", "益比奥", "特比澳", "胸腺五肽", "古拉定","天晴甘美", "易善复", "己糖神经节苷脂钠",
+            "核糖核酸II", "参芪扶正注射液", "甘露醇注射液", "兰索拉唑", "奥西康", "卡络磺钠注射液", "维生素K1注射液", "氨甲苯酸注射液", "酚磺乙胺注射液",
+            "盐酸甲氧氯普胺注", "甲磺酸托烷司琼注射液", "伊班膦酸钠注射液", "唑来膦酸", "盐酸氨溴索注射液","氨茶碱注射液", "孟鲁司特钠片", "阿托伐他汀钙片",
+            "阿卡波糖片", "盐酸二甲双胍片", "瑞格列奈片", "格列齐特片","拉米夫定片","耐信","益血生胶囊","地榆升白片", "鲨肝醇片", "复方皂矾丸", "加巴喷丁胶囊",
+            "塞来昔布胶囊", "氨酚曲马多片", "盐酸羟考酮缓释片","硫酸吗啡缓释片", "盐酸吗啡片","复方甲氧那明胶囊","醋酸甲地孕酮分散","枸橼酸托瑞米芬片","标准桃金娘油肠溶",
+            "甲氧氯普胺片","多潘立酮片"
+    );
 }
 
 

+ 26 - 18
src/main/java/com/diagbot/facade/AlgorithmFacade.java

@@ -197,7 +197,11 @@ public class AlgorithmFacade {
                 }
                 qcResultAlgVOList.add(algorithmVO.getOptResultAlgVO());
             }
-
+            if(ListUtil.isEmpty(qcResultAlgVOList)){
+                qcResultAlgVOList = new ArrayList<>();
+                qcResultAlgVOList.add(algorithmVO.getOptResultAlgVO());
+                algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
+            }
         }
         //删除
         else if (algorithmVO.getType().equals(2)||(algorithmVO.getType().equals(4)&&0==algorithmVO.getDelStatus())) {
@@ -226,28 +230,32 @@ public class AlgorithmFacade {
                 throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "恢复操作条目不能为空!");
             }
             //操作数据
-            if (ListUtil.isNotEmpty(qcResultAlgVOList)) {
-                Boolean hasData = false;
-                Long optId = algorithmVO.getOptResultAlgVO().getId(); // 操作id
-                QcresultDetail qcresultDetail = qcresultDetailFacade.getOne(new QueryWrapper<QcresultDetail>()
-                        .eq("id",optId));
-                if(qcresultDetail!=null)
-                {
-                    QcResultAlgVO qcResultAlgVO = new QcResultAlgVO();
-                    qcResultAlgVO.setScore(qcresultDetail.getScore());
-                    qcResultAlgVO.setId(qcresultDetail.getId());
-                    qcResultAlgVO.setCasesEntryId(qcresultDetail.getCasesEntryId());
-                    qcResultAlgVO.setCasesId(qcresultDetail.getCasesId());
-                    qcResultAlgVO.setMsg(qcresultDetail.getMsg());
-                    qcResultAlgVO.setIsReject(qcresultDetail.getIsReject());
-                    qcResultAlgVO.setCasesScore(qcresultDetail.getCasesScore());
+            Boolean hasData = false;
+            Long optId = algorithmVO.getOptResultAlgVO().getId(); // 操作id
+            QcresultDetail qcresultDetail = qcresultDetailFacade.getOne(new QueryWrapper<QcresultDetail>()
+                    .eq("id",optId));
+            if(qcresultDetail!=null)
+            {
+                QcResultAlgVO qcResultAlgVO = new QcResultAlgVO();
+                qcResultAlgVO.setScore(qcresultDetail.getScore());
+                qcResultAlgVO.setId(qcresultDetail.getId());
+                qcResultAlgVO.setCasesEntryId(qcresultDetail.getCasesEntryId());
+                qcResultAlgVO.setCasesId(qcresultDetail.getCasesId());
+                qcResultAlgVO.setMsg(qcresultDetail.getMsg());
+                qcResultAlgVO.setIsReject(qcresultDetail.getIsReject());
+                qcResultAlgVO.setCasesScore(qcresultDetail.getCasesScore());
+                if (ListUtil.isNotEmpty(qcResultAlgVOList)) {
+                    qcResultAlgVOList.add(qcResultAlgVO);
+                }else{
+                    qcResultAlgVOList = new ArrayList<>();
                     qcResultAlgVOList.add(qcResultAlgVO);
-                    hasData = true;
+                    algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
                 }
+                hasData = true;
+            }
                 if (!hasData) {
                     throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "恢复的条目不存在!");
                 }
-            }
         }
 
         //修改

+ 57 - 39
src/main/java/com/diagbot/facade/BehospitalInfoFacade.java

@@ -1,6 +1,7 @@
 package com.diagbot.facade;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,32 +14,9 @@ import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.service.impl.BehospitalInfoServiceImpl;
-import com.diagbot.service.impl.MedQcresultDetailServiceImpl;
-import com.diagbot.util.BeanUtil;
-import com.diagbot.util.DateUtil;
-import com.diagbot.util.EncrypDES;
-import com.diagbot.util.EntityUtil;
-import com.diagbot.util.ExcelUtils;
-import com.diagbot.util.ListUtil;
-import com.diagbot.util.MapUtil;
-import com.diagbot.util.StringUtil;
-import com.diagbot.util.SysUserUtils;
-import com.diagbot.vo.AlgorithmVO;
-import com.diagbot.vo.AnalyzeCdsVO;
-import com.diagbot.vo.AnalyzeCodeVO;
-import com.diagbot.vo.AnalyzeRunVO;
-import com.diagbot.vo.AnalyzeVO;
-import com.diagbot.vo.BasDeptInfoVO;
-import com.diagbot.vo.BehospitalPageVO;
-import com.diagbot.vo.ExportQcresultVO;
-import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.GetDetailVO;
-import com.diagbot.vo.MedrecVo;
-import com.diagbot.vo.QcResultAlgQueryVO;
-import com.diagbot.vo.QcResultAlgVO;
-import com.diagbot.vo.QueryVo;
-import com.diagbot.vo.RecordContentVO;
-import com.diagbot.vo.TaskVO;
+import com.diagbot.service.impl.StrInformedConsentServiceImpl;
+import com.diagbot.util.*;
+import com.diagbot.vo.*;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang3.StringUtils;
@@ -51,15 +29,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -172,6 +143,9 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
     SysHospitalSetFacade sysHospitalSetFacade;
     @Autowired
     QcCasesRelevanceEntryFacade qcCasesRelevanceEntryFacade;
+    @Autowired
+    StrInformedConsentServiceImpl strInformedConsentServiceImpl;
+
     @Autowired
     SysUserRoleFacade sysUserRoleFacade;
     @Autowired
@@ -251,6 +225,13 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
                 .eq("behospital_code", getDetailVO.getBehospitalCode()), false
         );
 
+        // 获取患者年龄
+        HomePage homePage = homePageFacade.getOne(new QueryWrapper<HomePage>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", getDetailVO.getHospitalId())
+                .eq("behospital_code", getDetailVO.getBehospitalCode()), false
+        );
+
         List<String> paramList = getDetailVO.getParamStr();// 参数列表
 
         if (ListUtil.isEmpty(paramList) || paramList.contains("beHospital")) {
@@ -259,6 +240,9 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
                 throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "该病历已删除!");
             }
             BeanUtil.copyProperties(behospitalInfo, behosDTO);
+            if(null != homePage && StringUtils.isNotEmpty(homePage.getAge()) && StringUtils.isNotEmpty(homePage.getAgeUnit())){
+                behosDTO.setAge(homePage.getAge()+homePage.getAgeUnit());
+            }
             res.put("beHospital", behosDTO);
         }
 
@@ -713,7 +697,7 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
         );
 
         //知情同意书
-        List<MedicalRecord> recordList = medicalRecordFacade.list(new QueryWrapper<MedicalRecord>()
+    /*    List<MedicalRecord> recordList = medicalRecordFacade.list(new QueryWrapper<MedicalRecord>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
                 .eq("behospital_code", analyzeVO.getBehospitalCode())
                 .eq("hospital_id", hospitalId)
@@ -721,7 +705,7 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
                 .orderByAsc("rec_date")
         );
         List<MedicalRecordDTO> medicalRecordDTOList = BeanUtil.listCopyTo(recordList, MedicalRecordDTO.class);
-
+*/
         List<HomeDiagnoseInfo> homePageList = new ArrayList<>();
         List<HomeOperationInfo> homeOperationInfoList = new ArrayList<>();
         if (homePage != null) {
@@ -1026,13 +1010,14 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
 */
 //        ==================================
 
+        addData("有创操作", recMap, medrecVoList);
 
         addData("病理检验送检单", recMap, medrecVoList);
 
         addData("日常病程录", recMap, medrecVoList);
 
-        DataWithKey("知情同意书", medicalRecordDTOList, medrecVoList);
-        //addDataWithInnerKey("知情同意书", recMap, medrecVoList);
+        //DataWithKey("知情同意书", medicalRecordDTOList, medrecVoList);
+        addDataWithInnerKey("知情同意书", recMap, medrecVoList);
         addDataWithInnerKey("谈话告知书", recMap, medrecVoList);
 
         //==============文书====================
@@ -2341,6 +2326,39 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
 
         //保存
         Map<String, Object> pageMap = outputInfo.getPageData();
+        //保存解析过后的手术知情同意书
+            List<String> recIds = new ArrayList<>();
+            if(pageMap.containsKey("手术知情同意书")){
+                Object informObject = pageMap.get("手术知情同意书");
+                List<Map<String,Object>> informList= (List<Map<String,Object>>) informObject;
+                List<StrInformedConsent> strInformedConsents = new ArrayList<>();
+                if(ListUtil.isNotEmpty(informList)) {
+                    informList.forEach(obj ->
+                            {
+                                Map<String, String> strMap = new HashMap<>();
+                                strMap.put("使用植入性材料", String.valueOf(obj.get("使用植入性材料")));
+                                StrInformedConsent strInformedConsent = new StrInformedConsent();
+                                strInformedConsent.setHospitalId(analyzeVO.getHospitalId());
+                                strInformedConsent.setBehospitalCode(analyzeVO.getBehospitalCode());
+                                strInformedConsent.setRecId(String.valueOf(obj.get("记录编号")));
+                                strInformedConsent.setRecTitle(String.valueOf(obj.get("病历标题")));
+                                strInformedConsent.setRecType("知情同意书");
+                                strInformedConsent.setContent(JSONObject.toJSONString(strMap));
+                                strInformedConsent.setGmtCreate(new Date());
+                                strInformedConsents.add(strInformedConsent);
+                                recIds.add(String.valueOf(obj.get("记录编号")));
+                            }
+                    );
+                    //删除手术知情同意书历史ric_id
+                    strInformedConsentServiceImpl.remove( new QueryWrapper<StrInformedConsent>()
+                            .eq("hospital_id",analyzeVO.getHospitalId())
+                            .eq("is_deleted",IsDeleteEnum.N.getKey())
+                            .eq("behospital_code",analyzeVO.getBehospitalCode())
+                            .in("rec_id",recIds));
+                    //新增
+                    strInformedConsentServiceImpl.saveBatch(strInformedConsents);
+                }
+            }
         // 手动拼接数据【知情同意书】【谈话告知书】
         List<MedicalRecord> recordList = medicalRecordFacade.list(new QueryWrapper<MedicalRecord>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())

+ 1 - 2
src/main/java/com/diagbot/facade/ConsoleByDeptExportFacade.java

@@ -332,9 +332,8 @@ public class ConsoleByDeptExportFacade {
      * @return
      */
     public void reHos31DaysPageExportByDept(HttpServletResponse response, ReBeHosPageVO reBeHosPageVO) {
-        reBeHosPageVO.setCurrent(1L);
-        reBeHosPageVO.setSize(Long.MAX_VALUE);
         reBeHosPageVO.setSearchCount(false);
+        reBeHosPageVO.setFlag(1);
         IPage<ReBeHosByDeptDTO> page = consoleByDeptFacade.reHos31DaysPageByDept(reBeHosPageVO);
         List<ReBeHosByDeptDTO> records = page.getRecords();
         String fileName = "31天再入院统计详情.xls";

+ 51 - 3
src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java

@@ -900,13 +900,25 @@ public class ConsoleByDeptFacade {
      */
     public IPage<ReBeHosByDeptDTO> reHos31DaysPageByDept(ReBeHosPageVO reBeHosPageVO) {
         filterFacade.reBeHosPageVOSet(reBeHosPageVO);
+        long size = reBeHosPageVO.getSize();
+        long current = reBeHosPageVO.getCurrent();
+        reBeHosPageVO.setCurrent(1L);
+        reBeHosPageVO.setSize(Long.MAX_VALUE);
         IPage<ReBeHosMergeDTO> page = behospitalInfoFacade.reHos31DaysPageByDept(reBeHosPageVO);
         List<ReBeHosMergeDTO> records = page.getRecords();
         IPage<ReBeHosByDeptDTO> retPage = new Page<>();
-        BeanUtil.copyProperties(page, retPage);
-        List<ReBeHosByDeptDTO> retRecords = Lists.newLinkedList();
         if (ListUtil.isNotEmpty(records)) {
-            for (ReBeHosMergeDTO record : records) {
+            List<ReBeHosByDeptDTO> retRecords = Lists.newLinkedList();
+            BeanUtil.copyProperties(page, retPage);
+            Iterator<ReBeHosMergeDTO> iterator = records.iterator();
+            while(iterator.hasNext()){
+                ReBeHosMergeDTO record = iterator.next();
+                strTrans(record);
+                Boolean flag = ConsoleFacade.isContainDiagnose(record);
+                if(!flag){
+                    iterator.remove();
+                    continue;
+                }
                 ReBeHosByDeptDTO retRecord = new ReBeHosByDeptDTO();
                 BeanUtil.copyProperties(record, retRecord);
                 List<ReBeHosDetailByDeptDTO> details = Lists.newLinkedList();
@@ -918,6 +930,8 @@ public class ConsoleByDeptFacade {
                 lastDetailRecord.setBehDeptId(record.getLastBehDeptId());
                 lastDetailRecord.setBehDeptName(record.getLastBehDeptName());
                 lastDetailRecord.setDoctorName(record.getLastDoctorName());
+                lastDetailRecord.setDiagnose(record.getLastDiagnose());
+                lastDetailRecord.setDiagnoseName(record.getLastDiagnoseName());
                 lastDetailRecord.setBehospitalCode(record.getLastBehospitalCode());
                 lastDetailRecord.setBehospitalDate(record.getLastBehospitalDate());
                 lastDetailRecord.setLeaveHospitalDate(record.getLastLeaveHospitalDate());
@@ -929,10 +943,44 @@ public class ConsoleByDeptFacade {
                 retRecord.setDetails(details);
                 retRecords.add(retRecord);
             }
+
+        if(reBeHosPageVO.getFlag()==1){
+            size = retRecords.size();
+        }
+        retPage.setSize(size);
+        retPage.setTotal(retRecords.size());
+        retPage.setCurrent(current);
+        if(0 == current){
+            current = 1;
+        }
+        int startIndex = ((int)current -1)*10;
+        int endIndex = startIndex + (int) size;
+
+        if(retRecords.size()>1){
+            if( retRecords.size()-startIndex<(int)size){
+                retRecords = retRecords.subList(startIndex,retRecords.size());
+            }else{
+                retRecords = retRecords.subList(startIndex,endIndex );
+            }
         }
         retPage.setRecords(retRecords);
+        }
         return retPage;
     }
+
+    public static void strTrans(ReBeHosMergeDTO record) {
+        String replace = record.getLastAgainBehospitalPlan();
+        if(StringUtils.isEmpty(replace)){
+            replace = "否";
+            record.setLastAgainBehospitalPlan(replace);
+            return;
+        }
+        replace = replace.replace("无", "否")
+                .replace("-", "无").replace("是一周后", "是")
+                .replace("1", "否").replace("2", "是")
+                .replace("有", "是");
+        record.setLastAgainBehospitalPlan(replace);
+    }
     /**
      * 未整改病历质控评分页-科室(内页)
      *

+ 1 - 2
src/main/java/com/diagbot/facade/ConsoleExportFacade.java

@@ -478,9 +478,8 @@ public class ConsoleExportFacade {
      * @return
      */
     public void reHos31DaysPageExport(HttpServletResponse response, ReBeHosPageVO reBeHosPageVO) {
-        reBeHosPageVO.setCurrent(1L);
-        reBeHosPageVO.setSize(Long.MAX_VALUE);
         reBeHosPageVO.setSearchCount(false);
+        reBeHosPageVO.setFlag(1);
         IPage<ReBeHosDTO> page = consoleFacade.reHos31DaysPage(reBeHosPageVO);
         List<ReBeHosDTO> records = page.getRecords();
         String fileName = "31天再入院统计详情.xls";

+ 451 - 44
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -1,5 +1,6 @@
 package com.diagbot.facade;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -420,11 +421,12 @@ public class ConsoleFacade {
         //MR
         Long mr = triggeringRulesMap.get("MR");
         //细菌培养
-        Long bacterialCulture = 0L;
+        Long bacterialCulture = triggeringRulesMap.get("bacterialCulture");
         //抗菌药物
-        Long antibiosis = 0L;
+        Long antibiosis = triggeringRulesMap.get("antibiosis");
         //恶性肿瘤化学治疗
-        Long chemotherapyMalignantTumors = 0L;
+        Long chemotherapyMalignantTumors = triggeringRulesMap.get("chemotherapyMalignantTumors");
+
         Map<String, Double> medicalRecordIndicator = medIndexResultFacade.medicalRecordIndicator(filterVO);
         Double startCount = medicalRecordIndicator.get("startCount");
         Double operationFeeNum = medicalRecordIndicator.get("operationFeeNum");
@@ -542,16 +544,23 @@ public class ConsoleFacade {
                 hashMapArrayList.add(stringStringHashMap);
             }
         }
+        //指标十四 恶性肿瘤放射治疗
+        if (indexName.equals(QualityContent.EXZL_FSZL_FHL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = tumorRadiationMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
+        }
 
         //指标十五 手术记录
         if (indexName.equals(QualityContent.SS_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
             hashMapArrayList = operationMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
         }
 
+        //指标十六 植入物相关记录符合率
+        if (indexName.equals(QualityContent.ZRW_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = implantsMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
+        }
 
         //指标十七  临床用血相关记录符合率
         if (indexName.equals(QualityContent.LCYX_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
-            filterVO.setFlagStr("1");
             hashMapArrayList = bloodMethod(hashMapArrayList,medicalRecordIndicator,triggeringRulesMap);
         }
 
@@ -570,9 +579,24 @@ public class ConsoleFacade {
             hashMapArrayList = getfileSecAmount(medicalRecordIndicator,hashMapArrayList, baseIndex);
         }
 
-        //指标二十七
+        //指标二十一 出院患者病历归档完整率
+        if (indexName.equals(QualityContent.CCHZ_GD_WZL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = fileCompleteMethod(medicalRecordIndicator,hashMapArrayList, baseIndex);
+        }
+
+        //指标二十二 不合理复制病历发生率
+        if (indexName.equals(QualityContent.BHL_FZ_FSL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = unreasonedCopyMethod(hashMapArrayList, baseIndex, triggeringRulesMap);
+        }
+
+        //指标二十三 知情同意书规范签署率
+        if (indexName.equals(QualityContent.ZQTYS_GF_QSL)||indexName.equals(QualityContent.QB)) {
+            hashMapArrayList = contentSignMethod(hashMapArrayList, baseIndex, triggeringRulesMap);
+        }
+
+        //指标二十四 甲级率
         if (indexName.equals(QualityContent.JJBLL)||indexName.equals(QualityContent.QB)) {
-            hashMapArrayList = firMethod(indexName,hashMapArrayList,baseIndex);
+            hashMapArrayList = firMethod(hashMapArrayList,baseIndex);
         }
         return hashMapArrayList;
     }
@@ -631,18 +655,47 @@ public class ConsoleFacade {
                 String behospitalCode = stringStringMap.get("behospitalCode");
                 //出院code
                 outHospitalCode.add(behospitalCode);
-                if (Double.parseDouble(stringStringMap.get("operationFee")) > 0) {
-                    //手术code
-                    operationCode.add(behospitalCode);
-                }
-                if (Double.parseDouble(stringStringMap.get("operationFee")) > 0 && Double.parseDouble(stringStringMap.get("pathologyFee")) > QualityContent.pathologyFee) {
-                    //病理code
-                    operationPathologyCode.add(behospitalCode);
+                String operationFee = stringStringMap.get("operationFee");
+                String pathologyFee = stringStringMap.get("pathologyFee");
+                String antibiosisFee = stringStringMap.get("antibiosisFee");
+                if(StringUtil.isNotEmpty(operationFee)) {
+                    double of = 0.0;
+                    try {
+                        of = Double.parseDouble(operationFee);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    if (of > 0) {
+                        //手术code
+                        operationCode.add(behospitalCode);
+                    }
                 }
-                if (Double.parseDouble(stringStringMap.get("antibiosisFee")) > 0) {
-                    //抗菌code
-                    antibiosisCode.add(behospitalCode);
+                if(StringUtil.isNotEmpty(operationFee)&&StringUtil.isNotEmpty(pathologyFee)) {
+                    double of = 0.0;
+                    double pf = 0.0;
+                    try {
+                        of = Double.parseDouble(operationFee);
+                        pf = Double.parseDouble(pathologyFee);
+                    } catch (NumberFormatException e) {
+                        e.printStackTrace();
+                    }
+                    if (of > 0 && pf > QualityContent.pathologyFee) {
+                        //病理code
+                        operationPathologyCode.add(behospitalCode);
+                    }
                 }
+                    if(StringUtil.isNotEmpty(antibiosisFee)) {
+                        double af = 0.0;
+                        try {
+                            af = Double.parseDouble(antibiosisFee);
+                        } catch (NumberFormatException e) {
+                            e.printStackTrace();
+                        }
+                        if (af > 0) {
+                        //抗菌code
+                        antibiosisCode.add(behospitalCode);
+                    }
+            }
             }
         }
                 if(ListUtil.isNotEmpty(adviceVerify)){
@@ -749,17 +802,37 @@ public class ConsoleFacade {
             Set<String> rescueCode = new CopyOnWriteArraySet<>();
             Set<String> bloodCode = new CopyOnWriteArraySet<>();
         //指标二十七
+        //指标14--恶性肿瘤放射治疗记录符合率
+        Set<String> tumorRadiationSet = tumorRadiationMethods(adviceNum, medIndexResult);
+
+        //指标15 手术记录
+        medIndexResult.setOperationCompleteResult(Double.parseDouble(operationFeeNum+""));
+
+        //指标16--植入物相关记录符合率
+        Set<String> implantsCode = implantsMethods(filterVO, medIndexResult);
+
+        //指标17  临床用血相关记录符合率
+        bloodMethods(doctorAdviceMedManageParams, filterVO,medIndexResult,bloodCode);
 
         //指标18 医师查房记录 查询直接返回 -code需要加载
 
         //指标19 抢救记录
         rescueMethods(doctorAdviceMedManageParams,medIndexResult,rescueCode);
+
         //指标20 出院患者病历2日归档
         getfileSecAmounts(filterVO,medIndexResult);
-        //指标15 手术记录
-        medIndexResult.setOperationCompleteResult(Double.parseDouble(operationFeeNum+""));
-        //指标17  临床用血相关记录符合率
-        bloodMethods(doctorAdviceMedManageParams, filterVO,medIndexResult,bloodCode);
+
+        //指标21 出院患者病历归档完整率
+        fileCompleteMethods(filterVO,medIndexResult);
+
+        //指标22 不合理复制病历发生率 查询直接返回
+
+        //指标23  知情同意书规范签署率 //分子通过规则
+       // contentSignMethods(contentFile,medIndexResult);
+
+        //指标24 甲级率 查询直接返回
+
+
         medIndexResult.setHospitalId(filterVO.getHospitalId());
         medIndexResult.setStartDate(filterVO.getStartDate());
         medIndexResult.setEndDate(filterVO.getEndDate());
@@ -838,34 +911,62 @@ public class ConsoleFacade {
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(operationCode.size()>0&&operationCode!=null) {
+        if(tumorRadiationSet.size()>0 && tumorRadiationSet != null) {
+            medIndexRelevance.setRelevanceType(14);
+            for (String Code : tumorRadiationSet) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
+            if(operationCode.size() > 0 && operationCode != null) {
                 medIndexRelevance.setRelevanceType(15);
                 for (String Code : operationCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(bloodCode.size()>0&&bloodCode!=null) {
+        if(implantsCode.size() > 0 && implantsCode != null) {
+            medIndexRelevance.setRelevanceType(16);
+            for (String Code : implantsCode) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
+            if(bloodCode.size() > 0 && bloodCode != null) {
                 medIndexRelevance.setRelevanceType(17);
                 for (String Code : bloodCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(outHospitalCode.size()>0&&outHospitalCode!=null) {
+            if(outHospitalCode.size() > 0 && outHospitalCode != null) {
                 medIndexRelevance.setRelevanceType(18);
                 for (String Code : outHospitalCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
-            if(rescueCode.size()>0&&rescueCode!=null) {
+            if(rescueCode.size() > 0 && rescueCode != null) {
                 medIndexRelevance.setRelevanceType(19);
                 for (String Code : rescueCode) {
                     medIndexRelevance.setBehospitalCode(Code);
                     medIndexRelevanceFacade.save(medIndexRelevance);
                 }
             }
+        if(outHospitalCode.size() > 0 && outHospitalCode != null) {
+            medIndexRelevance.setRelevanceType(22);
+            for (String Code : outHospitalCode) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
+        if(outHospitalCode.size() > 0 && outHospitalCode != null) {
+            medIndexRelevance.setRelevanceType(23);
+            for (String Code : outHospitalCode) {
+                medIndexRelevance.setBehospitalCode(Code);
+                medIndexRelevanceFacade.save(medIndexRelevance);
+            }
+        }
         }
     /**
      * 两数据相除得到百分比
@@ -958,6 +1059,7 @@ public class ConsoleFacade {
         Set<String> bacterialCultureCode = new CopyOnWriteArraySet<>();
         Set<String> antibiosisBehospitalCode = new CopyOnWriteArraySet<>();
         Set<String> chemotherapyMalignantTumorsBehospitalCode = new CopyOnWriteArraySet<>();
+        Set<String> tumorRadiationBehospitalCode = new CopyOnWriteArraySet<>();
         //无首页code
         List<String> behospitalCodeList = adviceVerify(filterVO);
         //首页为肿瘤code
@@ -1078,6 +1180,24 @@ public class ConsoleFacade {
                                     }
                                 }
                             }
+
+                            if (indexName.equals(QualityContent.EXZL_FSZL_FHL) || indexName.equals(QualityContent.QB)) {
+                                if (ListUtil.isNotEmpty(malignancyCodeList)) {
+                                    if (malignancyCodeList.contains(behospitalCode)) {
+                                        if (!tumorRadiationBehospitalCode.contains(behospitalCode)) {
+                                            if (doctorAdviceType.equals(QualityContent.STAT_ORDER) || doctorAdviceType.equals(QualityContent.STANDING_ORDER)) {
+                                                List<String> tumorRadiationDrugList = QualityContent.radiotherapyDrugList;
+                                                for (String tumorRadiationDrug : tumorRadiationDrugList) {
+                                                    if (daItemName.contains(tumorRadiationDrug)) {
+                                                        //医嘱含有放射治疗药物
+                                                        tumorRadiationBehospitalCode.add(behospitalCode);
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
                         }
                     }
                 }
@@ -1125,11 +1245,16 @@ public class ConsoleFacade {
             }else {
                 mapCode.put("antibiosis",null);
             }
-            if(antibiosisBehospitalCode!=null && antibiosisBehospitalCode.size()>0){
-                mapCode.put("chemotherapyMalignantTumors",antibiosisBehospitalCode);
+            if(chemotherapyMalignantTumorsBehospitalCode!=null && chemotherapyMalignantTumorsBehospitalCode.size()>0){
+                mapCode.put("chemotherapyMalignantTumors",chemotherapyMalignantTumorsBehospitalCode);
             }else {
                 mapCode.put("chemotherapyMalignantTumors",null);
             }
+            if(tumorRadiationBehospitalCode!=null && tumorRadiationBehospitalCode.size()>0){
+                mapCode.put("tumorRadiationSecNum",tumorRadiationBehospitalCode);
+            }else {
+                mapCode.put("tumorRadiationSecNum",null);
+            }
             return mapCode;
         }
     }
@@ -2877,13 +3002,25 @@ public class ConsoleFacade {
      */
     public IPage<ReBeHosDTO> reHos31DaysPage(ReBeHosPageVO reBeHosPageVO) {
         filterFacade.reBeHosPageVOSet(reBeHosPageVO);
+        long size = reBeHosPageVO.getSize();
+        long current = reBeHosPageVO.getCurrent();
+        reBeHosPageVO.setCurrent(1L);
+        reBeHosPageVO.setSize(Long.MAX_VALUE);
         IPage<ReBeHosMergeDTO> page = behospitalInfoFacade.reHos31DaysPage(reBeHosPageVO);
         List<ReBeHosMergeDTO> records = page.getRecords();
         IPage<ReBeHosDTO> retPage = new Page<>();
-        BeanUtil.copyProperties(page, retPage);
-        List<ReBeHosDTO> retRecords = Lists.newLinkedList();
         if (ListUtil.isNotEmpty(records)) {
-            for (ReBeHosMergeDTO record : records) {
+            BeanUtil.copyProperties(page, retPage);
+            List<ReBeHosDTO> retRecords = Lists.newLinkedList();
+            Iterator<ReBeHosMergeDTO> iterator = records.iterator();
+            while(iterator.hasNext()){
+                ReBeHosMergeDTO record = iterator.next();
+                ConsoleByDeptFacade.strTrans(record);
+                Boolean flag = isContainDiagnose(record);
+                if(!flag){
+                    iterator.remove();
+                    continue;
+                }
                 ReBeHosDTO retRecord = new ReBeHosDTO();
                 BeanUtil.copyProperties(record, retRecord);
                 List<ReBeHosDetailDTO> details = Lists.newLinkedList();
@@ -2892,6 +3029,9 @@ public class ConsoleFacade {
                 details.add(detailRecord);
                 ReBeHosDetailDTO lastDetailRecord = new ReBeHosDetailDTO();
                 lastDetailRecord.setName(record.getName());
+                lastDetailRecord.setAge(record.getLastAge());
+                lastDetailRecord.setDiagnose(record.getLastDiagnose());
+                lastDetailRecord.setDiagnoseName(record.getLastDiagnoseName());
                 lastDetailRecord.setBehDeptId(record.getLastBehDeptId());
                 lastDetailRecord.setBehDeptName(record.getLastBehDeptName());
                 lastDetailRecord.setBehospitalCode(record.getLastBehospitalCode());
@@ -2905,11 +3045,84 @@ public class ConsoleFacade {
                 retRecord.setDetails(details);
                 retRecords.add(retRecord);
             }
+            //首页返回全部数据
+        if(reBeHosPageVO.getFlag()==31){
+            retPage.setRecords(retRecords);
+            return retPage;
+        }
+        //导出操作
+        if(reBeHosPageVO.getFlag()==1){
+            size = retRecords.size();
+        }
+        retPage.setSize(size);
+        retPage.setTotal(retRecords.size());
+        retPage.setCurrent(current);
+        //数据返回索引处理
+        if(0 == current){
+            current = 1;
+        }
+        int startIndex = ((int)current -1)*10;
+        int endIndex = startIndex + (int) size;
+
+        if(retRecords.size()>1){
+            if( retRecords.size()-startIndex<(int)size){
+                retRecords = retRecords.subList(startIndex,retRecords.size());
+            }else{
+                retRecords = retRecords.subList(startIndex,endIndex );
+            }
         }
         retPage.setRecords(retRecords);
+        }
         return retPage;
     }
 
+
+   static Boolean isContainDiagnose(ReBeHosMergeDTO record){
+       // String lastDiagnoseName = replace(record.getLastDiagnoseName());本身使用,分隔
+        String diagnose =replace(record.getDiagnose());//手动分隔
+        String lastDiagnose = replace(record.getLastDiagnose());
+        record.setDiagnose(diagnose);
+        record.setLastDiagnose(lastDiagnose);
+        Set lastDiagnoseNames = strTranListMethod(record.getLastDiagnoseName());
+        Set diagnoses = strTranListMethod(record.getDiagnose());
+        long count = diagnoses.stream().filter(obj ->null != lastDiagnoseNames && null != obj && lastDiagnoseNames.contains(obj)).count();
+        if(count<=0){
+            return false;
+        }
+        return true;
+    };
+
+    static String replace(String str){
+        if(StringUtils.isEmpty(str)){
+            return null;
+        }
+        str = str.trim().replace(";", ",").replace(";", ",")
+                        .replace("、", ",").replace(",", ",")
+                        .replace("|", ",").replace(" ", ",")
+                        .replace(":", ",") .replace(":", ",");
+        if(str.startsWith(",")){
+            str = str.substring(1);
+        }
+        if(str.endsWith(",")){
+            str = str.substring(0,str.length()-1);
+        }
+
+       return str;
+    }
+    static Set strTranListMethod(String str){
+        Set<String> names = new HashSet<>();
+        if(StringUtils.isNotEmpty(str)){
+        if(str.contains(",") && str.length()>1){
+            for (String diagnoseName : str.split(",")) {
+                names.add(diagnoseName);
+            }
+        }else{
+            names.add(str);
+             }
+        }
+        return names;
+    };
+
     /**
      * 入院人数统计(首页)
      *
@@ -2973,11 +3186,63 @@ public class ConsoleFacade {
         return behospitalInfoFacade.hmImproveMRPage(qcResultShortPageVO);
     }
 
+
+    //指标十四 恶性肿瘤放射治疗
+    private List<Map<String, String>> tumorRadiationMethod(Map<String, Double> medManageParams,List<Map<String, String>> retList, Map<String, Long> triggeringRulesMap){
+        LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+        //接受肿瘤放射治疗的质控病历总数
+        Double count = medManageParams.get("tumorRadiationResult");
+        String num = null;
+        if( null == count){
+            count = 0d;
+        }
+        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+            double tumorRadiationDo = currencyCal(count, triggeringRulesMap.get("tumorRadiationNum"));//triggeringRules(filterVO)
+            num = String.valueOf(tumorRadiationDo);
+            if(tumorRadiationDo<0d){
+                num = null;
+            }
+        };
+
+        firMap.put("name","恶性肿瘤放射治疗记录符合率");
+        firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
+        retList.add(firMap);
+        return retList;
+    }
+
+    //指标十六 植入物相关记录符合率
+    private List<Map<String, String>> implantsMethod(Map<String, Double> medManageParams,List<Map<String, String>> retList, Map<String, Long> triggeringRulesMap){
+        LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+        //使用植入物的质控病历总数
+        Double count = medManageParams.get("implantsResult");
+        if( null == count){
+            count = 0d;
+        }
+        String num = null;
+        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+            double implantsDo = currencyCal(count, triggeringRulesMap.get("implantsNum"));//triggeringRules(filterVO)
+            num = String.valueOf(implantsDo);
+            if(implantsDo<0d){
+                num = null;
+            }
+        };
+
+        firMap.put("name","植入物相关记录符合率");
+        firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
+        retList.add(firMap);
+        return retList;
+    }
+
     //指标十八 抢救记录
     private  List<Map<String, String>> rescueMethod( Map<String, Double> medManageParams, List<Map<String, String>> retList,Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         //接受抢救的质控病历总数
-        double count = medManageParams.get("rescue_result");
+        Double count = medManageParams.get("rescueResult");
+        if( null == count){
+            count = 0d;
+        }
         String num = null;
         if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
             double rescueDo = currencyCal(count, triggeringRulesMap.get("rescueNum"));
@@ -2985,11 +3250,11 @@ public class ConsoleFacade {
             if(rescueDo<0d){
                 num = null;
             }
-            firMap.put("num",String.valueOf(count));
         };
 
         firMap.put("name","患者抢救记录及时完成率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
         retList.add(firMap);
         return retList;
     };
@@ -2998,16 +3263,70 @@ public class ConsoleFacade {
     private List<Map<String, String>> WardRoundMethod( List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         String num = null;
+        Object forWorkNum = baseIndex.get("forWorkNum");
         if( triggeringRulesMap.containsKey("WardRoundNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
             double wardRoundDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("WardRoundNum"));
             num = String.valueOf(wardRoundDo);
             if(wardRoundDo<0d){
                 num = null;
             }
-            firMap.put("num",baseIndex.get("forWorkNum").toString());
         };
         firMap.put("name","医师查房记录完成率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
+        retList.add(firMap);
+        return retList;
+    }
+
+
+    //指标二十二 不合理复制病历发生率
+    private List<Map<String, String>> unreasonedCopyMethod( List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
+       LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+       String num = null;
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        if( triggeringRulesMap.containsKey("unreasonedCopyNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
+           double wardRoundDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("unreasonedCopyNum"));
+           num = String.valueOf(wardRoundDo);
+           if(wardRoundDo<0d){
+               num = null;
+           }
+       };
+       firMap.put("name","不合理复制病历发生率");
+       firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
+       retList.add(firMap);
+        return retList;
+        };
+
+
+    //指标二十三 知情同意书规范签署率
+    private List<Map<String, String>> contentSignMethod(List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
+        LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        String num = null;
+        if( triggeringRulesMap.containsKey("InformedNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
+            double InformedDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("InformedNum"));
+            num = String.valueOf(InformedDo);
+            if(InformedDo<0d){
+                num = null;
+            }
+        }
+        firMap.put("name","知情同意书规范签署率");
+        firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
+
         retList.add(firMap);
         return retList;
     }
@@ -3016,6 +3335,9 @@ public class ConsoleFacade {
     private  List<Map<String, String>> operationMethod(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         String operationFeeNum = medManageParams.get("operationFeeNum")+"";
+        if(StringUtils.isEmpty(operationFeeNum)){
+            operationFeeNum = "0";
+        }
         String num = null;
         if( triggeringRulesMap.containsKey("operationRecordNum") && StringUtils.isNotEmpty(operationFeeNum) && ! operationFeeNum.equals("0")){
             double operationRecordDo = currencyCal(operationFeeNum, triggeringRulesMap.get("operationRecordNum"));
@@ -3023,13 +3345,13 @@ public class ConsoleFacade {
             if(operationRecordDo<0d){
                 num = null;
             }
-            firMap.put("num",operationFeeNum);
         };
         firMap.put("name","手术相关记录完成率");
         if("0.0".equals(num)){
             num = "0.00";
         }
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",operationFeeNum);
 
         retList.add(firMap);
         return retList;
@@ -3038,7 +3360,10 @@ public class ConsoleFacade {
     //指标十六  临床用血相关记录符合率
     private  List<Map<String, String>> bloodMethod( List<Map<String, String>>retList,Map<String, Double> bloodRes,Map<String, Long> triggeringRulesMap){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
-        double count = bloodRes.get("blood_result");
+        Double count = bloodRes.get("bloodResult");
+        if( null == count){
+            count = 0d;
+        }
         String num = null;
         if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
             //指标十七
@@ -3047,11 +3372,11 @@ public class ConsoleFacade {
             if(bloodDo<0d){
                 num = null;
             }
-            firMap.put("num",String.valueOf(count));
         }
 
         firMap.put("name","临床用血相关记录符合率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        firMap.put("num",String.valueOf(count));
         retList.add(firMap);
         return retList;
     }
@@ -3071,21 +3396,55 @@ public class ConsoleFacade {
     private List<Map<String, String>> getfileSecAmount(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Object> baseIndex){
         LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
         DecimalFormat df = new DecimalFormat("#0.00");
-        double count = medManageParams.get("sec_file_result");
+        Double count = medManageParams.get("secFileResult");
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        if( null == count){
+            count = 0d;
+        }
         String num = null;
-        if(StringUtils.isNotEmpty( baseIndex.get("sevenWorkNum").toString()) && ! baseIndex.get("sevenWorkNum").toString().equals("0") ){
-            double retNum =count* 100/Double.parseDouble(baseIndex.get("sevenWorkNum").toString());
+        if(StringUtils.isNotEmpty( baseIndex.get("forWorkNum").toString()) && ! baseIndex.get("forWorkNum").toString().equals("0") ){
+            double retNum =count* 100/Double.parseDouble(baseIndex.get("forWorkNum").toString());
             double firGradeStr = Double.parseDouble(df.format(retNum));
             num = String.valueOf(firGradeStr);
-            firMap.put("num",baseIndex.get("sevenWorkNum").toString());
+
         }
 
         firMap.put("name","出院患者病历2日归档率");
         firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
         retList.add(firMap);
         return retList;
     };
 
+    //指标21 --出院患者病历归档完整率
+    private  List<Map<String, String>> fileCompleteMethod(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Object> baseIndex){
+        LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
+        Double count = medManageParams.get("fileCompleteResult");
+        Object forWorkNum = baseIndex.get("forWorkNum");
+        if( null == count){
+            count = 0d;
+        }
+        String num = null;
+        if(StringUtils.isNotEmpty( baseIndex.get("forWorkNum").toString()) && ! baseIndex.get("forWorkNum").toString().equals("0") ){
+            double retNum = currencyCal( baseIndex.get("forWorkNum").toString(),count);
+            num = String.valueOf(retNum);
+        }
+
+        firMap.put("name","出院患者病历归档完整率");
+        firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
+        if(null == forWorkNum){
+            firMap.put("num","0");
+        }else{
+            firMap.put("num",baseIndex.get("forWorkNum").toString());
+        }
+        retList.add(firMap);
+        return retList;
+    }
+
 
     private List<Map<String, String>> ManageIndexMethod(String indexName,List<Map<String, String>> retList, Map<String, Object> baseIndex, MedIndexFilterVO timeVo){
         QueryWrapper<MedManagementInfo> query = new QueryWrapper<>();
@@ -3166,9 +3525,8 @@ public class ConsoleFacade {
     };
 
 
-    private List<Map<String, String>> firMethod(String indexName,List<Map<String, String>> retList, Map<String, Object> baseIndex){
+    private List<Map<String, String>> firMethod(List<Map<String, String>> retList, Map<String, Object> baseIndex){
         DecimalFormat df = new DecimalFormat("0.00");
-        if(indexName.equals(QualityContent.JJBLL)||indexName.equals(QualityContent.QB)) {
             //指标二十七 -甲级病历率
         LinkedHashMap<String, String> fouMap = new LinkedHashMap<>();
             Double firRecord = 0d;
@@ -3180,12 +3538,11 @@ public class ConsoleFacade {
                 double retNum = Double.parseDouble(baseIndex.get("sixWorkNum").toString()) * 100 / firRecord;
                 double firGradeStr = Double.parseDouble(df.format(retNum));
                 num4 = String.valueOf(firGradeStr);
-                fouMap.put("num",String.valueOf(firRecord));
             }
             fouMap.put("name","甲级病历率");
             fouMap.put("notCopiedStr",StringUtils.isEmpty(num4) ? "0.00%":(num4+"%"));
+        fouMap.put("num",String.valueOf(firRecord));
             retList.add(fouMap);
-        }
         return retList;
     };
 
@@ -3193,6 +3550,17 @@ public class ConsoleFacade {
     /**
      * ==============================后台维护===============================
      */
+    private  Set<String> tumorRadiationMethods( Map<String, Set<String>> adviceNum,MedIndexResult medIndexResult){
+        Set<String> tumorRadiationSecNum = new CopyOnWriteArraySet<>();
+        if(adviceNum.containsKey("tumorRadiationSecNum")&& adviceNum.get("tumorRadiationSecNum") != null && adviceNum.get("tumorRadiationSecNum").size()>0){
+            tumorRadiationSecNum = adviceNum.get("tumorRadiationSecNum");
+            double count = tumorRadiationSecNum.size();
+            if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+                medIndexResult.setTumorRadiationResult(count);
+            }
+        }
+        return tumorRadiationSecNum;
+    }
     //指标19 抢救记录
     private  void rescueMethods(List<MedManageParamsDTO> medManageParams,MedIndexResult medIndexResult, Set<String> rescueCode){
         List<MedManageParamsDTO> manageList= new ArrayList<>();
@@ -3231,7 +3599,7 @@ public class ConsoleFacade {
         System.out.println("lis项目存在用血住院病历号 = " + (xx2-xx1));
         //advice体现lis项目存在用血的住院病历号
         doctorAdviceList.parallelStream()
-                .filter(obj -> beCode.contains(obj.getBehospitalCode()) && obj.getDoctorAdviceType()
+                .filter(obj -> beCode.contains(obj.getBehospitalCode()) && StringUtils.isNotEmpty(obj.getDoctorAdviceType()) && obj.getDoctorAdviceType()
                         .equals(QualityContent.STAT_ORDER) && blood_list.contains(obj.getDaItemName()) &&
                         (StringUtils.isEmpty(obj.getDaStatus()) || (StringUtils.isNotEmpty(obj.getDaStatus()) && ! obj.getDaStatus()
                         .equals(QualityContent.CANCELLATION_ORDER))))
@@ -3339,6 +3707,45 @@ public class ConsoleFacade {
         filterVO.setLastEndDate(endTime);
     };
 
+    //指标 16--植入物相关记录符合率
+    private Set<String> implantsMethods(FilterVO filterVO,MedIndexResult medIndexResult){
+        filterVO.setFlagStr("4");
+        List<MedManageParamsDTO> fileLists = behospitalInfoFacade.getMedManageParams(filterVO);
+        Set<String> collect = fileLists.parallelStream().filter(obj -> {
+            String content = obj.getContent();
+            Map contenMap = JSON.parseObject(content, Map.class);
+            return contenMap.containsKey("使用植入性材料") && StringUtils.isNotEmpty(contenMap.get("使用植入性材料").toString())
+                    && "true".equals(contenMap.get("使用植入性材料").toString());
+        }).map(MedManageParamsDTO::getBehospitalCode).collect(Collectors.toSet());
+        double count = collect.size();
+        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+            medIndexResult.setImplantsResult(count);
+        }
+        return collect;
+    }
+
+    //指标21 出院患者病历归档完整率
+    private void fileCompleteMethods(FilterVO filterVO,MedIndexResult medIndexResult){
+        filterVO.setFlagStr("3");
+        List<MedManageParamsDTO> fileLists = behospitalInfoFacade.getMedManageParams(filterVO);
+        double count = fileLists.stream().map(MedManageParamsDTO::getBehospitalCode).distinct().count();
+        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+            medIndexResult.setFileCompleteResult(count);
+        }
+    }
+
+    //指标23  知情同意书规范签署率
+//    private void contentSignMethods(List<MedManageParamsDTO>fileLists,MedIndexResult medIndexResult){
+//        Set<String> collect = fileLists.parallelStream().filter(obj -> {
+//            String content = obj.getContent();
+//            Map contenMap = JSON.parseObject(content, Map.class);
+//            return contenMap.containsKey("签署") && StringUtils.isNotEmpty(contenMap.get("签署").toString());
+//        }).map(MedManageParamsDTO::getBehospitalCode).collect(Collectors.toSet());
+//        double count = collect.size();
+//        if(StringUtils.isNotEmpty(String.valueOf(count)) &&  count != 0d){
+//            medIndexResult.setRecordSignResult(count);
+//        }
+//    }
 
 
     /**

+ 65 - 0
src/main/java/com/diagbot/facade/DataEditFacade.java

@@ -0,0 +1,65 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.diagbot.dto.StrAdmissionNoteDTO;
+import com.diagbot.entity.*;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.service.*;
+import com.diagbot.util.*;
+import com.diagbot.vo.DataEditVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author:wangsy
+ * @time: 2021/08/14 11:37
+ */
+@Component
+public class DataEditFacade {
+
+    @Autowired
+    @Qualifier("strAdmissionNoteServiceImpl")
+    StrAdmissionNoteService strAdmissionNoteService;
+
+    /**
+     * 数据检索
+     */
+    public StrAdmissionNoteDTO dataSearch() {
+        Long hospitalId = Long.valueOf(SysUserUtils.getCurrentHospitalID());
+        StrAdmissionNote strAdmissionNote= strAdmissionNoteService.getBaseMapper().selectOne(new QueryWrapper<StrAdmissionNote>()
+                .eq("hospital_id", hospitalId)
+                .eq("remark", hospitalId + "N")
+                .select("rec_id", "whole_data"));
+        StrAdmissionNoteDTO strAdmissionNoteDTO = new StrAdmissionNoteDTO();
+        BeanUtil.copyProperties(strAdmissionNote,strAdmissionNoteDTO);
+        strAdmissionNoteDTO.setModeId("200");
+        return strAdmissionNoteDTO;
+    }
+
+
+
+    /**
+     * 更新数据
+     *
+     * @param dataEditVO
+     * @return
+     */
+    public Boolean saveDataEditFacade(DataEditVO dataEditVO) {
+        return strAdmissionNoteService.update(new UpdateWrapper<StrAdmissionNote>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", SysUserUtils.getCurrentHospitalID())
+                .eq("rec_id", dataEditVO.getRecId())
+                .set("whole_data", dataEditVO.getWholeData())
+                .set("gmt_modified", DateUtil.now())
+                .set("modifier", SysUserUtils.getCurrentPrincipleID())
+        );
+    }
+
+}

+ 2 - 0
src/main/java/com/diagbot/facade/FilterFacade.java

@@ -518,10 +518,12 @@ public class FilterFacade {
      * @param reBeHosPageVO
      */
     public void reBeHosPageVOSet(ReBeHosPageVO reBeHosPageVO) {
+        if(null == reBeHosPageVO.getUserId() && StringUtils.isEmpty(reBeHosPageVO.getHospitalId())){
         String hospitalId = SysUserUtils.getCurrentHospitalID();
         String userId = SysUserUtils.getCurrentPrincipleID();
         reBeHosPageVO.setHospitalId(hospitalId);
         reBeHosPageVO.setUserId(Long.valueOf(userId));
+        }
     }
 
     /**

+ 20 - 0
src/main/java/com/diagbot/facade/SysUserFacade.java

@@ -121,6 +121,26 @@ public class SysUserFacade extends SysUserServiceImpl {
         outputStream.flush();
         outputStream.close();
     }
+
+
+    /**
+     * 获取标识--选择登录页面
+     * @return java.lang.Long
+     */
+    public Long getHospitalMark() {
+        Long mark = 0L;//0-默认通用医院 1-湘雅医院特殊登录页面
+        SysHospitalSet sysHospitalSet = sysHospitalSetFacade.lambdaQuery()
+                .eq(SysHospitalSet::getHospitalId, 35)
+                .eq(SysHospitalSet::getIsDeleted, IsDeleteEnum.N.getKey())
+                .eq(SysHospitalSet::getCode, "special_page_csxy").one();
+        if(null != sysHospitalSet){
+            String val = sysHospitalSet.getValue();
+            if(StringUtil.isNotBlank(val) && "1".equals(val)){
+               mark =  Long.valueOf(val);
+            }
+        }
+        return mark;
+    }
     /**
      * 获取jwt
      * @param username 用户名

+ 9 - 2
src/main/java/com/diagbot/task/MedIndexTask.java

@@ -53,8 +53,15 @@ public class MedIndexTask implements SchedulingConfigurer{
                         && task001.getIsUsed().equals(1)) {
                     log.info("执行动态定时任务: " + LocalDateTime.now().toLocalTime());
                     IndexTimeVO IndexTimeVO = new IndexTimeVO();
-                    IndexTimeVO.setHospitalId(task001.getParam());
-                    consoleFacade.saveMedicaIndicator(IndexTimeVO);
+                    String param = task001.getParam();
+                    String[] split = {param};
+                    if(param.contains(",")){
+                        split = param.split(",");
+                    }
+                    for (String str : split) {
+                        IndexTimeVO.setHospitalId(str);
+                        consoleFacade.saveMedicaIndicator(IndexTimeVO);
+                    }
                 }
             }
         }, new Trigger() {

+ 1 - 1
src/main/java/com/diagbot/vo/AnalyzeVO.java

@@ -29,6 +29,6 @@ public class AnalyzeVO {
     @ApiModelProperty(hidden = true)
     private Integer delStatus;
     //已核查不能再次评分校验
-    @ApiModelProperty(hidden = true)
+    @ApiModelProperty("已核查不能再次评分标志位,false表示核查与评分无关已核查也可以评分")
     private Boolean checkFlag = true;
 }

+ 18 - 0
src/main/java/com/diagbot/vo/DataEditVO.java

@@ -0,0 +1,18 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+/**
+ * @Description:
+ * @author: wangsy
+ * @time: 2021/8/4 9:53
+ */
+@Data
+public class DataEditVO {
+    // 医院ID
+    private Long hospitalId;
+    // id
+    private String recId;
+    // json字符串
+    private String wholeData;
+}

+ 2 - 0
src/main/java/com/diagbot/vo/ReBeHosPageVO.java

@@ -37,4 +37,6 @@ public class ReBeHosPageVO extends Page {
      * 是否归档(0:未归档,1:已归档)
      */
     private String isPlacefile = "1";
+
+    private int flag = 0;//1-导出操作;
 }

+ 54 - 0
src/main/java/com/diagbot/web/DataEditController.java

@@ -0,0 +1,54 @@
+package com.diagbot.web;
+
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.StrAdmissionNoteDTO;
+import com.diagbot.facade.DataEditFacade;
+import com.diagbot.vo.DataEditVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * <p>
+ * 数据导入 前端控制器
+ * </p>
+ *
+ * @author wangsy
+ * @since 2020-04-27
+ */
+@RestController
+@RequestMapping("/qc/dataEdit")
+@SuppressWarnings("unchecked")
+@Api(value = "数据编辑API", tags = {"数据编辑API"})
+public class DataEditController {
+
+    @Autowired
+    DataEditFacade dateEditFacade;
+
+    @ApiOperation(value = "获取入院记录结构化json数据")
+    @PostMapping("/getDataEdit")
+    @SysLogger("getDataEdit")
+    public RespDTO<StrAdmissionNoteDTO>getDataEdit() {
+        return RespDTO.onSuc(dateEditFacade.dataSearch());
+    }
+
+    @ApiOperation(value = "更新数据", notes = "recId: id\n" +
+            "wholeData: json字符串")
+    @PostMapping("/saveDataEdit")
+    @SysLogger("saveDataEdit")
+    @Transactional
+    public RespDTO<Boolean> saveDataEdit(@RequestBody @Valid DataEditVO dataEditVO) {
+        Boolean data = dateEditFacade.saveDataEditFacade(dataEditVO);
+        return RespDTO.onSuc(data);
+    }
+
+
+}

+ 7 - 0
src/main/java/com/diagbot/web/SysUserController.java

@@ -81,6 +81,13 @@ public class SysUserController {
            userFacade.getCaptcha(request, response);
     }
 
+    @ApiOperation(value = "获取标识--选择登录页面[by:cy]")
+    @PostMapping("/getHospitalMark")
+    @SysLogger("getHospitalMark")
+    public RespDTO<Long> getHospitalMark() {
+        Long mark = userFacade.getHospitalMark();
+        return RespDTO.onSuc(mark);
+    }
     @ApiOperation(value = "登录获取jwt[by:gaodm]",
             notes = "username:用户名,必填<br>")
     @PostMapping("/getJwtNoPass")

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 307 - 192
src/main/resources/mapper/BehospitalInfoMapper.xml


+ 6 - 4
src/main/resources/mapper/MedIndexResultMapper.xml

@@ -48,10 +48,12 @@
             COALESCE (sum(a.antibiosis_result), 0) AS 'antibiosisFeeNum',
             COALESCE (sum(a.tumor_chemistry_result),0) AS 'chemotherapyMalignantTumorsNum',
             COALESCE (sum(a.tumor_radiation_result),0) AS 'tumor_radiation_result',
-            COALESCE (sum(a.implants_result), 0) AS 'implants_result',
-            COALESCE (sum(a.blood_result), 0) AS 'blood_result',
-            COALESCE (sum(a.rescue_result), 0) AS 'rescue_result',
-            COALESCE (sum(a.sec_file_result), 0) AS 'sec_file_result'
+            COALESCE (sum(a.implants_result), 0) AS 'implantsResult',
+            COALESCE (sum(a.blood_result), 0) AS 'bloodResult',
+            COALESCE (sum(a.rescue_result), 0) AS 'rescueResult',
+            COALESCE (sum(a.sec_file_result), 0) AS 'secFileResult',
+            COALESCE (sum(a.file_complete_result), 0) AS 'fileCompleteResult',
+            COALESCE (sum(a.tumor_radiation_result), 0) AS 'tumorRadiationResult'
 
         FROM
             med_index_result a

+ 0 - 1
src/main/resources/mapper/MedicalRecordMapper.xml

@@ -46,7 +46,6 @@
         and t1.rec_id = t3.rec_id
         and t1.hospital_id = #{hospitalId}
         and t1.behospital_code = #{behospitalCode}
-        and t3.xml_text != ''
     </select>
 
     <select id="getRecordCount"  resultType="java.lang.Integer">