Преглед на файлове

Merge branch 'dev/20211015_2.1.1'

chengyao преди 3 години
родител
ревизия
452d16421f
променени са 44 файла, в които са добавени 6528 реда и са изтрити 2385 реда
  1. 90 0
      doc/036.20211015_2.1.1/qc_initv2.1.1.sql
  2. 15 0
      pom.xml
  3. 18 0
      src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  4. 18 0
      src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  5. 5 0
      src/main/java/com/diagbot/dto/HomePageNumDTO.java
  6. 138 0
      src/main/java/com/diagbot/dto/HomePageNumXYDTO.java
  7. 61 0
      src/main/java/com/diagbot/entity/ImageCaptchaParams.java
  8. 87 0
      src/main/java/com/diagbot/entity/MedClickInfo.java
  9. 4 0
      src/main/java/com/diagbot/facade/BasDoctorInfoFacade.java
  10. 52 35
      src/main/java/com/diagbot/facade/BehospitalInfoFacade.java
  11. 122 3
      src/main/java/com/diagbot/facade/ConsoleExportFacade.java
  12. 60 5
      src/main/java/com/diagbot/facade/ConsoleFacade.java
  13. 89 39
      src/main/java/com/diagbot/facade/SysUserFacade.java
  14. 45 18
      src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java
  15. 16 0
      src/main/java/com/diagbot/mapper/MedClickInfoMapper.java
  16. 10 0
      src/main/java/com/diagbot/mapper/QcresultInfoMapper.java
  17. 9 2
      src/main/java/com/diagbot/service/BehospitalInfoService.java
  18. 16 0
      src/main/java/com/diagbot/service/MedClickInfoService.java
  19. 22 0
      src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java
  20. 20 0
      src/main/java/com/diagbot/service/impl/MedClickInfoServiceImpl.java
  21. 60 0
      src/main/java/com/diagbot/util/ImageCaptchaUtil.java
  22. 611 0
      src/main/java/com/diagbot/util/RedisUtils.java
  23. 63 0
      src/main/java/com/diagbot/vo/FilterOrderXYPageVO.java
  24. 15 0
      src/main/java/com/diagbot/vo/FilterPageVO.java
  25. 94 0
      src/main/java/com/diagbot/vo/FilterPageXYVO.java
  26. 5 0
      src/main/java/com/diagbot/vo/FilterVO.java
  27. 50 0
      src/main/java/com/diagbot/vo/MedClickInfoVO.java
  28. 5 0
      src/main/java/com/diagbot/vo/QcResultPageVO.java
  29. 159 0
      src/main/java/com/diagbot/vo/QcResultPageXYVO.java
  30. 5 0
      src/main/java/com/diagbot/vo/QcResultShortPageVO.java
  31. 155 0
      src/main/java/com/diagbot/vo/QcResultShortXYPageVO.java
  32. 2 1
      src/main/java/com/diagbot/vo/UserLoginVO.java
  33. 7 0
      src/main/java/com/diagbot/web/BehospitalInfoController.java
  34. 69 0
      src/main/java/com/diagbot/web/ConsoleByDeptController.java
  35. 61 5
      src/main/java/com/diagbot/web/ConsoleByDeptExportController.java
  36. 64 1
      src/main/java/com/diagbot/web/ConsoleController.java
  37. 59 3
      src/main/java/com/diagbot/web/ConsoleExportController.java
  38. 14 2
      src/main/java/com/diagbot/web/SysUserController.java
  39. 1 1
      src/main/resources/application-local.yml
  40. 3 3
      src/main/resources/application-pre.yml
  41. 1 1
      src/main/resources/bootstrap.yml
  42. 3873 2264
      src/main/resources/mapper/BehospitalInfoMapper.xml
  43. 22 0
      src/main/resources/mapper/MedClickInfoMapper.xml
  44. 233 2
      src/main/resources/mapper/QcresultInfoMapper.xml

+ 90 - 0
doc/036.20211015_2.1.1/qc_initv2.1.1.sql

