Bläddra i källkod

1 添加人事成本数据导入界面功能
2 添加患者收费项目导入界面功能
3 添加患者信息导入界面功能
4 添加单位人事成本计算界面功能
5 添加报表查询界面功能
6 添加报表跳转管理界面功能
7 添加报表管理功能
8 多人 添加医嘱项目成本流程功能
9 多人 添加人事分类管理界面功能
10 多人 添加药品成本管理界面功能
11 多人 添加材料成本管理界面功能
12 多人 添加设备成本管理界面功能
13 多人 添加空间成本管理界面功能
14 多人 添加康程分类管理界面功能
15 多人 添加标准项目管理界面功能
16 多人 添加收费项目管理界面功能
17 多人 添加病种管理界面功能
18 多人 添加病种诊断对照界面功能
19 多人 添加标准路径管理界面功能
20 多人 添加报表列管理界面功能

wangyongsheng 1 år sedan
förälder
incheckning
6bd1e84d74
100 ändrade filer med 2244 tillägg och 1619 borttagningar
  1. 213 108
      pom.xml
  2. 0 84
      src/main/java/com/imed/costaccount/common/aop/LogAspect.java
  3. 0 38
      src/main/java/com/imed/costaccount/common/aop/TokenAspect.java
  4. 0 19
      src/main/java/com/imed/costaccount/common/config/MybatisPlusConfig.java
  5. 0 43
      src/main/java/com/imed/costaccount/common/constants/FileConstant.java
  6. 0 100
      src/main/java/com/imed/costaccount/common/constants/NumberConstant.java
  7. 0 10
      src/main/java/com/imed/costaccount/common/constants/RedisKeyConstant.java
  8. 0 167
      src/main/java/com/imed/costaccount/common/shiro/OAuth2Filter.java
  9. 0 87
      src/main/java/com/imed/costaccount/common/shiro/OAuth2Realm.java
  10. 0 37
      src/main/java/com/imed/costaccount/common/shiro/OAuth2Token.java
  11. 0 86
      src/main/java/com/imed/costaccount/common/shiro/ShiroConfig.java
  12. 0 46
      src/main/java/com/imed/costaccount/common/token/JwtUtil.java
  13. 0 52
      src/main/java/com/imed/costaccount/common/token/RedisConfig.java
  14. 0 33
      src/main/java/com/imed/costaccount/common/util/UserContext.java
  15. 0 169
      src/main/java/com/imed/costaccount/constants/CommonConstant.java
  16. 0 7
      src/main/java/com/imed/costaccount/mapper/DemoMapper.java
  17. 0 15
      src/main/java/com/imed/costaccount/model/Demo.java
  18. 0 4
      src/main/java/com/imed/costaccount/model/vo/DemoVO.java
  19. 0 8
      src/main/java/com/imed/costaccount/service/DemoService.java
  20. 0 21
      src/main/java/com/imed/costaccount/service/impl/DemoServiceImpl.java
  21. 0 314
      src/main/java/com/imed/costaccount/service/impl/UserServiceImpl.java
  22. 0 87
      src/main/java/com/imed/costaccount/web/DemoController.java
  23. 5 3
      src/main/java/com/kcim/CostAccountApplication.java
  24. 5 5
      src/main/java/com/kcim/common/config/CorsConfig.java
  25. 34 0
      src/main/java/com/kcim/common/config/FeignConfiguration.java
  26. 30 0
      src/main/java/com/kcim/common/config/MybatisPlusConfig.java
  27. 56 0
      src/main/java/com/kcim/common/config/MybatisPlusMetaObjectHandler.java
  28. 56 0
      src/main/java/com/kcim/common/config/RedisProcessor.java
  29. 1 1
      src/main/java/com/kcim/common/constants/CommonConstant.java
  30. 48 13
      src/main/java/com/kcim/common/constants/Constant.java
  31. 1 1
      src/main/java/com/kcim/common/constants/FileConstant.java
  32. 3 2
      src/main/java/com/kcim/common/constants/NumberConstant.java
  33. 13 0
      src/main/java/com/kcim/common/constants/ParameterConstant.java
  34. 1 1
      src/main/java/com/kcim/common/constants/RedisKeyConstant.java
  35. 18 0
      src/main/java/com/kcim/common/constants/SQLParameter.java
  36. 1 1
      src/main/java/com/kcim/common/enums/CalcTypeEnum.java
  37. 1 1
      src/main/java/com/kcim/common/enums/CheckStatusEnum.java
  38. 39 0
      src/main/java/com/kcim/common/enums/ComputeTypeEnum.java
  39. 1 1
      src/main/java/com/kcim/common/enums/DateStyleEnum.java
  40. 32 0
      src/main/java/com/kcim/common/enums/EmpCostComputeTypeEnum.java
  41. 1 1
      src/main/java/com/kcim/common/enums/ErrorCodeEnum.java
  42. 32 0
      src/main/java/com/kcim/common/enums/ItemTypeEnum.java
  43. 1 1
      src/main/java/com/kcim/common/enums/NoticeBusinessEnum.java
  44. 1 1
      src/main/java/com/kcim/common/enums/NoticeOriginEnum.java
  45. 1 1
      src/main/java/com/kcim/common/enums/NoticeTemplateEnum.java
  46. 1 1
      src/main/java/com/kcim/common/enums/PermissionEnum.java
  47. 1 1
      src/main/java/com/kcim/common/enums/PlanStatusEnum.java
  48. 36 0
      src/main/java/com/kcim/common/enums/ReportItemTypeEnum.java
  49. 1 1
      src/main/java/com/kcim/common/enums/ReportTypeEnum.java
  50. 1 1
      src/main/java/com/kcim/common/enums/ResponseCodeEnum.java
  51. 1 1
      src/main/java/com/kcim/common/enums/ResultCodeEnum.java
  52. 1 1
      src/main/java/com/kcim/common/enums/SituationEnum.java
  53. 1 1
      src/main/java/com/kcim/common/enums/TaskCirculationEnum.java
  54. 1 1
      src/main/java/com/kcim/common/enums/WSMessageTypeEnum.java
  55. 1 1
      src/main/java/com/kcim/common/enums/WeekEnum.java
  56. 2 2
      src/main/java/com/kcim/common/exception/CostException.java
  57. 10 11
      src/main/java/com/kcim/common/exception/CostExceptionHandler.java
  58. 8 3
      src/main/java/com/kcim/common/file/MinioConfig.java
  59. 1 1
      src/main/java/com/kcim/common/file/MinioFileUtil.java
  60. 3 4
      src/main/java/com/kcim/common/swagger/SwaggerConfig.java
  61. 77 0
      src/main/java/com/kcim/common/token/RedisConfig.java
  62. 1 1
      src/main/java/com/kcim/common/token/RedisUtil.java
  63. 68 0
      src/main/java/com/kcim/common/token/SaTokenConfigure.java
  64. 1 1
      src/main/java/com/kcim/common/token/ThreadLocalToken.java
  65. 21 0
      src/main/java/com/kcim/common/token/TokenTypeConfigure.java
  66. 1 1
      src/main/java/com/kcim/common/util/AesUtil.java
  67. 1 1
      src/main/java/com/kcim/common/util/BeanUtil.java
  68. 1 1
      src/main/java/com/kcim/common/util/CommonUtil.java
  69. 3 3
      src/main/java/com/kcim/common/util/DateUtils.java
  70. 1 1
      src/main/java/com/kcim/common/util/ErrorResult.java
  71. 1 1
      src/main/java/com/kcim/common/util/JacksonUtil.java
  72. 1 1
      src/main/java/com/kcim/common/util/PageUtils.java
  73. 1 1
      src/main/java/com/kcim/common/util/RedisLock.java
  74. 2 2
      src/main/java/com/kcim/common/util/Result.java
  75. 27 0
      src/main/java/com/kcim/common/util/SnowflakeUtil.java
  76. 1 1
      src/main/java/com/kcim/common/util/ThreadUtil.java
  77. 35 0
      src/main/java/com/kcim/common/util/UserContext.java
  78. 29 0
      src/main/java/com/kcim/common/util/excel/ExcelExport.java
  79. 32 0
      src/main/java/com/kcim/common/util/excel/ExcelImport.java
  80. 94 0
      src/main/java/com/kcim/common/util/excel/ExcelStyleUtil.java
  81. 63 0
      src/main/java/com/kcim/common/util/excel/ExcelUtil.java
  82. 39 0
      src/main/java/com/kcim/common/util/excel/entity/DiseaseTypeImportEntity.java
  83. 36 0
      src/main/java/com/kcim/common/util/excel/entity/DiseaseTypeMapImportEntity.java
  84. 49 0
      src/main/java/com/kcim/common/util/excel/entity/DrugImportEntity.java
  85. 43 0
      src/main/java/com/kcim/common/util/excel/entity/EmpCostImportEntity.java
  86. 48 0
      src/main/java/com/kcim/common/util/excel/entity/EquipmentImportEntity.java
  87. 46 0
      src/main/java/com/kcim/common/util/excel/entity/ItemImportEntity.java
  88. 49 0
      src/main/java/com/kcim/common/util/excel/entity/MaterialImportEntity.java
  89. 53 0
      src/main/java/com/kcim/common/util/excel/entity/OrderImportEntity.java
  90. 132 0
      src/main/java/com/kcim/common/util/excel/entity/PatientInfoImportEntity.java
  91. 121 0
      src/main/java/com/kcim/common/util/excel/entity/PatientItemImportEntity.java
  92. 56 0
      src/main/java/com/kcim/common/util/excel/entity/SpaceImportEntity.java
  93. 56 0
      src/main/java/com/kcim/common/util/excel/entity/StandItemImportEntity.java
  94. 95 0
      src/main/java/com/kcim/common/util/excel/handler/DrugTypeHandler.java
  95. 96 0
      src/main/java/com/kcim/common/util/excel/handler/ItemTypeHandler.java
  96. 95 0
      src/main/java/com/kcim/common/util/excel/handler/KcClassTypeHandler.java
  97. 100 0
      src/main/java/com/kcim/common/util/excel/handler/OrderTypeHandler.java
  98. 2 2
      src/main/java/com/kcim/common/xss/XssFilter.java
  99. 2 2
      src/main/java/com/kcim/common/xss/XssHttpServletRequestWrapper.java
  100. 2 2
      src/main/java/com/kcim/dao/mapper/AccountingMapper.java

+ 213 - 108
pom.xml

@@ -5,183 +5,271 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.2.4.RELEASE</version>
+        <version>2.3.12.RELEASE</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
-    <groupId>com.imed</groupId>
-    <artifactId>CostAccount</artifactId>
+    <groupId>com.kcim</groupId>
+    <artifactId>kcim-cost</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-    <name>CostAccount</name>
+    <name>kcim-cost</name>
     <description>成本核算</description>
     <properties>
         <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
+        <fastjson2.version>2.0.23</fastjson2.version>
+        <nacos.version>2.2.8.RELEASE</nacos.version>
+        <openfeign.version>2.2.9.RELEASE</openfeign.version>
+        <saToken.version>1.31.0</saToken.version>
+        <easypoi.version>4.3.0</easypoi.version>
+        <minio.version>7.0.2</minio.version>
+        <springfox.version>3.0.0</springfox.version>
+        <knife4j.version>3.0.3</knife4j.version>
     </properties>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
 
     <dependencies>
