瀏覽代碼

Merge branch 'dev/20201224_2.0.1' into jsfwb/2021_2.0.1

liuqq 4 年之前
父節點
當前提交
8e12ccdbdd
共有 22 個文件被更改,包括 2481 次插入63 次删除
  1. 34 0
      doc/030.20201224v2.0.1/qc_initv2.0.0.sql
  2. 3 0
      src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  3. 3 0
      src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  4. 40 0
      src/main/java/com/diagbot/dto/CaseScoreDTO.java
  5. 100 41
      src/main/java/com/diagbot/dto/QualityControlDTO.java
  6. 237 0
      src/main/java/com/diagbot/dto/QualityControlDeptDTO.java
  7. 140 0
      src/main/java/com/diagbot/dto/QualityControlNullDTO.java
  8. 1 0
      src/main/java/com/diagbot/facade/BehospitalInfoFacade.java
  9. 60 4
      src/main/java/com/diagbot/facade/ConsoleByDeptExportFacade.java
  10. 470 0
      src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java
  11. 65 9
      src/main/java/com/diagbot/facade/ConsoleExportFacade.java
  12. 733 3
      src/main/java/com/diagbot/facade/ConsoleFacade.java
  13. 51 1
      src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java
  14. 53 1
      src/main/java/com/diagbot/service/BehospitalInfoService.java
  15. 67 1
      src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java
  16. 112 0
      src/main/java/com/diagbot/vo/CaseScoreVO.java
  17. 20 0
      src/main/java/com/diagbot/web/ConsoleByDeptController.java
  18. 18 0
      src/main/java/com/diagbot/web/ConsoleByDeptExportController.java
  19. 1 1
      src/main/java/com/diagbot/web/ConsoleController.java
  20. 20 0
      src/main/java/com/diagbot/web/ConsoleExportController.java
  21. 252 2
      src/main/resources/mapper/BehospitalInfoMapper.xml
  22. 1 0
      src/main/resources/mapper/SysMenuMapper.xml

+ 34 - 0
doc/030.20201224v2.0.1/qc_initv2.0.0.sql

@@ -0,0 +1,34 @@
+use `qc`;
+/**
+注意:
+1、中间表的新增或修改需要按照实际的唯一字段来进行操作
+例如:新增sys_role_menu中数据需要sys_menu中指定的id、menu_id,否则可能会失效!!!
+2、按照顺序执行
+ */
+ --全院
+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', '病历质控报表', '17', 'YH-ZKK-BLZK_XQ', '1', '1', '18', '用户-质控科-病历质控报表');
+--开放菜单
+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', '50', 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', '50', NULL);
+--开放权限报表
+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', '50', '125', 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', '病历质控报表', '', '/console/qualityControl', 'ALL', '病历质控报表', NULL);
+INSERT INTO `sys_role_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `permission_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '-1', '125', NULL);
+INSERT INTO `sys_role_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `permission_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '1', '125', NULL);
+
+--科室
+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', '病历质控报表', '18', 'YH-KSZR-BLZK_XQ', '1', '1', '13', '用户-科室主任-病历质控报表-详情');
+--开放菜单
+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', '53', 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', '2', '53', NULL);
+--开放权限报表
+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', '53', '126', 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', '病历质控报表', '', '/consoleByDept/qualityControlByDept', 'ALL', '病历质控报表(科室)', NULL);
+INSERT INTO `sys_role_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `permission_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '-1', '126', NULL);
+INSERT INTO `sys_role_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `permission_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '2', '126', NULL);
+
+

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

@@ -234,6 +234,9 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .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("/**").authenticated();
         //                .antMatchers("/**").permitAll();
     }

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

@@ -278,6 +278,9 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || 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("/", request)) {
             return true;
         }

+ 40 - 0
src/main/java/com/diagbot/dto/CaseScoreDTO.java

@@ -0,0 +1,40 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2020/4/14 13:07
+ */
+@Getter
+@Setter
+public class CaseScoreDTO {
+
+    //得分
+    private Double score;
+    //提示信息
+    private String msg;
+    //提示信息
+    private String info;
+    //单项否决
+    private String isReject;
+    //模块名称
+    private String modelName;
+    //模块id
+    private String modelId;
+    private String behospitalCode;
+    //模块ID
+    private Long casesId;
+    //模块分数
+    private Double casesScore;
+    // 条目ID
+    private Long casesEntryId;
+
+}

+ 100 - 41
src/main/java/com/diagbot/dto/QualityControlDTO.java