@@ -0,0 +1,90 @@
+
+use `qc`;
+-- 执行前请看注意事项!
+-- 通用版均执行病历doctorId、doctorName回查 @hospitalId =**:需要更新的医院hospitalId在此调整即可
+-- med_behospital_info病历doctorName回查
+-- 最下面有仅湘雅三院医院的sql!!
+SET @hospitalId =35;
+ UPDATE med_behospital_info a,
+ (
+	SELECT
+		doctor_id,
+		name
+		NAME
+	FROM
+		bas_doctor_info b
+	WHERE
+		b.hospital_id = @hospitalId
+	AND b.is_deleted = 'N'
+) c
+SET a.doctor_name = c. NAME
+WHERE
+	a.doctor_id = c.doctor_id
+AND a.hospital_id = @hospitalId
+AND (a.doctor_name is null or a.doctor_name = '' or a.doctor_name ='-' or a.doctor_name ='—' or LENGTH(a.doctor_name)>64);
+
+-- med_behospital_info病历doctorId回查
+UPDATE med_behospital_info a,
+ (
+	SELECT
+		doctor_id,
+		NAME
+	FROM
+		bas_doctor_info b
+	WHERE
+		b.hospital_id = @hospitalId
+	AND b.is_deleted = 'N'
+	GROUP BY
+		b. NAME
+	HAVING
+		count(b.doctor_id) = 1
+) c
+SET a.doctor_id = c.doctor_id
+WHERE
+	a.doctor_name = c.NAME
+AND a.hospital_id = @hospitalId
+AND (a.doctor_id is null or a.doctor_id = '' or a.doctor_id ='-' or a.doctor_id ='—' or LENGTH(a.doctor_id)>64);
+
+
+
+-- 仅仅湘雅三院医院执行!!
+-- 全院
+update sys_menu a set a.order_no = a.order_no+1 where a.parent_id = 17 and a.order_no>0;
+
+
+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-BASYHGLYSZB_XQ', '1', '1', '1', '医师病案首页合格率占比');
+SET @id =@@identity;
+INSERT INTO `sys_role_menu` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `menu_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '-1', @id, NULL);
+INSERT INTO `sys_role_menu` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `menu_id`, `remark`) VALUES ( 'N', '2021-11-01 13:48:37', '2021-11-01 13:48:37', '243', '243', '1', @id, NULL);
+
+
+INSERT INTO `sys_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `name`, `code`, `permissionUrl`, `method`, `descritpion`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '医师病案首页合格率占比报表', '', '/console/homePageLevelStatisticsXY', 'ALL', '医师病案首页合格率占比报表', NULL);
+SET @id2 =@@identity;
+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', @id2, NULL);
+INSERT INTO `sys_role_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `permission_id`, `remark`) VALUES ( 'N', '2021-11-01 13:48:37', '2021-11-01 13:48:37', '243', '243', '1', @id2, 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', @id, @id2, NULL, '医师病案首页合格率占比');
+
+
+-- 科室
+update sys_menu a set a.order_no = a.order_no+1 where a.parent_id = 18 and a.order_no>1;
+
+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-BASYHGLYSZB_XQ', '1', '1', '2', '医师病案首页合格率占比-科室');
+SET @id3 =@@identity;
+INSERT INTO `sys_role_menu` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `menu_id`, `remark`) VALUES ( 'N', '1970-01-01 12:00:00', '1970-01-01 12:00:00', '0', '0', '-1', @id3, NULL);
+INSERT INTO `sys_role_menu` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `menu_id`, `remark`) VALUES ( 'N', '2021-10-27 11:39:27', '2021-10-27 11:39:27', '13', '13', '2', @id3, 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/homePageLevelStatisticsXYByDept', 'ALL', '医师病案首页合格率占比报表', NULL);
+SET @id4 =@@identity;
+
+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', @id4, NULL);
+INSERT INTO `sys_role_permission` ( `is_deleted`, `gmt_create`, `gmt_modified`, `creator`, `modifier`, `role_id`, `permission_id`, `remark`) VALUES ( 'N', '2021-10-27 11:39:27', '2021-10-27 11:39:27', '13', '13', '2', @id4, 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', @id3, @id4, NULL, '医师病案首页合格率占比科室');
+
+
+
+

+ 15 - 0
pom.xml

@@ -36,6 +36,8 @@
         <aggregator.version>1.1.0</aggregator.version>
         <okhttp.version>4.2.2</okhttp.version>
         <easypoi.version>4.2.0</easypoi.version>
+        <patchca.version>1.1.2</patchca.version>
+        <hutool.version>5.0.7</hutool.version>
         <docker-maven-plugin.version>1.2.1</docker-maven-plugin.version>
         <docker.image.prefix>192.168.2.122:5000/diagbotcloud</docker.image.prefix>
         <registryUrl>http://192.168.2.122:5000/repository/diagbotcloud/</registryUrl>
@@ -108,6 +110,19 @@
             <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.bladejava</groupId>
+            <artifactId>blade-patchca</artifactId>
+            <version>${patchca.version}</version>
+
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>${hutool.version}</version>
+        </dependency>
+
         <!--swagger-->
         <dependency>
             <groupId>io.springfox</groupId>

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

@@ -38,6 +38,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .authorizeRequests()
                 .regexMatchers(".*swagger.*", ".*v2.*", ".*webjars.*", "/druid.*", "/actuator.*", "/hystrix.*").permitAll()
                 .antMatchers("/sys/user/getJwt").permitAll()
+                .antMatchers("/sys/user/getCaptcha").permitAll()
                 .antMatchers("/sys/user/getHospitalMark").permitAll()
                 .antMatchers("/sys/user/getJwtNoPass").permitAll()
                 .antMatchers("/sys/user/refreshJwt").permitAll()
@@ -85,6 +86,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/console/entryCountGroupByCasePage").permitAll()
                 .antMatchers("/console/entryCountGroupByEntry").permitAll()
                 .antMatchers("/console/entryCountGroupByEntryPage").permitAll()
+                .antMatchers("/console/entryCountGroupXYByEntryPage").permitAll()
                 .antMatchers("/console/entryGroupByEntryInnerPage").permitAll()
                 .antMatchers("/console/getAverageDayNum").permitAll()
                 .antMatchers("/console/getAverageDayNumPage").permitAll()
@@ -96,6 +98,16 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/console/getLevelResultDept").permitAll()
                 .antMatchers("/console/homePageLevelLimit").permitAll()
                 .antMatchers("/console/homePageLevelStatistics").permitAll()
+                .antMatchers("/console/homePageLevelStatisticsXY").permitAll()
+                .antMatchers("/console/export/homePageLevelXYExport").permitAll()
+                .antMatchers("/consoleByDept/homePageLevelStatisticsXYByDept").permitAll()
+                .antMatchers("/print/export/homePageLevelXYExportByDept").permitAll()
+                .antMatchers("/consoleByDept/entryCountGroupXYByEntryPageDept").permitAll()
+                .antMatchers("/print/export/entryCountGroupXYByExportDept").permitAll()
+                .antMatchers("/consoleByDept/qcResultShortXYPageByDept").permitAll()
+                .antMatchers("/print/export/qcResultShortXYPageExportDept").permitAll()
+                .antMatchers("/consoleByDept/badLevelXYPageByDept").permitAll()
+                .antMatchers("/print/export/badLevelPageXYExportByDept").permitAll()
                 .antMatchers("/console/leaveHosCount").permitAll()
                 .antMatchers("/console/medicalRecordIndicator").permitAll()
                 .antMatchers("/console/codingMonthly").permitAll()
@@ -105,6 +117,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/console/mrCount").permitAll()
                 .antMatchers("/console/mrStatistics").permitAll()
                 .antMatchers("/console/qcResultShortPage").permitAll()
+                .antMatchers("/console/qcResultShortXYPage").permitAll()
                 .antMatchers("/console/resultStatistics").permitAll()
                 .antMatchers("/console/resultStatisticsByDeptPage").permitAll()
                 .antMatchers("/console/homePageMRCount").permitAll()
@@ -137,9 +150,11 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/console/export/getAverageFeeExport").permitAll()
                 .antMatchers("/console/export/levelPercentGroupByDeptExport").permitAll()
                 .antMatchers("/console/export/entryCountGroupByEntryExport").permitAll()
+                .antMatchers("/console/export/entryCountGroupXYByEntryExport").permitAll()
                 .antMatchers("/console/export/entryCountGroupByCaseExport").permitAll()
                 .antMatchers("/console/export/entryStatisticsExport").permitAll()
                 .antMatchers("/console/export/qcResultShortPageExport").permitAll()
+                .antMatchers("/console/export/qcResultShortXYPageExport").permitAll()
                 .antMatchers("/console/export/leaveHosMrPageExport").permitAll()
                 .antMatchers("/console/export/qcCheckStatisticsExport").permitAll()
                 .antMatchers("/console/export/unModifyMRPageExport").permitAll()
@@ -199,11 +214,14 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/qc/medLisInfo/getExamineSonPage").permitAll()
                 .antMatchers("/console/medicalCheckForm").permitAll()
                 .antMatchers("/qc/behospitalInfo/analyzeCds").permitAll()
+                .antMatchers("/qc/behospitalInfo/addMedClickInfo").permitAll()
                 .antMatchers("/console/medicalCheckTitle").permitAll()
                 .antMatchers("/console/export/medicalCheckExport").permitAll()
                 .antMatchers("/console/export/medicalCheckInnerExport").permitAll()
                 .antMatchers("/console/badLevelPage").permitAll()
+                .antMatchers("/console/badLevelXYPage").permitAll()
                 .antMatchers("/console/export/badLevelPagePageExport").permitAll()
+                .antMatchers("/console/export/badLevelPageXYExport").permitAll()
                 .antMatchers("/qc/medNurse/getMedNursePage").permitAll()
                 .antMatchers("/qc/behospitalInfo/exportQcresultByPerson").permitAll()
                 .antMatchers("/consoleByDept/beHosCountByDept").permitAll()

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

@@ -81,6 +81,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/actuator/**", request)
                 || matchers("/hystrix/**", request)
                 || matchers("/sys/user/getJwt", request)
+                || matchers("/sys/user/getCaptcha", request)
                 || matchers("/sys/user/getHospitalMark", request)
                 || matchers("/sys/user/getJwtNoPass", request)
                 || matchers("/sys/user/refreshJwt", request)
@@ -129,6 +130,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/console/entryCountGroupByCasePage", request)
                 || matchers("/console/entryCountGroupByEntry", request)
                 || matchers("/console/entryCountGroupByEntryPage", request)
+                || matchers("/console/entryCountGroupXYByEntryPage", request)
                 || matchers("/console/entryGroupByEntryInnerPage", request)
                 || matchers("/console/getAverageDayNum", request)
                 || matchers("/console/getAverageDayNumPage", request)
@@ -140,6 +142,16 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/console/getLevelResultDept", request)
                 || matchers("/console/homePageLevelLimit", request)
                 || matchers("/console/homePageLevelStatistics", request)
+                || matchers("/console/homePageLevelStatisticsXY", request)
+                || matchers("/console/export/homePageLevelXYExport", request)
+                || matchers("/consoleByDept/homePageLevelStatisticsXYByDept", request)
+                || matchers("/print/export/homePageLevelXYExportByDept", request)
+                || matchers("/consoleByDept/entryCountGroupXYByEntryPageDept", request)
+                || matchers("/print/export/entryCountGroupXYByExportDept", request)
+                || matchers("/consoleByDept/qcResultShortXYPageByDept", request)
+                || matchers("/print/export/qcResultShortXYPageExportDept", request)
+                || matchers("/consoleByDept/badLevelXYPageByDept", request)
+                || matchers("/print/export/badLevelPageXYExportByDept", request)
                 || matchers("/console/leaveHosCount", request)
                 || matchers("/console/levelPercentGroupByDeptPage", request)
                 || matchers("/console/levelStatistics", request)
@@ -149,6 +161,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/console/medicalRecordIndicator", request)
                 || matchers("/console/codingMonthly", request)
                 || matchers("/console/qcResultShortPage", request)
+                || matchers("/console/qcResultShortXYPage", request)
                 || matchers("/console/resultStatistics", request)
                 || matchers("/console/resultStatisticsByDeptPage", request)
                 || matchers("/console/homePageMRCount", request)
@@ -181,9 +194,11 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/console/export/getAverageFeeExport", request)
                 || matchers("/console/export/levelPercentGroupByDeptExport", request)
                 || matchers("/console/export/entryCountGroupByEntryExport", request)
+                || matchers("/console/export/entryCountGroupXYByEntryExport", request)
                 || matchers("/console/export/entryCountGroupByCaseExport", request)
                 || matchers("/console/export/entryStatisticsExport", request)
                 || matchers("/console/export/qcResultShortPageExport", request)
+                || matchers("/console/export/qcResultShortXYPageExport", request)
                 || matchers("/console/export/leaveHosMrPageExport", request)
                 || matchers("/console/export/qcCheckStatisticsExport", request)
                 || matchers("/console/export/unModifyMRPageExport", request)
@@ -241,13 +256,16 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/qc/medPacsInfo/getCheckPage", request)
                 || matchers("/qc/medLisInfo/getExaminePage", request)
                 || matchers("/qc/behospitalInfo/analyzeCds", request)
+                || matchers("/qc/behospitalInfo/addMedClickInfo", request)
                 || matchers("/qc/medLisInfo/getExamineSonPage", request)
                 || matchers("/console/medicalCheckForm", request)
                 || matchers("/console/medicalCheckTitle", request)
                 || matchers("/console/export/medicalCheckExport", request)
                 || matchers("/console/export/medicalCheckInnerExport", request)
                 || matchers("/console/badLevelPage", request)
+                || matchers("/console/badLevelXYPage", request)
                 || matchers("/console/export/badLevelPagePageExport", request)
+                || matchers("/console/export/badLevelPageXYExport", request)
                 || matchers("/qc/medNurse/getMedNursePage", request)
                 || matchers("/qc/behospitalInfo/exportQcresultByPerson", request)
                 || matchers("/consoleByDept/beHosCountByDept", request)

+ 5 - 0
src/main/java/com/diagbot/dto/HomePageNumDTO.java

@@ -29,6 +29,11 @@ public class HomePageNumDTO {
      * 主管医生名称
      */
     private String doctorName;
+
+    /**
+     * 主管医生职称
+     */
+    private String professor;
     /**
      * 缺陷条目数
      */

+ 138 - 0
src/main/java/com/diagbot/dto/HomePageNumXYDTO.java

@@ -0,0 +1,138 @@
+package com.diagbot.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:病案首页合格率占比返回结构
+ * @Author:zhaops
+ * @time: 2020/6/5 17:32
+ */
+@Getter
+@Setter
+public class HomePageNumXYDTO {
+    /**
+     * 科室id(科室编码)
+     */
+    private String deptId;
+    /**
+     * 科室名称
+     */
+    @Excel(name = "科室", width = 30, orderNum = "1")
+    private String deptName;
+
+
+    /**
+     * 主管医生职称
+     */
+    @Excel(name = "医师类别", width = 20, orderNum = "2")
+    private String professor;
+
+    /**
+     * 主管医生id
+     */
+    private String doctorId;
+    /**
+     * 主管医生名称
+     */
+    @Excel(name = "医师姓名", width = 20, orderNum = "3")
+    private String doctorName;
+    /**
+     * 缺陷条目数
+     */
+    @Excel(name = "缺陷总数", orderNum = "4")
+    private Integer entryNum = 0;
+    /**
+     * 病案首页不合格病历数
+     */
+    @Excel(name = "不合格数", orderNum = "5")
+    private Integer secondLevelNum = 0;
+
+    /**
+     * 质控评分(总分)
+     */
+    private Double totleValue = 0d;
+
+    /**
+     * 病案首页合格病历数
+     */
+    @Excel(name = "合格数", orderNum = "6")
+    private Integer firstLevelNum = 0;
+    /**
+     * 病案首页合格病历占比
+     */
+    private Double firstLevelPercent = 0.00d;
+    /**
+     * 病案首页不合格病历占比
+     */
+    private Double secondLevelPercent = 0.00d;
+    /**
+     * 病案首页合格病历占比(百分比)
+     */
+    @Excel(name = "合格率", orderNum = "7")
+    private String firstLevelPercentStr = "0.00%";
+    /**
+     * 病案首页不合格病历占比(百分比)
+     */
+    private String secondLevelPercentStr = "0.00%";
+    /**
+     * 上级科室id(上级科室编码)
+     */
+    private String deptClassId;
+    /**
+     * 上级科室名称
+     */
+    private String deptClass;
+    /**
+     * 空项数
+     */
+    @Excel(name = "空项数", orderNum = "8")
+    private Integer emptyNum = 0;
+
+    /**
+     * 完整率
+     */
+
+    private Double emptyPercent = 0.00d;
+
+    /**
+     * 完整率(百分比)
+     */
+    @Excel(name = "完整率", orderNum = "9")
+    private String emptyPercentStr = "0.00%";
+
+    /**
+     * 错误数
+     */
+    @Excel(name = "错误数", orderNum = "10")
+    private Integer errorNum = 0;
+
+    /**
+     * 完整率、完善率分母(质控病历数*病案首页条目数)
+     */
+    private Integer entryTotleNum = 0;
+
+    /**
+     * 完善率
+     */
+    private Double errorPercent = 0.00d;
+
+    /**
+     * 完善率(百分比)
+     */
+    @Excel(name = "完善率", orderNum = "11")
+    private String errorPercentStr = "0.00%";
+
+    /**
+     * 质控评分(平均分)
+     */
+    @Excel(name = "质控平均分", orderNum = "12")
+    private Double averageValue = 0d;
+
+    /**
+     * 质控病历数
+     */
+    @Excel(name = "质控病历数", orderNum = "13")
+    private Integer mrNum = 0;
+}

+ 61 - 0
src/main/java/com/diagbot/entity/ImageCaptchaParams.java

@@ -0,0 +1,61 @@
+package com.diagbot.entity;
+import lombok.Data;
+
+
+/**
+ * @Author chengyao
+ * @Date 2021/10/14 19:57
+ * @Version 1.0
+ */
+
+@Data
+public class ImageCaptchaParams {
+    /**
+     * 默认图片验证码的文字内容
+     */
+    public static final String DEFAULT_WORDS = "123456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
+    public static final String DEFAULT_FORMAT = "png";
+    /**
+     * 图片验证码宽度
+     */
+    private int width;
+    /**
+     * 图片验证码高度
+     */
+    private int height;
+    /**
+     * 最多生成几个文字
+     */
+    private int maxWordAmount;
+    /**
+     * 最小生成几个文字
+     */
+    private int minWordAmount;
+    /**
+     * 字体最大尺寸
+     */
+    private int maxFontSize;
+    /**
+     * 文字最小尺寸
+     */
+    private int minFontSize;
+    /**
+     * 生成图片验证码内容的字体
+     */
+    private String words;
+    /**
+     * 图片类型
+     */
+    private String format;
+
+    public ImageCaptchaParams(){
+        this.width = 105;
+        this.height = 35;
+        this.maxWordAmount = 4;
+        this.minWordAmount = 4;
+        this.minFontSize = 24;
+        this.maxFontSize = 25;
+        this.words = DEFAULT_WORDS;
+        this.format = DEFAULT_FORMAT;
+    }
+}

+ 87 - 0
src/main/java/com/diagbot/entity/MedClickInfo.java

@@ -0,0 +1,87 @@
+package com.diagbot.entity;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 医生点击质控病历次数基本表
+ * </p>
+ *
+ * @author cy
+ * @since 2021-11-10
+ */
+@Data
+public class MedClickInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 医院ID
+     */
+    private Integer hospitalId;
+
+    /**
+     * 科室ID
+     */
+    private String deptId;
+
+    /**
+     * 科室名称
+     */
+    private String deptName;
+
+    /**
+     * 医生ID
+     */
+    private String doctorId;
+
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 质控结果基本信息ID
+     */
+    private Integer qcresultInfoId;
+
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     *  记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     *  记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+}

+ 4 - 0
src/main/java/com/diagbot/facade/BasDoctorInfoFacade.java

@@ -15,6 +15,7 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @Description:
@@ -28,8 +29,11 @@ public class BasDoctorInfoFacade extends BasDoctorInfoServiceImpl {
     @Autowired
     BasDeptInfoFacade basDeptInfoFacade;
     @Autowired
+    BasDoctorInfoFacade basDoctorInfoFacade;
+    @Autowired
     BehospitalInfoFacade behospitalInfoFacade;
 
+
     /**
      * 获取医院医生下拉列表信息
      *

+ 52 - 35
src/main/java/com/diagbot/facade/BehospitalInfoFacade.java

@@ -14,6 +14,7 @@ import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.service.impl.BehospitalInfoServiceImpl;
+import com.diagbot.service.impl.MedClickInfoServiceImpl;
 import com.diagbot.service.impl.StrInformedConsentServiceImpl;
 import com.diagbot.util.*;
 import com.diagbot.vo.*;
@@ -29,7 +30,6 @@ import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -145,9 +145,10 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
     QcCasesRelevanceEntryFacade qcCasesRelevanceEntryFacade;
     @Autowired
     StrInformedConsentServiceImpl strInformedConsentServiceImpl;
-
     @Autowired
     SysUserRoleFacade sysUserRoleFacade;
+    @Autowired
+    MedClickInfoServiceImpl medClickInfoService;
 
 
     /**
@@ -238,8 +239,8 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
                 throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "该病历已删除!");
             }
             BeanUtil.copyProperties(behospitalInfo, behosDTO);
-            if(null != homePage && StringUtils.isNotEmpty(homePage.getAge()) && StringUtils.isNotEmpty(homePage.getAgeUnit())){
-                behosDTO.setAge(homePage.getAge()+homePage.getAgeUnit());
+            if (null != homePage && StringUtils.isNotEmpty(homePage.getAge()) && StringUtils.isNotEmpty(homePage.getAgeUnit())) {
+                behosDTO.setAge(homePage.getAge() + homePage.getAgeUnit());
             }
             res.put("beHospital", behosDTO);
         }
@@ -2286,38 +2287,38 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
         //保存
         Map<String, Object> pageMap = outputInfo.getPageData();
         //保存解析过后的手术知情同意书
-            List<String> recIds = new ArrayList<>();
-            if(pageMap.containsKey("手术知情同意书")){
-                Object informObject = pageMap.get("手术知情同意书");
-                List<Map<String,Object>> informList= (List<Map<String,Object>>) informObject;
-                List<StrInformedConsent> strInformedConsents = new ArrayList<>();
-                if(ListUtil.isNotEmpty(informList)) {
-                    informList.forEach(obj ->
-                            {
-                                Map<String, String> strMap = new HashMap<>();
-                                strMap.put("使用植入性材料", String.valueOf(obj.get("使用植入性材料")));
-                                StrInformedConsent strInformedConsent = new StrInformedConsent();
-                                strInformedConsent.setHospitalId(analyzeVO.getHospitalId());
-                                strInformedConsent.setBehospitalCode(analyzeVO.getBehospitalCode());
-                                strInformedConsent.setRecId(String.valueOf(obj.get("记录编号")));
-                                strInformedConsent.setRecTitle(String.valueOf(obj.get("病历标题")));
-                                strInformedConsent.setRecType("知情同意书");
-                                strInformedConsent.setContent(JSONObject.toJSONString(strMap));
-                                strInformedConsent.setGmtCreate(new Date());
-                                strInformedConsents.add(strInformedConsent);
-                                recIds.add(String.valueOf(obj.get("记录编号")));
-                            }
-                    );
-                    //删除手术知情同意书历史ric_id
-                    strInformedConsentServiceImpl.remove( new QueryWrapper<StrInformedConsent>()
-                            .eq("hospital_id",analyzeVO.getHospitalId())
-                            .eq("is_deleted",IsDeleteEnum.N.getKey())
-                            .eq("behospital_code",analyzeVO.getBehospitalCode())
-                            .in("rec_id",recIds));
-                    //新增
-                    strInformedConsentServiceImpl.saveBatch(strInformedConsents);
-                }
+        List<String> recIds = new ArrayList<>();
+        if (pageMap.containsKey("手术知情同意书")) {
+            Object informObject = pageMap.get("手术知情同意书");
+            List<Map<String, Object>> informList = (List<Map<String, Object>>) informObject;
+            List<StrInformedConsent> strInformedConsents = new ArrayList<>();
+            if (ListUtil.isNotEmpty(informList)) {
+                informList.forEach(obj ->
+                        {
+                            Map<String, String> strMap = new HashMap<>();
+                            strMap.put("使用植入性材料", String.valueOf(obj.get("使用植入性材料")));
+                            StrInformedConsent strInformedConsent = new StrInformedConsent();
+                            strInformedConsent.setHospitalId(analyzeVO.getHospitalId());
+                            strInformedConsent.setBehospitalCode(analyzeVO.getBehospitalCode());
+                            strInformedConsent.setRecId(String.valueOf(obj.get("记录编号")));
+                            strInformedConsent.setRecTitle(String.valueOf(obj.get("病历标题")));
+                            strInformedConsent.setRecType("知情同意书");
+                            strInformedConsent.setContent(JSONObject.toJSONString(strMap));
+                            strInformedConsent.setGmtCreate(new Date());
+                            strInformedConsents.add(strInformedConsent);
+                            recIds.add(String.valueOf(obj.get("记录编号")));
+                        }
+                );
+                //删除手术知情同意书历史ric_id
+                strInformedConsentServiceImpl.remove(new QueryWrapper<StrInformedConsent>()
+                        .eq("hospital_id", analyzeVO.getHospitalId())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())
+                        .eq("behospital_code", analyzeVO.getBehospitalCode())
+                        .in("rec_id", recIds));
+                //新增
+                strInformedConsentServiceImpl.saveBatch(strInformedConsents);
             }
+        }
         // 手动拼接数据【知情同意书】【谈话告知书】
         List<MedicalRecord> recordList = medicalRecordFacade.list(new QueryWrapper<MedicalRecord>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
@@ -2465,6 +2466,22 @@ public class BehospitalInfoFacade extends BehospitalInfoServiceImpl {
         return baseMapper.malignancy(filterVO);
     }
 
+    /**
+     * @Description:医生质控信息次数
+     * @Param: [medClickInfoVO]
+     * @return: void
+     * @Author: cy
+     * @Date: 2021/11/10
+     */
+    public Boolean addMedClickInfo(MedClickInfoVO medClickInfoVO) {
+        MedClickInfo medClickInfo = new MedClickInfo();
+        medClickInfo.setHospitalId(Integer.valueOf(SysUserUtils.getCurrentHospitalID()));
+        medClickInfo.setCreator(SysUserUtils.getCurrentPrincipleID());
+        BeanUtil.copyProperties(medClickInfoVO, medClickInfo);
+        medClickInfo.setGmtCreate(new Date());
+        return medClickInfoService.save(medClickInfo);
+    }
+
     /**
      * 获取患者年龄信息(通过出生日期和入院日期重新计算)
      *

+ 122 - 3
src/main/java/com/diagbot/facade/ConsoleExportFacade.java

@@ -1,7 +1,6 @@
 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;
@@ -13,8 +12,6 @@ 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;
 
@@ -50,6 +47,21 @@ public class ConsoleExportFacade {
         ExcelUtils.exportExcel(res, null, "sheet1", HomePageNumDTO.class, fileName, response, 12.8f);
     }
 
+    /**
+     * 病案首页合格率占比-湘雅
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    public void homePageLevelXYExport(HttpServletResponse response, FilterOrderXYPageVO filterOrderXYPageVO) {
+        filterOrderXYPageVO.setCurrent(1L);
+        filterOrderXYPageVO.setSize(Long.MAX_VALUE);
+        filterOrderXYPageVO.setSearchCount(false);
+        IPage<HomePageNumXYDTO> res = consoleFacade.homePageLevelStatisticsXY(filterOrderXYPageVO);
+        String fileName = "病案首页合格率占比.xls";
+        ExcelUtils.exportExcel(res.getRecords(), null, "sheet1", HomePageNumXYDTO.class, fileName, response, 12.8f);
+    }
+
     /**
      * 条目缺陷占比(内页)
      *
@@ -184,6 +196,22 @@ public class ConsoleExportFacade {
         ExcelUtils.exportExcel(page.getRecords(), null, "sheet1", EntryNumGroupDTO.class, fileName, response, 12.8f);
     }
 
+    /**
+     * 缺陷详情导出-湘雅
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public void entryCountGroupXYByEntryExport(HttpServletResponse response, FilterPageXYVO filterPageVO) {
+        filterPageVO.setCurrent(1L);
+        filterPageVO.setSize(Long.MAX_VALUE);
+        filterPageVO.setSearchCount(false);
+        IPage<EntryNumGroupDTO> page = consoleFacade.entryCountGroupXYByEntryPage(filterPageVO);
+        String fileName = "缺陷详情.xls";
+        ExcelUtils.exportExcel(page.getRecords(), null, "sheet1", EntryNumGroupDTO.class, fileName, response, 12.8f);
+    }
+
+
 
     /**
      * 各模块缺陷占比导出
@@ -244,6 +272,38 @@ public class ConsoleExportFacade {
         ExcelUtils.exportExcelUser(record, null, "sheet1", ExportExcelDTO.class, fileName, response);
     }
 
+    /**
+     * 缺陷详情质控评分页导出-湘雅
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    public void qcResultShortXYPageExport(HttpServletResponse response, QcResultShortXYPageVO qcResultShortPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        qcResultShortPageVO.setHospitalId(hospitalId);
+        if (StringUtil.isNotBlank(qcResultShortPageVO.getDeptName())
+                && qcResultShortPageVO.getDeptName().equals("全部")) {
+            qcResultShortPageVO.setDeptName("");
+        }
+        Date startDate = qcResultShortPageVO.getStartDate();
+        Date endDate = qcResultShortPageVO.getEndDate();
+        //时间间隔90天
+        long interval = 90 * 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, "统计区间不能大于90天");
+        }
+
+        qcResultShortPageVO.setCurrent(1L);
+        qcResultShortPageVO.setSize(Long.MAX_VALUE);
+        qcResultShortPageVO.setSearchCount(false);
+        List<ExportExcelDTO> record = behospitalInfoFacade.getBaseMapper().qcResultShortXYPageExport(qcResultShortPageVO);
+        String fileName = "缺陷详情质控评分页.xls";
+        ExcelUtils.exportExcelUser(record, null, "sheet1", ExportExcelDTO.class, fileName, response);
+    }
+
     /**
      * 出院人数统计导出
      *
@@ -427,6 +487,65 @@ public class ConsoleExportFacade {
         }
    }
 
+    /**
+     * 病案首页不合格/合格数-XY
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    public void badLevelPageXYExport(HttpServletResponse response, QcResultShortXYPageVO qcResultShortPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        qcResultShortPageVO.setHospitalId(hospitalId);
+        if (StringUtil.isNotBlank(qcResultShortPageVO.getDeptName())
+                && qcResultShortPageVO.getDeptName().equals("全部")) {
+            qcResultShortPageVO.setDeptName("");
+        }
+        Date startDate = qcResultShortPageVO.getStartDate();
+        Date endDate = qcResultShortPageVO.getEndDate();
+        //时间间隔7天
+        long interval_7 = 7 * 24 * 60 * 60 * 1000;
+        long interval_90 = 90 * 24 * 60 * 60 * 1000l;
+
+        if("1".equals(qcResultShortPageVO.getRadioCheck())){
+            //时间间隔7天
+            if (endDate.getTime() < startDate.getTime()) {
+                throw new CommonException(CommonErrorCode.PARAM_ERROR, "截止时间不能小于起始时间");
+            }
+            if (endDate.getTime() - startDate.getTime() > interval_7) {
+                throw new CommonException(CommonErrorCode.PARAM_ERROR, "统计区间不能大于7天");
+            }
+        }else{
+            //时间间隔90天
+            if (endDate.getTime() < startDate.getTime()) {
+                throw new CommonException(CommonErrorCode.PARAM_ERROR, "截止时间不能小于起始时间");
+            }
+            if (endDate.getTime() - startDate.getTime() > interval_90) {
+                throw new CommonException(CommonErrorCode.PARAM_ERROR, "统计区间不能大于90天");
+            }
+        }
+
+        qcResultShortPageVO.setCurrent(1L);
+        qcResultShortPageVO.setSize(Long.MAX_VALUE);
+        qcResultShortPageVO.setSearchCount(false);
+        List<ExportExcelDTO> records = behospitalInfoFacade.getBaseMapper().badLevelPageXYExport(qcResultShortPageVO);
+        List<ExportWideExcelDTO> resWide = new ArrayList<ExportWideExcelDTO>();
+        if("2".equals(qcResultShortPageVO.getRadioCheck())){
+            resWide = transList(records, resWide);
+        }
+        String fileName = null;
+        if("不合格数".equals(qcResultShortPageVO.getTitleName())){
+            fileName = "病案首页不合格数病历详情页.xls";
+        }else{
+            fileName = "病案首页合格数病历详情页.xls";
+        }
+        if("1".equals(qcResultShortPageVO.getRadioCheck())){
+            ExcelUtils.exportExcelUser(records, null, "sheet1", ExportExcelDTO.class, fileName, response);
+        }
+        if("2".equals(qcResultShortPageVO.getRadioCheck())){
+            ExcelUtils.exportExcelUser(resWide, null, "sheet1", ExportWideExcelDTO.class, fileName, response);
+        }
+    }
+
     /**
      * 未整改病历统计导出
      *

+ 60 - 5
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.diagbot.aggregate.AverageStatisticsAggregate;
-import com.diagbot.aggregate.LeaveHosStatisticsAggregate;
 import com.diagbot.aggregate.MrStatisticsAggregate;
 import com.diagbot.aggregate.ResultStatisticsAggregate;
 import com.diagbot.dto.*;
@@ -22,8 +21,6 @@ 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.apache.poi.hssf.record.DVALRecord;
-import org.apache.poi.ss.formula.functions.Na;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -42,8 +39,6 @@ import java.util.*;
 import java.util.concurrent.*;
 import java.util.stream.Collectors;
 
-import static io.netty.util.internal.SystemPropertyUtil.contains;
-
 /**
  * @Description:
  * @Author:zhaops
@@ -1413,6 +1408,22 @@ public class ConsoleFacade {
         return page;
     }
 
+
+    /**
+     * 缺陷详情(分页)-湘雅
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<EntryNumGroupDTO> entryCountGroupXYByEntryPage(FilterPageXYVO filterPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        filterPageVO.setHospitalId(hospitalId);
+        filterPageVO.setUserId(Long.valueOf(userId));
+        IPage<EntryNumGroupDTO> page = qcresultInfoFacade.getBaseMapper().entryCountGroupXYByEntryPage(filterPageVO);
+        return page;
+    }
+
     /**
      * 按科室统计平均住院天数(分页)
      *
@@ -2161,6 +2172,21 @@ public class ConsoleFacade {
         return records;
     }
 
+    /**
+     * 医师病案首页合格率占比 湘雅定制
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    public IPage<HomePageNumXYDTO> homePageLevelStatisticsXY(FilterOrderXYPageVO filterOrderXYPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        filterOrderXYPageVO.setHospitalId(hospitalId);
+        filterOrderXYPageVO.setUserId(Long.valueOf(userId));
+        IPage<HomePageNumXYDTO> records = behospitalInfoFacade.homePageLevelStatisticsXY(filterOrderXYPageVO);
+        return records;
+    }
+
     /**
      * 病历质控报表
      *
@@ -2429,6 +2455,21 @@ public class ConsoleFacade {
         return page;
     }
 
+    /**
+     * 条目缺陷质控评分页(内页)-湘雅
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    public IPage<QcResultShortDTO> qcResultShortXYPage(QcResultShortXYPageVO qcResultShortPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        qcResultShortPageVO.setHospitalId(hospitalId);
+        qcResultShortPageVO.setUserId(Long.valueOf(userId));
+        IPage<QcResultShortDTO> page = behospitalInfoFacade.getBaseMapper().qcResultShortXYPage(qcResultShortPageVO);
+        return page;
+    }
+
     /**
      * 关键条目缺陷占比统计
      *
@@ -2994,6 +3035,20 @@ public class ConsoleFacade {
         return behospitalInfoFacade.badLevelPage(qcResultPageVO);
     }
 
+    /**
+     * 不合格/合格数病历号(内页)-湘雅
+     *
+     * @param qcResultPageVO
+     * @return
+     */
+    public IPage<QcResultShortDTO> badLevelXYPage(QcResultPageXYVO qcResultPageVO) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        qcResultPageVO.setHospitalId(hospitalId);
+        qcResultPageVO.setUserId(Long.valueOf(userId));
+        return behospitalInfoFacade.getBaseMapper().badLevelXYPage(qcResultPageVO);
+    }
+
     /**
      * 31天再入院详情页
      *

+ 89 - 39
src/main/java/com/diagbot/facade/SysUserFacade.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.client.AuthServiceClient;
 import com.diagbot.dto.*;
 import com.diagbot.entity.BasHospitalInfo;
+import com.diagbot.entity.ImageCaptchaParams;
 import com.diagbot.entity.JWT;
 import com.diagbot.entity.JwtStore;
 import com.diagbot.entity.SysHospitalSet;
@@ -26,7 +27,9 @@ import com.diagbot.service.impl.SysUserServiceImpl;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.DateUtil;
 import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ImageCaptchaUtil;
 import com.diagbot.util.ListUtil;
+import com.diagbot.util.RedisUtils;
 import com.diagbot.util.StringUtil;
 import com.diagbot.util.SysUserUtils;
 import com.diagbot.vo.BasDeptInfoVO;
@@ -34,6 +37,7 @@ import com.diagbot.vo.SysUserBaseVO;
 import com.diagbot.vo.SysUserDeptVO;
 import com.diagbot.vo.SysUserQueryVO;
 import com.diagbot.vo.SysUserRoleVO;
+import com.diagbot.vo.UserLoginVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.crypto.factory.PasswordEncoderFactories;
@@ -41,7 +45,16 @@ import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.oauth2.common.OAuth2AccessToken;
 import org.springframework.stereotype.Component;
 import org.springframework.util.DigestUtils;
-
+import org.springframework.util.StringUtils;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -87,12 +100,13 @@ public class SysUserFacade extends SysUserServiceImpl {
     private SysDictionaryFacade sysDictionaryFacade;
     @Autowired
     private SysHospitalSetFacade sysHospitalSetFacade;
-
-
+    @Autowired
+    private RedisUtils redisUtils;
 
 
     /**
      * 获取标识--选择登录页面
+     *
      * @return java.lang.Long
      */
     public Long getHospitalMark() {
@@ -101,34 +115,67 @@ public class SysUserFacade extends SysUserServiceImpl {
                 .eq(SysHospitalSet::getHospitalId, 35)
                 .eq(SysHospitalSet::getIsDeleted, IsDeleteEnum.N.getKey())
                 .eq(SysHospitalSet::getCode, "special_page_csxy").one();
-        if(null != sysHospitalSet){
+        if (null != sysHospitalSet) {
             String val = sysHospitalSet.getValue();
-            if(StringUtil.isNotBlank(val) && "1".equals(val)){
-               mark =  Long.valueOf(val);
+            if (StringUtil.isNotBlank(val) && "1".equals(val)) {
+                mark = Long.valueOf(val);
             }
         }
         return mark;
     }
+
+    public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        response.setContentType("image/png");
+        response.setHeader("Pragma", "no-cache");
+        response.setHeader("Cache-Control", "no-cache");
+        response.setDateHeader("Expires", 0);
+        HttpSession session = request.getSession();
+        String captchaId = session.getId();
+        ServletOutputStream outputStream = response.getOutputStream();
+        ImageCaptchaUtil imageCaptchaUtil = new ImageCaptchaUtil();
+        BufferedImage image = imageCaptchaUtil.createRandom();
+        String captcha = imageCaptchaUtil.getText();
+        redisUtils.set("user:captchaIds:" + captchaId, captcha, 60 * 3);
+        ImageIO.write(image, ImageCaptchaParams.DEFAULT_FORMAT, outputStream);
+        outputStream.flush();
+        outputStream.close();
+    }
+
     /**
      * 获取jwt
-     * @param username 用户名
-     * @param password 密码
+     *
+     * userLoginVO
      * @return jwt
      */
-    public JwtDTO getJwt(String username, String password) {
+    public JwtDTO getJwt(HttpServletRequest request, UserLoginVO userLoginVO) {
         JwtDTO data = new JwtDTO();
-        if (StringUtil.isBlank(username)) {
+        if (StringUtil.isBlank(userLoginVO.getUsername())) {
             throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
                     "请输入用户名");
         }
-        if (StringUtil.isBlank(password)) {
+        if (StringUtil.isBlank(userLoginVO.getPassword())) {
             throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
                     "请输入密码");
         }
+        //非湘雅医院执行
+        String captchaId ="";
+        if(0L == getHospitalMark()) {
+            if ( StringUtils.isEmpty(userLoginVO.getCaptcha())) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                        "请输入验证码");
+            }
+            // 验证码校验
+            captchaId = request.getSession().getId();
+            Object captchaObject = redisUtils.get("user:captchaIds:" + captchaId);
+            if (null == captchaObject || StringUtil.isBlank(captchaObject.toString()) || !captchaObject.toString().trim().equalsIgnoreCase(userLoginVO.getCaptcha())) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "验证码错误");
+            }
+        }
+
         //使用MD5对密码进行加密
-        String MD5Password = DigestUtils.md5DigestAsHex(password.getBytes());
+        String MD5Password = DigestUtils.md5DigestAsHex(userLoginVO.getPassword().getBytes());
         QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
-        userQueryWrapper.eq("username", username)
+        userQueryWrapper.eq("username", userLoginVO.getUsername())
                 .eq("status", StatusEnum.Enable.getKey())
                 .eq("is_deleted", IsDeleteEnum.N.getKey());
         SysUser user = this.getOne(userQueryWrapper, false);
@@ -140,10 +187,13 @@ public class SysUserFacade extends SysUserServiceImpl {
             throw new CommonException(ServiceErrorCode.USER_PASSWORD_ERROR);
         }
         JWT jwt = authServiceClient.getToken("Basic dWFhLXNlcnZpY2U6MTIzNDU2",
-                "password", username, MD5Password);
+                "password", userLoginVO.getUsername(), MD5Password);
         if (null == jwt) {
             throw new CommonException(ServiceErrorCode.GET_TOKEN_FAIL);
         }
+        if(0L == getHospitalMark()) {
+            redisUtils.del("user:captchaIds:" + captchaId);
+        }
         data.setAccessToken(jwt.getAccess_token());
         data.setRefreshToken(jwt.getRefresh_token());
         data.setType(user.getType());
@@ -152,15 +202,12 @@ public class SysUserFacade extends SysUserServiceImpl {
         try {
             SysUserBaseVO sysUserBaseVO = new SysUserBaseVO();
             sysUserBaseVO.setUserId(user.getId());
-            List<SysRoleDTO> selRoles =getlocalUserRoles(sysUserBaseVO);
-            if(selRoles!=null&&!selRoles.isEmpty())
-            {
+            List<SysRoleDTO> selRoles = getlocalUserRoles(sysUserBaseVO);
+            if (selRoles != null && !selRoles.isEmpty()) {
                 data.setSelRoles(selRoles);
             }
 
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
         //token存入redis
@@ -171,8 +218,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         /***
          * 未经过MD5加密密码复杂度判断
          */
-     //   获取用户医院id
-   //     String hospitalID = SysUserUtils.getCurrentHospitalID();
+        //   获取用户医院id
+        //     String hospitalID = SysUserUtils.getCurrentHospitalID();
         Long id = user.getId();
         QueryWrapper<SysUserHospital> UserHospitalQueryWrapper = new QueryWrapper<>();
         UserHospitalQueryWrapper
@@ -181,8 +228,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         SysUserHospital userHospital = sysUserHospitalFacade.getOne(UserHospitalQueryWrapper, false);
         Long hospitalId = userHospital.getHospitalId();
         String idStr = String.valueOf(hospitalId);
-        Boolean passwordRegular = passwordRegular(password,idStr);
-        if(!passwordRegular){
+        Boolean passwordRegular = passwordRegular(userLoginVO.getPassword(), idStr);
+        if (!passwordRegular) {
             data.setPasswordComplexity("未修改初始密码,请及时修改密码");
         }
         return data;
@@ -294,8 +341,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         }
         //对传入的密码进行格式验证
         String hospitalID = SysUserUtils.getCurrentHospitalID();
-        Boolean regularBoolean = passwordRegular(modifyPassword,hospitalID);
-        if(!regularBoolean){
+        Boolean regularBoolean = passwordRegular(modifyPassword, hospitalID);
+        if (!regularBoolean) {
             throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "请输入正确格式的新密码");
         }
         String userId = SysUserUtils.getCurrentPrincipleID();
@@ -325,23 +372,25 @@ public class SysUserFacade extends SysUserServiceImpl {
 
     /**
      * 未加密密文正则表达式  至少8个字符,1个大写字母,1个小写字母,1个数字和1个特殊字符:
+     *
      * @param password
      * @return
      */
-    public Boolean passwordRegular(String password,String hospitalId){
-        boolean check=true;
+    public Boolean passwordRegular(String password, String hospitalId) {
+        boolean check = true;
         Map<String, Map<String, String>> dictionaryWithKey = sysDictionaryFacade.getDictionaryWithKey();
-        if(dictionaryWithKey!=null){
+        if (dictionaryWithKey != null) {
             Map<String, String> stringStringMap = dictionaryWithKey.get("30");
-            if(stringStringMap!=null) {
+            if (stringStringMap != null) {
                 String regular = stringStringMap.get(hospitalId);
-                if(StringUtil.isNotEmpty(regular)) {
+                if (StringUtil.isNotEmpty(regular)) {
                     check = password.matches(regular);
                 }
             }
         }
         return check;
     }
+
     /**
      * 登录
      *
@@ -356,13 +405,13 @@ public class SysUserFacade extends SysUserServiceImpl {
                 .eq("status", StatusEnum.Enable.getKey())
                 .eq("id", userId), false);
         QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
-        sysUserRoleQueryWrapper.eq("user_id",userId);
-        sysUserRoleQueryWrapper .eq("is_deleted", IsDeleteEnum.N.getKey());
+        sysUserRoleQueryWrapper.eq("user_id", userId);
+        sysUserRoleQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey());
         List<SysUserRole> sysUserRoleList = sysUserRoleFacade.list(sysUserRoleQueryWrapper);
-        if(ListUtil.isNotEmpty(sysUserRoleList)){
-            sysUserRoleList.forEach(sysUserRole ->{
-                roleSet.add(sysUserRole.getRoleId()+"");
-            } );
+        if (ListUtil.isNotEmpty(sysUserRoleList)) {
+            sysUserRoleList.forEach(sysUserRole -> {
+                roleSet.add(sysUserRole.getRoleId() + "");
+            });
         }
         if (user == null) {
             throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
@@ -385,8 +434,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         }
 
         //添加菜单信息
-        List<SysMenuWrapper> menuList = sysMenuFacade.getByRole(user.getId(),roleSet);
-        List<SysUserPermissionDTO> sysUserPermissionDTOList = sysMenuFacade.getByRolePermission(user.getId(),roleSet);
+        List<SysMenuWrapper> menuList = sysMenuFacade.getByRole(user.getId(), roleSet);
+        List<SysUserPermissionDTO> sysUserPermissionDTOList = sysMenuFacade.getByRolePermission(user.getId(), roleSet);
         Map<Long, List<SysMenuWrapper>> menuMap = EntityUtil.makeEntityListMap(menuList, "parentId");
         Map<Long, List<SysUserPermissionDTO>> menuPermissionMap = EntityUtil.makeEntityListMap(sysUserPermissionDTOList, "menuId");
         List<SysMenuWrapper> menuRes = menuMap.get(-1L);
@@ -542,6 +591,7 @@ public class SysUserFacade extends SysUserServiceImpl {
 
         return sysUserRoleDTO;
     }
+
     /**
      * 获取用户角色
      *

+ 45 - 18
src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java

@@ -4,24 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.*;
 import com.diagbot.entity.BehospitalInfo;
-import com.diagbot.vo.AnalyzeCodeVO;
-import com.diagbot.vo.AnalyzeVO;
-import com.diagbot.vo.BehospitalPageVO;
-import com.diagbot.vo.CaseScoreVO;
-import com.diagbot.vo.EntryStatisticsVO;
-import com.diagbot.vo.ExportQcresultVO;
-import com.diagbot.vo.FilterMedicalCheckVO;
-import com.diagbot.vo.FilterOrderByDeptVO;
-import com.diagbot.vo.FilterOrderVO;
-import com.diagbot.vo.FilterPageByDeptVO;
-import com.diagbot.vo.FilterPageVO;
-import com.diagbot.vo.FilterUnModifyMRVO;
-import com.diagbot.vo.FilterVO;
-import com.diagbot.vo.MedIndexFilterVO;
-import com.diagbot.vo.QcResultPageVO;
-import com.diagbot.vo.QcResultShortPageVO;
-import com.diagbot.vo.ReBeHosPageVO;
-import com.diagbot.vo.TaskVO;
+import com.diagbot.vo.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -164,6 +147,14 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public List<HomePageNumDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO);
 
+    /**
+     * 医师病案首页合格率占比 湘雅定制
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    public IPage<HomePageNumXYDTO> homePageLevelStatisticsXY(FilterOrderXYPageVO filterOrderXYPageVO);
+
     /**
      * 病历质控报表--扣分项
      *
@@ -313,6 +304,15 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public IPage<QcResultShortDTO> qcResultShortPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
+
+    /**
+     * 条目缺陷质控评分页(内页)-湘雅
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    public IPage<QcResultShortDTO> qcResultShortXYPage(@Param("qcResultShortPageVO") QcResultShortXYPageVO qcResultShortPageVO);
+
     /**
      * 条目缺陷质控评分页-科室(内页)
      *
@@ -451,6 +451,14 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public List<ExportExcelDTO> qcResultShortPageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
+    /**
+     * 条目缺陷质控评分详情页导出到excel-湘雅
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    public List<ExportExcelDTO> qcResultShortXYPageExport(@Param("qcResultShortPageVO") QcResultShortXYPageVO qcResultShortPageVO);
+
     /**
      * 未整改病历统计
      *
@@ -536,6 +544,15 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
      */
     public IPage<QcResultShortDTO> badLevelPage(@Param("qcResultPageVO") QcResultPageVO qcResultPageVO);
 
+    /**
+     * 不合格/合格数病历号(内页)XY
+     *
+     * @param qcResultPageVO
+     * @return
+     */
+    public IPage<QcResultShortDTO> badLevelXYPage(@Param("qcResultPageVO") QcResultPageXYVO qcResultPageVO);
+
+
 
     /**
      * 未整改病历缺陷评分详情页导出
@@ -565,6 +582,16 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
 
     public List<ExportExcelDTO> badLevelPagePageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO);
 
+
+    /**
+     * 病案首页不合格/合格数病历详情页导出-XY
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+
+    public List<ExportExcelDTO> badLevelPageXYExport(@Param("qcResultShortPageVO") QcResultShortXYPageVO qcResultShortPageVO);
+
     /**
      * 病案首页不合格/合格数病历详情页导出-科室
      *

+ 16 - 0
src/main/java/com/diagbot/mapper/MedClickInfoMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.MedClickInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 医生点击质控病历次数基本表 Mapper 接口
+ * </p>
+ *
+ * @author cy
+ * @since 2021-11-10
+ */
+public interface MedClickInfoMapper extends BaseMapper<MedClickInfo> {
+
+}

+ 10 - 0
src/main/java/com/diagbot/mapper/QcresultInfoMapper.java

@@ -12,6 +12,7 @@ import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.entity.QcresultInfo;
 import com.diagbot.vo.FilterPageByDeptVO;
 import com.diagbot.vo.FilterPageVO;
+import com.diagbot.vo.FilterPageXYVO;
 import com.diagbot.vo.FilterVO;
 import com.diagbot.vo.QcresultFilterVO;
 import org.apache.ibatis.annotations.Param;
@@ -120,6 +121,15 @@ public interface QcresultInfoMapper extends BaseMapper<QcresultInfo> {
      */
     public IPage<EntryNumGroupDTO> entryCountGroupByEntryPage(@Param("filterPageVO") FilterPageVO filterPageVO);
 
+
+    /**
+     * 缺陷详情(分页)-湘雅
+     *
+     * @param filterPageVO
+     * @return
+     */
+    public IPage<EntryNumGroupDTO> entryCountGroupXYByEntryPage(@Param("filterPageVO") FilterPageXYVO filterPageVO);
+
     /**
      * 各科室质控平均分(分页)
      *

+ 9 - 2
src/main/java/com/diagbot/service/BehospitalInfoService.java

@@ -4,11 +4,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.dto.*;
 import com.diagbot.entity.BehospitalInfo;
-import com.diagbot.entity.FilterRecordVO;
 import com.diagbot.vo.*;
 import org.apache.ibatis.annotations.Param;
 
-import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -184,6 +182,14 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
      */
     public List<HomePageNumDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO);
 
+    /**
+     * 医师病案首页合格率占比 湘雅定制
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    public IPage<HomePageNumXYDTO> homePageLevelStatisticsXY(FilterOrderXYPageVO filterOrderXYPageVO);
+
 
 
     /**
@@ -261,6 +267,7 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
      */
     public List<HomePageByDeptDTO> homePageLevelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO);
 
+
     /**
      * 缺陷明细-科室(分页)
      *

+ 16 - 0
src/main/java/com/diagbot/service/MedClickInfoService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.MedClickInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 医生点击质控病历次数基本表 服务类
+ * </p>
+ *
+ * @author cy
+ * @since 2021-11-10
+ */
+public interface MedClickInfoService extends IService<MedClickInfo> {
+
+}

+ 22 - 0
src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java

@@ -217,6 +217,17 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.homePageLevelStatistics(filterOrderVO);
     }
 
+    /**
+     * 医师病案首页合格率占比 湘雅定制
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    @Override
+    public IPage<HomePageNumXYDTO> homePageLevelStatisticsXY(FilterOrderXYPageVO filterOrderXYPageVO) {
+        return baseMapper.homePageLevelStatisticsXY(filterOrderXYPageVO);
+    }
+
     /**
      * 病历质控报表-扣分项
      *
@@ -577,6 +588,17 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
         return baseMapper.qcResultShortPageExport(qcResultShortPageVO);
     }
 
+    /**
+     * 条目缺陷质控评分详情页导出到excel-湘雅
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+
+    public List<ExportExcelDTO> qcResultShortXYPageExport(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO) {
+        return baseMapper.qcResultShortPageExport(qcResultShortPageVO);
+    }
+
     /**
      * 缺陷详情质控评分页导出-科室
      *

+ 20 - 0
src/main/java/com/diagbot/service/impl/MedClickInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.MedClickInfo;
+import com.diagbot.mapper.MedClickInfoMapper;
+import com.diagbot.service.MedClickInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 医生点击质控病历次数基本表 服务实现类
+ * </p>
+ *
+ * @author cy
+ * @since 2021-11-10
+ */
+@Service
+public class MedClickInfoServiceImpl extends ServiceImpl<MedClickInfoMapper, MedClickInfo> implements MedClickInfoService {
+
+}

+ 60 - 0
src/main/java/com/diagbot/util/ImageCaptchaUtil.java

@@ -0,0 +1,60 @@
+package com.diagbot.util;
+
+import com.diagbot.entity.ImageCaptchaParams;
+import org.patchca.color.SingleColorFactory;
+import org.patchca.filter.predefined.CurvesRippleFilterFactory;
+import org.patchca.font.RandomFontFactory;
+import org.patchca.service.Captcha;
+import org.patchca.service.ConfigurableCaptchaService;
+import org.patchca.word.RandomWordFactory;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+/**
+ * @author huangrusheng
+ * @version 1.0
+ * @date 2021/5/20 9:54
+ */
+public class ImageCaptchaUtil {
+    private String text;
+
+    /**
+     * 以Web的img识别的base64返回
+     * @param
+     * @return 图片文字内容+base64格式的img标签识别的图片
+     * @throws IOException
+     */
+    public BufferedImage createRandom() throws IOException{
+        ImageCaptchaParams params = new ImageCaptchaParams();
+        ConfigurableCaptchaService  captchaService = new ConfigurableCaptchaService();
+        captchaService.setColorFactory(new SingleColorFactory(Color.black));
+        CurvesRippleFilterFactory curvesRippleFilterFactory = new CurvesRippleFilterFactory();
+        curvesRippleFilterFactory.setColorFactory(captchaService.getColorFactory());
+        curvesRippleFilterFactory.setStrokeMin(1);
+        curvesRippleFilterFactory.setStrokeMax(1.5f);
+        captchaService.setFilterFactory(curvesRippleFilterFactory);
+        captchaService.setHeight(params.getHeight());
+        captchaService.setWidth(params.getWidth());
+        RandomWordFactory wordFactory = new RandomWordFactory();
+        wordFactory.setCharacters(params.getWords());
+        wordFactory.setMaxLength(params.getMaxWordAmount());
+        wordFactory.setMinLength(params.getMinWordAmount());
+        captchaService.setWordFactory(wordFactory);
+        RandomFontFactory fontFactory = new RandomFontFactory();
+        fontFactory.setMaxSize(params.getMaxFontSize());
+        fontFactory.setMinSize(params.getMinFontSize());
+        captchaService.setFontFactory(fontFactory);
+        Captcha captcha = captchaService.getCaptcha();
+        this.text = captcha.getChallenge();
+        return captcha.getImage();
+    }
+
+    /**
+     * 获取验证码文本的方法
+     */
+    public String getText() {
+        return text;
+    }
+}

+ 611 - 0
src/main/java/com/diagbot/util/RedisUtils.java

@@ -0,0 +1,611 @@
+
+package com.diagbot.util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+@Component
+public class RedisUtils {
+@Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+    // =============================common============================
+
+    /**
+     * 普通缓存获取
+     *
+     * @param
+     * @return 值
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public Set<String> keys(String pattern) {
+        return redisTemplate.keys(pattern);
+    }
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key  键
+     * @param time 时间(秒)
+     * @return
+     */
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据key 获取过期时间
+     *
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    // ============================String=============================
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 递增
+     *
+     * @param key   键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 递减
+     *
+     * @param key   键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    // ================================Map=================================
+
+    /**
+     * HashGet
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key 键
+     * @return 对应的多个键值
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key 键
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key  键
+     * @param map  对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要增加几(大于0)
+     * @return
+     */
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash递减
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要减少记(小于0)
+     * @return
+     */
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    // ============================set=============================
+
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key 键
+     * @return
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key   键
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key    键
+     * @param time   时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 移除的个数
+     */
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+    // ===============================list=================================
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @param key   键
+     * @param start 开始
+     * @param end   结束 0 到 -1代表所有值
+     * @return
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key   键
+     * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key   键
+     * @param index 索引
+     * @param value 值
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key   键
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 按键的排序获取对应的值
+     *
+     * @param keys 多个键
+     * @return List<Object>
+     */
+    @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
+    public List<Object> mget(Collection<String> keys) {
+        return redisTemplate.opsForValue().multiGet(keys);
+    }
+
+}

+ 63 - 0
src/main/java/com/diagbot/vo/FilterOrderXYPageVO.java

@@ -0,0 +1,63 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/19 13:39
+ */
+@Getter
+@Setter
+public class FilterOrderXYPageVO extends Page {
+    /**
+     * 医院id
+     */
+    @ApiModelProperty(hidden = true)
+    private String hospitalId;
+    /**
+     * 医生id
+     */
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+    /**
+     * 科室名称
+     */
+    private String deptName;
+
+    /**
+     * 科室id
+     */
+    private String deptId;
+
+
+    /**
+     * 医生名称
+     */
+    private String doctorName;
+    private String isPlacefile;
+    /**
+     * 医生Id
+     */
+    private String doctorId;
+
+    /**
+     * 医师类型-取自病案首页医师字段含义
+     */
+    private String professor;
+    /**
+     * 起始时间
+     */
+    @NotBlank(message = "请输入起始时间")
+    private String startDate;
+    /**
+     * 结束时间
+     */
+    @NotBlank(message = "请输入结束时间")
+    private String endDate;
+}

+ 15 - 0
src/main/java/com/diagbot/vo/FilterPageVO.java

@@ -51,6 +51,21 @@ public class FilterPageVO extends Page {
      */
     private String deptName;
 
+    /**
+     * 科室id
+     */
+    private String deptId;
+
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 医生id
+     */
+    private String doctorId;
+
     /**
      * 模块id:243=病案首页
      */

+ 94 - 0
src/main/java/com/diagbot/vo/FilterPageXYVO.java

@@ -0,0 +1,94 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/5/14 14:57
+ */
+@Getter
+@Setter
+public class FilterPageXYVO extends Page {
+    /**
+     * 统计维度 1-本月,2-本年
+     */
+    private Integer type;
+    /**
+     * 起始时间
+     */
+    @NotBlank(message = "请输入起始时间")
+    private String startDate;
+    /**
+     * 结束时间
+     */
+    @NotBlank(message = "请输入结束时间")
+    private String endDate;
+    /**
+     * 医院id
+     */
+    @ApiModelProperty(hidden = true)
+    private String hospitalId;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+
+    /**
+     * 缺陷名称
+     */
+    private String name;
+
+    /**
+     * 科室名称
+     */
+    private String deptName;
+
+    /**
+     * 科室id
+     */
+    private String deptId;
+
+
+
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 医师类别
+     */
+    private String professor;
+    /**
+     * 模块id:243=病案首页
+     */
+    private Long casesId;
+
+    /**
+     * 模块名称
+     */
+    private String casesName;
+
+    /**
+     * 单项否决
+     */
+    private Integer isReject;
+
+    /**
+     * 规则类型(0:无,1:空项,2:错误)
+     */
+    private Integer ruleType;
+
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    private String isPlacefile = "1";
+
+}

+ 5 - 0
src/main/java/com/diagbot/vo/FilterVO.java

@@ -62,6 +62,11 @@ public class FilterVO {
     //科室名称
     private String deptName;
 
+    /**
+     * 科室分类
+     */
+    private String deptId;
+
     private String level;
     /**
      * 是否归档(0:未归档,1:已归档)

+ 50 - 0
src/main/java/com/diagbot/vo/MedClickInfoVO.java

@@ -0,0 +1,50 @@
+package com.diagbot.vo;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 医生点击质控病历次数基本表
+ * </p>
+ *
+ * @author cy
+ * @since 2021-11-10
+ */
+@Data
+public class MedClickInfoVO implements Serializable {
+
+    /**
+     * 医院ID
+     */
+    private Integer hospitalId;
+
+    /**
+     * 科室ID
+     */
+    private String deptId;
+
+    /**
+     * 科室名称
+     */
+    private String deptName;
+
+    /**
+     * 医生ID
+     */
+    private String doctorId;
+
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 质控结果基本信息ID
+     */
+    private Integer qcresultInfoId;
+
+    /**
+     * 病人住院ID
+     */
+    private String behospitalCode;
+}

+ 5 - 0
src/main/java/com/diagbot/vo/QcResultPageVO.java

@@ -66,6 +66,11 @@ public class QcResultPageVO extends Page {
      */
     private String deptClass;
 
+    /**
+     * 科室id
+     */
+    private String deptId;
+
     /**
      * 医生姓名
      */

+ 159 - 0
src/main/java/com/diagbot/vo/QcResultPageXYVO.java

@@ -0,0 +1,159 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/6/16 17:00
+ */
+@Getter
+@Setter
+public class QcResultPageXYVO extends Page {
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+    @ApiModelProperty(hidden = true)
+    private String hospitalId;
+    /**
+     * 病历号
+     */
+    private String behospitalCode;
+    /**
+     * 病人姓名
+     */
+    private String patName;
+
+    /**
+     * title名称
+     */
+    private String titleName;
+
+    /**
+     * 条目名称
+     */
+    private String casesEntryName;
+
+    /**
+     * 主诊断
+     */
+    private String diagnose;
+
+    /**
+     * 条目id
+     */
+    private Long casesEntryId;
+    /**
+     * 模块名称
+     */
+    private String casesName;
+    /**
+     * 模块id
+     */
+    private Long casesId;
+    /**
+     * 科室名称
+     */
+    private String deptName;
+    /**
+     * 科室id
+     */
+    private String deptClass;
+
+    /**
+     * 科室id
+     */
+    private String deptId;
+
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 医师类别
+     */
+    private String professor;
+    /**
+     * 医生编号
+     */
+    private String doctorId;
+    /**
+     * 病历等级
+     */
+    private String level;
+    @NotNull(message = "请输入起始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    private String startDate;
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    @NotNull(message = "请输入截止时间")
+    private String endDate;
+
+    /**
+     * 单项否决
+     */
+    private Integer isReject;
+
+    /**
+     * 规则类型(0:无,1:空项,2:错误)
+     */
+    private Integer ruleType;
+
+    /**
+     * 离院人员类型(0/null:总人数,1:死亡人数,2:新生儿,3:手术病人数,4:非医嘱离院病人,5:31日再入院病人)
+     */
+    private Integer leaveHosType;
+
+    /**
+     * 核查状态(1:已核查,0:未核查)
+     */
+    private Integer checkStatus;
+    /**
+     * 首页核查状态(1:已核查,0:未核查)
+     */
+    private Integer mrStatus;
+    /**
+     * 病历核查人员
+     */
+    private String chName;
+    /**
+     * 首页核查人员
+     */
+    private String mrName;
+    /**
+     * 病历核查起始时间
+     */
+    private Date chTimeStart;
+    /**
+     * 病历核查截止时间
+     */
+    private Date chTimeEnd;
+    /**
+     * 首页核查起始时间
+     */
+    private Date mrTimeStart;
+    /**
+     * 首页核查截止时间
+     */
+    private Date mrTimeEnd;
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    private String isPlacefile = "1";
+
+    /**
+     * 住院超过31日标志
+     */
+    private Integer beHosGT31Days;
+
+    /**
+     * 改善标志(1:病案首页改善病历,2:病案首页改善至合格病历,3:病案首页改善至满分病历)
+     */
+    private Integer improveType;
+}

+ 5 - 0
src/main/java/com/diagbot/vo/QcResultShortPageVO.java

@@ -64,6 +64,11 @@ public class QcResultShortPageVO extends Page {
      * 科室名称
      */
     private String deptName;
+
+    /**
+     * 科室id
+     */
+    private String deptId;
     /**
      * 医生姓名
      */

+ 155 - 0
src/main/java/com/diagbot/vo/QcResultShortXYPageVO.java

@@ -0,0 +1,155 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/6/16 17:00
+ */
+@Getter
+@Setter
+public class QcResultShortXYPageVO extends Page {
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+    @ApiModelProperty(hidden = true)
+    private String hospitalId;
+    /**
+     * 病历号
+     */
+    private String behospitalCode;
+    /**
+     * 病人姓名
+     */
+    private String patName;
+    /**
+     * 条目名称
+     */
+    private String casesEntryName;
+    /**
+     * (1-导出7天[含缺陷明细项]  2-导出90天[不含缺陷明细项] )
+     */
+    @NotNull(message = "导出天数选择不能为空")
+    private String radioCheck = "1";
+
+    /**
+     * 主诊断
+     */
+    private String diagnose;
+
+    /**
+     * title名称
+     */
+    private String titleName;
+
+    /**
+     * 条目id
+     */
+    private Long casesEntryId;
+    /**
+     * 模块名称
+     */
+    private String casesName;
+    /**
+     * 模块id
+     */
+    private Long casesId;
+    /**
+     * 科室名称
+     */
+    private String deptName;
+
+    /**
+     * 科室ID
+     */
+    private String deptId;
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 医师类别
+     */
+    private String professor;
+    /**
+     * 医生编号
+     */
+    private String doctorId;
+    /**
+     * 病历等级
+     */
+    private String level;
+    @NotNull(message = "请输入起始时间")
+    private Date startDate;
+    @NotNull(message = "请输入截止时间")
+    private Date endDate;
+
+    /**
+     * 单项否决
+     */
+    private Integer isReject;
+
+    /**
+     * 规则类型(0:无,1:空项,2:错误)
+     */
+    private Integer ruleType;
+
+    /**
+     * 离院人员类型(0/null:总人数,1:死亡人数,2:新生儿,3:手术病人数,4:非医嘱离院病人,5:31日再入院病人)
+     */
+    private Integer leaveHosType;
+
+    /**
+     * 核查状态(1:已核查,0:未核查)
+     */
+    private Integer checkStatus;
+    /**
+     * 首页核查状态(1:已核查,0:未核查)
+     */
+    private Integer mrStatus;
+    /**
+     * 病历核查人员
+     */
+    private String chName;
+    /**
+     * 首页核查人员
+     */
+    private String mrName;
+    /**
+     * 病历核查起始时间
+     */
+    private Date chTimeStart;
+    /**
+     * 病历核查截止时间
+     */
+    private Date chTimeEnd;
+    /**
+     * 首页核查起始时间
+     */
+    private Date mrTimeStart;
+    /**
+     * 首页核查截止时间
+     */
+    private Date mrTimeEnd;
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    private String isPlacefile = "1";
+
+    /**
+     * 住院超过31日标志
+     */
+    private Integer beHosGT31Days;
+
+    /**
+     * 改善标志(1:病案首页改善病历,2:病案首页改善至合格病历,3:病案首页改善至满分病历)
+     */
+    private Integer improveType;
+}

+ 2 - 1
src/main/java/com/diagbot/vo/UserLoginVO.java

@@ -18,5 +18,6 @@ public class UserLoginVO {
     private String username;
     @NotBlank(message = "请输入密码!")
     private String password;
-
+   //验证码
+    private String captcha;
 }

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

@@ -284,4 +284,11 @@ public class BehospitalInfoController {
         return RespDTO.onSuc(behospitalInfoFacade.analyzeCds(analyzeCdsVO));
     }
 
+    @ApiOperation(value = "记录医生点击质控病历信息[by:cy]",
+            notes = "")
+    @PostMapping("/addMedClickInfo")
+    @SysLogger("addMedClickInfo")
+    public RespDTO<Boolean> addMedClickInfo(@RequestBody MedClickInfoVO medClickInfoVO) {
+        return RespDTO.onSuc(behospitalInfoFacade.addMedClickInfo(medClickInfoVO));
+    }
 }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
 import com.diagbot.dto.*;
 import com.diagbot.facade.ConsoleByDeptFacade;
+import com.diagbot.facade.ConsoleFacade;
 import com.diagbot.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -30,6 +31,8 @@ import java.util.Map;
 public class ConsoleByDeptController {
     @Autowired
     private ConsoleByDeptFacade consoleByDeptFacade;
+    @Autowired
+    private ConsoleFacade consoleFacade;
 
     //region --------------------------首页接口开始------------------------------
     @ApiOperation(value = "出院病人统计(科室)-首页[by:zhaops]",
@@ -230,6 +233,72 @@ public class ConsoleByDeptController {
     public RespDTO<List<HomePageByDeptDTO>> homePageLevelStatisticsByDept(@RequestBody @Valid FilterOrderByDeptVO filterOrderByDeptVO) {
         return RespDTO.onSuc(consoleByDeptFacade.homePageLevelStatisticsByDept(filterOrderByDeptVO));
     }
+
+    /**
+     * 医师病案首页合格率占比科室 湘雅定制
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "deptName: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/homePageLevelStatisticsXYByDept")
+    @SysLogger("homePageLevelStatisticsXYByDept")
+    public RespDTO<IPage<HomePageNumXYDTO>> homePageLevelStatisticsXY(@RequestBody @Valid FilterOrderXYPageVO filterOrderXYPageVO) {
+        return RespDTO.onSuc(consoleFacade.homePageLevelStatisticsXY(filterOrderXYPageVO));
+    }
+
+    /**
+     * 条目缺陷占比科室(分页)-湘雅
+     *
+     * @param filterPageXYVO
+     * @return
+     */
+    @ApiOperation(value = "缺陷详情(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "deptName: 科室名称 <br>" +
+                    "casesId: 模块id:243=病案首页 <br>" +
+                    "casesName: 模块名称 <br>" +
+                    "isReject: 单项否决 1-否决,0-非<br>" +
+                    "ruleType: 规则类型 0:无,1:空项,2:错误<br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/entryCountGroupXYByEntryPageDept")
+    @SysLogger("entryCountGroupXYByEntryPageDept")
+    public RespDTO<IPage<EntryNumGroupDTO>> entryCountGroupXYByEntryPageDept(@RequestBody @Valid FilterPageXYVO filterPageXYVO) {
+        return RespDTO.onSuc(consoleFacade.entryCountGroupXYByEntryPage(filterPageXYVO));
+    }
+
+    /**
+     * 条目缺陷质控评科室分页(内页)-湘雅
+     *
+     * @param qcResultShortXYPageVO
+     * @return
+     */
+    @ApiOperation(value = "条目缺陷质控评分页(内页)[by:zhaops]")
+    @PostMapping("/qcResultShortXYPageByDept")
+    @SysLogger("qcResultShortXYPageByDept")
+    public RespDTO<IPage<QcResultShortDTO>> qcResultShortXYPageByDept(@RequestBody @Valid QcResultShortXYPageVO qcResultShortXYPageVO) {
+        return RespDTO.onSuc(consoleFacade.qcResultShortXYPage(qcResultShortXYPageVO));
+    }
+
+    /**
+     * 病案首页不合格数病历科室详情(内页)-湘雅
+     * @param qcResultPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页不合格/合格数病历详情(内页)[by:cy]")
+    @PostMapping("/badLevelXYPageByDept")
+    @SysLogger("badLevelXYPageByDept")
+    public RespDTO<IPage<QcResultShortDTO>> badLevelXYPageByDept(@RequestBody @Valid QcResultPageXYVO qcResultPageVO) {
+        return RespDTO.onSuc(consoleFacade.badLevelXYPage(qcResultPageVO));
+    }
+
+
     /**
      * 病案首页合格/不合格数
      *

+ 61 - 5
src/main/java/com/diagbot/web/ConsoleByDeptExportController.java

@@ -1,11 +1,8 @@
 package com.diagbot.web;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
-import com.diagbot.dto.DeptEntryNumDTO;
-import com.diagbot.dto.EntryStasByDeptDTO;
-import com.diagbot.dto.RespDTO;
 import com.diagbot.facade.ConsoleByDeptExportFacade;
+import com.diagbot.facade.ConsoleExportFacade;
 import com.diagbot.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -17,7 +14,6 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import java.util.List;
 
 /**
  * @Description:
@@ -33,6 +29,8 @@ public class ConsoleByDeptExportController {
 
     @Autowired
     private ConsoleByDeptExportFacade consoleByDeptExportFacade;
+    @Autowired
+    private ConsoleExportFacade consoleExportFacade;
 
 /**
      * 病案首页合格率占比科室-导出
@@ -55,6 +53,64 @@ public class ConsoleByDeptExportController {
         consoleByDeptExportFacade.homePageLevelExportByDept(response, filterOrderByDeptVO);
     }
 
+    /**
+     * 病案首页合格率占比导出-湘雅-科室
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比导出[by:gaodm]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/homePageLevelXYExportByDept")
+    @SysLogger("homePageLevelXYExportByDept")
+    public void homePageLevelXYExport(HttpServletResponse response, @RequestBody @Valid FilterOrderXYPageVO filterOrderXYPageVO) {
+        consoleExportFacade.homePageLevelXYExport(response, filterOrderXYPageVO);
+    }
+
+    /**
+     * 条目缺陷占比科室导出-湘雅
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "缺陷详情导出[by:gaodm]")
+    @PostMapping("/entryCountGroupXYByExportDept")
+    @SysLogger("entryCountGroupXYByExportDept")
+    public void entryCountGroupXYByExportDept(HttpServletResponse response, @RequestBody @Valid FilterPageXYVO filterPageVO) {
+        consoleExportFacade.entryCountGroupXYByEntryExport(response, filterPageVO);
+    }
+
+    /**
+     * 缺陷详情质控评分页科室导出-湘雅
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    @ApiOperation(value = "缺陷详情质控评分页导出[by:zhaops]")
+    @PostMapping("/qcResultShortXYPageExportDept")
+    @SysLogger("qcResultShortXYPageExportDept")
+    public void qcResultShortXYPageExportDept(HttpServletResponse response, @RequestBody @Valid QcResultShortXYPageVO qcResultShortPageVO) {
+        consoleExportFacade.qcResultShortXYPageExport(response, qcResultShortPageVO);
+    }
+
+    /**
+     * 病案首页不合格/合格数病历详情页科室导出-XY
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页不合格/合格数病历详情页导出[by:cy]")
+    @PostMapping("/badLevelPageXYExportByDept")
+    @SysLogger("badLevelPageXYExportByDept")
+    public void badLevelPageXYExportByDept(HttpServletResponse response, @RequestBody @Valid QcResultShortXYPageVO qcResultShortPageVO) {
+        consoleExportFacade.badLevelPageXYExport(response, qcResultShortPageVO);
+    }
+
     /**
      * 病案首页不合格/合格数病历详情页导出-科室
      *

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

@@ -3,7 +3,6 @@ package com.diagbot.web;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
 import com.diagbot.dto.*;
-import com.diagbot.entity.FilterRecordVO;
 import com.diagbot.facade.ConsoleFacade;
 import com.diagbot.vo.*;
 import io.swagger.annotations.Api;
@@ -323,6 +322,26 @@ public class ConsoleController {
         return RespDTO.onSuc(consoleFacade.entryCountGroupByEntryPage(filterPageVO));
     }
 
+    /**
+     * 条目缺陷占比(分页)-湘雅
+     *
+     * @param filterPageXYVO
+     * @return
+     */
+    @ApiOperation(value = "缺陷详情(分页)[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "deptName: 科室名称 <br>" +
+                    "casesId: 模块id:243=病案首页 <br>" +
+                    "casesName: 模块名称 <br>" +
+                    "isReject: 单项否决 1-否决,0-非<br>" +
+                    "ruleType: 规则类型 0:无,1:空项,2:错误<br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/entryCountGroupXYByEntryPage")
+    @SysLogger("entryCountGroupXYByEntryPage")
+    public RespDTO<IPage<EntryNumGroupDTO>> entryCountGroupXYByEntryPage(@RequestBody @Valid FilterPageXYVO filterPageXYVO) {
+        return RespDTO.onSuc(consoleFacade.entryCountGroupXYByEntryPage(filterPageXYVO));
+    }
+
     /**
      * 按科室统计平均住院天数(分页)
      *
@@ -474,6 +493,25 @@ public class ConsoleController {
         return RespDTO.onSuc(consoleFacade.homePageLevelStatistics(filterOrderVO));
     }
 
+    /**
+     * 医师病案首页合格率占比 湘雅定制
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "deptName: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/homePageLevelStatisticsXY")
+    @SysLogger("homePageLevelStatisticsXY")
+    public RespDTO<IPage<HomePageNumXYDTO>> homePageLevelStatisticsXY(@RequestBody @Valid FilterOrderXYPageVO filterOrderXYPageVO) {
+        return RespDTO.onSuc(consoleFacade.homePageLevelStatisticsXY(filterOrderXYPageVO));
+    }
+
     /**
      * 病历质控报表
      *
@@ -525,6 +563,18 @@ public class ConsoleController {
         return RespDTO.onSuc(consoleFacade.badLevelPage(qcResultPageVO));
     }
 
+    /**
+     * 病案首页不合格数病历详情(内页)-湘雅
+     * @param qcResultPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页不合格/合格数病历详情(内页)[by:cy]")
+    @PostMapping("/badLevelXYPage")
+    @SysLogger("badLevelXYPage")
+    public RespDTO<IPage<QcResultShortDTO>> badLevelXYPage(@RequestBody @Valid QcResultPageXYVO qcResultPageVO) {
+        return RespDTO.onSuc(consoleFacade.badLevelXYPage(qcResultPageVO));
+    }
+
 
     /**
      * 病案首页合格率占比(首页)
@@ -582,6 +632,19 @@ public class ConsoleController {
         return RespDTO.onSuc(consoleFacade.qcResultShortPage(qcResultShortPageVO));
     }
 
+    /**
+     * 条目缺陷质控评分页(内页)-湘雅
+     *
+     * @param qcResultShortXYPageVO
+     * @return
+     */
+    @ApiOperation(value = "条目缺陷质控评分页(内页)[by:zhaops]")
+    @PostMapping("/qcResultShortXYPage")
+    @SysLogger("qcResultShortXYPage")
+    public RespDTO<IPage<QcResultShortDTO>> qcResultShortXYPage(@RequestBody @Valid QcResultShortXYPageVO qcResultShortXYPageVO) {
+        return RespDTO.onSuc(consoleFacade.qcResultShortXYPage(qcResultShortXYPageVO));
+    }
+
     /**
      * 关键条目缺陷占比统计
      *

+ 59 - 3
src/main/java/com/diagbot/web/ConsoleExportController.java

@@ -1,9 +1,6 @@
 package com.diagbot.web;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
-import com.diagbot.dto.QcResultShortDTO;
-import com.diagbot.dto.RespDTO;
 import com.diagbot.facade.ConsoleExportFacade;
 import com.diagbot.vo.*;
 import io.swagger.annotations.Api;
@@ -50,6 +47,25 @@ public class ConsoleExportController {
         consoleExportFacade.homePageLevelExport(response, filterOrderVO);
     }
 
+    /**
+     * 病案首页合格率占比导出-湘雅
+     *
+     * @param filterOrderXYPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页合格率占比导出[by:gaodm]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>" +
+                    "level: 病历等级 <br>" +
+                    "name: 科室名称 <br>" +
+                    "asc: 排序(升序) <br>" +
+                    "desc: 排序(降序) <br>" +
+                    "isPlacefile: 是否归档(0:未归档,1:已归档) <br>")
+    @PostMapping("/homePageLevelXYExport")
+    @SysLogger("homePageLevelXYExport")
+    public void homePageLevelXYExport(HttpServletResponse response, @RequestBody @Valid FilterOrderXYPageVO filterOrderXYPageVO) {
+        consoleExportFacade.homePageLevelXYExport(response, filterOrderXYPageVO);
+    }
+
 
     /**
      * 条目缺陷占比(内页)
@@ -187,6 +203,19 @@ public class ConsoleExportController {
         consoleExportFacade.entryCountGroupByEntryExport(response, filterPageVO);
     }
 
+    /**
+     * 条目缺陷占比导出-湘雅
+     *
+     * @param filterPageVO
+     * @return
+     */
+    @ApiOperation(value = "缺陷详情导出[by:gaodm]")
+    @PostMapping("/entryCountGroupXYByEntryExport")
+    @SysLogger("entryCountGroupXYByEntryExport")
+    public void entryCountGroupXYByEntryExport(HttpServletResponse response, @RequestBody @Valid FilterPageXYVO filterPageVO) {
+        consoleExportFacade.entryCountGroupXYByEntryExport(response, filterPageVO);
+    }
+
     /**
      * 各模块缺陷占比导出
      *
@@ -258,6 +287,19 @@ public class ConsoleExportController {
         consoleExportFacade.qcResultShortPageExport(response, qcResultShortPageVO);
     }
 
+    /**
+     * 缺陷详情质控评分页导出-湘雅
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    @ApiOperation(value = "缺陷详情质控评分页导出[by:zhaops]")
+    @PostMapping("/qcResultShortXYPageExport")
+    @SysLogger("qcResultShortXYPageExport")
+    public void qcResultShortXYPageExport(HttpServletResponse response, @RequestBody @Valid QcResultShortXYPageVO qcResultShortPageVO) {
+        consoleExportFacade.qcResultShortXYPageExport(response, qcResultShortPageVO);
+    }
+
     /**
      * 出院人数统计导出
      *
@@ -369,6 +411,20 @@ public class ConsoleExportController {
     }
 
 
+    /**
+     * 病案首页不合格/合格数病历详情页导出-XY
+     *
+     * @param qcResultShortPageVO
+     * @return
+     */
+    @ApiOperation(value = "病案首页不合格/合格数病历详情页导出[by:cy]")
+    @PostMapping("/badLevelPageXYExport")
+    @SysLogger("badLevelPageXYExport")
+    public void badLevelPageXYExport(HttpServletResponse response, @RequestBody @Valid QcResultShortXYPageVO qcResultShortPageVO) {
+        consoleExportFacade.badLevelPageXYExport(response, qcResultShortPageVO);
+    }
+
+
     /**
      * 稽查病历详情页导出
      *

+ 14 - 2
src/main/java/com/diagbot/web/SysUserController.java

@@ -24,13 +24,18 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.oauth2.common.OAuth2AccessToken;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.IOException;
+
 
 /**
  * @Description: 用户账号API
@@ -64,11 +69,18 @@ public class SysUserController {
                     "password:密码, 必填, 默认密码:a123456<br> ")
     @PostMapping("/getJwt")
     @SysLogger("getJwt")
-    public RespDTO<JwtDTO> getJwt(@RequestBody UserLoginVO userLoginVO) {
-        JwtDTO data = userFacade.getJwt(userLoginVO.getUsername(), userLoginVO.getPassword());
+    public RespDTO<JwtDTO> getJwt(HttpServletRequest request,@RequestBody UserLoginVO userLoginVO) {
+        JwtDTO data = userFacade.getJwt(request,userLoginVO);
         return RespDTO.onSuc(data);
     }
 
+    @ApiOperation(value = "获取验证码[by:cy]")
+    @GetMapping("/getCaptcha")
+    @SysLogger("getCaptcha")
+    public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
+           userFacade.getCaptcha(request, response);
+    }
+
     @ApiOperation(value = "获取标识--选择登录页面[by:cy]")
     @PostMapping("/getHospitalMark")
     @SysLogger("getHospitalMark")

+ 1 - 1
src/main/resources/application-local.yml

@@ -59,7 +59,7 @@ spring:
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
       platform: mysql
-      url: jdbc:mysql://192.168.2.236:3306/qc?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
+      url: jdbc:mysql://192.168.2.237:3306/qc?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
       username: root
       password: lantone
       # 连接池的配置信息

+ 3 - 3
src/main/resources/application-pre.yml

@@ -59,9 +59,9 @@ spring:
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
       platform: mysql
-      url: jdbc:mysql://192.168.2.121:3306/qc?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
-      username: teamback
-      password: goTulmLeon
+      url: jdbc:mysql://192.168.2.125:3307/qc?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
+      username: root
+      password: LangT0ng@lt
       # 连接池的配置信息
       # 初始化大小,最小,最大
       initialSize: 5

+ 1 - 1
src/main/resources/bootstrap.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: mrqc-sys
   profiles:
-    active: test
+    active: local
   main:
     allow-bean-definition-overriding: true
 

Файловите разлики са ограничени, защото са твърде много
+ 3873 - 2264
src/main/resources/mapper/BehospitalInfoMapper.xml


+ 22 - 0
src/main/resources/mapper/MedClickInfoMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.MedClickInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.MedClickInfo">
+        <id column="id" property="id" />
+        <result column="hospital_id" property="hospitalId" />
+        <result column="dept_id" property="deptId" />
+        <result column="dept_name" property="deptName" />
+        <result column="doctor_id" property="doctorId" />
+        <result column="doctor_name" property="doctorName" />
+        <result column="qcresult_info_id" property="qcresultInfoId" />
+        <result column="behospital_code" property="behospitalCode" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+    </resultMap>
+
+</mapper>

+ 233 - 2
src/main/resources/mapper/QcresultInfoMapper.xml

@@ -1683,6 +1683,12 @@
         <if test="filterPageVO.deptName != null and filterPageVO.deptName != ''">
             AND a.beh_dept_name = #{filterPageVO.deptName}
         </if>
+        <if test="filterPageVO.deptId != null and filterPageVO.deptId != ''">
+            AND a.beh_dept_id = #{filterPageVO.deptId}
+        </if>
+        <if test="filterPageVO.doctorName != null and filterPageVO.doctorName != ''">
+            AND a.doctor_name = #{filterPageVO.doctorName}
+        </if>
         <if test="filterPageVO.casesId != null and filterPageVO.casesId != 0">
             AND d.cases_id = #{filterPageVO.casesId}
         </if>
@@ -1723,6 +1729,9 @@
         <if test="filterPageVO.isPlacefile != null and filterPageVO.isPlacefile != ''">
             and a.is_placefile = #{filterPageVO.isPlacefile}
         </if>
+        <if test="filterPageVO.casesId != null and filterPageVO.casesId != 0">
+            AND d.cases_id = #{filterPageVO.casesId}
+        </if>
         AND e.cases_id = d.cases_id
         AND e.id = d.cases_entry_id
         AND a.qc_type_id != 0
@@ -1745,9 +1754,218 @@
                 <![CDATA[ AND a.leave_hospital_date <= #{filterPageVO.endDate}]]>
             </if>
         </if>
+        <if test="filterPageVO.doctorName != null and filterPageVO.doctorName != ''">
+            AND a.doctor_name = #{filterPageVO.doctorName}
+        </if>
         <if test="filterPageVO.deptName != null and filterPageVO.deptName != ''">
             AND a.beh_dept_name  =  #{filterPageVO.deptName}
         </if>
+        <if test="filterPageVO.deptId != null and filterPageVO.deptId != ''">
+            AND a.beh_dept_id = #{filterPageVO.deptId}
+        </if>
+        <if test="filterPageVO.isReject != null">
+            AND d.is_reject = #{filterPageVO.isReject}
+        </if>
+        <if test="filterPageVO.ruleType != null">
+            AND e.rule_type = #{filterPageVO.ruleType}
+        </if>
+        ) t2
+        )t
+    </select>
+
+    <!-- 缺陷详情(分页)湘雅 -->
+    <select id="entryCountGroupXYByEntryPage"  resultType="com.diagbot.dto.EntryNumGroupDTO">
+        SELECT
+        t.*
+        FROM
+        (
+        SELECT
+        t1.id,
+        t1.NAME,
+        t1.casesId,
+        t1.casesName,
+        t1.ruleType,
+        t1.isReject,
+        t1.num,
+        t2.totleNum,
+        ROUND( t1.num / t2.totleNum, 4 ) AS percent,
+        CONCAT( ROUND( t1.num / t2.totleNum * 100, 2 ), '%' ) AS percentStr
+        FROM
+        (
+        SELECT
+        tt2.id AS id,
+        tt2.NAME AS NAME,
+        tt2.cases_id AS casesId,
+        tt2.cases_name AS casesName,
+        tt1.num,
+        tt2.rule_type AS ruleType,
+        tt1.is_reject AS isReject
+        FROM
+        (
+        SELECT
+        d.cases_id,
+        d.cases_entry_id,
+        d.is_reject,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_detail d
+        WHERE
+        a.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = d.behospital_code
+        AND d.cases_id = 243
+        <if test="filterPageVO.isPlacefile != null and filterPageVO.isPlacefile != ''">
+            and a.is_placefile = #{filterPageVO.isPlacefile}
+        </if>
+        AND a.qc_type_id != 0
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.isPlacefile != null and filterPageVO.isPlacefile == 0">
+            <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+                <![CDATA[ AND a.behospital_date >= #{filterPageVO.startDate}]]>
+            </if>
+            <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+                <![CDATA[ AND a.behospital_date <= #{filterPageVO.endDate}]]>
+            </if>
+        </if>
+        <if test="filterPageVO.isPlacefile != null and filterPageVO.isPlacefile == 1">
+            <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+                <![CDATA[ AND a.leave_hospital_date >= #{filterPageVO.startDate}]]>
+            </if>
+            <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+                <![CDATA[ AND a.leave_hospital_date <= #{filterPageVO.endDate}]]>
+            </if>
+        </if>
+        <if test="filterPageVO.deptName != null and filterPageVO.deptName != ''">
+            AND a.beh_dept_name = #{filterPageVO.deptName}
+        </if>
+        <if test="filterPageVO.deptId != null and filterPageVO.deptId != ''">
+            AND a.beh_dept_id = #{filterPageVO.deptId}
+        </if>
+        <if test="filterPageVO.doctorName != null and filterPageVO.doctorName != ''">
+            AND(case
+            when b.attending_doctor != '' and b.attending_doctor is not null then b.attending_doctor
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            b.director_doctor != '' and b.director_doctor is not null
+            then b.director_doctor
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            (b.director_doctor = '' or b.director_doctor is null) and
+            b.behospital_doctor != '' and b.behospital_doctor is not null
+            then b.behospital_doctor end ) = #{filterPageVO.doctorName}
+        </if>
+        <if test="filterPageVO.professor != null and filterPageVO.professor != ''">
+            AND(case
+            when b.attending_doctor != '' and b.attending_doctor is not null then '主治医师'
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            b.director_doctor != '' and b.director_doctor is not null
+            then '主任医师'
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            (b.director_doctor = '' or b.director_doctor is null) and
+            b.behospital_doctor != '' and b.behospital_doctor is not null
+            then '住院医师' end) = #{filterPageVO.professor}
+        </if>
+        <if test="filterPageVO.casesId != null and filterPageVO.casesId != 0">
+            AND d.cases_id = #{filterPageVO.casesId}
+        </if>
+        <if test="filterPageVO.isReject != null">
+            AND d.is_reject = #{filterPageVO.isReject}
+        </if>
+        GROUP BY
+        d.cases_entry_id,
+        d.cases_id
+        ) tt1,
+        qc_cases_entry tt2
+        WHERE
+        tt2.is_deleted = 'N'
+        AND tt1.cases_id = tt2.cases_id
+        AND tt1.cases_entry_id = tt2.id
+        <if test="filterPageVO.casesName != null and filterPageVO.casesName != ''">
+            AND tt2.cases_name like CONCAT('%', #{filterPageVO.casesName},'%')
+        </if>
+        <if test="filterPageVO.name != null and filterPageVO.name != ''">
+            AND tt2.name like CONCAT('%', #{filterPageVO.name},'%')
+        </if>
+        <if test="filterPageVO.ruleType != null">
+            AND tt2.rule_type = #{filterPageVO.ruleType}
+        </if>
+        ) t1,(
+        SELECT
+        count(*) AS totleNum
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_detail d,
+        qc_cases_entry e
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = d.behospital_code
+        <if test="filterPageVO.isPlacefile != null and filterPageVO.isPlacefile != ''">
+            and a.is_placefile = #{filterPageVO.isPlacefile}
+        </if>
+        AND e.cases_id = d.cases_id
+        AND e.id = d.cases_entry_id
+        AND e.cases_id = 243
+        AND a.qc_type_id != 0
+        <if test="filterPageVO.hospitalId != null and filterPageVO.hospitalId != ''">
+            AND a.hospital_id = #{filterPageVO.hospitalId}
+        </if>
+        <if test="filterPageVO.isPlacefile != null and filterPageVO.isPlacefile == 0">
+            <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+                <![CDATA[ AND a.behospital_date >= #{filterPageVO.startDate}]]>
+            </if>
+            <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+                <![CDATA[ AND a.behospital_date <= #{filterPageVO.endDate}]]>
+            </if>
+        </if>
+        <if test="filterPageVO.isPlacefile != null and filterPageVO.isPlacefile == 1">
+            <if test="filterPageVO.startDate != null and filterPageVO.startDate != ''">
+                <![CDATA[ AND a.leave_hospital_date >= #{filterPageVO.startDate}]]>
+            </if>
+            <if test="filterPageVO.endDate != null and filterPageVO.endDate != ''">
+                <![CDATA[ AND a.leave_hospital_date <= #{filterPageVO.endDate}]]>
+            </if>
+        </if>
+        <if test="filterPageVO.doctorName != null and filterPageVO.doctorName != ''">
+            AND(case
+            when b.attending_doctor != '' and b.attending_doctor is not null then b.attending_doctor
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            b.director_doctor != '' and b.director_doctor is not null
+            then b.director_doctor
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            (b.director_doctor = '' or b.director_doctor is null) and
+            b.behospital_doctor != '' and b.behospital_doctor is not null
+            then b.behospital_doctor end ) = #{filterPageVO.doctorName}
+        </if>
+        <if test="filterPageVO.professor != null and filterPageVO.professor != ''">
+            AND(case
+            when b.attending_doctor != '' and b.attending_doctor is not null then '主治医师'
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            b.director_doctor != '' and b.director_doctor is not null
+            then '主任医师'
+            when (b.attending_doctor = '' or b.attending_doctor is null) and
+            (b.director_doctor = '' or b.director_doctor is null) and
+            b.behospital_doctor != '' and b.behospital_doctor is not null
+            then '住院医师' end) = #{filterPageVO.professor}
+        </if>
+        <if test="filterPageVO.deptName != null and filterPageVO.deptName != ''">
+            AND a.beh_dept_name  =  #{filterPageVO.deptName}
+        </if>
+        <if test="filterPageVO.deptId != null and filterPageVO.deptId != ''">
+            AND a.beh_dept_id = #{filterPageVO.deptId}
+        </if>
         <if test="filterPageVO.isReject != null">
             AND d.is_reject = #{filterPageVO.isReject}
         </if>
@@ -2122,8 +2340,14 @@
         <if test="filterPageByDeptVO.deptName != null and filterPageByDeptVO.deptName != ''">
             AND a.beh_dept_name = #{filterPageByDeptVO.deptName}
         </if>
+        <if test="filterPageByDeptVO.deptId != null and filterPageByDeptVO.deptId != ''">
+            AND a.beh_dept_id = #{filterPageByDeptVO.deptId}
+        </if>
+        <if test="filterPageByDeptVO.doctorId != null and filterPageByDeptVO.doctorId != ''">
+            AND a.doctor_id = #{filterPageByDeptVO.doctorId}
+        </if>
         <if test="filterPageByDeptVO.doctorName != null and filterPageByDeptVO.doctorName != ''">
-            AND a.doctor_name  like CONCAT('%', #{filterPageByDeptVO.doctorName}, '%')
+            AND a.doctor_name =  #{filterPageByDeptVO.doctorName}
         </if>
         <if test="filterPageByDeptVO.casesId != null and filterPageByDeptVO.casesId != 0">
             AND d.cases_id = #{filterPageByDeptVO.casesId}
@@ -2173,6 +2397,7 @@
             and a.is_placefile = #{filterPageByDeptVO.isPlacefile}
         </if>
         AND e.cases_id = d.cases_id
+        AND e.cases_id = 243
         AND e.id = d.cases_entry_id
         AND a.qc_type_id != 0
         <if test="filterPageByDeptVO.hospitalId != null and filterPageByDeptVO.hospitalId != ''">
@@ -2198,7 +2423,13 @@
             AND a.beh_dept_name  =  #{filterPageByDeptVO.deptName}
         </if>
         <if test="filterPageByDeptVO.doctorName != null and filterPageByDeptVO.doctorName != ''">
-            AND a.doctor_name  like CONCAT('%', #{filterPageByDeptVO.doctorName}, '%')
+            AND a.doctor_name = #{filterPageByDeptVO.doctorName}
+        </if>
+        <if test="filterPageByDeptVO.deptId != null and filterPageByDeptVO.deptId != ''">
+            AND a.beh_dept_id = #{filterPageByDeptVO.deptId}
+        </if>
+        <if test="filterPageByDeptVO.doctorId != null and filterPageByDeptVO.doctorId != ''">
+            AND a.doctor_id = #{filterPageByDeptVO.doctorId}
         </if>
         <if test="filterPageByDeptVO.isReject != null">
             AND d.is_reject = #{filterPageByDeptVO.isReject}