-<!--        &lt;!&ndash;日志&ndash;&gt;-->
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.boot</groupId>-->
-<!--            <artifactId>spring-boot-starter-log4j2</artifactId>-->
-<!--            <version>2.2.4.RELEASE</version>-->
-<!--        </dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-logging</artifactId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>${spring-boot.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-<!--            <exclusions>-->
-<!--                <exclusion>-->
-<!--                    <groupId>org.springframework.boot</groupId>-->
-<!--                    <artifactId>spring-boot-starter-logging</artifactId>-->
-<!--                </exclusion>-->
-<!--            </exclusions>-->
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>${fastjson2.version}</version>
         </dependency>
-
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>1.9</version>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.3.1</version>
         </dependency>
-
         <dependency>
-            <groupId>org.jetbrains</groupId>
-            <artifactId>annotations</artifactId>
-            <version>RELEASE</version>
-            <scope>compile</scope>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter-test</artifactId>
+            <version>3.5.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.5.3.1</version>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
-
-        <!--junit-->
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.15</version>
         </dependency>
-        <!--aop-->
+
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-aop</artifactId>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>${saToken.version}</version>
         </dependency>
 
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.boot</groupId>-->
-<!--            <artifactId>spring-boot-configuration-processor</artifactId>-->
-<!--            <optional>true</optional>-->
-<!--        </dependency>-->
-
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.boot</groupId>-->
-<!--            <artifactId>spring-boot-devtools</artifactId>-->
-<!--            <scope>runtime</scope>-->
-<!--            <optional>true</optional>-->
-<!--        </dependency>-->
-
 
-        <!--mysql mybatis-plus等依赖-->
+        <!-- Sa-Token插件:权限缓存与业务缓存分离 -->
         <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.3.1</version>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-alone-redis</artifactId>
+            <version>${saToken.version}</version>
+        </dependency>
+        <!-- Sa-Token 整合 jwt -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-jwt</artifactId>
+            <version>${saToken.version}</version>
             <exclusions>
                 <exclusion>
-                    <groupId>com.baomidou</groupId>
-                    <artifactId>mybatis-plus-generator</artifactId>
+                    <groupId>cn.hutool</groupId>
+                    <artifactId>hutool-core</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
 
+        <!-- Sa-Token 整合 Redis (使用jackson序列化方式) -->
         <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <!--最好指定版本,不同环境版本可能不同-->
-            <version>8.0.16</version>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-dao-redis-jackson</artifactId>
+            <version>${saToken.version}</version>
         </dependency>
-
-
-        <!--数据连接池-->
         <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid-spring-boot-starter</artifactId>
-            <version>1.1.13</version>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.9</version>
         </dependency>
-
-        <!--hutool 个人习惯使用-->
+        <!--redis-->
         <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.4.7</version>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
-
-        <!--lombok-->
+        <!-- 提供Redis连接池 -->
         <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
         </dependency>
-
+        <!-- Swagger -->
         <dependency>
             <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger2</artifactId>
-            <version>2.9.2</version>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>${springfox.version}</version>
         </dependency>
+        <!-- swagger ui美化依赖 -->
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
-            <artifactId>swagger-bootstrap-ui</artifactId>
-            <version>1.9.1</version>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>${knife4j.version}</version>
         </dependency>
-
-        <!--shiro-->
         <dependency>
-            <groupId>org.apache.shiro</groupId>
-            <artifactId>shiro-web</artifactId>
-            <version>1.5.3</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.shiro</groupId>
-            <artifactId>shiro-spring</artifactId>
-            <version>1.5.3</version>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.auth0</groupId>
-            <artifactId>java-jwt</artifactId>
-            <version>3.10.3</version>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <version>${nacos.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>archaius-core</artifactId>
+                    <groupId>com.netflix.archaius</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>hystrix-core</artifactId>
+                    <groupId>com.netflix.hystrix</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
-
+        <!--        <dependency>-->
+        <!--            <groupId>com.alibaba.cloud</groupId>-->
+        <!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
+        <!--            <version>${nacos.version}</version>-->
+        <!--        </dependency>-->
 
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+            <version>${openfeign.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
-
-        <!--处理2003 excel-->
+        <!-- 文件上传 -->
         <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>3.16</version>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.7</version>
         </dependency>
-        <!--处理2007 excel-->
+        <!-- POI -->
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
-            <version>3.16</version>
+            <version>4.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <!--导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能-->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-base</artifactId>
+            <version>${easypoi.version}</version>
+        </dependency>
+        <!--耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能-->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-web</artifactId>
+            <version>${easypoi.version}</version>
+        </dependency>
+        <!--基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理-->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-annotation</artifactId>
+            <version>${easypoi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+            <version>${nacos.version}</version>
         </dependency>
-
-        <!--minio文件服务-->
         <dependency>
             <groupId>io.minio</groupId>
             <artifactId>minio</artifactId>
-            <version>7.0.2</version>
+            <version>${minio.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>failureaccess</artifactId>
+                </exclusion>
+            </exclusions>
+
+        </dependency>
+        <!--        <dependency>-->
+        <!--            <groupId>com.squareup.okhttp3</groupId>-->
+        <!--            <artifactId>okhttp</artifactId>-->
+        <!--            <version>3.14.9</version>-->
+
+        <!--        </dependency>-->
+        <!--skywalking traceId 记录到logback日志,请与安装的服务器版本对应-->
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>apm-toolkit-trace</artifactId>
+            <version>8.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>apm-toolkit-logback-1.x</artifactId>
+            <version>8.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>apm-toolkit-opentracing</artifactId>
+            <version>8.7.0</version>
         </dependency>
 
     </dependencies>
@@ -191,6 +279,23 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.springframework.boot</groupId>
+                            <artifactId>spring-boot-configuration-processor</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
             </plugin>
         </plugins>
     </build>

+ 0 - 84
src/main/java/com/imed/costaccount/common/aop/LogAspect.java

@@ -1,84 +0,0 @@
-//package com.imed.costaccount.common.aop;
-//
-//import cn.hutool.core.net.NetUtil;
-//import cn.hutool.json.JSONUtil;
-//import com.imed.costaccount.common.util.Result;
-//import io.swagger.annotations.ApiOperation;
-//import lombok.extern.slf4j.Slf4j;
-//import org.aspectj.lang.JoinPoint;
-//import org.aspectj.lang.Signature;
-//import org.aspectj.lang.annotation.AfterReturning;
-//import org.aspectj.lang.annotation.Aspect;
-//import org.aspectj.lang.annotation.Before;
-//import org.aspectj.lang.annotation.Pointcut;
-//import org.aspectj.lang.reflect.MethodSignature;
-//import org.springframework.stereotype.Component;
-//import org.springframework.web.context.request.RequestContextHolder;
-//import org.springframework.web.context.request.ServletRequestAttributes;
-//
-//import javax.servlet.http.HttpServletRequest;
-//
-//@Aspect
-//@Slf4j
-//@Component
-//public class LogAspect {
-//
-//    /**
-//     * ..表示包及子包 该方法代表controller层的所有方法
-//     */
-//    @Pointcut("execution(public * com.imed.costaccount.web.*.*(..))")
-//    public void controllerMethod() {
-//    }
-//
-//
-//    /**
-//     * 方法执行前
-//     *
-//     * @param joinPoint
-//     * @throws Exception
-//     */
-//    @Before("controllerMethod()")
-//    public void LogRequestInfo(JoinPoint joinPoint) throws Exception {
-//
-//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-//        HttpServletRequest request = attributes.getRequest();
-//
-//        StringBuilder requestLog = new StringBuilder();
-//        Signature signature = joinPoint.getSignature();
-//        requestLog.append(((MethodSignature) signature).getMethod().getAnnotation(ApiOperation.class).value()).append("\t")
-//                .append("请求信息:").append("URL = {").append(request.getRequestURI()).append("},\t")
-//                .append("请求方式 = {").append(request.getMethod()).append("},\t")
-//                .append("请求IP = {").append(NetUtil.getLocalhostStr()).append("},\t")
-//                .append("类方法 = {").append(signature.getDeclaringTypeName()).append(".")
-//                .append(signature.getName()).append("},\t");
-//
-//        // 处理请求参数
-//        String[] paramNames = ((MethodSignature) signature).getParameterNames();
-//        Object[] paramValues = joinPoint.getArgs();
-//        int paramLength = null == paramNames ? 0 : paramNames.length;
-//        if (paramLength == 0) {
-//            requestLog.append("请求参数 = {} ");
-//        } else {
-//            requestLog.append("请求参数 = [");
-//            for (int i = 0; i < paramLength - 1; i++) {
-//                requestLog.append(paramNames[i]).append("=").append(JSONUtil.toJsonStr(paramValues[i])).append(",");
-//            }
-//            requestLog.append(paramNames[paramLength - 1]).append("=").append(JSONUtil.toJsonStr(paramValues[paramLength - 1])).append("]");
-//        }
-//
-//        log.info(requestLog.toString());
-//    }
-//
-//
-//    /**
-//     * 方法执行后
-//     *
-//     * @param result
-//     * @throws Exception
-//     */
-//    @AfterReturning(returning = "result", pointcut = "controllerMethod()")
-//    public void logResultVOInfo(Result result) throws Exception {
-//        log.info("请求结果:" + result.getStatus() + "\t" + result.getMsg());
-//    }
-//
-//}

+ 0 - 38
src/main/java/com/imed/costaccount/common/aop/TokenAspect.java

@@ -1,38 +0,0 @@
-//package com.imed.costaccount.common.aop;
-//
-//import cn.hutool.core.util.StrUtil;
-//import com.imed.costaccount.common.token.ThreadLocalToken;
-//import com.imed.costaccount.common.util.Result;
-//import lombok.extern.slf4j.Slf4j;
-//import org.aspectj.lang.ProceedingJoinPoint;
-//import org.aspectj.lang.annotation.Around;
-//import org.aspectj.lang.annotation.Aspect;
-//import org.aspectj.lang.annotation.Pointcut;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.stereotype.Component;
-//
-//@Aspect
-//@Component
-//@Slf4j
-//public class TokenAspect {
-//
-//    @Autowired
-//    private ThreadLocalToken local;
-//
-//    @Pointcut("execution(public * com.imed.costaccount.web.*.*(..)))")
-//    public void tokenPointCut() {
-//
-//    }
-//
-//    @Around("tokenPointCut()")
-//    public Object tokenAround(ProceedingJoinPoint point) throws Throwable {
-//        Result result = (Result) point.proceed();
-//        String token = local.getToken();
-//        if (StrUtil.isNotBlank(token)) {
-//            result.setToken(token);
-//            local.clear();
-//            return result;
-//        }
-//        return result;
-//    }
-//}

+ 0 - 19
src/main/java/com/imed/costaccount/common/config/MybatisPlusConfig.java

@@ -1,19 +0,0 @@
-package com.imed.costaccount.common.config;
-
-import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class MybatisPlusConfig {
-
-    /**
-     * 分页配置
-     * @return
-     */
-    @Bean
-    public PaginationInterceptor paginationInterceptor(){
-        // 参考类,可设置对应参数
-        return new PaginationInterceptor();
-    }
-}

+ 0 - 43
src/main/java/com/imed/costaccount/common/constants/FileConstant.java

@@ -1,43 +0,0 @@
-package com.imed.costaccount.common.constants;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 文件名常量
- */
-public final class FileConstant {
-    public FileConstant() {
-    }
-
-    /**
-     * 图片后缀名
-     */
-    public static final List<String> PIC_SUFFIX = Arrays.asList(new String[]{"jpeg", "gif", "png", "ico", "jpg"});
-    /**
-     * excel后缀名
-     */
-    public static final List<String> EXCEL_SUFFIX = Arrays.asList(new String[]{"xls", "xlsx"});
-    /**
-     * word后缀名
-     */
-    public static final List<String> WORD_SUFFIX = Arrays.asList(new String[]{"doc", "docx"});
-    /**
-     * ppt后缀名
-     */
-    public static final List<String> PPT_SUFFIX = Arrays.asList(new String[]{"ppt", "pptx"});
-    /**
-     * pdf后缀名
-     */
-    public static final String PDF_SUFFIX = "pdf";
-    /**
-     * txt后缀名
-     */
-    public static final String TXT_SUFFIX = "txt";
-
-    /**
-     * mp4后缀名
-     */
-    public static final String MP4_SUFFIX = "mp4";
-
-}

+ 0 - 100
src/main/java/com/imed/costaccount/common/constants/NumberConstant.java

@@ -1,100 +0,0 @@
-package com.imed.costaccount.common.constants;
-
-/**
- * 数字设置
- */
-public final class NumberConstant {
-    public NumberConstant() {
-    }
-
-    /**
-     * 零
-     */
-    public static final Integer ZERO = 0;
-
-    /**
-     * 一
-     */
-    public static final Integer ONE = 1;
-
-    /**
-     * 二
-     */
-    public static final Integer TWO = 2;
-
-    /**
-     * 三
-     */
-    public static final Integer THREE = 3;
-
-    /**
-     * 四
-     */
-    public static final Integer FOUR = 4;
-
-    /**
-     * 五
-     */
-    public static final Integer FIVE = 5;
-
-    /**
-     * 六
-     */
-    public static final Integer SIX = 6;
-
-    /**
-     * 七
-     */
-    public static final Integer SEVEN = 7;
-
-    /**
-     * 八
-     */
-    public static final Integer EIGHT = 8;
-
-    /**
-     * 九
-     */
-    public static final Integer NINE = 9;
-
-    /**
-     * 10
-     */
-    public static final Integer TEN = 10;
-
-    /**
-     * 二十四
-     */
-    public static final Integer TWENTY_FOUR = 24;
-
-    /**
-     * 三十
-     */
-    public static final Integer THIRTY = 30;
-
-    /**
-     * 五十八
-     */
-    public static final Integer FIFTY_EIGHT = 58;
-
-    /**
-     * 五十九
-     */
-    public static final Integer FIFTY_NINE = 59;
-
-    /**
-     * 一百
-     */
-    public static final Integer ONE_HUNDRED = 100;
-    /**
-     * 一千
-     */
-    public static final Integer ONE_THOUSAND = 1000;
-
-    /**
-     * 负一
-     */
-    public static final Integer NEGATIVE = -1;
-
-
-}

+ 0 - 10
src/main/java/com/imed/costaccount/common/constants/RedisKeyConstant.java

@@ -1,10 +0,0 @@
-package com.imed.costaccount.common.constants;
-
-/**
- * @Description: redis key
- */
-public final class RedisKeyConstant {
-    public RedisKeyConstant() {
-    }
-
-}

+ 0 - 167
src/main/java/com/imed/costaccount/common/shiro/OAuth2Filter.java

@@ -1,167 +0,0 @@
-package com.imed.costaccount.common.shiro;
-
-import cn.hutool.core.util.StrUtil;
-import com.auth0.jwt.exceptions.TokenExpiredException;
-import com.imed.costaccount.common.token.JwtUtil;
-import com.imed.costaccount.common.token.RedisUtil;
-import com.imed.costaccount.common.util.ErrorResult;
-import com.imed.costaccount.common.util.JacksonUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.authc.AuthenticationException;
-import org.apache.shiro.authc.AuthenticationToken;
-import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Slf4j
-// 作用域多例
-@Scope("prototype")
-@Component
-public class  OAuth2Filter extends AuthenticatingFilter {
-
-    @Autowired
-    private JwtUtil jwtUtil;
-
-//    @Autowired
-//    private ThreadLocalToken local;
-
-    @Autowired
-    private RedisUtil redisUtil;
-
-
-    /**
-     * 判断是否需要交由shiro处理,一般options 请求类型不需要
-     * @return <code>true</code> if request should be allowed access
-     * @param request
-     * @param response
-     * @param mappedValue
-     */
-    @Override
-    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
-        HttpServletRequest req = (HttpServletRequest) request;
-        if (req.getMethod().equals(RequestMethod.OPTIONS.name())) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * 将token封装为auth2Token 返回交由shiro处理
-     * @param servletRequest
-     * @param servletResponse
-     * @return
-     * @throws Exception
-     */
-    @Override
-    protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
-        HttpServletRequest request = (HttpServletRequest) servletRequest;
-        String token = this.getRequestToken(request);
-        if (StrUtil.isBlank(token)) {
-            return null;
-        }
-        return new OAuth2Token(token);
-    }
-
-    /**
-     * 验证token,并进行相应处理(是否过期,续期等)
-     * @param request
-     * @param response
-     * @return
-     * @throws Exception
-     */
-    @Override
-    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
-        HttpServletRequest req = (HttpServletRequest) request;
-        HttpServletResponse resp = (HttpServletResponse) response;
-        resp.setContentType("text/html");
-        resp.setCharacterEncoding("UTF-8");
-        // 允许跨域
-        resp.setHeader("Access-Control-Allow-Credentials", "true");
-        resp.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
-
-//        local.clear();
-        String token = this.getRequestToken(req);
-        // 如果前端传过来的token是null
-        if (StrUtil.isBlank(token)) {
-            String json = JacksonUtil.obj2Str(ErrorResult.errorMsg(499, "请先登录"));
-            resp.getWriter().print(json);
-            return false;
-        }
-
-        // 查看redis中token是否不存在了
-        int userId = jwtUtil.getUserId(token);
-        String redisToken = (String) redisUtil.get(userId + "");
-        if (StrUtil.isBlank(redisToken)) {
-            String json = JacksonUtil.obj2Str(ErrorResult.errorMsg(499, "令牌失效"));
-            resp.getWriter().print(json);
-            return false;
-        }
-        // 如果两个缓存不一致,说明有人重新登录了
-        if (!token.equalsIgnoreCase(redisToken)) {
-            String json = JacksonUtil.obj2Str(ErrorResult.errorMsg(499, "您的账户在其他地方登录,请重新登录或修改密码!"));
-            resp.getWriter().print(json);
-            return false;
-        }
-
-        // 内容是否过期
-        try {
-            jwtUtil.verifierToken(token);
-        } catch (TokenExpiredException e) {
-            resp.setStatus(499);
-            resp.getWriter().print("token过期");
-            String json = JacksonUtil.obj2Str(ErrorResult.errorMsg(499, "令牌过期,请重新登录"));
-            resp.getWriter().print(json);
-            return false;
-        } catch (Exception e) {
-            resp.setStatus(499);
-            resp.getWriter().print("无效的令牌");
-            String json = JacksonUtil.obj2Str(ErrorResult.errorMsg(499, "令牌异常,请重新登录"));
-            resp.getWriter().print(json);
-            return false;
-        }
-        return executeLogin(request, response);
-    }
-
-    @Override
-    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
-        HttpServletRequest req = (HttpServletRequest) request;
-        HttpServletResponse resp = (HttpServletResponse) response;
-        resp.setContentType("text/html");
-        resp.setCharacterEncoding("UTF-8");
-        // 允许跨域
-        resp.setHeader("Access-Control-Allow-Credentials", "true");
-        resp.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
-        resp.setStatus(400);
-        try {
-            resp.getWriter().print(e.getMessage());
-        } catch (IOException ioException) {
-            ioException.printStackTrace();
-        }
-        return false;
-    }
-
-
-    private String getRequestToken(HttpServletRequest request) {
-        String token = request.getHeader("token");
-
-        if (StrUtil.isBlank(token)) {
-            token = request.getParameter("token");
-        }
-        return token;
-    }
-
-    @Override
-    public void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
-        super.doFilterInternal(request, response, chain);
-    }
-}

+ 0 - 87
src/main/java/com/imed/costaccount/common/shiro/OAuth2Realm.java

@@ -1,87 +0,0 @@
-package com.imed.costaccount.common.shiro;
-
-import cn.hutool.core.util.StrUtil;
-import com.imed.costaccount.common.exception.CostException;
-import com.imed.costaccount.common.token.JwtUtil;
-import com.imed.costaccount.model.User;
-import com.imed.costaccount.service.UserService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.authc.AuthenticationException;
-import org.apache.shiro.authc.AuthenticationInfo;
-import org.apache.shiro.authc.AuthenticationToken;
-import org.apache.shiro.authc.SimpleAuthenticationInfo;
-import org.apache.shiro.authz.AuthorizationInfo;
-import org.apache.shiro.authz.SimpleAuthorizationInfo;
-import org.apache.shiro.realm.AuthorizingRealm;
-import org.apache.shiro.subject.PrincipalCollection;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Objects;
-
-/**
- * 认证和授权在这里操作
- */
-@Slf4j
-@Component
-public class OAuth2Realm extends AuthorizingRealm {
-
-    @Autowired
-    private JwtUtil jwtUtil;
-
-    @Autowired
-    @Lazy
-    private UserService userService;
-
-
-    /**
-     * 是否需要认证
-     *
-     * @param token
-     * @return
-     */
-    @Override
-    public boolean supports(AuthenticationToken token) {
-        return token instanceof com.imed.costaccount.common.shiro.OAuth2Token;
-    }
-
-    /**
-     * 登录认证
-     *
-     * @param token token
-     * @return
-     * @throws AuthenticationException
-     */
-    @Override
-    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
-        String principal = (String) token.getPrincipal();
-        if (StrUtil.isEmpty(principal)) {
-            log.error("当前请求未携带token");
-            throw new CostException(499, "登录失败,请重新登录");
-        }
-        int userId = jwtUtil.getUserId(principal);
-        User user = userService.getById(userId);
-        if (Objects.isNull(user)) {
-            log.error("当前token{}", principal);
-            throw new CostException(499, "登录失败,请重新登录");
-        }
-
-        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, principal, getName());
-        return info;
-    }
-
-    /**
-     * 授权对象
-     *
-     * @param principals
-     * @return
-     */
-    @Override
-    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
-        return new SimpleAuthorizationInfo();
-    }
-
-
-}