@@ -20,13 +20,13 @@ public class QualityControlDTO {
     /**
      * 姓名
      */
-    @Excel(name = "病人姓名", width = 30, orderNum = "1")
+    @Excel(name = "病人姓名", width = 12, orderNum = "1")
     private String name;
 
     /**
      * 病人住院ID
      */
-    @Excel(name = "住院号", width = 30, orderNum = "2")
+    @Excel(name = "住院号", width = 16, orderNum = "2")
     private String behospitalCode;
 
     /**
@@ -34,10 +34,15 @@ public class QualityControlDTO {
      */
     private String doctorId;
 
+    /**
+     * 年龄
+     */
+    private String age;
+
     /**
      * 医生姓名
      */
-    @Excel(name = "主治医生", width = 30, orderNum = "3")
+    @Excel(name = "主治医生", width = 12, orderNum = "3")
     private String doctorName;
 
     /**
@@ -47,7 +52,7 @@ public class QualityControlDTO {
     /**
      * 科室名称
      */
-    @Excel(name = "科室名称", width = 30, orderNum = "4")
+    @Excel(name = "科室名称", width = 16, orderNum = "4",mergeVertical = true)
     private String deptName;
 
     /**
@@ -59,121 +64,175 @@ public class QualityControlDTO {
     /**
      * 出院时间
      */
-    @Excel(name = "出院日期", width = 30, orderNum = "5")
+    @Excel(name = "出院日期", width = 25, orderNum = "5", exportFormat = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date leaveHospitalDate;
 
     /**
      * 病案首页--
      */
-    @Excel(name = "病案首页", orderNum = "6")
+    @Excel(name = "病案首页", width = 30, orderNum = "6")
     private String medHomePage;
     /**
      * 病案首页扣分
      */
-    @Excel(name = "扣分", orderNum = "7")
-    private BigDecimal medHomePageScore;
-
+    @Excel(name = "扣分",width = 12, orderNum = "7")
+    private Double medHomePageScore= 0d;
+    private Double medHomePageScoreOn= 0d;
+    private Double medHomePageScoreTw= 0d;
     /**
      * 入院记录--
      */
-    @Excel(name = "入院记录", orderNum = "8")
+    @Excel(name = "入院记录",width = 30, orderNum = "8")
     private String admissionNote;
+
     /**
      * 入院记录扣分
      */
-    @Excel(name = "扣分", orderNum = "9")
-    private BigDecimal admissionNoteScore;
-
+    @Excel(name = "扣分",width = 12, orderNum = "9")
+    private Double admissionNoteScore= 0d;
+    //非单项否决扣分
+    private Double admissionNoteScoreOn= 0d;
+    //扣分项总和
+    private Double admissionNoteScoreTw= 0d;
 
     /**
      * 首次病程录--
      */
-    @Excel(name = "首次病程录", orderNum = "10")
+    @Excel(name = "首次病程录",width = 30, orderNum = "10")
     private String firstCourseNote;
+
     /**
      * 首次病程录扣分
      */
-    @Excel(name = "扣分", orderNum = "11")
-    private BigDecimal firstCourseNoteScore;
-
+    @Excel(name = "扣分",width = 12, orderNum = "11")
+    private Double firstCourseNoteScore= 0d;
+    private Double firstCourseNoteScoreOn= 0d;
+    private Double firstCourseNoteScoreTw= 0d;
     /**
      * 病程记录--
      */
-    @Excel(name = "病程记录", orderNum = "12")
+    @Excel(name = "病程记录",width = 30, orderNum = "12")
     private String courseRecord;
+
     /**
      * 病程记录扣分
      */
-    @Excel(name = "扣分", orderNum = "13")
-    private BigDecimal courseRecordScore;
-
+    @Excel(name = "扣分", width = 12,orderNum = "13")
+    private Double courseRecordScore= 0d;
+    private Double courseRecordScoreOn= 0d;
+    private Double courseRecordScoreTw= 0d;
     /**
      * 手术信息--
      */
-    @Excel(name = "手术信息", orderNum = "14")
+    @Excel(name = "手术信息",width = 30, orderNum = "14")
     private String  operationInfo;
+
     /**
      * 手术信息扣分
      */
-    @Excel(name = "扣分", orderNum = "15")
-    private BigDecimal operationInfoScore;
-
+    @Excel(name = "扣分",width = 12, orderNum = "15")
+    private Double operationInfoScore= 0d;
+    private Double  operationInfoScoreOn= 0d;
+    private Double  operationInfoScoreTw= 0d;
     /**
      * 出院记录--
      */
-    @Excel(name = "出院记录", orderNum = "16")
+    @Excel(name = "出院记录",width = 30, orderNum = "16")
     private String  dischargeNote;
     /**
      * 出院记录扣分
      */
-    @Excel(name = "扣分", orderNum = "17")
-    private BigDecimal dischargeNoteScore;
-
+    @Excel(name = "扣分",width = 12, orderNum = "17")
+    private Double  dischargeNoteScore= 0d;
+    private Double  dischargeNoteScoreOn= 0d;
+    private Double  dischargeNoteScoreTw= 0d;
     /**
      * 医嘱单--
      */
-    @Excel(name = "医嘱单", orderNum = "18")
+    @Excel(name = "医嘱单",width = 30, orderNum = "18")
     private String  docAdviceNote;
     /**
      * 医嘱单扣分
      */
-    @Excel(name = "扣分", orderNum = "19")
-    private BigDecimal docAdviceNoteScore;
-
+    @Excel(name = "扣分",width = 12, orderNum = "19")
+    private Double docAdviceNoteScore= 0d;
+    private Double  docAdviceNoteScoreOn= 0d;
+    private Double  docAdviceNoteScoreTw= 0d;
     /**
      * 其他
      */
-    @Excel(name = "其他", orderNum = "20")
+    @Excel(name = "其他",width = 30, orderNum = "20")
     private String  otherCase;
     /**
      * 其他扣分
      */
-    @Excel(name = "扣分", orderNum = "21")
-    private BigDecimal otherCaseScore;
+    @Excel(name = "扣分",width = 12, orderNum = "21")
+    private Double otherCaseScore= 0d;
 
     /**
      * 总分
      */
-    @Excel(name = "总分", orderNum = "22")
-    private String  totalScore;
+    @Excel(name = "总分",width = 12, orderNum = "22")
+    private Double  totalScore= 0d;
     /**
      * 病历等级
      */
-    @Excel(name = "病历等级", orderNum = "23")
+    @Excel(name = "病历等级",width = 12, orderNum = "23")
     private String level;
 
     /**
      * 病案首页核查人
      */
-    @Excel(name = "首页检查者", orderNum = "24")
+    @Excel(name = "首页检查者", width = 12,orderNum = "24")
     private String  mrName;
     /**
      * 病历核查人
      */
-    @Excel(name = "病历检查者", orderNum = "25")
+    @Excel(name = "病历检查者",width = 12, orderNum = "25")
     private String chName;
 
 
+    /**
+     * 病案首页模块总分
+     */
+    private Double medHomePageTolScore =0d;
+
+
+    /**
+     * 入院记录模块总分
+     */
+    private Double admissionNoteTolScore=0d;
+
+    /**
+     * 首次病程录模块总分
+     */
+    private Double firstCourseNoteTolScore=0d;
+
+    /**
+     * 病程记录模块总分
+     */
+    private Double courseRecordTolScore=0d;
+
+
+    /**
+     * 手术信息模块总分
+     */
+    private Double operationInfoTolScore=0d;
+
+
+    /**
+     * 出院记录模块总分
+     */
+    private Double dischargeNoteTolScore=0d;
+
+
+
+    /**
+     * 医嘱单模块总分
+     */
+    private Double docAdviceNoteTolScore=0d;
+
+
 
 }

+ 237 - 0
src/main/java/com/diagbot/dto/QualityControlDeptDTO.java

@@ -0,0 +1,237 @@
+package com.diagbot.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @Description:病历质控报表返回结构
+ * @Author:cy
+ * @time: 2021/1/20 13:32
+ */
+@Getter
+@Setter
+public class QualityControlDeptDTO {
+
+    /**
+     * 姓名
+     */
+    @Excel(name = "病人姓名", width = 12, orderNum = "1")
+    private String name;
+
+    /**
+     * 病人住院ID
+     */
+    @Excel(name = "住院号", width = 16, orderNum = "2")
+    private String behospitalCode;
+
+    /**
+     * 主管医生id
+     */
+    private String doctorId;
+
+    /**
+     * 年龄
+     */
+    private String age;
+
+    /**
+     * 医生姓名
+     */
+    @Excel(name = "主治医生", width = 12, orderNum = "3",mergeVertical = true)
+    private String doctorName;
+
+    /**
+     * 科室id(科室编码)
+     */
+    private String deptId;
+    /**
+     * 科室名称
+     */
+    @Excel(name = "科室名称", width = 16, orderNum = "4",mergeVertical = true)
+    private String deptName;
+
+    /**
+     * 入院时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date behospitalDate;
+
+    /**
+     * 出院时间
+     */
+    @Excel(name = "出院日期", width = 25, orderNum = "5", exportFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date leaveHospitalDate;
+
+    /**
+     * 病案首页--
+     */
+    @Excel(name = "病案首页", width = 30, orderNum = "6")
+    private String medHomePage;
+    /**
+     * 病案首页扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "7")
+    private Double medHomePageScore= 0d;
+    private Double medHomePageScoreOn= 0d;
+    private Double medHomePageScoreTw= 0d;
+    /**
+     * 入院记录--
+     */
+    @Excel(name = "入院记录",width = 30, orderNum = "8")
+    private String admissionNote;
+
+    /**
+     * 入院记录扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "9")
+    private Double admissionNoteScore= 0d;
+    //非单项否决扣分
+    private Double admissionNoteScoreOn= 0d;
+    //扣分项总和
+    private Double admissionNoteScoreTw= 0d;
+
+    /**
+     * 首次病程录--
+     */
+    @Excel(name = "首次病程录",width = 30, orderNum = "10")
+    private String firstCourseNote;
+
+    /**
+     * 首次病程录扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "11")
+    private Double firstCourseNoteScore= 0d;
+    private Double firstCourseNoteScoreOn= 0d;
+    private Double firstCourseNoteScoreTw= 0d;
+    /**
+     * 病程记录--
+     */
+    @Excel(name = "病程记录",width = 30, orderNum = "12")
+    private String courseRecord;
+
+    /**
+     * 病程记录扣分
+     */
+    @Excel(name = "扣分", width = 12,orderNum = "13")
+    private Double courseRecordScore= 0d;
+    private Double courseRecordScoreOn= 0d;
+    private Double courseRecordScoreTw= 0d;
+    /**
+     * 手术信息--
+     */
+    @Excel(name = "手术信息",width = 30, orderNum = "14")
+    private String  operationInfo;
+
+    /**
+     * 手术信息扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "15")
+    private Double operationInfoScore= 0d;
+    private Double  operationInfoScoreOn= 0d;
+    private Double  operationInfoScoreTw= 0d;
+    /**
+     * 出院记录--
+     */
+    @Excel(name = "出院记录",width = 30, orderNum = "16")
+    private String  dischargeNote;
+    /**
+     * 出院记录扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "17")
+    private Double  dischargeNoteScore= 0d;
+    private Double  dischargeNoteScoreOn= 0d;
+    private Double  dischargeNoteScoreTw= 0d;
+    /**
+     * 医嘱单--
+     */
+    @Excel(name = "医嘱单",width = 30, orderNum = "18")
+    private String  docAdviceNote;
+    /**
+     * 医嘱单扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "19")
+    private Double docAdviceNoteScore= 0d;
+    private Double  docAdviceNoteScoreOn= 0d;
+    private Double  docAdviceNoteScoreTw= 0d;
+    /**
+     * 其他
+     */
+    @Excel(name = "其他",width = 30, orderNum = "20")
+    private String  otherCase;
+    /**
+     * 其他扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "21")
+    private Double otherCaseScore= 0d;
+
+    /**
+     * 总分
+     */
+    @Excel(name = "总分",width = 12, orderNum = "22")
+    private Double  totalScore= 0d;
+    /**
+     * 病历等级
+     */
+    @Excel(name = "病历等级",width = 12, orderNum = "23")
+    private String level;
+
+    /**
+     * 病案首页核查人
+     */
+    @Excel(name = "首页检查者", width = 12,orderNum = "24")
+    private String  mrName;
+    /**
+     * 病历核查人
+     */
+    @Excel(name = "病历检查者",width = 12, orderNum = "25")
+    private String chName;
+
+
+    /**
+     * 病案首页模块总分
+     */
+    private Double medHomePageTolScore =0d;
+
+
+    /**
+     * 入院记录模块总分
+     */
+    private Double admissionNoteTolScore=0d;
+
+    /**
+     * 首次病程录模块总分
+     */
+    private Double firstCourseNoteTolScore=0d;
+
+    /**
+     * 病程记录模块总分
+     */
+    private Double courseRecordTolScore=0d;
+
+
+    /**
+     * 手术信息模块总分
+     */
+    private Double operationInfoTolScore=0d;
+
+
+    /**
+     * 出院记录模块总分
+     */
+    private Double dischargeNoteTolScore=0d;
+
+
+
+    /**
+     * 医嘱单模块总分
+     */
+    private Double docAdviceNoteTolScore=0d;
+
+
+
+}

+ 140 - 0
src/main/java/com/diagbot/dto/QualityControlNullDTO.java

@@ -0,0 +1,140 @@
+package com.diagbot.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Description:病历质控报表返回结构
+ * @Author:cy
+ * @time: 2021/1/20 13:32
+ */
+@Getter
+@Setter
+public class QualityControlNullDTO {
+
+
+
+
+
+    /**
+     * 病案首页扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "7")
+    private Double medHomePageScore;
+    private Double medHomePageScoreOn;
+    private Double medHomePageScoreTw;
+
+    /**
+     * 入院记录扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "9")
+    private Double admissionNoteScore;
+    //非单项否决扣分
+    private Double admissionNoteScoreOn;
+    //扣分项总和
+    private Double admissionNoteScoreTw;
+
+
+
+    /**
+     * 首次病程录扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "11")
+    private Double firstCourseNoteScore;
+    private Double firstCourseNoteScoreOn;
+    private Double firstCourseNoteScoreTw;
+
+
+    /**
+     * 病程记录扣分
+     */
+    @Excel(name = "扣分", width = 12,orderNum = "13")
+    private Double courseRecordScore;
+    private Double courseRecordScoreOn;
+    private Double courseRecordScoreTw;
+
+    /**
+     * 手术信息扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "15")
+    private Double operationInfoScore;
+    private Double  operationInfoScoreOn;
+    private Double  operationInfoScoreTw;
+
+    /**
+     * 出院记录扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "17")
+    private Double  dischargeNoteScore;
+    private Double  dischargeNoteScoreOn;
+    private Double  dischargeNoteScoreTw;
+
+    /**
+     * 医嘱单扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "19")
+    private Double docAdviceNoteScore;
+    private Double  docAdviceNoteScoreOn;
+    private Double  docAdviceNoteScoreTw;
+
+    /**
+     * 其他扣分
+     */
+    @Excel(name = "扣分",width = 12, orderNum = "21")
+    private Double otherCaseScore;
+
+    /**
+     * 总分
+     */
+    @Excel(name = "总分",width = 12, orderNum = "22")
+    private Double  totalScore;
+
+
+    /**
+     * 病案首页模块总分
+     */
+    private Double medHomePageTolScore;
+
+
+    /**
+     * 入院记录模块总分
+     */
+    private Double admissionNoteTolScore;
+
+    /**
+     * 首次病程录模块总分
+     */
+    private Double firstCourseNoteTolScore;
+
+    /**
+     * 病程记录模块总分
+     */
+    private Double courseRecordTolScore;
+
+
+    /**
+     * 手术信息模块总分
+     */
+    private Double operationInfoTolScore;
+
+
+    /**
+     * 出院记录模块总分
+     */
+    private Double dischargeNoteTolScore;
+
+
+
+    /**
+     * 医嘱单模块总分
+     */
+    private Double docAdviceNoteTolScore;
+
+
+
+}

+ 1 - 0
src/main/java/com/diagbot/facade/BehospitalInfoFacade.java

@@ -1603,6 +1603,7 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
                 = sysHospitalSetFacade.getOne(new QueryWrapper<SysHospitalSet>()
                         .eq("is_deleted", IsDeleteEnum.N.getKey())
                         .eq("hospital_id", analyzeRunVO.getHospitalId())
+                        .eq("code", "score_type")
                 , false);
         if (null != sysHospitalSet && sysHospitalSet.getValue().equals("1")) {
             //百分制

+ 60 - 4
src/main/java/com/diagbot/facade/ConsoleByDeptExportFacade.java

@@ -3,12 +3,14 @@ package com.diagbot.facade;
 import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.diagbot.dto.*;
 import com.diagbot.entity.SysHospitalSet;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.util.*;
 import com.diagbot.vo.*;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,10 +18,7 @@ import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * @Description: 报表导出装饰层
@@ -377,6 +376,63 @@ public class ConsoleByDeptExportFacade {
         ExcelUtils.exportExcel(records, null, "sheet1", MedicalDeptDTO.class, fileName, response, 15.8f);
     }
 
+    /**
+     * 病历质控报表-科室-导出
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public void qualityControlExportByDept(HttpServletResponse response, BehospitalPageVO behospitalPageVO) {
+        behospitalPageVO.setCurrent(1L);
+        behospitalPageVO.setSize(Long.MAX_VALUE);
+        behospitalPageVO.setSearchCount(false);
+        Date startDate = behospitalPageVO.getLeaveHosDateStart();
+        Date endDate = behospitalPageVO.getLeaveHosDateEnd();
+        orderMethod(behospitalPageVO);
+        //时间间隔30天
+        long interval = 30 * 24l * 60l * 60l * 1000l;
+        if (endDate.getTime() < startDate.getTime()) {
+            throw new CommonException(CommonErrorCode.PARAM_ERROR, "截止时间不能小于起始时间");
+        }
+        if (endDate.getTime() - startDate.getTime() > interval) {
+            throw new CommonException(CommonErrorCode.PARAM_ERROR, "统计区间不能大于30天");
+        }
+        String  fileName = "病历质控报表科室详情.xls";
+        IPage<QualityControlDeptDTO> records = consoleByDeptFacade.qualityControlByDept(behospitalPageVO);
+        ExcelUtils.exportExcel(records.getRecords(), null, "sheet1", QualityControlDeptDTO.class, fileName, response, 26.8f);
+    }
+
+    static void orderMethod(BehospitalPageVO behospitalPageVO){
+        List orders = behospitalPageVO.getOrders();
+        Boolean flag = false;
+        List<OrderItem> itemList = new ArrayList<>();
+        List<OrderItem> targetItemList = new ArrayList<>();
+        for (Object order : orders) {
+            ObjectMapper objectMapper = new ObjectMapper();
+            OrderItem orderName = objectMapper.convertValue(order, OrderItem.class);
+            itemList.add(orderName);
+            if(!(orderName.getColumn().equals("deptName")||orderName.getColumn().equals("doctorName"))){
+                flag = true;
+            }
+        }
+        //科室、医生作为第一升序排列,传入排序随后 配合excel注解属性mergeVertical处理科室合并
+            OrderItem orderDept = new OrderItem();
+            orderDept.setAsc(true);
+            orderDept.setColumn("deptName");
+            targetItemList.add(orderDept);
+            OrderItem orderDoctor = new OrderItem();
+            orderDoctor.setAsc(true);
+            orderDoctor.setColumn("doctorName");
+            targetItemList.add(orderDoctor);
+        if(flag){
+            if(itemList.size()==1){
+                targetItemList.add(itemList.get(0));
+            }
+        }
+        behospitalPageVO.setOrders(targetItemList);
+
+    };
+
 
 
     /**

+ 470 - 0
src/main/java/com/diagbot/facade/ConsoleByDeptFacade.java

@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.diagbot.dto.*;
 import com.diagbot.entity.QcCasesEntry;
 import com.diagbot.entity.SysHospitalSet;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
 import com.diagbot.util.*;
 import com.diagbot.vo.*;
 import com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -1052,6 +1055,309 @@ public class ConsoleByDeptFacade {
         return medicalCheck;
     }
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public IPage<QualityControlDeptDTO> qualityControlByDept(@Param("filterVO")  BehospitalPageVO behospitalPageVO) {
+        behospitalPageSet(behospitalPageVO);
+        DecimalFormat df=new DecimalFormat("0.0");
+        IPage<QualityControlDeptDTO> records = behospitalInfoFacade.qualityControlByDept(behospitalPageVO);
+        List<QualityControlDeptDTO> qualityControlDTOs = records.getRecords();
+        CaseScoreVO caseScoreVO = new CaseScoreVO();
+        BeanUtil.copyProperties(behospitalPageVO,caseScoreVO);
+        List<CaseScoreDTO>caseScoreDTOS= behospitalInfoFacade.getQualityCaseSorce(caseScoreVO);
+        if(ListUtil.isNotEmpty(qualityControlDTOs)){
+            qualityControlDTOs.forEach(qualityControlDTO->{
+                Double rePlaceTolScore = qualityControlDTO.getTotalScore();
+                StringBuffer admissionNote = new StringBuffer();
+                StringBuffer firstCourseNote = new StringBuffer();
+                StringBuffer dischargeNote = new StringBuffer();
+                StringBuffer medHomePage = new StringBuffer();
+                StringBuffer docAdviceNote = new StringBuffer();
+                StringBuffer operationInfo = new StringBuffer();
+                StringBuffer courseRecord = new StringBuffer();
+                StringBuffer otherCase = new StringBuffer();
+                Double admissionNoteScoreOn = 0d;
+                Double admissionNoteScoreTw = 0d;
+                Double firstCourseNoteScoreOn = 0d;
+                Double firstCourseNoteScoreTw = 0d;
+                Double dischargeNoteScoreOn = 0d;
+                Double dischargeNoteScoreTw = 0d;
+                Double medHomePageScoreOn = 0d;
+                Double medHomePageScoreTw = 0d;
+                Double docAdviceNoteScoreOn = 0d;
+                Double docAdviceNoteScoreTw = 0d;
+                Double operationInfoScoreOn = 0d;
+                Double operationInfoScoreTw = 0d;
+                Double courseRecordScoreOn = 0d;
+                Double courseRecordScoreTw = 0d;
+                if(ListUtil.isNotEmpty(caseScoreDTOS)){
+                    AlgorithmVO algorithmVO = new AlgorithmVO();
+                    BeanUtil.copyProperties(behospitalPageVO,algorithmVO);
+                    algorithmVO.setType(0);
+                    List<QcResultAlgVO> qcResultAlgVOList = new ArrayList<QcResultAlgVO>();
+                    for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
+                        if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode())&&
+                                StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode())&&
+                                qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
+                            double targetScore =  Double.valueOf(df.format(caseScoreDTO.getScore()));
+
+                            QcResultAlgVO qcResultAlgVO = new QcResultAlgVO();
+                            BeanUtil.copyProperties(caseScoreDTO,qcResultAlgVO);
+                            qcResultAlgVO.setIsReject(Integer.valueOf(caseScoreDTO.getIsReject()));
+                            qcResultAlgVO.setScore(new BigDecimal(caseScoreDTO.getScore()));
+                            qcResultAlgVO.setCasesScore(new BigDecimal(caseScoreDTO.getCasesScore()));
+                            qcResultAlgVOList.add(qcResultAlgVO);
+
+                            switch (caseScoreDTO.getModelId()) {
+                                case "1":
+                                    String admissionMsg = caseScoreDTO.getMsg() + ";";
+                                    admissionNote.append(admissionMsg);
+                                    //对单个modeId进行扣分总和计算
+                                    //非单项否决总分
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        admissionNoteScoreOn += targetScore;
+                                        admissionNoteScoreOn = Double.valueOf(df.format(admissionNoteScoreOn));
+                                    }
+
+                                    //扣分总和
+                                    admissionNoteScoreTw += targetScore;
+                                    admissionNoteScoreTw = Double.valueOf(df.format(admissionNoteScoreTw));
+                                    qualityControlDTO.setAdmissionNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "2":
+                                    String firstCourseNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    firstCourseNote.append(firstCourseNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        firstCourseNoteScoreOn +=targetScore;
+                                        firstCourseNoteScoreOn = Double.valueOf(df.format(firstCourseNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    firstCourseNoteScoreTw += targetScore;
+                                    firstCourseNoteScoreTw = Double.valueOf(df.format(firstCourseNoteScoreTw));
+                                    qualityControlDTO.setFirstCourseNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "5":
+                                    String dischargeNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    dischargeNote.append(dischargeNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        dischargeNoteScoreOn += targetScore;
+                                        dischargeNoteScoreOn = Double.valueOf(df.format(dischargeNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    dischargeNoteScoreTw += targetScore;
+                                    dischargeNoteScoreTw = Double.valueOf(df.format(dischargeNoteScoreTw));
+                                    qualityControlDTO.setDischargeNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "6":
+                                    String medHomePageMsg = caseScoreDTO.getMsg() + ";";
+                                    medHomePage.append(medHomePageMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        medHomePageScoreOn += targetScore;
+                                        medHomePageScoreOn = Double.valueOf(df.format(medHomePageScoreOn));
+                                    }
+                                    //扣分总和
+                                    medHomePageScoreTw += targetScore;
+                                    medHomePageScoreTw = Double.valueOf(df.format(medHomePageScoreTw));
+                                    qualityControlDTO.setMedHomePageTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "8":
+                                    String docAdviceNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    docAdviceNote.append(docAdviceNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        docAdviceNoteScoreOn += targetScore;
+                                        docAdviceNoteScoreOn = Double.valueOf(df.format(docAdviceNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    docAdviceNoteScoreTw += targetScore;
+                                    docAdviceNoteScoreTw = Double.valueOf(df.format(docAdviceNoteScoreTw));
+                                    qualityControlDTO.setDocAdviceNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "17":
+                                    String operationInfoMsg = caseScoreDTO.getMsg() + ";";
+                                    operationInfo.append(operationInfoMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        operationInfoScoreOn += targetScore;
+                                        operationInfoScoreOn = Double.valueOf(df.format(operationInfoScoreOn));
+                                    }
+                                    //扣分总和
+                                    operationInfoScoreTw += targetScore;
+                                    operationInfoScoreTw = Double.valueOf(df.format(operationInfoScoreTw));
+                                    qualityControlDTO.setOperationInfoTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "56":
+                                    String courseRecordMsg = caseScoreDTO.getMsg() + ";";
+                                    courseRecord.append(courseRecordMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        courseRecordScoreOn += targetScore;
+                                        courseRecordScoreOn = Double.valueOf(df.format(courseRecordScoreOn));
+                                    }
+                                    //扣分总和
+                                    courseRecordScoreTw += targetScore;
+                                    courseRecordScoreTw = Double.valueOf(df.format(courseRecordScoreTw));
+                                    qualityControlDTO.setCourseRecordTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+
+                            }
+
+                            String modelId = caseScoreDTO.getModelId();
+                            if(!(modelId.equals("1")||modelId.equals("2")||modelId.equals("5")||modelId.equals("6")||
+                                    modelId.equals("8")||modelId.equals("17")||modelId.equals("56"))){
+                                String otherCaseMsg = caseScoreDTO.getMsg() + ";";
+                                otherCase.append(otherCaseMsg);
+                            }
+                            //未评分
+                        }
+                        if(StringUtils.isEmpty(caseScoreDTO.getBehospitalCode())){
+                            QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                            BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                            break;
+                        }
+                    };
+                    algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
+                    Double toltalScore = getScoreForCx(algorithmVO).doubleValue();
+                    qualityControlDTO.setTotalScore(toltalScore);
+                    qualityControlDTO.setAdmissionNoteScoreOn(admissionNoteScoreOn);
+                    qualityControlDTO.setAdmissionNoteScoreTw(admissionNoteScoreTw);
+                    qualityControlDTO.setFirstCourseNoteScoreOn(firstCourseNoteScoreOn);
+                    qualityControlDTO.setFirstCourseNoteScoreTw(firstCourseNoteScoreTw);
+                    qualityControlDTO.setDischargeNoteScoreOn(dischargeNoteScoreOn);
+                    qualityControlDTO.setDischargeNoteScoreTw(dischargeNoteScoreTw);
+                    qualityControlDTO.setMedHomePageScoreOn(medHomePageScoreOn);
+                    qualityControlDTO.setMedHomePageScoreTw(medHomePageScoreTw);
+                    qualityControlDTO.setDocAdviceNoteScoreOn(docAdviceNoteScoreOn);
+                    qualityControlDTO.setDocAdviceNoteScoreTw(docAdviceNoteScoreTw);
+                    qualityControlDTO.setOperationInfoScoreOn(operationInfoScoreOn);
+                    qualityControlDTO.setOperationInfoScoreTw(operationInfoScoreTw);
+                    qualityControlDTO.setCourseRecordScoreOn(courseRecordScoreOn);
+                    qualityControlDTO.setCourseRecordScoreTw(courseRecordScoreTw);
+
+                    String admissionNoteString = StringUtils.isEmpty(admissionNote) == true ?"无缺陷" : admissionNote.toString().substring(0,  admissionNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setAdmissionNote(admissionNoteString);
+                    String firstCourseNoteString = StringUtils.isEmpty(firstCourseNote) == true ?"无缺陷" :firstCourseNote.toString().substring(0,  firstCourseNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setFirstCourseNote(firstCourseNoteString);
+                    String dischargeNoteString = StringUtils.isEmpty(dischargeNote) == true ?"无缺陷" : dischargeNote.toString().substring(0,  dischargeNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setDischargeNote(dischargeNoteString);
+                    String medHomePageString = StringUtils.isEmpty(medHomePage) == true ?"无缺陷" : medHomePage.toString().substring(0,  medHomePage.toString().lastIndexOf(";"));
+                    qualityControlDTO.setMedHomePage(medHomePageString);
+                    String docAdviceNoteString = StringUtils.isEmpty(docAdviceNote) == true ?"无缺陷" : docAdviceNote.toString().substring(0,  docAdviceNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setDocAdviceNote(docAdviceNoteString);
+                    String operationInfoString = StringUtils.isEmpty(operationInfo) == true ?"无缺陷" : operationInfo.toString().substring(0,  operationInfo.toString().lastIndexOf(";"));
+                    qualityControlDTO.setOperationInfo(operationInfoString);
+                    String courseRecordString = StringUtils.isEmpty(courseRecord) == true ?"无缺陷" : courseRecord.toString().substring(0,  courseRecord.toString().lastIndexOf(";"));
+                    qualityControlDTO.setCourseRecord(courseRecordString);
+                    String otherCaseString = StringUtils.isEmpty(otherCase) == true ?"无缺陷" : otherCase.toString().substring(0,  otherCase.toString().lastIndexOf(";"));
+                    qualityControlDTO.setOtherCase(otherCaseString);
+
+
+                    for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
+                        if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode())&&
+                                StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode())&&
+                                qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
+                            switch (caseScoreDTO.getModelId()) {
+                                case "1":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((admissionNoteScoreOn-qualityControlDTO.getAdmissionNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setAdmissionNoteScore(qualityControlDTO.getAdmissionNoteTolScore()+(admissionNoteScoreTw-admissionNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setAdmissionNoteScore(admissionNoteScoreOn+(admissionNoteScoreTw-admissionNoteScoreOn));
+                                    }
+                                    break;
+                                case "2":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((firstCourseNoteScoreOn-qualityControlDTO.getFirstCourseNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setFirstCourseNoteScore(qualityControlDTO.getFirstCourseNoteTolScore()+(firstCourseNoteScoreTw-firstCourseNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setFirstCourseNoteScore(firstCourseNoteScoreOn+(firstCourseNoteScoreTw-firstCourseNoteScoreOn));
+                                    }
+                                    break;
+                                case "5":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((dischargeNoteScoreOn-qualityControlDTO.getDischargeNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setDischargeNoteScore(qualityControlDTO.getDischargeNoteTolScore()+(dischargeNoteScoreTw-dischargeNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setDischargeNoteScore(dischargeNoteScoreOn+(dischargeNoteScoreTw-dischargeNoteScoreOn));
+                                    }
+                                    break;
+                                case "6":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((medHomePageScoreOn-qualityControlDTO.getMedHomePageTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setMedHomePageScore(qualityControlDTO.getMedHomePageTolScore()+(medHomePageScoreTw-medHomePageScoreOn));
+                                    }else{
+                                        qualityControlDTO.setMedHomePageScore(medHomePageScoreOn+(medHomePageScoreTw-medHomePageScoreOn));
+                                    }
+                                    break;
+                                case "8":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((docAdviceNoteScoreOn-qualityControlDTO.getDocAdviceNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setDocAdviceNoteScore(qualityControlDTO.getDocAdviceNoteTolScore()+(docAdviceNoteScoreTw-docAdviceNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setDocAdviceNoteScore(docAdviceNoteScoreOn+(docAdviceNoteScoreTw-docAdviceNoteScoreOn));
+                                    }
+                                    break;
+                                case "17":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((operationInfoScoreOn-qualityControlDTO.getOperationInfoTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setOperationInfoScore(qualityControlDTO.getOperationInfoTolScore()+(operationInfoScoreTw-operationInfoScoreOn));
+                                    }else{
+                                        qualityControlDTO.setOperationInfoScore(operationInfoScoreOn+(operationInfoScoreTw-operationInfoScoreOn));
+                                    }
+                                    break;
+                                case "56":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((courseRecordScoreOn-qualityControlDTO.getCourseRecordTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setCourseRecordScore(qualityControlDTO.getCourseRecordTolScore()+(courseRecordScoreTw-courseRecordScoreOn));
+                                    }else{
+                                        qualityControlDTO.setCourseRecordScore(courseRecordScoreOn+(courseRecordScoreTw-courseRecordScoreOn));
+                                    }
+                                    break;
+
+                            }
+
+
+
+                        } if(StringUtils.isEmpty(caseScoreDTO.getBehospitalCode())){
+                            QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                            BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                        }
+
+                    };
+                    Double otherScore = new Double(0d);
+                    Double mainScore = new Double(0d);
+                    Double otherCaseScore = null;
+                    Double res = new Double(120d);
+                    Double resPr = new Double(100d);
+                    String scoreType = "0";
+                    mainScore =  qualityControlDTO.getMedHomePageScore()+qualityControlDTO.getAdmissionNoteScore()+qualityControlDTO.getFirstCourseNoteScore()+
+                            qualityControlDTO.getCourseRecordScore()+qualityControlDTO.getOperationInfoScore()+qualityControlDTO.getDischargeNoteScore()+qualityControlDTO. getDocAdviceNoteScore();
+                    scoreType = sysHospitalSetFacade.getScoreType(behospitalPageVO.getHospitalId());
+                    if ("1".equals(scoreType)) {
+                        otherScore = (resPr-qualityControlDTO.getTotalScore()-mainScore);
+                    } else if ("0".equals(scoreType)) {
+                        otherScore = res-(qualityControlDTO.getTotalScore()*res/resPr)-mainScore;
+                    }
+                    otherCaseScore =  Double.valueOf(df.format(otherScore));
+                    qualityControlDTO.setOtherCaseScore(otherCaseScore == null ? 0d : otherCaseScore  );
+                    qualityControlDTO.setTotalScore(rePlaceTolScore);
+                }else{
+                    QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                    BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                }
+            });
+        };
+        return records;
+    }
+
 
     /**
      * 未整改病历统计-科室
@@ -1282,6 +1588,170 @@ public class ConsoleByDeptFacade {
         return unModifyMRDTO;
     }
 
+    private void behospitalPageSet(BehospitalPageVO behospitalPageVO) {
+        //入参验证
+        //入院时间
+        if (null != behospitalPageVO && null != behospitalPageVO.getBehosDateStart()) {
+            behospitalPageVO.setBehosDateStart(DateUtil.getFirstTimeOfDay(behospitalPageVO.getBehosDateStart()));
+        }
+        if (null != behospitalPageVO && null != behospitalPageVO.getBehosDateEnd()) {
+            behospitalPageVO.setBehosDateEnd(DateUtil.getFirstTimeOfDay(DateUtil.addDay(behospitalPageVO.getBehosDateEnd(), 1)));
+        }
+        if (null != behospitalPageVO && null != behospitalPageVO.getBehosDateStart() && null != behospitalPageVO.getBehosDateEnd()) {
+            if (DateUtil.after(behospitalPageVO.getBehosDateStart(), behospitalPageVO.getBehosDateEnd())) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "入院时间的开始时间必须小于结束时间!");
+            }
+        }
+        //出院时间
+        if (null != behospitalPageVO && null != behospitalPageVO.getLeaveHosDateStart()) {
+            behospitalPageVO.setLeaveHosDateStart(DateUtil.getFirstTimeOfDay(behospitalPageVO.getLeaveHosDateStart()));
+        }
+        if (null != behospitalPageVO && null != behospitalPageVO.getLeaveHosDateEnd()) {
+            behospitalPageVO.setLeaveHosDateEnd(DateUtil.getFirstTimeOfDay(DateUtil.addDay(behospitalPageVO.getLeaveHosDateEnd(), 1)));
+        }
+        if (null != behospitalPageVO && null != behospitalPageVO.getLeaveHosDateStart() && null != behospitalPageVO.getLeaveHosDateEnd()) {
+            if (DateUtil.after(behospitalPageVO.getLeaveHosDateStart(), behospitalPageVO.getLeaveHosDateEnd())) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "出院时间的开始时间必须小于结束时间!");
+            }
+        }
+        behospitalPageVO.setHospitalId(Long.parseLong(SysUserUtils.getCurrentHospitalID()));
+        behospitalPageVO.setUserId(Long.valueOf(SysUserUtils.getCurrentPrincipleID()));
+    }
 
+    /**
+     * 评结果分数(长兴)
+     *
+     * @param algorithmVO 操作条目的所有信息
+     * @return 评结果分数
+     */
+    private BigDecimal getScoreForCx(AlgorithmVO algorithmVO) {
+        List<QcResultAlgVO> qcResultAlgHomePage = new ArrayList<>();
+        List<QcResultAlgVO> qcResultAlgHomePageExt = new ArrayList<>();
+        for (QcResultAlgVO qcResultAlgVO : algorithmVO.getQcResultAlgVOList()) {
+            //首页的情况
+            if (qcResultAlgVO.getCasesId().equals(243L)) {
+                qcResultAlgHomePage.add(qcResultAlgVO);
+            } else {
+                //非首页
+                qcResultAlgHomePageExt.add(qcResultAlgVO);
+            }
+        }
+        List<MedQcresultCasesVO> medQcresultCasesVOList = new ArrayList<>();
+        //病案首页
+        AlgorithmVO homePage = new AlgorithmVO();
+        BeanUtil.copyProperties(algorithmVO, homePage);
+        homePage.setQcResultAlgVOList(qcResultAlgHomePage);
+        homePage.setIsHomePage(true);
+        BigDecimal homePageRes = cal(homePage);
+        String level = getHomePageLevel(homePageRes);
+        MedQcresultCasesVO medQcresultCasesVOHp = new MedQcresultCasesVO();
+        medQcresultCasesVOHp.setHospitalId(algorithmVO.getHospitalId());
+        medQcresultCasesVOHp.setBehospitalCode(algorithmVO.getBehospitalCode());
+        medQcresultCasesVOHp.setCasesId(243L);
+        medQcresultCasesVOHp.setScoreRes(homePageRes);
+        medQcresultCasesVOHp.setLevel(level);
+        medQcresultCasesVOList.add(medQcresultCasesVOHp);
+        //病案首页以外
+        AlgorithmVO homePageExt = new AlgorithmVO();
+        BeanUtil.copyProperties(algorithmVO, homePageExt);
+        homePageExt.setQcResultAlgVOList(qcResultAlgHomePageExt);
+        BigDecimal homePageExtRes = cal(homePageExt);
+        MedQcresultCasesVO medQcresultCasesVOHpExt = new MedQcresultCasesVO();
+        medQcresultCasesVOHpExt.setHospitalId(algorithmVO.getHospitalId());
+        medQcresultCasesVOHpExt.setBehospitalCode(algorithmVO.getBehospitalCode());
+        medQcresultCasesVOHpExt.setCasesId(0L);
+        medQcresultCasesVOHpExt.setScoreRes(homePageExtRes);
+        medQcresultCasesVOHpExt.setLevel("");
+        medQcresultCasesVOList.add(medQcresultCasesVOHpExt);
+        algorithmVO.setMedQcresultCasesVOList(medQcresultCasesVOList);
+        //计算分数
+        BigDecimal res = homePageRes
+                .add(homePageExtRes)
+                .multiply(new BigDecimal(100))
+                .divide(new BigDecimal(120), 2, RoundingMode.HALF_UP);
+        // 判断是否是百分制
+        if (sysHospitalSetFacade.getScoreType(algorithmVO.getHospitalId()).equals("1")
+                ||(algorithmVO.getHospitalId().intValue() == 1
+                && StringUtil.isNotBlank(algorithmVO.getIsPlacefile())
+                && algorithmVO.getIsPlacefile().equals("0"))) {
+            res = cal(algorithmVO);
+        }
+        return res;
+    }
+
+    /**
+     * 计算分数
+     *
+     * @param algorithmVO 操作条目的所有信息
+     * @return 评分分数
+     */
+    private BigDecimal cal(AlgorithmVO algorithmVO) {
+        BigDecimal res = new BigDecimal(100);
+        //统一为长兴的算法
+        if (algorithmVO.getIsHomePage().equals(true)) {
+            res = new BigDecimal(20);
+        }
+        //模块总分
+        Map<Long, BigDecimal> casesMap = new HashMap<>();
+        //单票否决计分
+        BigDecimal rejectScore = BigDecimal.ZERO;
+        //模块计分
+        Map<Long, BigDecimal> casesScoreMap = new HashMap<>();
+
+        List<QcResultAlgVO> qcResultAlgVOList = algorithmVO.getQcResultAlgVOList();
+        if (ListUtil.isNotEmpty(qcResultAlgVOList)) {
+            for (QcResultAlgVO qcResultAlgVO : qcResultAlgVOList) {
+                if (!casesMap.containsKey(qcResultAlgVO.getCasesId())) {
+                    casesMap.put(qcResultAlgVO.getCasesId(), qcResultAlgVO.getCasesScore());
+                }
+                if (!casesScoreMap.containsKey(qcResultAlgVO.getCasesId())) {
+                    casesScoreMap.put(qcResultAlgVO.getCasesId(), BigDecimal.ZERO);
+                }
+                //单票否决计分
+                if (qcResultAlgVO.getIsReject().equals(1)) {
+                    rejectScore = rejectScore.add(qcResultAlgVO.getScore());
+                } else {
+                    //非单票否决计分
+                    if (casesScoreMap.containsKey(qcResultAlgVO.getCasesId())) {
+                        BigDecimal casesScore = casesScoreMap.get(qcResultAlgVO.getCasesId());
+                        casesScore = casesScore.add(qcResultAlgVO.getScore());
+                        casesScoreMap.put(qcResultAlgVO.getCasesId(), casesScore);
+                    }
+                }
+            }
+
+            //结果先减去单票否决计分总和
+            res = res.subtract(rejectScore);
+            //结果小于0按0计算
+            if (BigDecimalUtil.lt(res, BigDecimal.ZERO)) {
+                return BigDecimal.ZERO;
+            } else {
+                //模块计分
+                for (Map.Entry<Long, BigDecimal> casesScore : casesScoreMap.entrySet()) {
+                    BigDecimal allSccore = casesMap.get(casesScore.getKey());
+                    if (BigDecimalUtil.le(allSccore, casesScore.getValue())) {
+                        //模块标准分小于等于模块减分总和就用模块标准分
+                        res = res.subtract(allSccore);
+                    } else {
+                        //模块标准分大于模块减分总和就用模块减分总和
+                        res = res.subtract(casesScore.getValue());
+                    }
+                }
+            }
+            //结果小于0按0计算
+            if (BigDecimalUtil.lt(res, BigDecimal.ZERO)) {
+                res = BigDecimal.ZERO;
+            }
+        }
+        return res;
+    }
+    private String getHomePageLevel(BigDecimal score) {
+        String level = "不合格";
+        //得分≥18分为甲级
+        if (BigDecimalUtil.ge(score, new BigDecimal(18))) {
+            level = "合格";
+        }
+        return level;
+    }
 
 }

+ 65 - 9
src/main/java/com/diagbot/facade/ConsoleExportFacade.java

@@ -1,27 +1,25 @@
 package com.diagbot.facade;
 
 import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.diagbot.dto.*;
 import com.diagbot.entity.SysHospitalSet;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
-import com.diagbot.util.BeanUtil;
-import com.diagbot.util.ExcelUtils;
-import com.diagbot.util.ListUtil;
-import com.diagbot.util.StringUtil;
-import com.diagbot.util.SysUserUtils;
+import com.diagbot.util.*;
 import com.diagbot.vo.*;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
+import com.google.gson.JsonObject;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * @Description: 报表导出装饰层
@@ -597,4 +595,62 @@ public class ConsoleExportFacade {
             ExcelUtils.exportExcelUser(resWide, null, "sheet1", ExportWideExcelDTO.class, fileName, response);
         }
     }
+
+
+    /**
+     * 病历质控报表分页导出
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public void qualityControlExport(HttpServletResponse response, BehospitalPageVO behospitalPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        behospitalPageVO.setHospitalId(Long.valueOf(hospitalId));
+
+    Date startDate = behospitalPageVO.getLeaveHosDateStart();
+    Date endDate = behospitalPageVO.getLeaveHosDateEnd();
+    //时间间隔30天
+    long interval = 30 * 24l * 60l * 60l * 1000l;
+        if (endDate.getTime() < startDate.getTime()) {
+        throw new CommonException(CommonErrorCode.PARAM_ERROR, "截止时间不能小于起始时间");
+    }
+        if (endDate.getTime() - startDate.getTime() > interval) {
+        throw new CommonException(CommonErrorCode.PARAM_ERROR, "统计区间不能大于30天");
+    }
+
+        behospitalPageVO.setCurrent(1L);
+        behospitalPageVO.setSize(Long.MAX_VALUE);
+        behospitalPageVO.setSearchCount(false);
+        orderMethod(behospitalPageVO);
+
+        IPage<QualityControlDTO> page = consoleFacade.getQualityControlExport(behospitalPageVO);
+        List<QualityControlDTO> records = page.getRecords();
+
+        String fileName = "病历质控报表详情页.xls";
+        ExcelUtils.exportExcel(records, null, "sheet1", QualityControlDTO.class, fileName, response, 26.8f);
+    }
+
+   static void orderMethod(BehospitalPageVO behospitalPageVO){
+       List orders = behospitalPageVO.getOrders();
+       Boolean flag= false;
+       List<OrderItem> itemList = new ArrayList<>();
+       for (Object order : orders) {
+           ObjectMapper objectMapper = new ObjectMapper();
+           OrderItem orderName = objectMapper.convertValue(order, OrderItem.class);
+           itemList.add(orderName);
+           if(!orderName.getColumn().equals("deptName")){
+               flag = true;
+           }
+       }
+       //科室作为第一升序排列,传入排序随后 配合excel注解属性mergeVertical处理科室合并
+       if(flag){
+           OrderItem orderItem = new OrderItem();
+           orderItem.setAsc(true);
+           orderItem.setColumn("deptName");
+           itemList.add(orderItem);
+           Collections.reverse(itemList);
+           behospitalPageVO.setOrders(itemList);
+       }
+
+   };
 }

+ 733 - 3
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -9,12 +9,14 @@ import com.diagbot.aggregate.ResultStatisticsAggregate;
 import com.diagbot.dto.*;
 import com.diagbot.entity.QcCasesEntry;
 import com.diagbot.entity.SysHospitalSet;
+import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.util.*;
 import com.diagbot.vo.*;
 import com.google.common.collect.Lists;
 import io.github.lvyahui8.spring.aggregate.facade.DataBeanAggregateQueryFacade;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -1251,13 +1253,605 @@ public class ConsoleFacade {
      * @param behospitalPageVO
      * @return
      */
-    public List<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO) {
+    public IPage<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO) {
         behospitalPageSet(behospitalPageVO);
-      //  QualityCaseScoreDTO qualityCaseScoreDTO =  behospitalInfoFacade.getQualityCaseSorce(behospitalPageVO);
-        List<QualityControlDTO> records = behospitalInfoFacade.getQualityControl(behospitalPageVO);
+        DecimalFormat df=new DecimalFormat("0.0");
+        IPage<QualityControlDTO> records = behospitalInfoFacade.getQualityControl(behospitalPageVO);
+        List<QualityControlDTO> qualityControlDTOs = records.getRecords();
+        CaseScoreVO caseScoreVO = new CaseScoreVO();
+        BeanUtil.copyProperties(behospitalPageVO,caseScoreVO);
+        List<CaseScoreDTO>caseScoreDTOS= behospitalInfoFacade.getQualityCaseSorce(caseScoreVO);
+        if(ListUtil.isNotEmpty(qualityControlDTOs)){
+        qualityControlDTOs.forEach(qualityControlDTO->{
+            Double rePlaceTolScore = qualityControlDTO.getTotalScore();
+            StringBuffer admissionNote = new StringBuffer();
+            StringBuffer firstCourseNote = new StringBuffer();
+            StringBuffer dischargeNote = new StringBuffer();
+            StringBuffer medHomePage = new StringBuffer();
+            StringBuffer docAdviceNote = new StringBuffer();
+            StringBuffer operationInfo = new StringBuffer();
+            StringBuffer courseRecord = new StringBuffer();
+            StringBuffer otherCase = new StringBuffer();
+            Double admissionNoteScoreOn = 0d;
+            Double admissionNoteScoreTw = 0d;
+            Double firstCourseNoteScoreOn = 0d;
+            Double firstCourseNoteScoreTw = 0d;
+            Double dischargeNoteScoreOn = 0d;
+            Double dischargeNoteScoreTw = 0d;
+            Double medHomePageScoreOn = 0d;
+            Double medHomePageScoreTw = 0d;
+            Double docAdviceNoteScoreOn = 0d;
+            Double docAdviceNoteScoreTw = 0d;
+            Double operationInfoScoreOn = 0d;
+            Double operationInfoScoreTw = 0d;
+            Double courseRecordScoreOn = 0d;
+            Double courseRecordScoreTw = 0d;
+            if(ListUtil.isNotEmpty(caseScoreDTOS)){
+                AlgorithmVO algorithmVO = new AlgorithmVO();
+              BeanUtil.copyProperties(behospitalPageVO,algorithmVO);
+                algorithmVO.setType(0);
+                List<QcResultAlgVO> qcResultAlgVOList = new ArrayList<QcResultAlgVO>();
+            for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
+                        if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode())&&
+                                StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode())&&
+                                qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
+                            double targetScore =  Double.valueOf(df.format(caseScoreDTO.getScore()));
+
+                            QcResultAlgVO qcResultAlgVO = new QcResultAlgVO();
+                            BeanUtil.copyProperties(caseScoreDTO,qcResultAlgVO);
+                            qcResultAlgVO.setIsReject(Integer.valueOf(caseScoreDTO.getIsReject()));
+                            qcResultAlgVO.setScore(new BigDecimal(caseScoreDTO.getScore()));
+                            qcResultAlgVO.setCasesScore(new BigDecimal(caseScoreDTO.getCasesScore()));
+                            qcResultAlgVOList.add(qcResultAlgVO);
+
+                            switch (caseScoreDTO.getModelId()) {
+                                case "1":
+                                    String admissionMsg = caseScoreDTO.getMsg() + ";";
+                                    admissionNote.append(admissionMsg);
+                                    //对单个modeId进行扣分总和计算
+                                    //非单项否决总分
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        admissionNoteScoreOn += targetScore;
+                                        admissionNoteScoreOn = Double.valueOf(df.format(admissionNoteScoreOn));
+                                    }
+
+                                    //扣分总和
+                                    admissionNoteScoreTw += targetScore;
+                                    admissionNoteScoreTw = Double.valueOf(df.format(admissionNoteScoreTw));
+                                    qualityControlDTO.setAdmissionNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "2":
+                                    String firstCourseNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    firstCourseNote.append(firstCourseNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        firstCourseNoteScoreOn +=targetScore;
+                                        firstCourseNoteScoreOn = Double.valueOf(df.format(firstCourseNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    firstCourseNoteScoreTw += targetScore;
+                                    firstCourseNoteScoreTw = Double.valueOf(df.format(firstCourseNoteScoreTw));
+                                    qualityControlDTO.setFirstCourseNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "5":
+                                    String dischargeNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    dischargeNote.append(dischargeNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        dischargeNoteScoreOn += targetScore;
+                                        dischargeNoteScoreOn = Double.valueOf(df.format(dischargeNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    dischargeNoteScoreTw += targetScore;
+                                    dischargeNoteScoreTw = Double.valueOf(df.format(dischargeNoteScoreTw));
+                                    qualityControlDTO.setDischargeNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "6":
+                                    String medHomePageMsg = caseScoreDTO.getMsg() + ";";
+                                    medHomePage.append(medHomePageMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        medHomePageScoreOn += targetScore;
+                                        medHomePageScoreOn = Double.valueOf(df.format(medHomePageScoreOn));
+                                    }
+                                    //扣分总和
+                                    medHomePageScoreTw += targetScore;
+                                   medHomePageScoreTw = Double.valueOf(df.format(medHomePageScoreTw));
+                                    qualityControlDTO.setMedHomePageTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "8":
+                                    String docAdviceNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    docAdviceNote.append(docAdviceNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        docAdviceNoteScoreOn += targetScore;
+                                        docAdviceNoteScoreOn = Double.valueOf(df.format(docAdviceNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    docAdviceNoteScoreTw += targetScore;
+                                    docAdviceNoteScoreTw = Double.valueOf(df.format(docAdviceNoteScoreTw));
+                                    qualityControlDTO.setDocAdviceNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "17":
+                                    String operationInfoMsg = caseScoreDTO.getMsg() + ";";
+                                    operationInfo.append(operationInfoMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        operationInfoScoreOn += targetScore;
+                                        operationInfoScoreOn = Double.valueOf(df.format(operationInfoScoreOn));
+                                    }
+                                    //扣分总和
+                                    operationInfoScoreTw += targetScore;
+                                    operationInfoScoreTw = Double.valueOf(df.format(operationInfoScoreTw));
+                                    qualityControlDTO.setOperationInfoTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "56":
+                                    String courseRecordMsg = caseScoreDTO.getMsg() + ";";
+                                    courseRecord.append(courseRecordMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        courseRecordScoreOn += targetScore;
+                                        courseRecordScoreOn = Double.valueOf(df.format(courseRecordScoreOn));
+                                    }
+                                    //扣分总和
+                                    courseRecordScoreTw += targetScore;
+                                    courseRecordScoreTw = Double.valueOf(df.format(courseRecordScoreTw));
+                                    qualityControlDTO.setCourseRecordTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+
+                            }
+
+                            String modelId = caseScoreDTO.getModelId();
+                            if(!(modelId.equals("1")||modelId.equals("2")||modelId.equals("5")||modelId.equals("6")||
+                                    modelId.equals("8")||modelId.equals("17")||modelId.equals("56"))){
+                                String otherCaseMsg = caseScoreDTO.getMsg() + ";";
+                                otherCase.append(otherCaseMsg);
+                            }
+                            //未评分
+                        }
+                        if(StringUtils.isEmpty(caseScoreDTO.getBehospitalCode())){
+                            QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                            BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                           break;
+                        }
+                    };
+                algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
+                Double toltalScore = getScoreForCx(algorithmVO).doubleValue();
+                qualityControlDTO.setTotalScore(toltalScore);
+                qualityControlDTO.setAdmissionNoteScoreOn(admissionNoteScoreOn);
+             qualityControlDTO.setAdmissionNoteScoreTw(admissionNoteScoreTw);
+             qualityControlDTO.setFirstCourseNoteScoreOn(firstCourseNoteScoreOn);
+             qualityControlDTO.setFirstCourseNoteScoreTw(firstCourseNoteScoreTw);
+             qualityControlDTO.setDischargeNoteScoreOn(dischargeNoteScoreOn);
+             qualityControlDTO.setDischargeNoteScoreTw(dischargeNoteScoreTw);
+             qualityControlDTO.setMedHomePageScoreOn(medHomePageScoreOn);
+             qualityControlDTO.setMedHomePageScoreTw(medHomePageScoreTw);
+             qualityControlDTO.setDocAdviceNoteScoreOn(docAdviceNoteScoreOn);
+             qualityControlDTO.setDocAdviceNoteScoreTw(docAdviceNoteScoreTw);
+             qualityControlDTO.setOperationInfoScoreOn(operationInfoScoreOn);
+             qualityControlDTO.setOperationInfoScoreTw(operationInfoScoreTw);
+             qualityControlDTO.setCourseRecordScoreOn(courseRecordScoreOn);
+             qualityControlDTO.setCourseRecordScoreTw(courseRecordScoreTw);
+
+            String admissionNoteString = StringUtils.isEmpty(admissionNote) == true ?"无缺陷" : admissionNote.toString().substring(0,  admissionNote.toString().lastIndexOf(";"));
+            qualityControlDTO.setAdmissionNote(admissionNoteString);
+            String firstCourseNoteString = StringUtils.isEmpty(firstCourseNote) == true ?"无缺陷" :firstCourseNote.toString().substring(0,  firstCourseNote.toString().lastIndexOf(";"));
+            qualityControlDTO.setFirstCourseNote(firstCourseNoteString);
+            String dischargeNoteString = StringUtils.isEmpty(dischargeNote) == true ?"无缺陷" : dischargeNote.toString().substring(0,  dischargeNote.toString().lastIndexOf(";"));
+            qualityControlDTO.setDischargeNote(dischargeNoteString);
+            String medHomePageString = StringUtils.isEmpty(medHomePage) == true ?"无缺陷" : medHomePage.toString().substring(0,  medHomePage.toString().lastIndexOf(";"));
+            qualityControlDTO.setMedHomePage(medHomePageString);
+            String docAdviceNoteString = StringUtils.isEmpty(docAdviceNote) == true ?"无缺陷" : docAdviceNote.toString().substring(0,  docAdviceNote.toString().lastIndexOf(";"));
+            qualityControlDTO.setDocAdviceNote(docAdviceNoteString);
+            String operationInfoString = StringUtils.isEmpty(operationInfo) == true ?"无缺陷" : operationInfo.toString().substring(0,  operationInfo.toString().lastIndexOf(";"));
+            qualityControlDTO.setOperationInfo(operationInfoString);
+            String courseRecordString = StringUtils.isEmpty(courseRecord) == true ?"无缺陷" : courseRecord.toString().substring(0,  courseRecord.toString().lastIndexOf(";"));
+            qualityControlDTO.setCourseRecord(courseRecordString);
+            String otherCaseString = StringUtils.isEmpty(otherCase) == true ?"无缺陷" : otherCase.toString().substring(0,  otherCase.toString().lastIndexOf(";"));
+            qualityControlDTO.setOtherCase(otherCaseString);
+
+
+            for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
+                if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode())&&
+                        StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode())&&
+                        qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
+                    switch (caseScoreDTO.getModelId()) {
+                        case "1":
+                              //  非单项否决总扣分大于扣分总和
+                            if((admissionNoteScoreOn-qualityControlDTO.getAdmissionNoteTolScore())>=0){
+                                //扣分总和+单项否决总分
+                                qualityControlDTO.setAdmissionNoteScore(qualityControlDTO.getAdmissionNoteTolScore()+(admissionNoteScoreTw-admissionNoteScoreOn));
+                            }else{
+                                qualityControlDTO.setAdmissionNoteScore(admissionNoteScoreOn+(admissionNoteScoreTw-admissionNoteScoreOn));
+                            }
+                            break;
+                        case "2":
+                            //  非单项否决总扣分大于扣分总和
+                            if((firstCourseNoteScoreOn-qualityControlDTO.getFirstCourseNoteTolScore())>=0){
+                                //扣分总和+单项否决总分
+                                qualityControlDTO.setFirstCourseNoteScore(qualityControlDTO.getFirstCourseNoteTolScore()+(firstCourseNoteScoreTw-firstCourseNoteScoreOn));
+                            }else{
+                                qualityControlDTO.setFirstCourseNoteScore(firstCourseNoteScoreOn+(firstCourseNoteScoreTw-firstCourseNoteScoreOn));
+                            }
+                            break;
+                        case "5":
+                            //  非单项否决总扣分大于扣分总和
+                            if((dischargeNoteScoreOn-qualityControlDTO.getDischargeNoteTolScore())>=0){
+                                //扣分总和+单项否决总分
+                                qualityControlDTO.setDischargeNoteScore(qualityControlDTO.getDischargeNoteTolScore()+(dischargeNoteScoreTw-dischargeNoteScoreOn));
+                            }else{
+                                qualityControlDTO.setDischargeNoteScore(dischargeNoteScoreOn+(dischargeNoteScoreTw-dischargeNoteScoreOn));
+                            }
+                            break;
+                        case "6":
+                            //  非单项否决总扣分大于扣分总和
+                            if((medHomePageScoreOn-qualityControlDTO.getMedHomePageTolScore())>=0){
+                                //扣分总和+单项否决总分
+                                qualityControlDTO.setMedHomePageScore(qualityControlDTO.getMedHomePageTolScore()+(medHomePageScoreTw-medHomePageScoreOn));
+                            }else{
+                                qualityControlDTO.setMedHomePageScore(medHomePageScoreOn+(medHomePageScoreTw-medHomePageScoreOn));
+                            }
+                            break;
+                        case "8":
+                            //  非单项否决总扣分大于扣分总和
+                            if((docAdviceNoteScoreOn-qualityControlDTO.getDocAdviceNoteTolScore())>=0){
+                                //扣分总和+单项否决总分
+                                qualityControlDTO.setDocAdviceNoteScore(qualityControlDTO.getDocAdviceNoteTolScore()+(docAdviceNoteScoreTw-docAdviceNoteScoreOn));
+                            }else{
+                                qualityControlDTO.setDocAdviceNoteScore(docAdviceNoteScoreOn+(docAdviceNoteScoreTw-docAdviceNoteScoreOn));
+                            }
+                            break;
+                        case "17":
+                            //  非单项否决总扣分大于扣分总和
+                            if((operationInfoScoreOn-qualityControlDTO.getOperationInfoTolScore())>=0){
+                                //扣分总和+单项否决总分
+                                qualityControlDTO.setOperationInfoScore(qualityControlDTO.getOperationInfoTolScore()+(operationInfoScoreTw-operationInfoScoreOn));
+                            }else{
+                                qualityControlDTO.setOperationInfoScore(operationInfoScoreOn+(operationInfoScoreTw-operationInfoScoreOn));
+                            }
+                            break;
+                        case "56":
+                            //  非单项否决总扣分大于扣分总和
+                            if((courseRecordScoreOn-qualityControlDTO.getCourseRecordTolScore())>=0){
+                                //扣分总和+单项否决总分
+                                qualityControlDTO.setCourseRecordScore(qualityControlDTO.getCourseRecordTolScore()+(courseRecordScoreTw-courseRecordScoreOn));
+                            }else{
+                                qualityControlDTO.setCourseRecordScore(courseRecordScoreOn+(courseRecordScoreTw-courseRecordScoreOn));
+                            }
+                            break;
+
+                    }
+
+
+
+                } if(StringUtils.isEmpty(caseScoreDTO.getBehospitalCode())){
+                    QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                    BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                }
+
+            };
+                Double otherScore = new Double(0d);
+                Double mainScore = new Double(0d);
+                Double otherCaseScore = null;
+                Double res = new Double(120d);
+                Double resPr = new Double(100d);
+                String scoreType = "0";
+                mainScore =  qualityControlDTO.getMedHomePageScore()+qualityControlDTO.getAdmissionNoteScore()+qualityControlDTO.getFirstCourseNoteScore()+
+                        qualityControlDTO.getCourseRecordScore()+qualityControlDTO.getOperationInfoScore()+qualityControlDTO.getDischargeNoteScore()+qualityControlDTO. getDocAdviceNoteScore();
+                scoreType = sysHospitalSetFacade.getScoreType(behospitalPageVO.getHospitalId());
+                if ("1".equals(scoreType)) {
+                    otherScore = (resPr-qualityControlDTO.getTotalScore()-mainScore);
+                } else if ("0".equals(scoreType)) {
+                    otherScore = res-(qualityControlDTO.getTotalScore()*res/resPr)-mainScore;
+                }
+                otherCaseScore =  Double.valueOf(df.format(otherScore));
+                qualityControlDTO.setOtherCaseScore(otherCaseScore == null ? 0d : otherCaseScore  );
+                qualityControlDTO.setTotalScore(rePlaceTolScore);
+            }else{
+                QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+            }
+        });
+        };
         return records;
     }
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public IPage<QualityControlDTO> getQualityControlExport(BehospitalPageVO behospitalPageVO) {
+        behospitalPageSet(behospitalPageVO);
+        DecimalFormat df=new DecimalFormat("0.0");
+        IPage<QualityControlDTO> records = behospitalInfoFacade.getQualityControl(behospitalPageVO);
+        List<QualityControlDTO> qualityControlDTOs = records.getRecords();
+        CaseScoreVO caseScoreVO = new CaseScoreVO();
+        BeanUtil.copyProperties(behospitalPageVO,caseScoreVO);
+        List<CaseScoreDTO>caseScoreDTOS= behospitalInfoFacade.getQualityCaseSorce(caseScoreVO);
+        if(ListUtil.isNotEmpty(qualityControlDTOs)){
+            qualityControlDTOs.forEach(qualityControlDTO->{
+                Double rePlaceTolScore = qualityControlDTO.getTotalScore();
+                StringBuffer admissionNote = new StringBuffer();
+                StringBuffer firstCourseNote = new StringBuffer();
+                StringBuffer dischargeNote = new StringBuffer();
+                StringBuffer medHomePage = new StringBuffer();
+                StringBuffer docAdviceNote = new StringBuffer();
+                StringBuffer operationInfo = new StringBuffer();
+                StringBuffer courseRecord = new StringBuffer();
+                StringBuffer otherCase = new StringBuffer();
+                Double admissionNoteScoreOn = 0d;
+                Double admissionNoteScoreTw = 0d;
+                Double firstCourseNoteScoreOn = 0d;
+                Double firstCourseNoteScoreTw = 0d;
+                Double dischargeNoteScoreOn = 0d;
+                Double dischargeNoteScoreTw = 0d;
+                Double medHomePageScoreOn = 0d;
+                Double medHomePageScoreTw = 0d;
+                Double docAdviceNoteScoreOn = 0d;
+                Double docAdviceNoteScoreTw = 0d;
+                Double operationInfoScoreOn = 0d;
+                Double operationInfoScoreTw = 0d;
+                Double courseRecordScoreOn = 0d;
+                Double courseRecordScoreTw = 0d;
+                if(ListUtil.isNotEmpty(caseScoreDTOS)){
+                    AlgorithmVO algorithmVO = new AlgorithmVO();
+                    BeanUtil.copyProperties(behospitalPageVO,algorithmVO);
+                    algorithmVO.setType(0);
+                    List<QcResultAlgVO> qcResultAlgVOList = new ArrayList<QcResultAlgVO>();
+                    for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
+                        if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode())&&
+                                StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode())&&
+                                qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
+                            double targetScore =  Double.valueOf(df.format(caseScoreDTO.getScore()));
+
+                            QcResultAlgVO qcResultAlgVO = new QcResultAlgVO();
+                            BeanUtil.copyProperties(caseScoreDTO,qcResultAlgVO);
+                            qcResultAlgVO.setIsReject(Integer.valueOf(caseScoreDTO.getIsReject()));
+                            qcResultAlgVO.setScore(new BigDecimal(caseScoreDTO.getScore()));
+                            qcResultAlgVO.setCasesScore(new BigDecimal(caseScoreDTO.getCasesScore()));
+                            qcResultAlgVOList.add(qcResultAlgVO);
+
+                            switch (caseScoreDTO.getModelId()) {
+                                case "1":
+                                    String admissionMsg = caseScoreDTO.getMsg() + ";";
+                                    admissionNote.append(admissionMsg);
+                                    //对单个modeId进行扣分总和计算
+                                    //非单项否决总分
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        admissionNoteScoreOn += targetScore;
+                                        admissionNoteScoreOn = Double.valueOf(df.format(admissionNoteScoreOn));
+                                    }
+
+                                    //扣分总和
+                                    admissionNoteScoreTw += targetScore;
+                                    admissionNoteScoreTw = Double.valueOf(df.format(admissionNoteScoreTw));
+                                    qualityControlDTO.setAdmissionNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "2":
+                                    String firstCourseNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    firstCourseNote.append(firstCourseNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        firstCourseNoteScoreOn +=targetScore;
+                                        firstCourseNoteScoreOn = Double.valueOf(df.format(firstCourseNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    firstCourseNoteScoreTw += targetScore;
+                                    firstCourseNoteScoreTw = Double.valueOf(df.format(firstCourseNoteScoreTw));
+                                    qualityControlDTO.setFirstCourseNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "5":
+                                    String dischargeNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    dischargeNote.append(dischargeNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        dischargeNoteScoreOn += targetScore;
+                                        dischargeNoteScoreOn = Double.valueOf(df.format(dischargeNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    dischargeNoteScoreTw += targetScore;
+                                    dischargeNoteScoreTw = Double.valueOf(df.format(dischargeNoteScoreTw));
+                                    qualityControlDTO.setDischargeNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "6":
+                                    String medHomePageMsg = caseScoreDTO.getMsg() + ";";
+                                    medHomePage.append(medHomePageMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        medHomePageScoreOn += targetScore;
+                                        medHomePageScoreOn = Double.valueOf(df.format(medHomePageScoreOn));
+                                    }
+                                    //扣分总和
+                                    medHomePageScoreTw += targetScore;
+                                    medHomePageScoreTw = Double.valueOf(df.format(medHomePageScoreTw));
+                                    qualityControlDTO.setMedHomePageTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "8":
+                                    String docAdviceNoteMsg = caseScoreDTO.getMsg() + ";";
+                                    docAdviceNote.append(docAdviceNoteMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        docAdviceNoteScoreOn += targetScore;
+                                        docAdviceNoteScoreOn = Double.valueOf(df.format(docAdviceNoteScoreOn));
+                                    }
+                                    //扣分总和
+                                    docAdviceNoteScoreTw += targetScore;
+                                    docAdviceNoteScoreTw = Double.valueOf(df.format(docAdviceNoteScoreTw));
+                                    qualityControlDTO.setDocAdviceNoteTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "17":
+                                    String operationInfoMsg = caseScoreDTO.getMsg() + ";";
+                                    operationInfo.append(operationInfoMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        operationInfoScoreOn += targetScore;
+                                        operationInfoScoreOn = Double.valueOf(df.format(operationInfoScoreOn));
+                                    }
+                                    //扣分总和
+                                    operationInfoScoreTw += targetScore;
+                                    operationInfoScoreTw = Double.valueOf(df.format(operationInfoScoreTw));
+                                    qualityControlDTO.setOperationInfoTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+                                case "56":
+                                    String courseRecordMsg = caseScoreDTO.getMsg() + ";";
+                                    courseRecord.append(courseRecordMsg);
+                                    if (caseScoreDTO.getIsReject().equals("0")) {
+                                        courseRecordScoreOn += targetScore;
+                                        courseRecordScoreOn = Double.valueOf(df.format(courseRecordScoreOn));
+                                    }
+                                    //扣分总和
+                                    courseRecordScoreTw += targetScore;
+                                    courseRecordScoreTw = Double.valueOf(df.format(courseRecordScoreTw));
+                                    qualityControlDTO.setCourseRecordTolScore(caseScoreDTO.getCasesScore());
+                                    break;
+
+                            }
+
+                            String modelId = caseScoreDTO.getModelId();
+                            if(!(modelId.equals("1")||modelId.equals("2")||modelId.equals("5")||modelId.equals("6")||
+                                    modelId.equals("8")||modelId.equals("17")||modelId.equals("56"))){
+                                String otherCaseMsg = caseScoreDTO.getMsg() + ";";
+                                otherCase.append(otherCaseMsg);
+                            }
+                            //未评分
+                        }
+                        if(StringUtils.isEmpty(caseScoreDTO.getBehospitalCode())){
+                            QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                            BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                            break;
+                        }
+                    };
+                    algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
+                    Double toltalScore = getScoreForCx(algorithmVO).doubleValue();
+                    qualityControlDTO.setTotalScore(toltalScore);
+                    qualityControlDTO.setAdmissionNoteScoreOn(admissionNoteScoreOn);
+                    qualityControlDTO.setAdmissionNoteScoreTw(admissionNoteScoreTw);
+                    qualityControlDTO.setFirstCourseNoteScoreOn(firstCourseNoteScoreOn);
+                    qualityControlDTO.setFirstCourseNoteScoreTw(firstCourseNoteScoreTw);
+                    qualityControlDTO.setDischargeNoteScoreOn(dischargeNoteScoreOn);
+                    qualityControlDTO.setDischargeNoteScoreTw(dischargeNoteScoreTw);
+                    qualityControlDTO.setMedHomePageScoreOn(medHomePageScoreOn);
+                    qualityControlDTO.setMedHomePageScoreTw(medHomePageScoreTw);
+                    qualityControlDTO.setDocAdviceNoteScoreOn(docAdviceNoteScoreOn);
+                    qualityControlDTO.setDocAdviceNoteScoreTw(docAdviceNoteScoreTw);
+                    qualityControlDTO.setOperationInfoScoreOn(operationInfoScoreOn);
+                    qualityControlDTO.setOperationInfoScoreTw(operationInfoScoreTw);
+                    qualityControlDTO.setCourseRecordScoreOn(courseRecordScoreOn);
+                    qualityControlDTO.setCourseRecordScoreTw(courseRecordScoreTw);
+
+                    String admissionNoteString = StringUtils.isEmpty(admissionNote) == true ?"无缺陷" : admissionNote.toString().substring(0,  admissionNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setAdmissionNote(admissionNoteString);
+                    String firstCourseNoteString = StringUtils.isEmpty(firstCourseNote) == true ?"无缺陷" :firstCourseNote.toString().substring(0,  firstCourseNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setFirstCourseNote(firstCourseNoteString);
+                    String dischargeNoteString = StringUtils.isEmpty(dischargeNote) == true ?"无缺陷" : dischargeNote.toString().substring(0,  dischargeNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setDischargeNote(dischargeNoteString);
+                    String medHomePageString = StringUtils.isEmpty(medHomePage) == true ?"无缺陷" : medHomePage.toString().substring(0,  medHomePage.toString().lastIndexOf(";"));
+                    qualityControlDTO.setMedHomePage(medHomePageString);
+                    String docAdviceNoteString = StringUtils.isEmpty(docAdviceNote) == true ?"无缺陷" : docAdviceNote.toString().substring(0,  docAdviceNote.toString().lastIndexOf(";"));
+                    qualityControlDTO.setDocAdviceNote(docAdviceNoteString);
+                    String operationInfoString = StringUtils.isEmpty(operationInfo) == true ?"无缺陷" : operationInfo.toString().substring(0,  operationInfo.toString().lastIndexOf(";"));
+                    qualityControlDTO.setOperationInfo(operationInfoString);
+                    String courseRecordString = StringUtils.isEmpty(courseRecord) == true ?"无缺陷" : courseRecord.toString().substring(0,  courseRecord.toString().lastIndexOf(";"));
+                    qualityControlDTO.setCourseRecord(courseRecordString);
+                    String otherCaseString = StringUtils.isEmpty(otherCase) == true ?"无缺陷" : otherCase.toString().substring(0,  otherCase.toString().lastIndexOf(";"));
+                    qualityControlDTO.setOtherCase(otherCaseString);
+
+
+                    for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
+                        if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode())&&
+                                StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode())&&
+                                qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
+                            switch (caseScoreDTO.getModelId()) {
+                                case "1":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((admissionNoteScoreOn-qualityControlDTO.getAdmissionNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setAdmissionNoteScore(qualityControlDTO.getAdmissionNoteTolScore()+(admissionNoteScoreTw-admissionNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setAdmissionNoteScore(admissionNoteScoreOn+(admissionNoteScoreTw-admissionNoteScoreOn));
+                                    }
+                                    break;
+                                case "2":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((firstCourseNoteScoreOn-qualityControlDTO.getFirstCourseNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setFirstCourseNoteScore(qualityControlDTO.getFirstCourseNoteTolScore()+(firstCourseNoteScoreTw-firstCourseNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setFirstCourseNoteScore(firstCourseNoteScoreOn+(firstCourseNoteScoreTw-firstCourseNoteScoreOn));
+                                    }
+                                    break;
+                                case "5":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((dischargeNoteScoreOn-qualityControlDTO.getDischargeNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setDischargeNoteScore(qualityControlDTO.getDischargeNoteTolScore()+(dischargeNoteScoreTw-dischargeNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setDischargeNoteScore(dischargeNoteScoreOn+(dischargeNoteScoreTw-dischargeNoteScoreOn));
+                                    }
+                                    break;
+                                case "6":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((medHomePageScoreOn-qualityControlDTO.getMedHomePageTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setMedHomePageScore(qualityControlDTO.getMedHomePageTolScore()+(medHomePageScoreTw-medHomePageScoreOn));
+                                    }else{
+                                        qualityControlDTO.setMedHomePageScore(medHomePageScoreOn+(medHomePageScoreTw-medHomePageScoreOn));
+                                    }
+                                    break;
+                                case "8":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((docAdviceNoteScoreOn-qualityControlDTO.getDocAdviceNoteTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setDocAdviceNoteScore(qualityControlDTO.getDocAdviceNoteTolScore()+(docAdviceNoteScoreTw-docAdviceNoteScoreOn));
+                                    }else{
+                                        qualityControlDTO.setDocAdviceNoteScore(docAdviceNoteScoreOn+(docAdviceNoteScoreTw-docAdviceNoteScoreOn));
+                                    }
+                                    break;
+                                case "17":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((operationInfoScoreOn-qualityControlDTO.getOperationInfoTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setOperationInfoScore(qualityControlDTO.getOperationInfoTolScore()+(operationInfoScoreTw-operationInfoScoreOn));
+                                    }else{
+                                        qualityControlDTO.setOperationInfoScore(operationInfoScoreOn+(operationInfoScoreTw-operationInfoScoreOn));
+                                    }
+                                    break;
+                                case "56":
+                                    //  非单项否决总扣分大于扣分总和
+                                    if((courseRecordScoreOn-qualityControlDTO.getCourseRecordTolScore())>=0){
+                                        //扣分总和+单项否决总分
+                                        qualityControlDTO.setCourseRecordScore(qualityControlDTO.getCourseRecordTolScore()+(courseRecordScoreTw-courseRecordScoreOn));
+                                    }else{
+                                        qualityControlDTO.setCourseRecordScore(courseRecordScoreOn+(courseRecordScoreTw-courseRecordScoreOn));
+                                    }
+                                    break;
+
+                            }
+
+
+
+                        } if(StringUtils.isEmpty(caseScoreDTO.getBehospitalCode())){
+                            QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                            BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                        }
+
+                    };
+                    Double otherScore = new Double(0d);
+                    Double mainScore = new Double(0d);
+                    Double otherCaseScore = null;
+                    Double res = new Double(120d);
+                    Double resPr = new Double(100d);
+                    String scoreType = "0";
+                    mainScore =  qualityControlDTO.getMedHomePageScore()+qualityControlDTO.getAdmissionNoteScore()+qualityControlDTO.getFirstCourseNoteScore()+
+                            qualityControlDTO.getCourseRecordScore()+qualityControlDTO.getOperationInfoScore()+qualityControlDTO.getDischargeNoteScore()+qualityControlDTO. getDocAdviceNoteScore();
+                    scoreType = sysHospitalSetFacade.getScoreType(behospitalPageVO.getHospitalId());
+                    if ("1".equals(scoreType)) {
+                        otherScore = (resPr-qualityControlDTO.getTotalScore()-mainScore);
+                    } else if ("0".equals(scoreType)) {
+                        otherScore = res-(qualityControlDTO.getTotalScore()*res/resPr)-mainScore;
+                    }
+                    otherCaseScore =  Double.valueOf(df.format(otherScore));
+                    qualityControlDTO.setOtherCaseScore(otherCaseScore == null ? 0d : otherCaseScore  );
+                    qualityControlDTO.setTotalScore(rePlaceTolScore);
+                }else{
+                    QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
+                    BeanUtil.copyProperties(qualityControlNullDTO,qualityControlDTO);
+                }
+            });
+        };
+        return records;
+    }
     private void behospitalPageSet(BehospitalPageVO behospitalPageVO) {
         //入参验证
         //入院时间
@@ -2226,5 +2820,141 @@ public class ConsoleFacade {
 
         return columns;
     }
+
+    /**
+     * 评结果分数(长兴)
+     *
+     * @param algorithmVO 操作条目的所有信息
+     * @return 评结果分数
+     */
+    private BigDecimal getScoreForCx(AlgorithmVO algorithmVO) {
+        List<QcResultAlgVO> qcResultAlgHomePage = new ArrayList<>();
+        List<QcResultAlgVO> qcResultAlgHomePageExt = new ArrayList<>();
+        for (QcResultAlgVO qcResultAlgVO : algorithmVO.getQcResultAlgVOList()) {
+            //首页的情况
+            if (qcResultAlgVO.getCasesId().equals(243L)) {
+                qcResultAlgHomePage.add(qcResultAlgVO);
+            } else {
+                //非首页
+                qcResultAlgHomePageExt.add(qcResultAlgVO);
+            }
+        }
+        List<MedQcresultCasesVO> medQcresultCasesVOList = new ArrayList<>();
+        //病案首页
+        AlgorithmVO homePage = new AlgorithmVO();
+        BeanUtil.copyProperties(algorithmVO, homePage);
+        homePage.setQcResultAlgVOList(qcResultAlgHomePage);
+        homePage.setIsHomePage(true);
+        BigDecimal homePageRes = cal(homePage);
+        String level = getHomePageLevel(homePageRes);
+        MedQcresultCasesVO medQcresultCasesVOHp = new MedQcresultCasesVO();
+        medQcresultCasesVOHp.setHospitalId(algorithmVO.getHospitalId());
+        medQcresultCasesVOHp.setBehospitalCode(algorithmVO.getBehospitalCode());
+        medQcresultCasesVOHp.setCasesId(243L);
+        medQcresultCasesVOHp.setScoreRes(homePageRes);
+        medQcresultCasesVOHp.setLevel(level);
+        medQcresultCasesVOList.add(medQcresultCasesVOHp);
+        //病案首页以外
+        AlgorithmVO homePageExt = new AlgorithmVO();
+        BeanUtil.copyProperties(algorithmVO, homePageExt);
+        homePageExt.setQcResultAlgVOList(qcResultAlgHomePageExt);
+        BigDecimal homePageExtRes = cal(homePageExt);
+        MedQcresultCasesVO medQcresultCasesVOHpExt = new MedQcresultCasesVO();
+        medQcresultCasesVOHpExt.setHospitalId(algorithmVO.getHospitalId());
+        medQcresultCasesVOHpExt.setBehospitalCode(algorithmVO.getBehospitalCode());
+        medQcresultCasesVOHpExt.setCasesId(0L);
+        medQcresultCasesVOHpExt.setScoreRes(homePageExtRes);
+        medQcresultCasesVOHpExt.setLevel("");
+        medQcresultCasesVOList.add(medQcresultCasesVOHpExt);
+        algorithmVO.setMedQcresultCasesVOList(medQcresultCasesVOList);
+        //计算分数
+        BigDecimal res = homePageRes
+                .add(homePageExtRes)
+                .multiply(new BigDecimal(100))
+                .divide(new BigDecimal(120), 2, RoundingMode.HALF_UP);
+        // 判断是否是百分制
+        if (sysHospitalSetFacade.getScoreType(algorithmVO.getHospitalId()).equals("1")
+                ||(algorithmVO.getHospitalId().intValue() == 1
+                && StringUtil.isNotBlank(algorithmVO.getIsPlacefile())
+                && algorithmVO.getIsPlacefile().equals("0"))) {
+            res = cal(algorithmVO);
+        }
+        return res;
+    }
+
+    /**
+     * 计算分数
+     *
+     * @param algorithmVO 操作条目的所有信息
+     * @return 评分分数
+     */
+    private BigDecimal cal(AlgorithmVO algorithmVO) {
+        BigDecimal res = new BigDecimal(100);
+        //统一为长兴的算法
+        if (algorithmVO.getIsHomePage().equals(true)) {
+            res = new BigDecimal(20);
+        }
+        //模块总分
+        Map<Long, BigDecimal> casesMap = new HashMap<>();
+        //单票否决计分
+        BigDecimal rejectScore = BigDecimal.ZERO;
+        //模块计分
+        Map<Long, BigDecimal> casesScoreMap = new HashMap<>();
+
+        List<QcResultAlgVO> qcResultAlgVOList = algorithmVO.getQcResultAlgVOList();
+        if (ListUtil.isNotEmpty(qcResultAlgVOList)) {
+            for (QcResultAlgVO qcResultAlgVO : qcResultAlgVOList) {
+                if (!casesMap.containsKey(qcResultAlgVO.getCasesId())) {
+                    casesMap.put(qcResultAlgVO.getCasesId(), qcResultAlgVO.getCasesScore());
+                }
+                if (!casesScoreMap.containsKey(qcResultAlgVO.getCasesId())) {
+                    casesScoreMap.put(qcResultAlgVO.getCasesId(), BigDecimal.ZERO);
+                }
+                //单票否决计分
+                if (qcResultAlgVO.getIsReject().equals(1)) {
+                    rejectScore = rejectScore.add(qcResultAlgVO.getScore());
+                } else {
+                    //非单票否决计分
+                    if (casesScoreMap.containsKey(qcResultAlgVO.getCasesId())) {
+                        BigDecimal casesScore = casesScoreMap.get(qcResultAlgVO.getCasesId());
+                        casesScore = casesScore.add(qcResultAlgVO.getScore());
+                        casesScoreMap.put(qcResultAlgVO.getCasesId(), casesScore);
+                    }
+                }
+            }
+
+            //结果先减去单票否决计分总和
+            res = res.subtract(rejectScore);
+            //结果小于0按0计算
+            if (BigDecimalUtil.lt(res, BigDecimal.ZERO)) {
+                return BigDecimal.ZERO;
+            } else {
+                //模块计分
+                for (Map.Entry<Long, BigDecimal> casesScore : casesScoreMap.entrySet()) {
+                    BigDecimal allSccore = casesMap.get(casesScore.getKey());
+                    if (BigDecimalUtil.le(allSccore, casesScore.getValue())) {
+                        //模块标准分小于等于模块减分总和就用模块标准分
+                        res = res.subtract(allSccore);
+                    } else {
+                        //模块标准分大于模块减分总和就用模块减分总和
+                        res = res.subtract(casesScore.getValue());
+                    }
+                }
+            }
+            //结果小于0按0计算
+            if (BigDecimalUtil.lt(res, BigDecimal.ZERO)) {
+                res = BigDecimal.ZERO;
+            }
+        }
+        return res;
+    }
+    private String getHomePageLevel(BigDecimal score) {
+        String level = "不合格";
+        //得分≥18分为甲级
+        if (BigDecimalUtil.ge(score, new BigDecimal(18))) {
+            level = "合格";
+        }
+        return level;
+    }
 }
 

+ 51 - 1
src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java

@@ -147,13 +147,54 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public List<HomePageNumDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO);
 
+    /**
+     * 病历质控报表--扣分项
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<QualityControlDTO> getQualityCase(CaseScoreVO caseScoreVO);
+
+    /**
+     * 病历质控报表-扣分
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<QualityControlDTO> getQualitySorce(CaseScoreVO caseScoreVO);
+
+    /**
+     * 病历质控报表-扣分数据
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<CaseScoreDTO> getQualityCaseSorce(CaseScoreVO caseScoreVO);
+
+    /**
+     * 病历质控报表科室-扣分数据
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<CaseScoreDTO> getQualityCaseSorceByDept(CaseScoreVO caseScoreVO);
+
+
     /**
      * 病历质控报表
      *
      * @param behospitalPageVO
      * @return
      */
-    public List<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO);
+    public IPage<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO);
+
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public IPage<QualityControlDTO> getQualityControlExport(BehospitalPageVO behospitalPageVO);
 
 
     /**
@@ -409,6 +450,15 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public List<UnModifyMRDetailDTO> unModifyMRSByDept(FilterUnModifyMRVO filterUnModifyMRVO);
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public IPage<QualityControlDeptDTO> qualityControlByDept(BehospitalPageVO behospitalPageVO);
+
+
 
     /**
      * 病历稽查表

+ 53 - 1
src/main/java/com/diagbot/service/BehospitalInfoService.java

@@ -90,6 +90,14 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
      */
     public List<NumDTO> leaveHosCountByDept(FilterVO filterVO);
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public IPage<QualityControlDeptDTO> qualityControlByDept(BehospitalPageVO behospitalPageVO);
+
     /**
      * 入院总人数统计-科室-首页
      *
@@ -147,14 +155,58 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
      */
     public List<HomePageNumDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO);
 
+
+
+    /**
+     * 病历质控报表-扣分项
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<QualityControlDTO> getQualityCase(CaseScoreVO caseScoreVO);
+
+    /**
+     * 病历质控报表-扣分
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<QualityControlDTO> getQualitySorce(CaseScoreVO caseScoreVO);
+
+    /**
+     * 病历质控报表
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<CaseScoreDTO> getQualityCaseSorce(CaseScoreVO caseScoreVO);
+
+    /**
+     * 病历质控报表-科室
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    public List<CaseScoreDTO> getQualityCaseSorceByDept(CaseScoreVO caseScoreVO);
+
+
+
+
     /**
      * 病历质控报表
      *
      * @param behospitalPageVO
      * @return
      */
-    public List<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO);
+    public IPage<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO);
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    public IPage<QualityControlDTO> getQualityControlExport(BehospitalPageVO behospitalPageVO);
 
     /**
      * 各科室缺陷占比(主任医生)

+ 67 - 1
src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java

@@ -213,6 +213,49 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.homePageLevelStatistics(filterOrderVO);
     }
 
+    /**
+     * 病历质控报表-扣分项
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    @Override
+    public List<QualityControlDTO> getQualityCase(CaseScoreVO caseScoreVO) {
+        return baseMapper.getQualityCase(caseScoreVO);
+    }
+
+    /**
+     * 病历质控报表-扣分
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    @Override
+    public List<QualityControlDTO> getQualitySorce(CaseScoreVO caseScoreVO) {
+        return baseMapper.getQualitySorce(caseScoreVO);
+    }
+    /**
+     * 病历质控报表-扣分数据
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    @Override
+    public List<CaseScoreDTO> getQualityCaseSorce(CaseScoreVO caseScoreVO) {
+        return baseMapper.getQualityCaseSorce(caseScoreVO);
+    }
+
+    /**
+     * 病历质控报表科室-扣分数据
+     *
+     * @param caseScoreVO
+     * @return
+     */
+    @Override
+    public List<CaseScoreDTO> getQualityCaseSorceByDept(CaseScoreVO caseScoreVO) {
+        return baseMapper.getQualityCaseSorceByDept(caseScoreVO);
+    }
+
     /**
      * 病历质控报表
      *
@@ -220,10 +263,21 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
      * @return
      */
     @Override
-    public List<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO) {
+    public IPage<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO) {
         return baseMapper.getQualityControl(behospitalPageVO);
     }
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    @Override
+    public IPage<QualityControlDTO> getQualityControlExport(BehospitalPageVO behospitalPageVO) {
+        return baseMapper.getQualityControlExport(behospitalPageVO);
+    }
+
 
     /**
      * 各科室缺陷占比(主任医生)
@@ -552,6 +606,18 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.unModifyMRSByDept(filterUnModifyMRVO);
     }
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    @Override
+    public IPage<QualityControlDeptDTO> qualityControlByDept(BehospitalPageVO behospitalPageVO) {
+        return baseMapper.qualityControlByDept(behospitalPageVO);
+    }
+
+
     /**
      * 病历稽查表
      *

+ 112 - 0
src/main/java/com/diagbot/vo/CaseScoreVO.java

@@ -0,0 +1,112 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 病历质控
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-04-13
+ */
+@Data
+public class CaseScoreVO  implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 医院ID
+     */
+    @ApiModelProperty(hidden = true)
+    private Long hospitalId;
+
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 档案号
+     */
+    private String fileCode;
+
+    /**
+     * 入院时间开始时间
+     */
+    private Date behosDateStart;
+
+    /**
+     * 入院时间结束时间
+     */
+    private Date behosDateEnd;
+
+    /**
+     * 出院时间开始时间
+     */
+    private Date leaveHosDateStart;
+
+    /**
+     * 出院时间结束时间
+     */
+    private Date leaveHosDateEnd;
+
+    /**
+     * 等级
+     */
+    private String level;
+
+    /**
+     * 住院科室名称
+     */
+    private String deptName;
+
+    /**
+     * 主诊断
+     */
+    private String diagnose;
+
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+
+    /**
+     * 医生工号
+     */
+    private String doctorCode;
+
+    /**
+     * 统计维度 1-本月,2-本年
+     */
+    private Integer statisticsType;
+
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+//    @ApiModelProperty(hidden = true)
+    private String isPlacefile = "1";
+
+    private Integer checkStatus;
+    private Integer mrStatus;
+    private String chName;
+    private String mrName;
+    private Date chTimeStart;
+    private Date chTimeEnd;
+    private Date mrTimeStart;
+    private Date mrTimeEnd;
+
+}

+ 20 - 0
src/main/java/com/diagbot/web/ConsoleByDeptController.java

@@ -510,5 +510,25 @@ public class ConsoleByDeptController {
         return RespDTO.onSuc(consoleByDeptFacade.getMedicalChecks(filterVO));
     }
 
+    /**
+     * 病历质控报表-科室
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    @ApiOperation(value = "病历质控报表[by:cy]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/qualityControlByDept")
+    @SysLogger("qualityControlByDept")
+    public RespDTO<IPage<QualityControlDTO>> qualityControlByDept(@RequestBody BehospitalPageVO behospitalPageVO) {
+        return RespDTO.onSuc(consoleByDeptFacade.qualityControlByDept(behospitalPageVO));
+    }
+
+
     //endregion -----------------------内页接口结束------------------------------
 }

+ 18 - 0
src/main/java/com/diagbot/web/ConsoleByDeptExportController.java

@@ -396,6 +396,24 @@ public class ConsoleByDeptExportController {
         consoleByDeptExportFacade.medicalCheckExportByDept(response, filterVO);
     }
 
+    /**
+     * 病历质控报表-科室-导出
+     * @param behospitalPageVO
+     * @return
+     */
+    @ApiOperation(value = "病历质控报表导出-科室[by:cy]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/qualityControlExportByDept")
+    @SysLogger("qualityControlExportByDept")
+    public void qualityControlExportByDept(HttpServletResponse response, @RequestBody @Valid BehospitalPageVO behospitalPageVO) {
+        consoleByDeptExportFacade.qualityControlExportByDept(response, behospitalPageVO);
+    }
+
 /**
      * 病历稽查统计(首页)
      * @param filterVO

+ 1 - 1
src/main/java/com/diagbot/web/ConsoleController.java

@@ -457,7 +457,7 @@ public class ConsoleController {
                     "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
     @PostMapping("/qualityControl")
     @SysLogger("qualityControl")
-    public RespDTO<List<QualityControlDTO>> getQualityControl(@RequestBody BehospitalPageVO behospitalPageVO) {
+    public RespDTO<IPage<QualityControlDTO>> getQualityControl(@RequestBody BehospitalPageVO behospitalPageVO) {
         return RespDTO.onSuc(consoleFacade.getQualityControl(behospitalPageVO));
     }
 

+ 20 - 0
src/main/java/com/diagbot/web/ConsoleExportController.java

@@ -497,4 +497,24 @@ public class ConsoleExportController {
     public void qcCheckMRPageExport(HttpServletResponse response, @RequestBody @Valid QcResultShortPageVO qcResultShortPageVO) {
         consoleExportFacade.qcCheckMRPageExport(response, qcResultShortPageVO);
     }
+
+
+    /**
+     * 病历质控报表分页导出
+     *
+     * @param behospitalPageVO
+     * @return
+     */
+    @ApiOperation(value = "病历质控报表导出[by:cy]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/qualityControlExport")
+    @SysLogger("qualityControlExport")
+    public void qualityControlExport(HttpServletResponse response, @RequestBody BehospitalPageVO behospitalPageVO) {
+        consoleExportFacade.qualityControlExport(response, behospitalPageVO);
+    }
 }

+ 252 - 2
src/main/resources/mapper/BehospitalInfoMapper.xml

@@ -143,7 +143,257 @@
         </if>
     </select>
 
+    <select id="getQualityCaseSorce" resultType="com.diagbot.dto.CaseScoreDTO">
+     SELECT  a.cases_id as casesId,c.cases_entry_id as casesEntryId,c.behospital_code as behospitalCode,a.mode_id as modelId,c.score,c.cases_score as casesScore,c.msg,c.is_reject as isReject
+        FROM `qc_cases_entry` a, med_qcresult_detail c,med_behospital_info e
+        where a.is_deleted = 'N' and c.is_deleted = 'N'AND e.is_deleted = 'N'
+        and a.id = c.cases_entry_id
+        AND c.behospital_code = e.behospital_code
+        AND c.hospital_id = e.hospital_id
+        and c.hospital_id = #{hospitalId}
+        <if test="deptName != null and deptName != ''">
+            and e.beh_dept_name= #{deptName}
+        </if>
+        <if test="behospitalCode != null and behospitalCode != ''">
+            and e.behospital_code like CONCAT('%',#{behospitalCode},'%')
+        </if>
+        <if test="isPlacefile != null and isPlacefile != ''">
+            and e.is_placefile = #{isPlacefile}
+        </if>
+        <if test="behosDateStart != null">
+            <![CDATA[ and e.behospital_date >= #{behosDateStart}]]>
+        </if>
+        <if test="behosDateEnd != null">
+            <![CDATA[ and e.behospital_date < #{behosDateEnd}]]>
+        </if>
+        <if test="leaveHosDateStart != null">
+            <![CDATA[ and e.leave_hospital_date >= #{leaveHosDateStart}]]>
+        </if>
+        <if test="leaveHosDateEnd != null">
+            <![CDATA[ and e.leave_hospital_date < #{leaveHosDateEnd}]]>
+        </if>
+        GROUP BY c.behospital_code,a.mode_id,c.cases_entry_id
+        order by c.behospital_code
+    </select>
+
+    <select id="getQualityCaseSorceByDept" resultType="com.diagbot.dto.CaseScoreDTO">
+        SELECT a.cases_id as casesId,c.cases_entry_id as casesEntryId,c.behospital_code as behospitalCode,a.mode_id as modelId,c.score,c.cases_score as casesScore,c.msg,c.is_reject as isReject
+        FROM `qc_cases_entry` a, med_qcresult_detail c,sys_user_dept d,med_behospital_info e
+        where a.is_deleted = 'N' and c.is_deleted = 'N' AND d.is_deleted = 'N' AND e.is_deleted = 'N'
+        and a.id = c.cases_entry_id
+        AND c.behospital_code = e.behospital_code
+        ON d.hospital_id = e.hospital_id
+        AND e.beh_dept_id = d.dept_id
+        AND c.hospital_id = e.hospital_id
+        and c.hospital_id = #{hospitalId}
+        <if test="deptName != null and deptName != ''">
+            and e.beh_dept_name= #{deptName}
+        </if>
+        <if test="userId != null and userId != ''">
+            and d.user_id = #{userId}
+        </if>
+        <if test="behospitalCode != null and behospitalCode != ''">
+            and e.behospital_code like CONCAT('%',#{behospitalCode},'%')
+        </if>
+        <if test="isPlacefile != null and isPlacefile != ''">
+            and e.is_placefile = #{isPlacefile}
+        </if>
+        <if test="behosDateStart != null">
+            <![CDATA[ and e.behospital_date >= #{behosDateStart}]]>
+        </if>
+        <if test="behosDateEnd != null">
+            <![CDATA[ and e.behospital_date < #{behosDateEnd}]]>
+        </if>
+        <if test="leaveHosDateStart != null">
+            <![CDATA[ and e.leave_hospital_date >= #{leaveHosDateStart}]]>
+        </if>
+        <if test="leaveHosDateEnd != null">
+            <![CDATA[ and e.leave_hospital_date < #{leaveHosDateEnd}]]>
+        </if>
+        GROUP BY c.behospital_code,a.mode_id,c.cases_entry_id
+        order by c.behospital_code
+    </select>
+
     <select id="getQualityControl" resultType="com.diagbot.dto.QualityControlDTO">
+        SELECT * FROM (
+        select
+        t.name AS NAME,
+        t.behospital_code AS behospitalCode,
+        t.doctor_name AS doctorName,
+        t.beh_dept_name AS deptName,
+        t.beh_dept_id AS deptId,
+        t.leave_hospital_date AS leaveHospitalDate,
+        t.level,
+        t.age,
+        t.score_res as totalScore,
+        t.is_deleted,
+        g.check_name AS chName,
+        h.check_name AS mrName
+        from (
+        select a.*,
+         ifnull(b.level,'未评分') as level,
+          b.grade_type,
+          IF(c.age is null, null,CONCAT( ifnull(c.age,'') ,ifnull(c.age_unit,'') ))as age,
+          b.score_res
+        from med_behospital_info a
+        LEFT JOIN med_qcresult_info b
+        on a.behospital_code = b.behospital_code and b.is_deleted = 'N'
+        left join med_home_page c
+        on a.behospital_code = c.behospital_code and c.is_deleted = 'N'
+        ) t
+        LEFT JOIN (SELECT * FROM med_check_info WHERE is_deleted = 'N' AND check_type = 0 ) g
+        ON t.behospital_code = g.behospital_code
+        AND t.hospital_id = g.hospital_id
+        LEFT JOIN (SELECT * FROM med_check_info WHERE is_deleted = 'N'AND check_type = 1 ) h
+        ON t.behospital_code = h.behospital_code
+        AND t.hospital_id = h.hospital_id
+        where t.is_deleted = 'N'
+        <if test="diagnose != null and diagnose != ''">
+            AND t.diagnose LIKE CONCAT( '%', #{diagnose}, '%' )
+        </if>
+        <if test="deptName != null and deptName != ''">
+            and t.beh_dept_name= #{deptName}
+        </if>
+        <if test="doctorName != null and doctorName != ''">
+            and CONCAT(
+            IFNULL(t.doctor_name,''),IFNULL(t.beh_doctor_name,''),IFNULL(t.director_doctor_name,''))
+            like CONCAT('%',#{doctorName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t.name like CONCAT('%',#{name},'%')
+        </if>
+        <if test="doctorCode != null and doctorCode != ''">
+            and (t.doctor_id = #{doctorCode}
+            or t.beh_doctor_id = #{doctorCode}
+            or t.director_doctor_id = #{doctorCode})
+        </if>
+        <if test="fileCode != null and fileCode != ''">
+            and t.file_code like CONCAT('%',#{fileCode},'%')
+        </if>
+        <if test="hospitalId != null">
+            and t.hospital_id = #{hospitalId}
+        </if>
+        <if test="behospitalCode != null and behospitalCode != ''">
+            and t.behospital_code like CONCAT('%',#{behospitalCode},'%')
+        </if>
+        <if test="behosDateStart != null">
+            <![CDATA[ and t.behospital_date >= #{behosDateStart}]]>
+        </if>
+        <if test="behosDateEnd != null">
+            <![CDATA[ and t.behospital_date < #{behosDateEnd}]]>
+        </if>
+        <if test="leaveHosDateStart != null">
+            <![CDATA[ and t.leave_hospital_date >= #{leaveHosDateStart}]]>
+        </if>
+        <if test="leaveHosDateEnd != null">
+            <![CDATA[ and t.leave_hospital_date < #{leaveHosDateEnd}]]>
+        </if>
+        <if test="level != null and level != ''">
+            and t.level = #{level}
+        </if>
+        <if test="isPlacefile != null and isPlacefile != ''">
+            and t.is_placefile = #{isPlacefile}
+        </if>
+        and t.qc_type_id != 0) p
+        where p.is_deleted="N"
+        <if test="chName != null and chName !=''">
+            AND p.chName like CONCAT('%',#{chName},'%')
+        </if>
+        <if test="mrName != null and mrName !=''">
+            AND p.mrName like CONCAT('%',#{mrName},'%')
+        </if>
+    </select>
+
+    <select id="qualityControlByDept" resultType="com.diagbot.dto.QualityControlDeptDTO">
+        SELECT * FROM (
+        select
+        t.name AS NAME,
+        t.behospital_code AS behospitalCode,
+        t.doctor_name AS doctorName,
+        t.beh_dept_name AS deptName,
+        t.beh_dept_id AS deptId,
+        t.leave_hospital_date AS leaveHospitalDate,
+        t.level,
+        t.age,
+        t.score_res as totalScore,
+        t.is_deleted,
+        g.check_name AS chName,
+        h.check_name AS mrName
+        from (
+        select a.*, ifnull(b.level,'未评分') as level, IF(c.age is null, null,CONCAT( ifnull(c.age,''),ifnull(c.age_unit,'') ))as age, b.grade_type,d.user_id, b.score_res, b.gmt_create as
+        grade_time from med_behospital_info a
+        LEFT JOIN med_qcresult_info b
+        on a.behospital_code = b.behospital_code and b.is_deleted = 'N'
+        left join med_home_page c
+        on a.behospital_code = c.behospital_code and c.is_deleted = 'N'
+        LEFT JOIN sys_user_dept d
+        ON a.hospital_id = d.hospital_id
+        AND a.beh_dept_id = d.dept_id
+        ) t
+        LEFT JOIN (SELECT * FROM med_check_info WHERE is_deleted = 'N' AND check_type = 0 ) g
+        ON t.behospital_code = g.behospital_code
+        AND t.hospital_id = g.hospital_id
+        LEFT JOIN (SELECT * FROM med_check_info WHERE is_deleted = 'N'AND check_type = 1 ) h
+        ON t.behospital_code = h.behospital_code
+        AND t.hospital_id = h.hospital_id
+        where t.is_deleted = 'N'
+        AND t.user_id = #{userId}
+        <if test="diagnose != null and diagnose != ''">
+            AND t.diagnose LIKE CONCAT( '%', #{diagnose}, '%' )
+        </if>
+        <if test="deptName != null and deptName != ''">
+            and t.beh_dept_name= #{deptName}
+        </if>
+        <if test="doctorName != null and doctorName != ''">
+            and CONCAT(
+            IFNULL(t.doctor_name,''),IFNULL(t.beh_doctor_name,''),IFNULL(t.director_doctor_name,''))
+            like CONCAT('%',#{doctorName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t.name like CONCAT('%',#{name},'%')
+        </if>
+        <if test="doctorCode != null and doctorCode != ''">
+            and (t.doctor_id = #{doctorCode}
+            or t.beh_doctor_id = #{doctorCode}
+            or t.director_doctor_id = #{doctorCode})
+        </if>
+        <if test="fileCode != null and fileCode != ''">
+            and t.file_code like CONCAT('%',#{fileCode},'%')
+        </if>
+        <if test="hospitalId != null">
+            and t.hospital_id = #{hospitalId}
+        </if>
+        <if test="behospitalCode != null and behospitalCode != ''">
+            and t.behospital_code like CONCAT('%',#{behospitalCode},'%')
+        </if>
+        <if test="behosDateStart != null">
+            <![CDATA[ and t.behospital_date >= #{behosDateStart}]]>
+        </if>
+        <if test="behosDateEnd != null">
+            <![CDATA[ and t.behospital_date < #{behosDateEnd}]]>
+        </if>
+        <if test="leaveHosDateStart != null">
+            <![CDATA[ and t.leave_hospital_date >= #{leaveHosDateStart}]]>
+        </if>
+        <if test="leaveHosDateEnd != null">
+            <![CDATA[ and t.leave_hospital_date < #{leaveHosDateEnd}]]>
+        </if>
+        <if test="level != null and level != ''">
+            and t.level = #{level}
+        </if>
+        <if test="isPlacefile != null and isPlacefile != ''">
+            and t.is_placefile = #{isPlacefile}
+        </if>
+        and t.qc_type_id != 0) p
+        where p.is_deleted="N"
+        <if test="chName != null and chName !=''">
+            AND p.chName like CONCAT('%',#{chName},'%')
+        </if>
+        <if test="mrName != null and mrName !=''">
+            AND p.mrName like CONCAT('%',#{mrName},'%')
+        </if>
+    </select>
+   <!-- <select id="getQualityControl" resultType="com.diagbot.dto.QualityControlDTO">
         SELECT m.* FROM(
         SELECT
         a.name AS NAME,
@@ -238,7 +488,7 @@
         SUM(CASE WHEN  t1.mode_id =5 AND t1.is_reject = 0 THEN t1.score ELSE 0 END)  AS dischargeNoteScoreOn,
         SUM(CASE WHEN  t1.mode_id =5 THEN t1.score ELSE 0 END)  AS dischargeNoteScoreTw,
         (SUM(CASE WHEN  t1.mode_id =5 THEN t1.score ELSE 0 END)-GROUP_CONCAT(DISTINCT CASE WHEN t1.mode_id = 5 THEN t1.msg ELSE NULL END SEPARATOR ';' )) AS dischargeNoteScoreTh,
-        GROUP_CONCAT(DISTINCT CASE WHEN 1=1 THEN t1.msg ELSE NULL END SEPARATOR ';' ) AS otherCase
+        GROUP_CONCAT(DISTINCT CASE WHEN t1.mode_id != 1 AND t1.mode_id !=  2 AND t1.mode_id !=  6 AND t1.mode_id != 8 AND t1.mode_id != 156 AND t1.mode_id != 17 AND t1.mode_id != 5 THEN t1.msg ELSE NULL END SEPARATOR ';' ) AS otherCase
         FROM (
         SELECT
         c.behospital_code,
@@ -426,7 +676,7 @@
             AND h.mr_name like CONCAT('%',#{mrName},'%')
         </if>)m
 
-    </select>
+    </select>-->
 
     <select id="getMsg" resultType="com.diagbot.dto.MsgDTO">
         SELECT b.`name` model_name,c.score,c.msg,c.cases_entry_id,c.is_reject,c.id id,c.info,

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

@@ -11,6 +11,7 @@
         <result column="creator" property="creator" />
         <result column="modifier" property="modifier" />
         <result column="name" property="name" />
+        <result column="is_file" property="isFile" />
         <result column="parent_id" property="parentId" />
         <result column="code" property="code" />
         <result column="order_no" property="orderNo" />