+ 0 - 37
src/main/java/com/imed/costaccount/common/shiro/OAuth2Token.java

@@ -1,37 +0,0 @@
-package com.imed.costaccount.common.shiro;
-
-import org.apache.shiro.authc.AuthenticationToken;
-
-public class OAuth2Token implements AuthenticationToken {
-    private String token;
-
-    public OAuth2Token(String token) {
-        this.token = token;
-    }
-
-    public String getToken() {
-        return token;
-    }
-
-    public void setToken(String token) {
-        this.token = token;
-    }
-
-    /**
-     * 返回授权主体
-     * @return
-     */
-    @Override
-    public Object getPrincipal() {
-        return token;
-    }
-
-    /**
-     * 返回授权凭证
-     * @return
-     */
-    @Override
-    public Object getCredentials() {
-        return token;
-    }
-}

+ 0 - 86
src/main/java/com/imed/costaccount/common/shiro/ShiroConfig.java

@@ -1,86 +0,0 @@
-package com.imed.costaccount.common.shiro;
-
-import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.spring.LifecycleBeanPostProcessor;
-import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
-import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
-import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import javax.servlet.Filter;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-@Configuration
-public class ShiroConfig {
-
-    @Bean("securityManager")
-    public SecurityManager securityManager(OAuth2Realm realm) {
-        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
-        defaultWebSecurityManager.setRealm(realm);
-        defaultWebSecurityManager.setRememberMeManager(null);
-        return defaultWebSecurityManager;
-    }
-
-    @Bean("shiroFilter")
-    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, OAuth2Filter filter) {
-        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
-        filterFactoryBean.setSecurityManager(securityManager);
-        // OAuth2过滤
-        Map<String, Filter> filters = new HashMap<>();
-        filters.put("oauth2", filter);
-        filterFactoryBean.setFilters(filters);
-
-        // HTTP请求过滤
-        Map<String, String> filterMap = new LinkedHashMap<>();
-        filterMap.put("/webjars/**", "anon");
-        filterMap.put("/druid/**", "anon");
-        filterMap.put("/app/**", "anon");
-        filterMap.put("/swagger/**", "anon");
-        filterMap.put("/v2/api-docs", "anon");
-        filterMap.put("/swagger-ui.html", "anon");
-        filterMap.put("/static/js/**", "anon");
-        filterMap.put("/demo/**", "anon");
-        filterMap.put("/doc.html", "anon");
-        filterMap.put("/**/*.xlsx", "anon");
-        filterMap.put("/**/*.xls", "anon");
-        filterMap.put("/swagger-resources/**", "anon");
-        filterMap.put("/captcha.jpg", "anon");
-        filterMap.put("/costAccount/getHospArea/**", "anon");
-        filterMap.put("/costAccount/excel/getImportUserTemplate", "anon");
-        filterMap.put("/costAccount/excel/getcurrentTemplate","anon");
-        filterMap.put("/costAccount/excel/getDepartmentTemplate", "anon");
-        filterMap.put("/costAccount/excel/getImportProductTemplate", "anon");
-        filterMap.put("/costAccount/login", "anon");
-        filterMap.put("/swagger.json","anon");
-        filterMap.put("/swagger-ui.html","anon");
-        filterMap.put("/v2/api-docs/*","anon");
-        filterMap.put("/**/*.jpg", "anon");
-        filterMap.put("/**/*.png", "anon");
-
-        // 除了以上的,其他的都使用oauth2过滤器
-        filterMap.put("/**", "oauth2");
-        filterFactoryBean.setFilterChainDefinitionMap(filterMap);
-        return filterFactoryBean;
-    }
-
-    @Bean("lifecycleBeanPostProcessor")
-    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
-        return new LifecycleBeanPostProcessor();
-    }
-
-    /**
-     * AOP 使用 的通知点增强点
-     *
-     * @param securityManager
-     * @return
-     */
-    @Bean
-    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
-        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
-        advisor.setSecurityManager(securityManager);
-        return advisor;
-    }
-}

+ 0 - 46
src/main/java/com/imed/costaccount/common/token/JwtUtil.java

@@ -1,46 +0,0 @@
-package com.imed.costaccount.common.token;
-
-import cn.hutool.core.date.DateField;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
-import com.auth0.jwt.exceptions.JWTDecodeException;
-import com.auth0.jwt.interfaces.DecodedJWT;
-import com.imed.costaccount.common.exception.CostException;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-
-@Component
-public class JwtUtil {
-
-    @Value("${cost.jwt.secret}")
-    private String secret;
-
-    @Value("${cost.jwt.expire}")
-    private Integer expire;
-
-    public String createToken(Long userId) {
-        Date date = DateUtil.offset(new DateTime(), DateField.DAY_OF_YEAR, expire).toJdkDate();
-        Algorithm algorithm = Algorithm.HMAC256(secret);
-        String token = JWT.create().withClaim("userId", userId).withExpiresAt(date).sign(algorithm);
-        return token;
-    }
-
-    public int  getUserId(String token) {
-        try {
-            DecodedJWT decode = JWT.decode(token);
-            Integer userId = decode.getClaim("userId").asInt();
-            return userId;
-        } catch (JWTDecodeException e) {
-            throw new CostException(500, "操作非法");
-        }
-    }
-
-    public void verifierToken(String token) {
-        Algorithm algorithm = Algorithm.HMAC256(secret);
-        JWT.require(algorithm).build().verify(token);
-    }
-}

+ 0 - 52
src/main/java/com/imed/costaccount/common/token/RedisConfig.java

@@ -1,52 +0,0 @@
-package com.imed.costaccount.common.token;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.HashOperations;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * @author :lilei
- * @date :Created in 2020/8/20 16:20
- * @description:
- */
-@Configuration
-public class RedisConfig {
-
-//    @Bean
-//    public RedisCacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
-//        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
-//        cacheManager.se
-//    }
-
-    @Bean
-    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
-        StringRedisTemplate redisTemplate = new StringRedisTemplate(redisConnectionFactory);
-        redisTemplate.setConnectionFactory(redisConnectionFactory);
-        // 使用Jackson2JsonRedisSerialize 替换默认序列化
-        @SuppressWarnings({ "rawtypes", "unchecked" })
-        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
-        ObjectMapper objectMapper = new ObjectMapper();
-        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
-        // 设置value的序列化规则和 key的序列化规则
-        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
-        redisTemplate.afterPropertiesSet();
-        return redisTemplate;
-    }
-
-    @Bean
-    public HashOperations hashOperations(
-            @NotNull RedisTemplate redisTemplate) {
-        return redisTemplate.opsForHash();
-    }
-}

+ 0 - 33
src/main/java/com/imed/costaccount/common/util/UserContext.java

@@ -1,33 +0,0 @@
-package com.imed.costaccount.common.util;
-
-import com.imed.costaccount.model.User;
-import org.apache.shiro.SecurityUtils;
-
-/**
- * @author 李加喜
- * @Package com.imed.costaccount.common.util
- * @date 2021-08-03 8:46
- */
-public class UserContext {
-    private static final ThreadLocal<User> current = new ThreadLocal();
-
-    public UserContext() {
-    }
-
-    public static User getCurrentUser() {
-        return (User) SecurityUtils.getSubject().getPrincipal();
-    }
-
-    public static void setCurrentUser(User user) {
-        current.set(user);
-    }
-
-    public static void removeUser() {
-        current.remove();
-    }
-
-    public static Long getHospId(){
-        User principal = (User) SecurityUtils.getSubject().getPrincipal();
-        return principal.getHospId();
-    }
-}

+ 0 - 169
src/main/java/com/imed/costaccount/constants/CommonConstant.java

@@ -1,169 +0,0 @@
-package com.imed.costaccount.constants;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @Description: 分隔符公共类
- */
-public final class CommonConstant {
-    public CommonConstant() {
-    }
-
-    /**
-     * 分割符-分号
-     */
-    public static final String SEPARATOR_SEMICOLON = ";";
-
-    /**
-     * 分割符-右箭头
-     */
-    public static final String RIGHT_ARROWS = "→";
-
-    /**
-     * 分割符-分号
-     */
-    public static final String SEPARATOR_SEMICOLON_C = ";";
-
-    /**
-     * 分割符-冒号
-     */
-    public static final String SEPARATOR_NUMBER = ":";
-
-    /**
-     * 分割符-冒号
-     */
-    public static final String SEPARATOR_NUMBER_C = ":";
-
-    /**
-     *  分割符-下划线
-     */
-    public static final String SEPARATOR_UNDERLINE = "_";
-    /**
-     * 分割符-竖线
-     */
-    public static final String SEPARATOR_VERTICALLINE="\\|";
-
-    /**
-     * 分割符-逗号
-     */
-    public static final String SEPARATOR_COMMA = ",";
-
-    /**
-     * 分割符-逗号
-     */
-    public static final String SEPARATOR_COMMA_C = ",";
-
-
-    /**
-     * 分割符-反斜杠
-     */
-    public static final String SEPARATOR_BACKSLASH = "/";
-
-    /**
-     * 分割符-反斜杠
-     */
-    public static final String SEPARATOR_BACKSLASH_C = "、";
-
-    /**
-     * 分割符-横杠
-     */
-    public static final String SEPARATOR_WHIPPTREE = "-";
-
-
-    /**
-     * 分割符-波浪号
-     */
-    public static final String SEPARATOR_WAVE = "~";
-
-    /**
-     * 分割符-分号
-     */
-    public static final String SEPARATOR_POINT = ".";
-
-    /**
-     * 分割符-分号
-     */
-    public static final String SEPARATOR_POINT_C = "。";
-
-    /**
-     * 分割符-空格
-     */
-    public static final String SEPARATOR_BlankSpace = " ";
-
-
-    /**
-     * 常量A
-     */
-    public static final String SEPARATOR_A = "A";
-    /**
-     * 左括号
-     */
-    public static final String LEFT_PARENTHESES = "(";
-    /**
-     * 左括号
-     */
-    public static final String LEFT_PARENTHESES_C = "(";
-    /**
-     * 右括号
-     */
-    public static final String RIGHT_PARENTHESES = ")";
-
-    /**
-     * 右括号
-     */
-    public static final String RIGHT_PARENTHESES_C = ")";
-    /**
-     * 导管表默认时间
-     */
-    public static final String ZERO_POINT = "0001-01-01 00:00:00";
-
-    /**
-     * 分隔符 - 乘号
-     */
-    public static final String MULTIPLICATION_SIGN = "×";
-
-    public static final String LIMIT_ONE = "limit 1";
-
-
-    /**
-     * 分隔符 - 加号
-     */
-
-    public static final String MULTIPLICATION_PLUS = "\\+";
-
-    /**
-     * error
-     */
-    public static final String ERROR = "error";
-
-    /**
-     * UTF_8
-     */
-    public static final String UTF_8 = "UTF-8";
-
-    public static final String BLANK = " ";
-
-    /** 取消/作废 */
-    public static final Integer CANCEL = 1;
-    /** 正常 */
-    public static final Integer ENABLE = 0;
-
-    public static final String LIMIT_1 = "limit 1";
-
-    public static final String TOKEN = "token";
-
-    public static final String CHECK_PLAN_MSG_TITLE = "你有一个查核计划即将开始";
-
-    public static final String NULL = "";
-
-    public static final String X = "+";
-
-    public static final List<Integer> ADMIN = Arrays.asList(2, 5, 10);
-
-    public static final List<Integer> DEPT_MANAGER = Arrays.asList(1, 3, 12, 14, 16, 18);
-
-    public static final List<Integer> IMPROVER = Arrays.asList(4, 6, 7, 8, 9, 11, 13, 15);
-
-    public static final String NOT_APPLICABLE_NAME = "不适用";
-}

+ 0 - 7
src/main/java/com/imed/costaccount/mapper/DemoMapper.java

@@ -1,7 +0,0 @@
-package com.imed.costaccount.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.imed.costaccount.model.Demo;
-
-public interface DemoMapper extends BaseMapper<Demo> {
-}

+ 0 - 15
src/main/java/com/imed/costaccount/model/Demo.java

@@ -1,15 +0,0 @@
-package com.imed.costaccount.model;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-@Data
-@Accessors(chain = true)
-@TableName("demo")
-public class Demo {
-
-    private Long id;
-
-    private String name;
-}

+ 0 - 4
src/main/java/com/imed/costaccount/model/vo/DemoVO.java

@@ -1,4 +0,0 @@
-package com.imed.costaccount.model.vo;
-
-public class DemoVO {
-}

+ 0 - 8
src/main/java/com/imed/costaccount/service/DemoService.java

@@ -1,8 +0,0 @@
-package com.imed.costaccount.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.imed.costaccount.model.Demo;
-
-public interface DemoService extends IService<Demo> {
-    void test();
-}

+ 0 - 21
src/main/java/com/imed/costaccount/service/impl/DemoServiceImpl.java

@@ -1,21 +0,0 @@
-package com.imed.costaccount.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.imed.costaccount.mapper.DemoMapper;
-import com.imed.costaccount.model.Demo;
-import com.imed.costaccount.service.DemoService;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-@Service
-public class DemoServiceImpl extends ServiceImpl<DemoMapper, Demo> implements DemoService {
-
-    @Override
-    @Transactional
-    public void test() {
-        Demo byId = this.getById(1);
-        this.removeById(1);
-        Demo byId1 = this.getById(1);
-        System.out.println(1111);
-    }
-}

+ 0 - 314
src/main/java/com/imed/costaccount/service/impl/UserServiceImpl.java

@@ -1,314 +0,0 @@
-package com.imed.costaccount.service.impl;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.crypto.SecureUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.imed.costaccount.common.exception.CostException;
-import com.imed.costaccount.common.token.JwtUtil;
-import com.imed.costaccount.common.token.RedisUtil;
-import com.imed.costaccount.common.util.BeanUtil;
-import com.imed.costaccount.common.util.PageUtils;
-import com.imed.costaccount.common.util.Result;
-import com.imed.costaccount.mapper.UserMapper;
-import com.imed.costaccount.model.Hospital;
-import com.imed.costaccount.model.User;
-import com.imed.costaccount.model.dto.LoginDTO;
-import com.imed.costaccount.model.dto.UserDto;
-import com.imed.costaccount.model.vo.LoginVO;
-import com.imed.costaccount.model.vo.UserVO;
-import com.imed.costaccount.service.HospitalService;
-import com.imed.costaccount.service.UserService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.SecurityUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-
-
-/**
- * @author 11290
- */
-@Slf4j
-@Service("userService")
-public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
-
-    private JwtUtil jwtUtil;
-
-    private HospitalService hosptailService;
-
-    private final RedisUtil redisUtil;
-
-    private Map<String, Integer> map = new ConcurrentHashMap<>();
-
-    public UserServiceImpl(JwtUtil jwtUtil, HospitalService hosptailService, RedisUtil redisUtil) {
-        this.jwtUtil = jwtUtil;
-        this.hosptailService = hosptailService;
-        this.redisUtil = redisUtil;
-    }
-
-
-    /**
-     * 登录具体逻辑
-     *
-     * @param loginDTO {@link LoginDTO} 登录相关参数
-     * @return
-     */
-    @Override
-    public LoginVO login(LoginDTO loginDTO) {
-        String hospSign = loginDTO.getHospSign();
-        Long id = loginDTO.getId();
-        if (Objects.isNull(id)) {
-            Hospital hospital = hosptailService.getBySign(hospSign);
-            id = hospital.getId();
-        }
-        // 院区情况
-        User one = this.getOne(
-                new LambdaQueryWrapper<User>()
-                        .eq(User::getAccount, loginDTO.getAccount())
-                        .eq(User::getHospId, id)
-                        .last("limit 1")
-        );
-        if (Objects.isNull(one)) {
-            throw new CostException("用户不存在");
-        }
-        if (!SecureUtil.md5(loginDTO.getPassword()).equals(one.getPassword())) {
-            throw new CostException("密码错误");
-        }
-        String token = jwtUtil.createToken(one.getId());
-        // 保存到redis 有效期一天
-        redisUtil.set(one.getId() + "", token, 60 * 60 * 24);
-        return LoginVO.builder().token(token).name(one.getName()).userid(one.getId()).build();
-    }
-
-    /**
-     * 查询查询用户的数据信息
-     *
-     * @param page
-     * @param pageSize
-     * @param hospId
-     * @return
-     */
-    @Override
-    public PageUtils queryList(Integer page, Integer pageSize, Long hospId, String name) {
-        Page<User> userPage = new Page<>(page, pageSize);
-        Page<User> pages = this.page(userPage,
-                new QueryWrapper<User>().lambda().
-                        eq(User::getHospId, hospId)
-                        .like(!StringUtils.isEmpty(name), User::getName, name)
-                        .orderByDesc(User::getCreateTime));
-        List<User> records = pages.getRecords();
-        List<UserVO> userVOS = BeanUtil.convertList(records, UserVO.class);
-        PageUtils pageUtils = new PageUtils(pages);
-        pageUtils.setList(userVOS);
-        return pageUtils;
-    }
-
-    /**
-     * 根据用户的姓名查询用户
-     *
-     * @param name
-     * @return
-     */
-    @Override
-    public List<UserVO> getByUserName(String name) {
-        List<User> users = baseMapper.selectList(new QueryWrapper<User>().lambda().like(!StringUtils.isEmpty(name), User::getName, name));
-        List<UserVO> userVOS = BeanUtil.convertList(users, UserVO.class);
-        return userVOS;
-    }
-
-    /**
-     * 保存用户信息
-     *
-     * @param userDto
-     */
-    @Override
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public void saveUser(UserDto userDto) {
-        User user = (User) SecurityUtils.getSubject().getPrincipal();
-        // 医院的Id
-        Long hospId = user.getHospId();
-
-        User userRequest = BeanUtil.convertObj(userDto, User.class);
-        if (StringUtils.isEmpty(userDto.getPassword())) {
-            throw new CostException("密码不能为空");
-        }
-        userRequest.setPassword(SecureUtil.md5(userDto.getPassword()));
-        userRequest.setHospId(hospId);
-        userRequest.setCreateTime(System.currentTimeMillis());
-        baseMapper.insert(userRequest);
-    }
-
-    /**
-     * 修改用户
-     *
-     * @param userDto
-     */
-    @Override
-
-    public void updateByUser(UserDto userDto) {
-        User userOne = (User) SecurityUtils.getSubject().getPrincipal();
-        User user = baseMapper.selectOne(new QueryWrapper<User>().lambda().like(
-                !StringUtils.isEmpty(userDto.getId()), User::getId, userDto.getId()));
-        if (Objects.isNull(user)) {
-            throw new CostException("用户不存在");
-        }
-        baseMapper.deleteById(user.getId());
-        User userRequest = BeanUtil.convertObj(userDto, User.class);
-        userRequest.setId(null);
-        userRequest.setHospitalStatus(userDto.getHospitalStatus());
-        userRequest.setCreateTime(System.currentTimeMillis());
-        userRequest.setHospId(userOne.getHospId());
-        if (!StringUtils.isEmpty(userDto.getPassword())) {
-            String newPassWord = SecureUtil.md5(userDto.getPassword());
-            userRequest.setPassword(newPassWord);
-        }else {
-            userRequest.setPassword(user.getPassword());
-        }
-        baseMapper.insert(userRequest);
-    }
-
-    /**
-     * 导入用户
-     *
-     * @param list        上传的文件读取的内容
-     * @param currentUser 当前登录用户
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
-    public Result importUser(List<List<Object>> list, User currentUser) {
-        // TODO: 2021/7/26 校验excel格式是否正确
-        for (int i = list.size() - 1; i >= 0; i--) {
-            if (i == 0 || i == 1 || i == 2 || i == 3) {
-                list.remove(list.get(i));
-            }
-        }
-        log.info("读取的数据为:{}", list);
-        List<User> users = new ArrayList<>();
-        List<String> errRowNums = new ArrayList<>();
-        for (int i = 0; i < list.size(); i++) {
-            List<Object> data = list.get(i);
-            log.info("得到用户输入的数据为:{}", data);
-            User user = new User();
-            user.setHospId(currentUser.getHospId());
-            user.setCreateTime(System.currentTimeMillis());
-            int size = data.size();
-            if (size != 5) {
-                // 补充读取的null问题
-                if (size == 4) {
-                    data.add(StrUtil.EMPTY);
-                }
-                for (int j = 0; j < 5; j++) {
-                    if (Objects.isNull(data.get(j))) {
-                        data.set(j, StrUtil.EMPTY);
-                    }
-                }
-            }
-            for (int j = 0; j < 5; j++) {
-                String str = String.valueOf(data.get(j));
-                log.info("得到的字符串{}", str);
-                if (StrUtil.isBlank(str)) {
-                    errRowNums.add("" + (i + 5));
-                }
-
-                if (j == 0) {
-                    Hospital hospital = hosptailService.getByName(str);
-                    user.setHospId(hospital.getId());
-                } else if (j == 1) {
-                    user.setName(str);
-                } else if (j == 2) {
-                    user.setAccount(str);
-                } else if (j == 3) {
-                    user.setPassword(SecureUtil.md5(str));
-                } else {
-                    user.setMobilePhoneNum(str);
-                }
-            }
-            users.add(user);
-        }
-        if (CollUtil.isNotEmpty(errRowNums)) {
-            String collect = errRowNums.stream().collect(Collectors.joining(StrUtil.COMMA));
-            throw new CostException(500, "第" + collect + "行数据异常");
-        }
-        // 校验users
-        List<User> realUsers = new ArrayList<>();
-        users.forEach(i -> {
-            User one = getOne(
-                    new QueryWrapper<User>().lambda()
-                            .eq(User::getAccount, i.getAccount())
-                            .eq(User::getHospId, i.getHospId())
-            );
-            if (Objects.nonNull(one)) {
-                realUsers.add(one);
-            }
-        });
-        users = users.stream().filter(i -> !realUsers.stream().map(User::getAccount).collect(Collectors.toList()).contains(i.getAccount())).collect(Collectors.toList());
-        this.saveBatch(users);
-        return Result.build(200, "有" + realUsers.size() + "条数据已存在,未被导入", null);
-    }
-
-//    /**
-//     * 校验是否是本院下人员,并且返回对应的院区id
-//     * @param hospId
-//     * @param str
-//     * @return
-//     */
-//    private Integer getByNameAndCheck(Long hospId, String str) {
-//        Integer thisHospAreaId = this.hosptailService.getByNameAndCheck(hospId, str);
-//        return thisHospAreaId;
-//    }
-
-    /**
-     * 退出登录
-     *
-     * @param user
-     */
-    @Override
-    public void logout(User user) {
-        redisUtil.del(user.getId() + "");
-    }
-
-    /**
-     * 通过用户id和医院id获取用户的名称,
-     *
-     * @param createUserId id
-     * @param hospId       医院id
-     * @return 如果不存在,返回"" (使用redis 缓存避免过多的查询)
-     */
-    @Override
-    public String getUsernameByIdAndHospId(Long createUserId, Long hospId) {
-        User one = this.getOne(
-                new LambdaQueryWrapper<User>()
-                        .select(User::getName)
-                        .eq(User::getId, createUserId)
-                        .eq(User::getHospId, hospId)
-                        .last("limit 1")
-        );
-        if (Objects.isNull(one)) {
-            return "";
-        }
-        return one.getName();
-    }
-
-    /**
-     * 批量删除用户集合
-     *
-     * @param asList idList
-     */
-    @Override
-    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
-    public void deleteByIds(List<Integer> asList) {
-        this.removeByIds(asList);
-    }
-}

+ 0 - 87
src/main/java/com/imed/costaccount/web/DemoController.java

@@ -1,87 +0,0 @@
-package com.imed.costaccount.web;
-
-import cn.hutool.core.date.DatePattern;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.lang.UUID;
-import com.imed.costaccount.common.exception.CostException;
-import com.imed.costaccount.common.file.MinioFileUtil;
-import com.imed.costaccount.common.util.Result;
-import com.imed.costaccount.service.DemoService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.SneakyThrows;
-import lombok.var;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-
-@Api(tags = "demo")
-@RestController
-@RequestMapping("/demo")
-public class DemoController {
-
-    private static final String bucketName = "test";
-    private static final Long hospId = 777L;
-    private final DemoService demoService;
-    private final MinioFileUtil fileUtil;
-
-    public DemoController(DemoService demoService, MinioFileUtil fileUtil) {
-        this.demoService = demoService;
-        this.fileUtil = fileUtil;
-    }
-
-
-    @GetMapping
-    public Result demo() {
-        demoService.test();
-        return Result.ok();
-    }
-
-    @ApiOperation("upload")
-    @PostMapping("/upload")
-    public Result ok(@RequestParam("file") MultipartFile file) {
-        DateTime date = DateUtil.date();
-        int month = DateUtil.month(date) + 1;
-        int year = DateUtil.year(date);
-        int day = DateUtil.dayOfMonth(date);
-        try {
-            // 文件唯一性处理(根据业务需求处理)
-            String format = DateUtil.format(date, DatePattern.PURE_DATETIME_PATTERN);
-            String originalFilename = format+file.getOriginalFilename();
-            String fileName = hospId + "/" + year + "/" + month + "/" + day + "/" + originalFilename;
-            InputStream inputStream = file.getInputStream();
-            fileUtil.putObject(bucketName, fileName, inputStream);
-            String objectUrl = fileUtil.getObjectUrl(bucketName, fileName);
-            return Result.ok(objectUrl);
-        } catch (IOException e) {
-            throw new CostException("文件错误");
-        }
-    }
-
-    @SneakyThrows
-    @ApiOperation("download")
-    @GetMapping("/download")
-    public void download(HttpServletResponse response) {
-        // 方式1
-        fileUtil.download(bucketName, "777/2021/9/2/minmin.jpg", response);
-
-        // 方式2
-//        InputStream object = fileUtil.getObject(bucketName, "777/2021/9/2/minmin.jpg");
-//        response.setContentType("application/octet-stream;charset=UTF-8");
-//        response.setHeader("Content-disposition", "attachment;filename=minmin.jpg");
-//        ServletOutputStream out = response.getOutputStream();
-//        IoUtil.copy(object, out);
-//        IoUtil.close(out);
-//        IoUtil.close(object);
-
-    }
-
-}

+ 5 - 3
src/main/java/com/imed/costaccount/CostAccountApplication.java → src/main/java/com/kcim/CostAccountApplication.java

@@ -1,11 +1,13 @@
-package com.imed.costaccount;
+package com.kcim;
 
-import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
-@MapperScan(basePackages = {"com.imed.costaccount.mapper"})
 @SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients("com.kcim.endPoint")
 public class CostAccountApplication {
 
     public static void main(String[] args) {

+ 5 - 5
src/main/java/com/imed/costaccount/common/config/CorsConfig.java → src/main/java/com/kcim/common/config/CorsConfig.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.config;
+package com.kcim.common.config;
 
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
@@ -17,8 +17,8 @@ public class CorsConfig implements WebMvcConfigurer {
 
 
 
-    @Value("${file.filelocal}")
-    private String fileLocal;
+//    @Value("${file.filelocal}")
+//    private String fileLocal;
 
     @Bean
     public CorsFilter corsFilter() {
@@ -49,8 +49,8 @@ public class CorsConfig implements WebMvcConfigurer {
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
         registry.addResourceHandler("/**")
-                .addResourceLocations("classpath:/static/**","/doc.html")
-                .addResourceLocations(fileLocal);//映射本地静态资源
+                .addResourceLocations("classpath:/static/**","/doc.html");
+//                .addResourceLocations(fileLocal);//映射本地静态资源
     }
 
 

+ 34 - 0
src/main/java/com/kcim/common/config/FeignConfiguration.java

@@ -0,0 +1,34 @@
+package com.kcim.common.config;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-09-19 17:16
+ **/
+@Configuration
+public class FeignConfiguration implements RequestInterceptor {
+    /**
+     * Called for every request. Add data using methods on the supplied {@link RequestTemplate}.
+     *
+     * @param template
+     */
+    @Override
+    public void apply(RequestTemplate template) {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//        获取请求体
+        javax.servlet.http.HttpServletRequest request = attributes.getRequest();
+//        获取token
+        String token = request.getHeader("token");
+//        注入feign的请求头
+        template.header("token",token);
+
+    }
+
+}

+ 30 - 0
src/main/java/com/kcim/common/config/MybatisPlusConfig.java

@@ -0,0 +1,30 @@
+package com.kcim.common.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Collections;
+
+@Configuration
+public class MybatisPlusConfig {
+
+    @Bean
+    public PaginationInnerInterceptor paginationInnerInterceptor() {
+        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        paginationInterceptor.setMaxLimit(-1L);
+        paginationInterceptor.setDbType(DbType.MYSQL);
+        // 开启 count 的 join 优化,只针对部分 left join
+        paginationInterceptor.setOptimizeJoin(true);
+        return paginationInterceptor;
+    }
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor(){
+        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
+        mybatisPlusInterceptor.setInterceptors(Collections.singletonList(paginationInnerInterceptor()));
+        return mybatisPlusInterceptor;
+    }
+}

+ 56 - 0
src/main/java/com/kcim/common/config/MybatisPlusMetaObjectHandler.java

@@ -0,0 +1,56 @@
+package com.kcim.common.config;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.ClassUtils;
+
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-09-20 14:03
+ **/
+@Configuration
+public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        fillValueByName("createTime", new Date(), metaObject, false);
+        fillValueByName("updateTime", new Date(), metaObject, false);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        fillValueByName("updateTime", new Date(), metaObject, false);
+
+    }
+    /**
+     * 填充数据具体实现
+     *
+     * @param filedName  字段名
+     * @param fieldVal   字段值
+     * @param metaObject 元对象
+     * @param isCover    是否覆盖原有内容
+     */
+    private static void fillValueByName(String filedName, Object fieldVal, MetaObject metaObject, Boolean isCover) {
+        // 如果该对象没有setter,直接返回
+        if (!metaObject.hasSetter(filedName)) {
+            return;
+        }
+        // 用户需要手动设置的值
+        Object value = metaObject.getValue(filedName);
+        String valueStr = StrUtil.str(value, "UTF-8");
+        // 如果不为空,并且不覆盖
+        if (StrUtil.isNotBlank(valueStr) && !isCover) {
+            return;
+        }
+        // 类型相同设置
+        Class<?> type = metaObject.getGetterType(filedName);
+        if (ClassUtils.isAssignableValue(type, fieldVal)) {
+            metaObject.setValue(filedName, fieldVal);
+        }
+    }
+}

+ 56 - 0
src/main/java/com/kcim/common/config/RedisProcessor.java

@@ -0,0 +1,56 @@
+package com.kcim.common.config;
+
+import cn.hutool.core.util.StrUtil;
+import org.springframework.data.redis.cache.RedisCache;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+
+import java.time.Duration;
+
+/**
+ * @program: CostAccount
+ * @description: redis配置
+ * @author: Wang.YS
+ * @create: 2023-09-19 15:49
+ **/
+
+public class RedisProcessor extends RedisCacheManager {
+    /**
+     * 默认父类构造方法
+     *
+     * @param cacheWriter               must not be {@literal null}.
+     * @param defaultCacheConfiguration must not be {@literal null}. Maybe just use
+     *                                  {@link RedisCacheConfiguration#defaultCacheConfig()}.
+     */
+    public RedisProcessor(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
+        super(cacheWriter, defaultCacheConfiguration);
+    }
+
+    /**
+     * Configuration hook for creating {@link RedisCache} with given name and {@code cacheConfig}.
+     * 配置自定义的创建redisCache
+     *
+     * @param name        must not be {@literal null}.
+     *                    这里规定name格式必须为
+     *                    <p>
+     *                    user#60或者user,#后代表过期时间单位分钟,如果不存在默认一个小时的过期时间
+     *                    </p>
+     *                    // TODO 2021-9-14 14:19:15 暂未配置一个缓存多个名称的处理 所以暂定该项目缓存使用单命名方式,可以为每个缓存时间加上一个随机时间 防止同事失效造成缓存雪崩
+     * @param cacheConfig can be {@literal null}.
+     * @return never {@literal null}.
+     */
+    @Override
+    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
+
+        String[] array = StrUtil.splitToArray(name, "#");
+        name = array[0];
+        cacheConfig = cacheConfig.entryTtl(Duration.ofMinutes(60));
+        if (array.length > 1) {
+            long ttl = Long.parseLong(array[1]);
+            cacheConfig = cacheConfig.entryTtl(Duration.ofMinutes(ttl));
+        }
+        return super.createRedisCache(name, cacheConfig);
+    }
+
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/constants/CommonConstant.java → src/main/java/com/kcim/common/constants/CommonConstant.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.constants;
+package com.kcim.common.constants;
 
 import java.util.Arrays;
 import java.util.List;

+ 48 - 13
src/main/java/com/imed/costaccount/common/constants/Constant.java → src/main/java/com/kcim/common/constants/Constant.java

@@ -1,19 +1,16 @@
-/**
- * Copyright (c) 2016-2019 人人开源 All rights reserved.
- *
- * https://www.renren.io
- *
- * 版权所有,侵权必究!
- */
-
-package com.imed.costaccount.common.constants;
+package com.kcim.common.constants;
 
 /**
  * 常量
- *
- * @author Mark sunlightcs@gmail.com
+ * * @author Mark sunlightcs@gmail.com
  */
-public class Constant {
+public interface Constant {
+
+    /**
+     * Sa-Token 存储用户信息在 session 中 前缀
+     */
+    String USER_PREFIX = "centerSys:";
+
 	/** 超级管理员ID */
 	public static final int SUPER_ADMIN = 1;
     /**
@@ -36,7 +33,12 @@ public class Constant {
      *  升序
      */
     public static final String ASC = "asc";
-	/**
+    /**
+     * 月度工作日天数
+     */
+    String MONTH_WORKDAYS = "MONTH_WORKDAYS";
+
+    /**
 	 * 菜单类型
 	 * 
 	 * @author chenshun
@@ -124,4 +126,37 @@ public class Constant {
         }
     }
 
+    long LOCAL_SYSTEM_ID= 1714195886747291648L ;
+
+    long CENTER_SYSTEM_ID= 1547394914533380096L ;
+
+
+    String REPORT_TYPE = "REPORT_TYPE";
+
+    String REPORT_ITEM_TYPE = "REPORT_ITEM_TYPE";
+
+    String REPORT_REDIRECT_PATH = "REPORT_REDIRECT_PATH";
+
+    String REPORT_REDIRECT_PARAM = "REPORT_REDIRECT_PARAM";
+    /**
+     * 收费项目类别常量
+     */
+    String CHARGE_ITEM_TYPE = "CHARGE_ITEM_TYPE";
+    /**
+     * 岗位
+     */
+    String POSITION = "POSITION";
+
+    String REPORT_COLUMN_TYPE = "REPORT_COLUMN_TYPE";
+
+    String REPORT_COLUMN_TEXT_MAP = "REPORT_COLUMN_TEXT_MAP";
+
+    String EMP_CHILD_TYPE = "EMP_CHILD_TYPE";
+
+    String DRUG_TYPE = "DRUG_TYPE";
+
+    String ORDER_TYPE = "ORDER_TYPE";
+
+
+
 }

+ 1 - 1
src/main/java/com/imed/costaccount/constants/FileConstant.java → src/main/java/com/kcim/common/constants/FileConstant.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.constants;
+package com.kcim.common.constants;
 
 import java.util.Arrays;
 import java.util.List;

+ 3 - 2
src/main/java/com/imed/costaccount/constants/NumberConstant.java → src/main/java/com/kcim/common/constants/NumberConstant.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.constants;
+package com.kcim.common.constants;
 
 /**
  * 数字设置
@@ -10,8 +10,9 @@ public final class NumberConstant {
     /**
      * 零
      */
+    public static final Long ZERO_L = 0L;
     public static final Integer ZERO = 0;
-
+    public static final String ZERO_S = "0";
     /**
      * 一
      */

+ 13 - 0
src/main/java/com/kcim/common/constants/ParameterConstant.java

@@ -0,0 +1,13 @@
+package com.kcim.common.constants;
+
+/**
+ * @program: CostAccount
+ * @description: 参数代码枚举
+ * @author: Wang.YS
+ * @create: 2023-10-24 18:16
+ **/
+public interface ParameterConstant {
+
+    Long DAY_HOUR = 1716751564162600960L;
+
+}

+ 1 - 1
src/main/java/com/imed/costaccount/constants/RedisKeyConstant.java → src/main/java/com/kcim/common/constants/RedisKeyConstant.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.constants;
+package com.kcim.common.constants;
 
 /**
  * @Description: redis key

+ 18 - 0
src/main/java/com/kcim/common/constants/SQLParameter.java

@@ -0,0 +1,18 @@
+package com.kcim.common.constants;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-01 20:58
+ **/
+public interface SQLParameter {
+    String COMPUTE_DATE = "#compute_date";
+    String HOSP_ID = "#hosp_id";
+    String UNIT_CODE = "#unit_code";
+
+    String HOSP_ID_CODE = "#hosp_id";
+    String COMPUTE_DATE_CODE = "#compute_date";
+
+    String USER_CODE = "#user_code";
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/CalcTypeEnum.java → src/main/java/com/kcim/common/enums/CalcTypeEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import lombok.Getter;
 

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/CheckStatusEnum.java → src/main/java/com/kcim/common/enums/CheckStatusEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import java.util.Objects;
 

+ 39 - 0
src/main/java/com/kcim/common/enums/ComputeTypeEnum.java

@@ -0,0 +1,39 @@
+package com.kcim.common.enums;
+
+/**
+ * @program: CostAccount
+ * @description: 计算方式枚举
+ * @author: Wang.YS
+ * @create: 2023-10-18 14:40
+ **/
+public enum ComputeTypeEnum {
+    /**
+     * 项目类别
+     */
+    ITEM_TYPE(1,"项目类别"),
+    /**
+     * 计算公式
+     */
+    CALCULATION_FORMULA(2,"计算公式"),
+    /**
+     * 合计
+     */
+    SUM(3,"合计")
+    ;
+
+    private Integer code;
+    private String name;
+
+    ComputeTypeEnum(Integer code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/DateStyleEnum.java → src/main/java/com/kcim/common/enums/DateStyleEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 public enum DateStyleEnum {
     DD("dd"),

+ 32 - 0
src/main/java/com/kcim/common/enums/EmpCostComputeTypeEnum.java

@@ -0,0 +1,32 @@
+package com.kcim.common.enums;
+
+/**
+ * @program: CostAccount
+ * @description: 人事分类子集计算类型
+ * @author: Wang.YS
+ * @create: 2023-10-24 16:19
+ **/
+public enum EmpCostComputeTypeEnum {
+
+    NONE("0","无"),
+    DEPARTMENT("1","科室"),
+    POSITION("2","岗位")
+    ;
+
+    private String code;
+
+    private String name;
+
+    EmpCostComputeTypeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/ErrorCodeEnum.java → src/main/java/com/kcim/common/enums/ErrorCodeEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 public enum ErrorCodeEnum {
     DATA_NOT_EXIST(500, "数据不存在或已被移除"),

+ 32 - 0
src/main/java/com/kcim/common/enums/ItemTypeEnum.java

@@ -0,0 +1,32 @@
+package com.kcim.common.enums;
+
+/**
+ * @program: CostAccount
+ * @description: 收费项目类别枚举
+ * @author: Wang.YS
+ * @create: 2023-10-25 16:03
+ **/
+public enum ItemTypeEnum {
+    DRUG("1","药品"),
+    MATERIAL("2","材料"),
+    ITEM("3","项目"),
+    OTHER("9","其他")
+
+    ;
+    private final String code;
+
+    private final String name;
+
+    ItemTypeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/NoticeBusinessEnum.java → src/main/java/com/kcim/common/enums/NoticeBusinessEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import java.util.Objects;
 

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/NoticeOriginEnum.java → src/main/java/com/kcim/common/enums/NoticeOriginEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 public enum NoticeOriginEnum {
     SITUATION("SITUATION", "情境创建或修改(来源id为情境id)"),

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/NoticeTemplateEnum.java → src/main/java/com/kcim/common/enums/NoticeTemplateEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import java.util.Objects;
 

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/PermissionEnum.java → src/main/java/com/kcim/common/enums/PermissionEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import java.util.Objects;
 

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/PlanStatusEnum.java → src/main/java/com/kcim/common/enums/PlanStatusEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import java.util.Objects;
 

+ 36 - 0
src/main/java/com/kcim/common/enums/ReportItemTypeEnum.java

@@ -0,0 +1,36 @@
+package com.kcim.common.enums;
+
+/**
+ * @program: CostAccount
+ * @description: 报表项目类型
+ * @author: Wang.YS
+ * @create: 2023-10-25 16:33
+ **/
+public enum ReportItemTypeEnum {
+    DRUG_INCOME("1","药品收入"),
+    MATERIAL_INCOME("2","材料收入"),
+    ITEM_INCOME("3","项目收入"),
+    DRUG_COST("4","药品成本"),
+    MATERIAL_COST("5","材料成本"),
+    ITEM_COST("6","项目成本"),
+    EMP_COST("7","人力成本"),
+    EQUIPMENT_COST("8","设备成本"),
+    SPACE_COST("9","空间成本"),
+
+    ;
+    private final String code;
+    private final String name;
+
+    ReportItemTypeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/ReportTypeEnum.java → src/main/java/com/kcim/common/enums/ReportTypeEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import lombok.Getter;
 

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/ResponseCodeEnum.java → src/main/java/com/kcim/common/enums/ResponseCodeEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 public enum ResponseCodeEnum {
     SUCCESS("SUCCESS", "返回成功"),

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/ResultCodeEnum.java → src/main/java/com/kcim/common/enums/ResultCodeEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 /**
  * @author 李加喜

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/SituationEnum.java → src/main/java/com/kcim/common/enums/SituationEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 import lombok.Getter;
 

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/TaskCirculationEnum.java → src/main/java/com/kcim/common/enums/TaskCirculationEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 /**
  * @description: imed-pfm

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/WSMessageTypeEnum.java → src/main/java/com/kcim/common/enums/WSMessageTypeEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 public enum WSMessageTypeEnum {
     /**

+ 1 - 1
src/main/java/com/imed/costaccount/common/enums/WeekEnum.java → src/main/java/com/kcim/common/enums/WeekEnum.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.enums;
+package com.kcim.common.enums;
 
 /**
  * 星期一 ~ 星期日

+ 2 - 2
src/main/java/com/imed/costaccount/common/exception/CostException.java → src/main/java/com/kcim/common/exception/CostException.java

@@ -1,6 +1,6 @@
-package com.imed.costaccount.common.exception;
+package com.kcim.common.exception;
 
-import com.imed.costaccount.common.enums.ErrorCodeEnum;
+import com.kcim.common.enums.ErrorCodeEnum;
 
 public class CostException extends RuntimeException{
 

+ 10 - 11
src/main/java/com/imed/costaccount/common/exception/CostExceptionHandler.java → src/main/java/com/kcim/common/exception/CostExceptionHandler.java

@@ -1,8 +1,7 @@
-package com.imed.costaccount.common.exception;
+package com.kcim.common.exception;
 
-import com.imed.costaccount.common.util.ErrorResult;
+import com.kcim.common.util.ErrorResult;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.authz.UnauthorizedException;
 import org.springframework.dao.DataAccessException;
 import org.springframework.validation.BindException;
 import org.springframework.validation.ObjectError;
@@ -45,13 +44,13 @@ public class CostExceptionHandler {
     }
 
 //    @ResponseStatus(value = HttpStatus.UNAUTHORIZED)
-    @ExceptionHandler(value = UnauthorizedException.class)
-    public ErrorResult handlerUnauthorizedException(UnauthorizedException e) {
-        e.printStackTrace();
-        log.info("GlobalExceptionHandler...");
-        log.info("错误代码:" + e.getMessage());
-        return ErrorResult.errorMsg(403,"您的权限不足,请联系管理员添加");
-    }
+//    @ExceptionHandler(value = UnauthorizedException.class)
+//    public ErrorResult handlerUnauthorizedException(UnauthorizedException e) {
+//        e.printStackTrace();
+//        log.info("GlobalExceptionHandler...");
+//        log.info("错误代码:" + e.getMessage());
+//        return ErrorResult.errorMsg(403,"您的权限不足,请联系管理员添加");
+//    }
 
 //    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
     @ExceptionHandler(value = Exception.class)
@@ -59,7 +58,7 @@ public class CostExceptionHandler {
         e.printStackTrace();
         log.info("===============================GlobalExceptionHandler异常信息===============================");
         log.info("错误代码:" + e.getLocalizedMessage());
-        return ErrorResult.errorMsg(500,"预期之外错误,请联系管理员~");
+        return ErrorResult.errorMsg(500,e.getLocalizedMessage());
     }
 
     private String formatAllErrorMessages(List<ObjectError> errors) {

+ 8 - 3
src/main/java/com/imed/costaccount/common/file/MinioConfig.java → src/main/java/com/kcim/common/file/MinioConfig.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.file;
+package com.kcim.common.file;
 
 import io.minio.MinioClient;
 import io.minio.errors.InvalidEndpointException;
@@ -37,8 +37,13 @@ public class MinioConfig {
 
     @Bean
     public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
-        MinioClient minioClient = new MinioClient(url, port, accessKey, secretKey, bucketName, false);
-        return minioClient;
+        try {
+            return new MinioClient(url, accessKey, secretKey);
+        } catch (InvalidEndpointException e) {
+            throw new RuntimeException(e);
+        } catch (InvalidPortException e) {
+            throw new RuntimeException(e);
+        }
     }
 
 }

+ 1 - 1
src/main/java/com/imed/costaccount/common/file/MinioFileUtil.java → src/main/java/com/kcim/common/file/MinioFileUtil.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.file;
+package com.kcim.common.file;
 
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;

+ 3 - 4
src/main/java/com/imed/costaccount/common/swagger/SwaggerConfig.java → src/main/java/com/kcim/common/swagger/SwaggerConfig.java

@@ -1,6 +1,5 @@
-package com.imed.costaccount.common.swagger;
+package com.kcim.common.swagger;
 
-import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -11,6 +10,7 @@ import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
 import springfox.documentation.service.ApiInfo;
 import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.SecurityScheme;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
@@ -23,7 +23,6 @@ import static com.google.common.collect.Lists.newArrayList;
 @Profile({"dev"})
 @Configuration
 @EnableSwagger2
-@EnableSwaggerBootstrapUI
 public class SwaggerConfig implements WebMvcConfigurer {
 
     @Bean
@@ -50,7 +49,7 @@ public class SwaggerConfig implements WebMvcConfigurer {
                 .build();
     }
 
-    private List<ApiKey> security() {
+    private List<SecurityScheme> security() {
         return newArrayList(
                 new ApiKey("token", "token", "header")
         );

+ 77 - 0
src/main/java/com/kcim/common/token/RedisConfig.java

@@ -0,0 +1,77 @@
+package com.kcim.common.token;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.kcim.common.config.RedisProcessor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author :lilei
+ * @date :Created in 2020/8/20 16:20
+ * @description:
+ */
+@Configuration
+public class RedisConfig extends CachingConfigurerSupport {
+
+    @Autowired
+    private LettuceConnectionFactory factory;
+
+
+
+    /**
+     * 将RedisCacheManager 纳入管理使自定义RedisProcessor启用
+     *
+     * @return
+     */
+    @Bean
+    public RedisCacheManager cacheManager(RedisTemplate redisTemplate) {
+        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory);
+        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
+//                .entryTtl(Duration.ofDays(1))
+                // 这里可以指定前缀
+//                .computePrefixWith(cacheName -> cacheName);
+                // 这里设置序列化为json非二进制
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
+        RedisProcessor redisCacheManager = new RedisProcessor(redisCacheWriter, defaultCacheConfig);
+        return redisCacheManager;
+    }
+
+
+    @Bean
+    public RedisTemplate<Object, Object> redisTemplate() {
+        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
+        // 关闭共享链接
+        factory.setShareNativeConnection(false);
+        redisTemplate.setConnectionFactory(factory);
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+
+    @Bean
+    public HashOperations hashOperations(
+            @NotNull RedisTemplate redisTemplate) {
+        return redisTemplate.opsForHash();
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/token/RedisUtil.java → src/main/java/com/kcim/common/token/RedisUtil.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.token;
+package com.kcim.common.token;
 
 
 import org.springframework.beans.factory.annotation.Autowired;

+ 68 - 0
src/main/java/com/kcim/common/token/SaTokenConfigure.java

@@ -0,0 +1,68 @@
+package com.kcim.common.token;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.List;
+
+import static cn.hutool.core.collection.CollUtil.newArrayList;
+
+/**
+ * @program: CostAccount
+ * @description: 跨域 统一鉴权处理
+ * @author: Wang.YS
+ * @create: 2023-09-19 17:36
+ **/
+@Configuration
+@EnableSwagger2
+public class SaTokenConfigure implements WebMvcConfigurer {
+
+    /**
+     * 注册统一鉴权注册器
+     *
+     * @param registry 拦截器注册器
+     */
+    @Order(value = Integer.MAX_VALUE)
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // 是否需要登录的 登录拦截器
+//        registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
+        registry.addInterceptor(new SaInterceptor())
+
+                .addPathPatterns("/**")
+                // 主要配置登录注销接口,还有swagger相关文件 这里不需要带上server.context-path
+                .excludePathPatterns(
+                        "/v2/api-docs", "/swagger-ui.html",
+                        "/static/js/**", "/swagger-resources/**");
+
+        // 注册注解拦截器,并排除不需要注解鉴权的接口地址 (与登录拦截器无关)
+//        registry.addInterceptor(new SaAnnotationInterceptor())
+//                .addPathPatterns("/**");
+//        SaRouteFunction function = (req,resp,hand) -> StpUtil.checkLogin();
+//        SaRouteInterceptor saRouteInterceptor = SaRouteInterceptor.newInstance(function);
+    }
+
+
+
+    private List<ApiKey> security() {
+        // 注意 Sa-token token 前缀配置
+        return newArrayList(new ApiKey("token", "token", "header"));
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
+        registry.addResourceHandler("swagger-ui.html")
+                .addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**")
+                .addResourceLocations("classpath:/META-INF/resources/webjars/");
+        registry.addResourceHandler("doc.html")
+                .addResourceLocations("classpath:/META-INF/resources/");
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/token/ThreadLocalToken.java → src/main/java/com/kcim/common/token/ThreadLocalToken.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.token;
+package com.kcim.common.token;
 
 import org.springframework.stereotype.Component;
 

+ 21 - 0
src/main/java/com/kcim/common/token/TokenTypeConfigure.java

@@ -0,0 +1,21 @@
+package com.kcim.common.token;
+
+import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
+import cn.dev33.satoken.stp.StpLogic;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-09-19 17:49
+ **/
+@Configuration
+public class TokenTypeConfigure {
+    //     Sa-Token 整合 jwt (Simple 简单模式)
+    @Bean
+    public StpLogic getStpLogicJwt() {
+        return new StpLogicJwtForSimple();
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/AesUtil.java → src/main/java/com/kcim/common/util/AesUtil.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 import org.apache.commons.codec.binary.Base64;
 

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/BeanUtil.java → src/main/java/com/kcim/common/util/BeanUtil.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/CommonUtil.java → src/main/java/com/kcim/common/util/CommonUtil.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 /**
  * 通用工具类

+ 3 - 3
src/main/java/com/imed/costaccount/common/util/DateUtils.java → src/main/java/com/kcim/common/util/DateUtils.java

@@ -1,7 +1,7 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
-import com.imed.costaccount.common.enums.DateStyleEnum;
-import com.imed.costaccount.common.enums.WeekEnum;
+import com.kcim.common.enums.DateStyleEnum;
+import com.kcim.common.enums.WeekEnum;
 import lombok.extern.slf4j.Slf4j;
 
 import java.sql.Timestamp;

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/ErrorResult.java → src/main/java/com/kcim/common/util/ErrorResult.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 
 import com.fasterxml.jackson.annotation.JsonInclude;

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/JacksonUtil.java → src/main/java/com/kcim/common/util/JacksonUtil.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.annotation.JsonInclude;

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/PageUtils.java → src/main/java/com/kcim/common/util/PageUtils.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.fasterxml.jackson.annotation.JsonInclude;

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/RedisLock.java → src/main/java/com/kcim/common/util/RedisLock.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 import cn.hutool.core.util.StrUtil;
 import org.springframework.beans.factory.annotation.Autowired;

+ 2 - 2
src/main/java/com/imed/costaccount/common/util/Result.java → src/main/java/com/kcim/common/util/Result.java

@@ -1,8 +1,8 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.imed.costaccount.common.enums.ResultCodeEnum;
+import com.kcim.common.enums.ResultCodeEnum;
 
 /**
  * 统一封装返回对象

+ 27 - 0
src/main/java/com/kcim/common/util/SnowflakeUtil.java

@@ -0,0 +1,27 @@
+package com.kcim.common.util;
+
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+
+/**
+ * @desc 雪花生成主键id可以拓展
+ * @version 1.0
+ * @Author hhz
+ * @time 2020/6/23
+ */
+public class SnowflakeUtil {
+    //成本 workid 3
+    // workId 和 datacenterId 暂定1
+    public static Long getId(){
+        Snowflake snowflake = IdUtil.getSnowflake(3, 1);
+        return snowflake.nextId();
+    }
+
+    public static void main(String[] args) {
+        for (int i = 0; i < 10; i++) {
+            System.out.println(getId());
+        }
+    }
+
+
+}

+ 1 - 1
src/main/java/com/imed/costaccount/common/util/ThreadUtil.java → src/main/java/com/kcim/common/util/ThreadUtil.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.util;
+package com.kcim.common.util;
 
 
 import lombok.extern.slf4j.Slf4j;

+ 35 - 0
src/main/java/com/kcim/common/util/UserContext.java

@@ -0,0 +1,35 @@
+package com.kcim.common.util;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.kcim.vo.SessionUserVO;
+
+import static com.kcim.common.constants.Constant.USER_PREFIX;
+
+/**
+ * @author 李加喜
+ * @Package com.imed.costaccount.common.util
+ * @date 2021-08-03 8:46
+ */
+public class UserContext {
+
+    /**
+     * 获取当前用户
+     */
+    public static SessionUserVO getCurrentUser() {
+        SessionUserVO user = (SessionUserVO) StpUtil.getSession().get(USER_PREFIX + StpUtil.getLoginId());
+        return user;
+    }
+
+    /**
+     * 获取当前用户所登录的医院id
+     */
+    public static Long getCurrentLoginHospId() {
+        SessionUserVO user = (SessionUserVO) StpUtil.getSession().get(USER_PREFIX + StpUtil.getLoginId());
+        return user.getHospId();
+    }
+
+    public static Long getHospId() {
+        SessionUserVO user = (SessionUserVO) StpUtil.getSession().get(USER_PREFIX + StpUtil.getLoginId());
+        return user.getHospId();
+    }
+}

+ 29 - 0
src/main/java/com/kcim/common/util/excel/ExcelExport.java

@@ -0,0 +1,29 @@
+package com.kcim.common.util.excel;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @program: performace
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-02-14 15:31
+ **/
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelExport {
+
+    /** 字段名称 */
+    String value();
+
+    /** 导出排序先后: 数字越小越靠前(默认按Java类字段顺序导出) */
+    int sort() default 0;
+
+    /** 导出映射,格式如:0-未知;1-男;2-女 */
+    String kv() default "";
+
+    /** 导出模板示例值(有值的话,直接取该值,不做映射) */
+    String example() default "";
+}

+ 32 - 0
src/main/java/com/kcim/common/util/excel/ExcelImport.java

@@ -0,0 +1,32 @@
+package com.kcim.common.util.excel;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+* @program: performace
+* @description: 
+* @author: Wang.YS
+* @create: 2023-02-14 15:31
+**/
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelImport {
+    /** 字段名称 */
+    String value();
+
+    /** 导出映射,格式如:0-未知;1-男;2-女 */
+    String kv() default "";
+
+    /** 是否为必填字段(默认为非必填) */
+    boolean required() default false;
+
+    /** 最大长度(默认255) */
+    int maxLength() default 255;
+
+    /** 导入唯一性验证(多个字段则取联合验证) */
+    boolean unique() default false;
+
+}

+ 94 - 0
src/main/java/com/kcim/common/util/excel/ExcelStyleUtil.java

@@ -0,0 +1,94 @@
+package com.kcim.common.util.excel;
+
+import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl;
+import org.apache.poi.ss.usermodel.*;
+
+/**
+* @program: performace
+* @description: excel 自定义样式
+* @author: Wang.YS
+* @create: 2023-02-16 11:37
+**/
+
+public class ExcelStyleUtil extends ExcelExportStylerDefaultImpl {
+    public ExcelStyleUtil(Workbook workbook) {
+        super(workbook);
+    }
+
+    /**
+     * 标题样式
+     */
+    @Override
+    public CellStyle getTitleStyle(short color) {
+        CellStyle cellStyle = super.getTitleStyle(color);
+        cellStyle.setFont(getFont(workbook, 11, true));
+        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        return cellStyle;
+    }
+    /**
+     * 单元格的样式
+     */
+    @Override
+    public CellStyle stringSeptailStyle(Workbook workbook, boolean isWarp) {
+        CellStyle cellStyle = super.stringSeptailStyle(workbook, isWarp);
+        cellStyle.setFont(getFont(workbook, 10, false));
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        return cellStyle;
+    }
+    /**
+     * 列表头样式
+     */
+    @Override
+    public CellStyle getHeaderStyle(short color) {
+        CellStyle cellStyle =  super.getHeaderStyle(color);
+        cellStyle.setFont(getFont(workbook, 9, false));
+        cellStyle.setAlignment(HorizontalAlignment.LEFT);
+
+        cellStyle.setWrapText(true);
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        return cellStyle;
+    }
+
+    /**
+     * 单元格的样式
+     */
+    @Override
+    public CellStyle stringNoneStyle(Workbook workbook, boolean isWarp) {
+        CellStyle cellStyle = super.stringNoneStyle(workbook, isWarp);
+        cellStyle.setFont(getFont(workbook, 10, false));
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        return cellStyle;
+    }
+
+    /**
+     * 字体样式
+     *
+     * @param size   字体大小
+     * @param isBold 是否加粗
+     * @return
+     */
+    private Font getFont(Workbook workbook, int size, boolean isBold) {
+        Font font = workbook.createFont();
+        //字体样式
+        font.setFontName("宋体");
+        //是否加粗
+        font.setBold(isBold);
+        //字体大小
+        font.setFontHeightInPoints((short) size);
+        return font;
+    }
+}

+ 63 - 0
src/main/java/com/kcim/common/util/excel/ExcelUtil.java

@@ -0,0 +1,63 @@
+package com.kcim.common.util.excel;
+
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
+
+/**
+ * @program: CostAccount
+ * @description:
+ * @author: Wang.YS
+ * @create: 2023-11-16 21:10
+ **/
+
+public class ExcelUtil {
+    /**
+     * 创建下拉列表选项【适用长度超过255】
+     * @param workbook
+     * @param values   下拉框的选项值
+     * @param firstRow 起始行(从0开始)
+     * @param lastRow  终止行(从0开始)
+     * @param firstCol 起始列(从0开始)
+     * @param lastCol  终止列(从0开始)
+     */
+    public static void createDropDownExpandList(Workbook workbook, String[] values, int firstRow, int lastRow, int firstCol, int lastCol) {
+        Sheet sheet = workbook.getSheetAt(0);
+        //创建名为"hidden"的新Sheet页
+        Sheet hidden = workbook.createSheet("hidden");
+
+        //遍历选项值填充到"hidden"页的第一列
+        Cell cell = null;
+        for (int i = 0; i < values.length; i++) {
+            String value = values[i];
+            Row row = hidden.createRow(i); //第i行
+            cell = row.createCell(0);      //第1列
+            cell.setCellValue(value);
+        }
+
+        //指定"hidden"页面选项值的坐标,上面均填充到第一列 所以从A1开始到A values的个数
+        Name name = workbook.createName();
+        name.setNameName("hidden");
+        name.setRefersToFormula("hidden!$A$1:$A$" + values.length);
+
+        //将"hidden"的数据加载
+        DataValidationHelper helper = sheet.getDataValidationHelper();
+        DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden");
+
+        //设置下拉框作用区域,起始行 终止行 起始列 终止列
+        CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
+        DataValidation dataValidation = helper.createValidation(constraint, addressList);
+
+        //设置第二个sheet页为隐藏
+        workbook.setSheetHidden(1, true);
+
+        // Excel兼容性问题
+        if (dataValidation instanceof XSSFDataValidation) {
+            dataValidation.setSuppressDropDownArrow(true);
+            dataValidation.setShowErrorBox(true);
+        } else {
+            dataValidation.setSuppressDropDownArrow(false);
+        }
+        sheet.addValidationData(dataValidation);
+    }
+}

+ 39 - 0
src/main/java/com/kcim/common/util/excel/entity/DiseaseTypeImportEntity.java

@@ -0,0 +1,39 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("DiseaseTypeImportEntity")
+public class DiseaseTypeImportEntity {
+
+    @Excel(name="病种编码",width = 20)
+    private String code;
+
+    @Excel(name="病种名称",width = 20)
+    private String name;
+
+    @Excel(name="说明",width = 20)
+    private String description;
+
+
+
+
+
+}

+ 36 - 0
src/main/java/com/kcim/common/util/excel/entity/DiseaseTypeMapImportEntity.java

@@ -0,0 +1,36 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("DiseaseTypeMapImportEntity")
+public class DiseaseTypeMapImportEntity {
+
+    @Excel(name="诊断代码",width = 20)
+    private String code;
+
+    @Excel(name="诊断名称",width = 20)
+    private String name;
+
+    @Excel(name="国家编码",width = 20)
+    private String icdCode;
+
+
+
+
+
+}

+ 49 - 0
src/main/java/com/kcim/common/util/excel/entity/DrugImportEntity.java

@@ -0,0 +1,49 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("DrugImportEntity")
+public class DrugImportEntity {
+
+    @Excel(name="项目代码",width = 20)
+    private String code;
+
+    @Excel(name="项目名称",width = 20)
+    private String name;
+
+    @Excel(name="项目类型",width = 20,dict = "drugType",addressList = true)
+    private String type;
+
+    @Excel(name="单价",width = 20)
+    private BigDecimal price;
+
+    @Excel(name="成本",width = 20)
+    private BigDecimal cost;
+
+    @Excel(name="停用",width = 20,replace = {"启用_0","停用_1"},addressList = true)
+    private Integer status;
+
+    @Excel(name="停用时间",width = 20)
+    private Date stopTime;
+
+
+
+}

+ 43 - 0
src/main/java/com/kcim/common/util/excel/entity/EmpCostImportEntity.java

@@ -0,0 +1,43 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @program: CostAccount
+ * @description: 人事成本导入模版
+ * @author: Wang.YS
+ * @create: 2023-10-19 09:55
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("EmpCostImportEntity")
+public class EmpCostImportEntity {
+    @Excel(name="工号",width = 20,exportFormat = "@")
+    private String empCode;
+
+    @Excel(name="姓名",width = 20)
+    private String empName;
+
+    @Excel(name="总工时",width = 20)
+    private BigDecimal hour;
+
+    @Excel(name="固定薪资",width = 20)
+    private BigDecimal salary;
+
+    @Excel(name="变动薪资",width = 20)
+    private BigDecimal variableCompensation;
+
+    @Excel(name="总成本",width = 20)
+    private BigDecimal cost;
+
+
+}

+ 48 - 0
src/main/java/com/kcim/common/util/excel/entity/EquipmentImportEntity.java

@@ -0,0 +1,48 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("EquipmentImportEntity")
+public class EquipmentImportEntity {
+
+    @Excel(name="设备编码",width = 20)
+    private String code;
+
+    @Excel(name="设备名称",width = 20)
+    private String name;
+
+    @Excel(name="设备型号",width = 20)
+    private String type;
+
+    @Excel(name="折旧年限(年)",width = 20)
+    private BigDecimal depreciationYear;
+    @Excel(name="采购价格(元)",width = 20)
+    private BigDecimal price;
+
+    @Excel(name="停用",width = 20,replace = {"启用_0","停用_1"},addressList = true)
+    private Integer status;
+
+    @Excel(name="停用时间",width = 20)
+    private Date stopTime;
+
+
+
+}

+ 46 - 0
src/main/java/com/kcim/common/util/excel/entity/ItemImportEntity.java

@@ -0,0 +1,46 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("ItemImportEntity")
+public class ItemImportEntity {
+
+    @Excel(name="收费项目编码",width = 20)
+    private String code;
+
+    @Excel(name="收费项目名称",width = 20)
+    private String name;
+
+    @Excel(name="国家编码",width = 20)
+    private String nationalCode;
+
+    @Excel(name="项目类别",width = 20)
+    private String type;
+
+    @Excel(name="单价",width = 20)
+    private BigDecimal price;
+
+
+
+
+
+
+}

+ 49 - 0
src/main/java/com/kcim/common/util/excel/entity/MaterialImportEntity.java

@@ -0,0 +1,49 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("MaterialImportEntity")
+public class MaterialImportEntity {
+
+    @Excel(name="项目代码",width = 20)
+    private String code;
+
+    @Excel(name="项目名称",width = 20)
+    private String name;
+
+    @Excel(name="项目类型",width = 20,replace = {"不计价材料_1","高值材料_2"},addressList = true)
+    private Integer type;
+
+    @Excel(name="单价",width = 20)
+    private BigDecimal price;
+
+    @Excel(name="成本",width = 20)
+    private BigDecimal cost;
+
+    @Excel(name="停用",width = 20,replace = {"启用_0","停用_1"},addressList = true)
+    private Integer status;
+
+    @Excel(name="停用时间",width = 20)
+    private Date stopTime;
+
+
+
+}

+ 53 - 0
src/main/java/com/kcim/common/util/excel/entity/OrderImportEntity.java

@@ -0,0 +1,53 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("OrderImportEntity")
+public class OrderImportEntity {
+
+    @Excel(name="医嘱项目代码",width = 20)
+    private String code;
+
+    @Excel(name="医嘱项目名称",width = 20)
+    private String name;
+
+    @Excel(name="医嘱项目类型",width = 20,dict = "orderType",addressList = true)
+    private String type;
+
+    @Excel(name="收费项目代码",width = 20)
+    private String itemCode;
+
+    @Excel(name="收费项目名称",width = 20)
+    private String itemName;
+
+    @Excel(name="收费项目类别",width = 20,replace = {"药品_1","材料_2","项目_3"},addressList = true)
+    private String itemType;
+
+    @Excel(name="单位",width = 20)
+    private String unit;
+
+    @Excel(name="数量",width = 20)
+    private BigDecimal num;
+
+
+
+
+}

+ 132 - 0
src/main/java/com/kcim/common/util/excel/entity/PatientInfoImportEntity.java

@@ -0,0 +1,132 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 患者信息导入模版
+ * @author: Wang.YS
+ * @create: 2023-10-19 18:18
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("PatientInfoImportEntity")
+public class PatientInfoImportEntity {
+    /**
+     * 住院号/门诊号
+     */
+    @Excel(name="住院号/门诊号",width = 20)
+    private String visitNo;
+    /**
+     * 病人id
+     */
+    @Excel(name="病人ID",width = 20)
+    private String patientNo;
+    /**
+     * 姓名
+     */
+    @Excel(name="姓名",width = 20)
+    private String name;
+    /**
+     * 科室代码
+     */
+    @Excel(name="科室代码",width = 20)
+    private String departmentCode;
+    /**
+     * 科室名称
+     */
+    @Excel(name="科室名称",width = 20)
+    private String departmentName;
+    /**
+     * 就诊类别 1门诊3住院2急诊
+     */
+    @Excel(name="就诊类别",width = 20,replace = {"门诊_1","急诊_2","住院_3"},addressList = true)
+    private Integer type;
+    /**
+     * 主诊断代码
+     */
+    @Excel(name="主诊断代码",width = 20)
+    private String primaryDiagCode;
+    /**
+     * 主诊断名称
+     */
+    @Excel(name="主诊断名称",width = 20)
+    private String primaryDiagName;
+    /**
+     * 次诊断代码
+     */
+    @Excel(name="次诊断代码",width = 20)
+    private String secondaryDiagCode;
+    /**
+     * 次诊断名称
+     */
+    @Excel(name="次诊断名称",width = 20)
+    private String secondaryDiagName;
+    /**
+     * 主手术/操作代码
+     */
+    @Excel(name="主手术/操作代码",width = 20)
+    private String primaryOperationCode;
+    /**
+     * 主手术/操作名称
+     */
+    @Excel(name="主手术/操作名称",width = 20)
+    private String primaryOperationName;
+    /**
+     * 次手术/操作代码
+     */
+    @Excel(name="次手术/操作代码",width = 20)
+    private String secondaryOperationCode;
+    /**
+     * 次手术/操作名称
+     */
+    @Excel(name="次手术/操作名称",width = 20)
+    private String secondaryOperationName;
+    /**
+     * DRG/DIP分组代码
+     */
+    @Excel(name="DRG/DIP分组代码",width = 20)
+    private String groupCode;
+    /**
+     * DRG/DIP分组名称
+     */
+    @Excel(name="DRG/DIP分组名称",width = 20)
+    private String groupName;
+    /**
+     * 临床路径代码
+     */
+    @Excel(name="临床路径代码",width = 20)
+    private String clinicalPathwayCode;
+    /**
+     * 临床路径名称
+     */
+    @Excel(name="临床路径名称",width = 20)
+    private String clinicalPathwayName;
+    /**
+     * 入院时间
+     */
+    @Excel(name="入院时间",width = 20)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private Date inHospitalTime;
+    /**
+     * 出院时间
+     */
+    @Excel(name="出院时间",width = 20)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private Date outHospitalTime;
+    /**
+     * 住院天数
+     */
+    @Excel(name="住院天数",width = 20)
+    private Integer inHospitalDays;
+}

+ 121 - 0
src/main/java/com/kcim/common/util/excel/entity/PatientItemImportEntity.java

@@ -0,0 +1,121 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 患者收费项目导入模版
+ * @author: Wang.YS
+ * @create: 2023-10-19 14:07
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("PatientItemImportEntity")
+public class PatientItemImportEntity {
+    /**
+     * 住院号/门诊号
+     */
+    @Excel(name="住院号/门诊号",width = 20)
+    private String visitNo;
+    /**
+     * 病人id
+     */
+    @Excel(name="病人ID",width = 20)
+    private String patientNo;
+    /**
+     * 姓名
+     */
+    @Excel(name="姓名",width = 20)
+    private String name;
+    /**
+     * 项目代码
+     */
+    @Excel(name="项目代码",width = 20)
+    private String itemCode;
+    /**
+     * 项目名称
+     */
+    @Excel(name="项目名称",width = 20)
+    private String itemName;
+//    /**
+//     * 项目类别代码
+//     */
+//    @Excel(name="测试",width = 20)
+//    private String itemTypeCode;
+    /**
+     * 项目类别
+     */
+    @Excel(name="项目类别代码",width = 20,dict = "itemType",addressList = true)
+    private String itemType;
+    /**
+     * 开单科室代码
+     */
+    @Excel(name="开单科室代码",width = 20)
+    private String orderDepartmentCode;
+    /**
+     * 开单科室名称
+     */
+    @Excel(name="开单科室名称",width = 20)
+    private String orderDepartmentName;
+    /**
+     * 开单人工号
+     */
+    @Excel(name="开单人工号",width = 20)
+    private String orderUserCode;
+    /**
+     * 开单人姓名
+     */
+    @Excel(name="开单人姓名",width = 20)
+    private String orderUserName;
+    /**
+     * 执行科室代码
+     */
+    @Excel(name="执行科室代码",width = 20)
+    private String executeDepartmentCode;
+
+    /**
+     * 执行科室名称
+     */
+    @Excel(name="执行科室名称",width = 20)
+    private String executeDepartmentName;
+    /**
+     * 执行人工号
+     */
+    @Excel(name="执行人工号",width = 20)
+    private String executeUserCode;
+    /**
+     * 执行人姓名
+     */
+    @Excel(name="执行人姓名",width = 20)
+    private String executeUserName;
+    /**
+     * 数量
+     */
+    @Excel(name="数量",width = 20)
+    private BigDecimal num;
+    /**
+     * 单价
+     */
+    @Excel(name="单价",width = 20)
+    private BigDecimal price;
+    /**
+     * 金额
+     */
+    @Excel(name="金额",width = 20)
+    private BigDecimal amount;
+    /**
+     * 费用发生时间
+     */
+    @Excel(name="费用发生时间",width = 20)
+    private Date executeTime;
+}

+ 56 - 0
src/main/java/com/kcim/common/util/excel/entity/SpaceImportEntity.java

@@ -0,0 +1,56 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("SpaceImportEntity")
+public class SpaceImportEntity {
+
+    @Excel(name="空间编码",width = 20)
+    private String code;
+
+    @Excel(name="空间名称",width = 20)
+    private String name;
+
+
+    @Excel(name="父级空间编码",width = 20)
+    private String parentCode;
+
+    @Excel(name="是否空间分类",width = 20,replace = {"是_0","否_1"},addressList = true)
+    private String type;
+
+    @Excel(name="建置成本(元)",width = 20)
+    private BigDecimal cost;
+
+    @Excel(name="建置容积(m³)",width = 20)
+    private BigDecimal volume;
+
+    @Excel(name="折旧年限(年)",width = 20)
+    private BigDecimal depreciationYear;
+
+    @Excel(name="停用",width = 20,replace = {"启用_0","停用_1"},addressList = true)
+    private Integer status;
+
+    @Excel(name="停用时间",width = 20)
+    private Date stopTime;
+
+
+
+}

+ 56 - 0
src/main/java/com/kcim/common/util/excel/entity/StandItemImportEntity.java

@@ -0,0 +1,56 @@
+package com.kcim.common.util.excel.entity;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @program: CostAccount
+ * @description: 药品字典导入模版
+ * @author: Wang.YS
+ * @create: 2023-11-06 20:54
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ExcelTarget("StandItemImportEntity")
+public class StandItemImportEntity {
+
+    @Excel(name="项目编码",width = 20)
+    private String code;
+
+    @Excel(name="项目名称",width = 20)
+    private String name;
+
+    @Excel(name="国家编码",width = 20)
+    private String nationalCode;
+
+    @Excel(name="康程分类",width = 20)
+    private String type;
+
+    @Excel(name="执行时间(min)",width = 20)
+    private BigDecimal executeTime;
+
+    @Excel(name="参与人员",width = 20)
+    private String emp;
+
+    @Excel(name="使用设备",width = 20)
+    private String equipment;
+
+    @Excel(name="使用空间",width = 20)
+    private String space;
+
+
+
+
+
+
+
+
+}

+ 95 - 0
src/main/java/com/kcim/common/util/excel/handler/DrugTypeHandler.java

@@ -0,0 +1,95 @@
+package com.kcim.common.util.excel.handler;
+
+import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import com.kcim.vo.DictDataVo;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description: 收费项目项目类别实现
+ * @author: Wang.YS
+ * @create: 2023-10-19 14:33
+ **/
+
+public class DrugTypeHandler implements IExcelDictHandler {
+
+
+    public final List<DictDataVo> list ;
+
+    public DrugTypeHandler(List<DictDataVo> dataVoList) {
+        this.list = dataVoList;
+    }
+    /**
+     * 返回字典所有值
+     * key: dictKey
+     * value: dictValue
+     *
+     * @param dict 字典Key
+     * @return
+     */
+    @Override
+    public List<Map> getList(String dict) {
+        List<Map> dictList    = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(list)){
+            for (DictDataVo dataVo : list) {
+                Map<String, String> dictMap = new HashMap<>();
+                dictMap.put("dictKey", dataVo.getCode());
+                dictMap.put("dictValue", dataVo.getName());
+                dictList.add(dictMap);
+            }
+        }
+        return dictList;
+    }
+
+    /**
+     * 从值翻译到名称 导出用
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toName(String dict, Object obj, String name, Object value) {
+        if ("drugType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                String level = value.toString();
+                Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
+                return dictMap.get(level);
+            }
+
+        }
+        return null;
+    }
+
+    /**
+     * 从名称翻译到值
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toValue(String dict, Object obj, String name, Object value) {
+        if ("drugType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                if(!CollectionUtils.isEmpty(list)){
+                    Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getName, DictDataVo::getCode, (a, b) -> b));
+                    String level = value.toString();
+                    return dictMap.get(level);
+                }
+            }
+        }
+        return null;
+    }
+}

+ 96 - 0
src/main/java/com/kcim/common/util/excel/handler/ItemTypeHandler.java

@@ -0,0 +1,96 @@
+package com.kcim.common.util.excel.handler;
+
+import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import com.kcim.vo.DictDataVo;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description: 收费项目项目类别实现
+ * @author: Wang.YS
+ * @create: 2023-10-19 14:33
+ **/
+
+public class ItemTypeHandler implements IExcelDictHandler {
+
+
+    public final List<DictDataVo> list ;
+
+    public ItemTypeHandler(List<DictDataVo> dataVoList) {
+        this.list = dataVoList;
+    }
+    /**
+     * 返回字典所有值
+     * key: dictKey
+     * value: dictValue
+     *
+     * @param dict 字典Key
+     * @return
+     */
+    @Override
+    public List<Map> getList(String dict) {
+        List<Map> dictList    = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(list)){
+            for (DictDataVo dataVo : list) {
+                Map<String, String> dictMap = new HashMap<>();
+                dictMap.put("dictKey", dataVo.getCode());
+                dictMap.put("dictValue", dataVo.getName());
+                dictList.add(dictMap);
+            }
+        }
+        return dictList;
+    }
+
+    /**
+     * 从值翻译到名称
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toName(String dict, Object obj, String name, Object value) {
+        if ("itemType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                String level = value.toString();
+                Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
+                return dictMap.get(level);
+            }
+
+        }
+        return null;
+    }
+
+    /**
+     * 从名称翻译到值
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toValue(String dict, Object obj, String name, Object value) {
+        if ("itemType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                if(!CollectionUtils.isEmpty(list)){
+                    Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getName, DictDataVo::getCode, (a, b) -> b));
+                    String level = value.toString();
+                    return dictMap.get(level);
+                }
+            }
+
+        }
+        return null;
+    }
+}

+ 95 - 0
src/main/java/com/kcim/common/util/excel/handler/KcClassTypeHandler.java

@@ -0,0 +1,95 @@
+package com.kcim.common.util.excel.handler;
+
+import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import com.kcim.vo.KCClassVo;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description: 收费项目项目类别实现
+ * @author: Wang.YS
+ * @create: 2023-10-19 14:33
+ **/
+
+public class KcClassTypeHandler implements IExcelDictHandler {
+
+
+    public final List<KCClassVo> list ;
+
+    public KcClassTypeHandler(List<KCClassVo> dataVoList) {
+        this.list = dataVoList;
+    }
+    /**
+     * 返回字典所有值
+     * key: dictKey
+     * value: dictValue
+     *
+     * @param dict 字典Key
+     * @return
+     */
+    @Override
+    public List<Map> getList(String dict) {
+        List<Map> dictList    = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(list)){
+            for (KCClassVo dataVo : list) {
+                Map<String, String> dictMap = new HashMap<>();
+                dictMap.put("dictKey", dataVo.getCode());
+                dictMap.put("dictValue", dataVo.getLevelName());
+                dictList.add(dictMap);
+            }
+        }
+        return dictList;
+    }
+
+    /**
+     * 从值翻译到名称 导出用
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toName(String dict, Object obj, String name, Object value) {
+        if ("kcClassType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                String level = value.toString();
+                Map<String, String> dictMap = list.stream().collect(Collectors.toMap(KCClassVo::getCode, KCClassVo::getLevelName, (a, b) -> b));
+                return dictMap.get(level);
+            }
+
+        }
+        return null;
+    }
+
+    /**
+     * 从名称翻译到值
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toValue(String dict, Object obj, String name, Object value) {
+        if ("kcClassType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                if(!CollectionUtils.isEmpty(list)){
+                    Map<String, String> dictMap = list.stream().collect(Collectors.toMap(KCClassVo::getLevelName, KCClassVo::getCode, (a, b) -> b));
+                    String level = value.toString();
+                    return dictMap.get(level);
+                }
+            }
+        }
+        return null;
+    }
+}

+ 100 - 0
src/main/java/com/kcim/common/util/excel/handler/OrderTypeHandler.java

@@ -0,0 +1,100 @@
+package com.kcim.common.util.excel.handler;
+
+import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import com.kcim.vo.DictDataVo;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: CostAccount
+ * @description: 收费项目项目类别实现
+ * @author: Wang.YS
+ * @create: 2023-10-19 14:33
+ **/
+public class OrderTypeHandler implements IExcelDictHandler {
+
+    public final List<DictDataVo> list ;
+
+    public OrderTypeHandler(List<DictDataVo> dataVoList) {
+        this.list = dataVoList;
+    }
+
+    /**
+     * 返回字典所有值
+     * key: dictKey
+     * value: dictValue
+     *
+     * @param dict 字典Key
+     * @return
+     */
+    @Override
+    public List<Map> getList(String dict) {
+        List<Map> dictList    = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(list)){
+            for (DictDataVo dataVo : list) {
+                Map<String, String> dictMap = new HashMap<>();
+                dictMap.put("dictKey", dataVo.getCode());
+                dictMap.put("dictValue", dataVo.getName());
+                dictList.add(dictMap);
+            }
+        }
+        return dictList;
+    }
+
+    /**
+     * 从值翻译到名称
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toName(String dict, Object obj, String name, Object value) {
+        if ("orderType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                String level = value.toString();
+                Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
+                return dictMap.get(level);
+            }
+        } else if ("itemType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                String level = value.toString();
+                Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
+                return dictMap.get(level);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 从名称翻译到值
+     *
+     * @param dict  字典Key
+     * @param obj   对象
+     * @param name  属性名称
+     * @param value 属性值
+     * @return
+     */
+    @Override
+    public String toValue(String dict, Object obj, String name, Object value) {
+        if ("orderType".equals(dict)) {
+            if(!StringUtils.isEmpty(value)){
+                if(!CollectionUtils.isEmpty(list)){
+                    Map<String, String> dictMap = list.stream().collect(Collectors.toMap(DictDataVo::getName, DictDataVo::getCode, (a, b) -> b));
+                    String level = value.toString();
+                    return dictMap.get(level);
+                }
+            }
+
+        }
+        return null;
+    }
+}

+ 2 - 2
src/main/java/com/imed/costaccount/common/xss/XssFilter.java → src/main/java/com/kcim/common/xss/XssFilter.java

@@ -1,4 +1,4 @@
-package com.imed.costaccount.common.xss;
+package com.kcim.common.xss;
 
 import javax.servlet.*;
 import javax.servlet.annotation.WebFilter;
@@ -15,7 +15,7 @@ public class XssFilter implements Filter {
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
         HttpServletRequest request = (HttpServletRequest) servletRequest;
-        com.imed.costaccount.common.xss.XssHttpServletRequestWrapper wrapper = new com.imed.costaccount.common.xss.XssHttpServletRequestWrapper(request);
+        XssHttpServletRequestWrapper wrapper = new XssHttpServletRequestWrapper(request);
         filterChain.doFilter(wrapper, servletResponse);
     }
 

+ 2 - 2
src/main/java/com/imed/costaccount/common/xss/XssHttpServletRequestWrapper.java → src/main/java/com/kcim/common/xss/XssHttpServletRequestWrapper.java

@@ -1,8 +1,8 @@
-package com.imed.costaccount.common.xss;
+package com.kcim.common.xss;
 
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HtmlUtil;
-import com.imed.costaccount.common.util.JacksonUtil;
+import com.kcim.common.util.JacksonUtil;
 
 import javax.servlet.ReadListener;
 import javax.servlet.ServletInputStream;

+ 2 - 2
src/main/java/com/imed/costaccount/mapper/AccountingMapper.java → src/main/java/com/kcim/dao/mapper/AccountingMapper.java

@@ -1,6 +1,6 @@
-package com.imed.costaccount.mapper;
+package com.kcim.dao.mapper;
 
-import com.imed.costaccount.model.Accounting;
+import com.kcim.dao.model.Accounting;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 

Vissa filer visades inte eftersom för många filer har ändrats